G-6.2:讀不了的檔案不再安靜消失——首頁當場說出來
服務 J-1 / S6「我丟進去的檔案,查得到」的考題 G-6.2: 「要嘛查得到,要嘛**當場被告知這種檔案還不支援**,不准安靜地略過。」 本次只做後半句(轉檔本體另有人閘,等 leo 裁「那段 Go 住哪裡」)。 ## 真實現況比記載更糟 t16 寫的「PDF 被靜默略過」已不成立(t73 的轉檔層把 pdf/docx/xlsx/csv/pptx 都接上了,實測 2 頁中文 PDF 完整抽出)。**真正還在沉默的是別的東西**: 副檔名不在 allowedExt 的檔案在 scan.go 直接 `return nil`—— 不進事件、不進 manifest、不進 status、不進畫面。 使用者丟一份 .doc 進去,從頭到尾一個字都沒有。 實測基線(真檔):丟 .pdf/.md/.doc/.key/.jpg 進資料夾, `collector scan` 只吐出 pdf 與 md 兩個事件,另外三個檔沒留下任何痕跡。 ## 改了什麼 - scan.go:白名單閘不再是死巷。像文件的(.doc/.xls/.ppt/.pages/.key/ .numbers/.odt/.ods/.odp/.rtf/.epub/.wpd/.msg/.eml)逐檔留名; 其餘(圖片/影音/程式碼)只計總數——**避免 Obsidian 附件庫炸出幾百行噪音**。 - 兩個新欄位標 `json:"-"`:collector-trigger schema 是 additionalProperties:false,且 BuildSendablePayload 是淺拷貝 ⇒ 有 tag 就會漏到雲端被擋。這是給本機使用者看的,不上 wire。 - direct.go → status.json → App 首頁一張卡:講檔名與格式(「舊版報告.doc (舊版 Word)」),並告訴他不用重丟、也給替代路(另存成 PDF/.docx)。 - 刻意不進 manifest、不走 CarryForwardActivity:每輪由檔案系統重算, 不製造 t195 那種「跨輪欄位漏 carry 就靜默歸零」的債。 ## 順手修掉一個會讓驗收失效的回歸 同綑的 arcrun-collector 一路自稱 `dev`:退役 fyne 版 (arcrun-tray/build-mac.sh:24,t150/t72)本來就有版本注入, t194 換 Wails 時沒帶過來,Mac 與 Windows 兩邊都掉。 **幹活的是 collector**——它不報版本,就沒人能判斷修復有沒有到使用者手上。 ## 實測 - go test ./... 135 過 0 敗(新增 10 條:scan 5+首頁文案 5) - check-cis / check-render / check-tray 三閘全過;淺色深色都抓過畫面 - 從 **DMG 裡那支** collector 實跑:Info.plist 0.18.6、 collector 回報 v0.18.6 (build 20260806-0101)、 status.json 吐出 skipped_docs=[簡報.key, 舊版報告.doc]、other=1 ⚠️ 未出貨:推 bundles repo 在 GitHub,要 leo 開 D20 閘。 DMG 已備妥 dist/Arcrun-v0.18.6.dmg。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -72,6 +72,7 @@ function pageHome(s) {
|
||||
</div>`).join('')}
|
||||
</div>
|
||||
</div>
|
||||
${cardSkipped(s.skipped)}
|
||||
<div class="card">
|
||||
<h3>總計</h3>
|
||||
<div class="kv" style="margin-top:10px">
|
||||
@@ -82,6 +83,27 @@ function pageHome(s) {
|
||||
</div>`;
|
||||
}
|
||||
|
||||
// 🔴 G-6.2「不准安靜地略過」(2026-08-06)——J-1/S6 考題的後半句:
|
||||
// 「Then 我一樣找得到——**或當場被告知這種檔案還不支援**」
|
||||
// 以前 .doc/.pages 這類檔在 collector 掃描時就被丟掉,畫面上一個字都沒有,
|
||||
// 使用者只能得到「我丟了檔,然後什麼都沒發生」這個結論。
|
||||
// 這張卡就是那句話該出現的地方——**首頁**,他每次打開 App 一定會看到。
|
||||
// 沒有東西被略過時後端回 null ⇒ 這裡回空字串,畫面保持乾淨(沒事不佔版面)。
|
||||
function cardSkipped(k) {
|
||||
if (!k) return '';
|
||||
return `
|
||||
<div class="card">
|
||||
<h3>${esc(k.title)}</h3>
|
||||
<div class="d" style="margin-top:6px">${esc(k.note)}</div>
|
||||
${(k.files || []).length ? `
|
||||
<ul class="skiplist">
|
||||
${k.files.map((f) => `<li>${esc(f)}</li>`).join('')}
|
||||
${k.more ? `<li class="more">…等 ${k.more} 個</li>` : ''}
|
||||
</ul>` : ''}
|
||||
${k.other ? `<div class="d" style="margin-top:8px">${esc(k.other)}</div>` : ''}
|
||||
</div>`;
|
||||
}
|
||||
|
||||
// ── 各庫頁:動作全部作用在這個庫(不會加錯帳號)──
|
||||
function pageLib(s, idx) {
|
||||
const a = s.accounts[idx];
|
||||
|
||||
Reference in New Issue
Block a user