fix(collector): 排除判準不看版控、不誤殺筆記庫、剪掉什麼講得出來(arcrun-rag#104)
票上寫的真兇是錯的。`direct.go` 那一行 `skipDirNames{"system-dev"}` 不是唯一的
排除清單——同一個 Scan 呼叫下面幾行就是 `Plan: plan`,#104 的清單一直都接著。
拿 leo 真實的 `pms` 唯讀跑一輪現行 main:策略 docs-only、送 9 個檔、node_modules 零個。
他 08-16 看到 undici 文件,是因為手上的 daemon 是 v0.18.27,而修法 cc6e500 要到
v0.18.28(08-16 16:13,7f379d0)才被戳版號——那支 commit 自己就寫著
「changelog 停在 v0.18.27,而 collector/ 早已往前走 30 個檔(…cc6e500…)」。
但那個誤判之所以會發生,是因為底下有四個真的缺陷,這一版把它們一起修掉:
① 兩張表分居兩處 ⇒ 讀源碼的人只看得到一張。
`system-dev` 的保護搬進 IngestPlan(templateOwnedDirNames),
direct.go 不再手捏第二張清單。判準只剩一個地方。
② 排除規則生不生效,取決於呼叫端記不記得傳 Plan。
改成 Scan 自己算(Mode == "" ⇒ PlanIngest)。「忘了接」這個失敗模式不存在了。
③ 一張大表把「沒有人會這樣命名」與「這是普通英文字」混在一起,於是**誤殺**。
實測:一般筆記庫 8 份筆記只送出 1 份(build/樂高作品集、out/外出旅遊、
vendor/廠商聯絡簿…全被當成建置產物),而且回報「擋掉 0 個」。
拆成三種理由,強度不同、要求的佐證也不同:
① 使用者的 .gitignore 說的(新增 ignorerules.go,git 語法的安全子集)
② 名字本身就不是人話(node_modules、__pycache__…)——無條件
③ 泛用名(build/dist/out/vendor…)——**旁邊真的擺著專案檔才算**
🔴 判準一律不看 `.git`(leo 2026-08-16:「你不需要判斷有沒有 git,
我的 KB 筆記庫也有 git,是否用 github/gitea 追蹤完全沒意義」)。
`.gitignore` 只讀內容當線索,不拿存在當門檻。
順帶:鎖定檔(pnpm-lock.yaml…)不是知識——`.yaml` 進白名單後它變成了「知識」。
④ 「排除規則要看得見」只做了一半:整棵剪掉的子樹一個都沒數(pms 實測回報 0),
而且 Plan/ExcludedByPlan 只有 CLI 讀,daemon(使用者真正走的那條路)拿到就丟。
新增 ExcludedDirs(路徑+人話理由)+ SyncStatus.FolderPlans 寫進 status.json。
實測(唯讀跑 leo 的 `/Users/youlinhsieh/Documents/tech_projects/pms`):
139 個文件檔 → 送出 7 個,全是他自己的 README/docs;
6 個資料夾整棵跳過,每個都講得出理由;node_modules 與授權條款 0 個。
測試:collector 全綠(新增 12 案,含「裸呼叫 Scan 也必須排除別人的套件」、
「不准再有第二張排除清單」的源碼層守門、筆記庫不誤殺、同名看旁邊擺什麼決定);
arcrun-app 全綠。未出貨、未推 main。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -100,6 +100,10 @@ type SyncStatus struct {
|
||||
// 沒人判斷得出那到底是什麼檔。
|
||||
SkippedOtherNames []string `json:"skipped_other_names,omitempty"`
|
||||
|
||||
// FolderPlans=每個看守資料夾這一輪的收檔策略與少收了什麼(key=資料夾路徑)。
|
||||
// 與 SkippedDocs 同族:每輪照現況重算的快照,**不進 CarryForwardActivity**。
|
||||
FolderPlans map[string]FolderPlanStatus `json:"folder_plans,omitempty"`
|
||||
|
||||
// ── t210 統計層(2026-08-08,Evan 封測:「9000 個檔,雲端只有 101 張卡,
|
||||
// 畫面卻說 20 份沒送——這幾個數字到底是怎麼回事?」)──────────────────────
|
||||
//
|
||||
@@ -117,6 +121,29 @@ type SyncStatus struct {
|
||||
FailureBreakdown FailureBreakdown `json:"failure_breakdown"`
|
||||
}
|
||||
|
||||
// FolderPlanStatus=某個看守資料夾這一輪用了什麼收檔策略、據此少收了什麼
|
||||
// (arcrun-rag#104,2026-08-16 補接線)。
|
||||
//
|
||||
// 🔴 為什麼補這個:#104 第一階段的收工留言宣稱「策略、理由、擋掉幾個檔…
|
||||
// 都經 TriggerPayload.Plan 走進 status.json」,**但那從來沒有發生過**——
|
||||
// `ExcludedByPlan` 與 `Plan` 在整個 repo 裡只有 `main.go`(CLI,走 stderr)讀過,
|
||||
// daemon(`direct.go`,也就是 App 真正在跑的那條路)拿到 payload 之後直接把這兩欄丟掉。
|
||||
// ⇒ 使用者接上一個兩千檔的專案、只看到九份進度,畫面**一個字都不會解釋**。
|
||||
//
|
||||
// 這是與本票真兇同一天、同一個形狀的第四例:**東西做好了,但不在會被執行的那條路上。**
|
||||
// 差別只在前三例是「沒接上」,這一例是「接了一半——CLI 有,使用者走的那條沒有」。
|
||||
type FolderPlanStatus struct {
|
||||
Mode string `json:"mode"` // all/curated-wiki/docs-only
|
||||
Reason string `json:"reason"` // 一句話講給使用者聽的「為什麼只收這些」
|
||||
// ExcludedFiles=走進去了但逐檔被策略擋下的數量。
|
||||
ExcludedFiles int `json:"excluded_files"`
|
||||
// ExcludedDirs/ExcludedDirCount=整棵被剪掉的目錄與理由(清單有上限,總數看 Count)。
|
||||
ExcludedDirs []ExcludedDir `json:"excluded_dirs,omitempty"`
|
||||
ExcludedDirCount int `json:"excluded_dir_count"`
|
||||
// OtherWikiDirs=底下其他子專案自己的知識庫,刻意不收但一定要講。
|
||||
OtherWikiDirs []string `json:"other_wiki_dirs,omitempty"`
|
||||
}
|
||||
|
||||
// MaxSkippedListed:status.json 裡最多逐檔列幾個。
|
||||
// 超過的只反映在 SkippedDocCount,UI 說「…等 N 個」——避免整批舊 Office 檔
|
||||
// 把狀態檔撐大,也避免畫面變成一面看不完的檔名牆。
|
||||
|
||||
Reference in New Issue
Block a user