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
+8 -10
View File
@@ -324,19 +324,17 @@ func TestVaultFootprint_WatchRootInsideVault(t *testing.T) {
if len(added) == 0 {
t.Fatal("這一輪什麼都沒產出——紅線是「東西照樣產出、但不撞進使用者的命名空間」")
}
// 產物一律落在 docs/.arcrun-rag/ 底下(在監看根裡,且是隱藏的),
// 其中**卡片**還要再進一層 wiki/cards/。
// 分兩層檢查是因為工作區裡不只有卡片:#105 起還有一份 `.gitignore`
// (讓整個工作區對 git 隱形)。它同樣是隱藏的、同樣不撞使用者的命名空間,
// 但它本來就不該住在 cards/ 裡。
// 產物一律落在兩個隱藏目錄底下(在監看根裡):
// `docs/.arcrun-rag/`=工作區(.gitignore 等)
// `docs/.wiki/`wiki 產物(InkStoneCo#44 ④ 起:卡片+00-INDEXmanifest
workspacePrefix := filepath.ToSlash(filepath.Join("docs", workspaceRelDir)) + "/"
cardsPrefix := filepath.ToSlash(filepath.Join("docs", vaultCardsRelDir)) + "/"
wikiPrefix := filepath.ToSlash(filepath.Join("docs", wikiRelDir)) + "/"
for _, rel := range added {
if !strings.HasPrefix(rel, workspacePrefix) {
t.Fatalf("產物 %s 不在預期的隱藏工作區 %s 底下", rel, workspacePrefix)
if !strings.HasPrefix(rel, workspacePrefix) && !strings.HasPrefix(rel, wikiPrefix) {
t.Fatalf("產物 %s 不在預期的隱藏目錄(%s 或 %s底下", rel, workspacePrefix, wikiPrefix)
}
if strings.HasSuffix(rel, ".md") && !strings.HasPrefix(rel, cardsPrefix) {
t.Fatalf("卡片 %s 不在預期的隱藏卡片區 %s 底下", rel, cardsPrefix)
if strings.HasSuffix(rel, ".md") && !strings.HasPrefix(rel, wikiPrefix) {
t.Fatalf("卡片 %s 不在預期的隱藏 wiki 區 %s 底下", rel, wikiPrefix)
}
}
})