feat(collector): daemon 產出改成規範形 wiki 卡——1 文件卡+N 原子卡落 .wiki/(InkStoneCo#44 ④)

LLM 只回 JSON 判斷,格式/落點/連結閉合/索引/manifest 全由 wikishape.go 機械組裝:
- 卡形=frontmatter(tags/gloss/created/updated)+← 上層+摘要/重點/實體(帶類型)/
  關聯(內文知識關係/卡片關係/出處)——差距表 #6
- 落點 <節點>/.wiki/、檔名=H1(.wiki 隱藏目錄自身即機器標記,machinemark 例外③)——#7
- 00-INDEX 機械維護:每行五樣照抄 frontmatter;每份原稿必列——#8
- 萃取端就切 1 hub+N 原子卡(gemma 路 prompt 改 JSON 契約)——#9
- 無可萃概念標「空」+理由,上索引不產卡——#10
機械保證對著 wiki-lint.py 寫:斷連結拆殼、index 式句改寫、三元組恰三項、
雙向邊自動補反向、佔用不覆蓋、原稿永不動;同名概念跨文件先消歧(merge 歸第⑤環)。
scan/convert 白名單補 .feature/.yaml/.yml/.org/.rst(規範洞 6);
lint.go 新舊格式雙軌(workers-ai 雲端 prompt 屬 matrix/arcrun 核心,待開票);
direct.go 只送文件卡上雲(takedown 配對鍵不變)、下架收走 .wiki 產物。

實測:真資料夾+真 Gemini → 2 節點 12 卡,wiki-lint 17/17 exit 0,
原稿 sha256 前後不變;go test collector+supervisor+arcrun-app 全綠(新增 9 案)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 21:03:45 +08:00
parent f233eec9c2
commit 12c2d41886
13 changed files with 1442 additions and 134 deletions
+18 -1
View File
@@ -1169,7 +1169,13 @@ func runDirectOnceRoot(cfg *DirectConfig, root string, dryRun bool, qs *quotaSta
continue
}
ok := true
for _, cardRel := range cards {
// InkStoneCo#44 ④(2026-08-15):gemma 路現在一份文件產「文件卡+N 張
// 概念卡」(cards[0]=文件卡)。雲端 rag_ingest_card 以 page_name upsert、
// 下架以原稿頁名比對 ⇒ N 張卡都送會互相蓋寫同一頁。
// ⇒ 本環先只送文件卡(雲端行為與改版前一致);原子卡與三元組上雲的
// 形狀是第⑤環(Arcrun#129/#130)的題目,屆時在這裡展開。
// cards 為空=該檔被判「無可萃取概念」(00-INDEX 已標「空」),不送雲端。
for cardIdx, cardRel := range cards {
cardData, cerr := os.ReadFile(filepath.Join(absRoot, filepath.FromSlash(cardRel)))
if cerr != nil {
res.Status, res.Error = "failed", "讀卡片失敗:"+cerr.Error()
@@ -1195,6 +1201,9 @@ func runDirectOnceRoot(cfg *DirectConfig, root string, dryRun bool, qs *quotaSta
// pageNameOf(ev.Path)(原稿頁名,不帶前綴)⇒ 兩邊從此對不上,
// 「刪原檔→下架」永遠 0 命中,跟 07-24 那枚 source_uri 的坑同一個形狀。
// 改成原稿頁名後,**雲端看到的頁名與改版前完全相同**(本次只動本機檔名)。
if cardIdx > 0 {
continue // 概念卡先只落本機 .wiki(品質檢查照跑),上雲等第⑤環
}
cardBody := map[string]any{
"page_name": pageNameOf(ev.Path),
"path": ev.Path,
@@ -1297,6 +1306,14 @@ func runDirectOnceRoot(cfg *DirectConfig, root string, dryRun bool, qs *quotaSta
})
}
}
// InkStoneCo#44 ④:新制 `.wiki/` 的卡(文件卡+概念卡)+索引+manifest
// 一起收走——鍵同樣是原稿路徑,與上面的舊制清理並存(過渡期兩制都可能有卡)。
if werr := RemoveWikiDoc(absRoot, ev.Path); werr != nil {
results = append(results, DirectResult{
Type: "warning", Path: ev.Path, Status: "skipped",
Error: "wiki 卡收走失敗(不擋下架):" + werr.Error(),
})
}
}
}
results = append(results, res)