我的藏書地圖是空的——但我有 1854 條,而且搜尋查得到 #108
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
症狀
leo 2026-08-12 實撞:
kbdb_get_map(藏書地圖)回 0 個庫,但他的
arcrun_whoami顯示role: admin、libraries: ["*"]、「全部知識庫」,而且
kbdb_search查得到東西。只有地圖那格是空的。地圖是 AI 進庫前的導航——空的等於每次都要瞎猜該查哪裡。
實測(同一分鐘,leo21c)
根因
cypher-executor/src/routes/portal-data.ts:712:而
cypher-executor/src/routes/portal.ts:62:leo 的知識在
owner_id = bfezv28v(2026-08-11 深夜回灌時改的名,見Leo/mira#808-12 留言),而
CONSOLE_TENANT沒跟著改 ⇒ 過濾掉全部。🔴 這與
Arcrun#105剛修掉的是同一個形狀,只是低一層#105修的是ownerNamespace(env) = env.MCP_OWNER_NAMESPACE || "leo"——身分來自環境變數,而不是來自登入者。
本票是同一句話換一個檔案:
portalTenant(env) = env.CONSOLE_TENANT || "leo"。⇒
#105讓 MCP 接住了登入者的身分,但它下游的 cypher 資料面仍然用靜態租戶字串過濾。只要實例的 owner_id 與
CONSOLE_TENANT對不上(例如做過資料搬遷/改名),使用者就會看到空地圖。要達成什麼
已登入的人(與他授權的 AI)看到的地圖,要與他實際擁有的知識一致。
不指定做法。但有一題請先回答:租戶字串該從哪裡來?
#105的答案是「從登入者身分來」;本票的CONSOLE_TENANT還是環境變數。兩者要不要收斂成同一個來源,是這張票的核心判斷。
怎麼驗才算數
kbdb_get_map,看得到他的庫與三元組數(kb1851/合計 1854)kbdb_search/kbdb_query現在是好的,不能弄壞紅線
leo(08-11 回灌已定案bfezv28v,改回去是製造新故障)leo21c(要 leo 親手解閘);測試用 youlin📍 repo:
matrix/arcrun(cypher-executor/src/routes/portal.ts:62、portal-data.ts:712)📍 相關:
Arcrun#105(MCP 身分,已修)|Leo/mira#8(owner_id 改名的來龍去脈)📐 收工標準補一條:修完要留一道會擋的閘(leo 2026-08-12 立原則後回頭補)
leo 2026-08-12:「做一個平台要減少 hotfix。」
當晚實測:32 個 commit,其中 5 個在修「上一個修法造成的問題」。
把那些 hotfix 逐個追根,全部由同兩種缺陷生出來:
🔴 本票屬於第 ② 類。 對照組:
.worker-builds落後源碼這件事有Arcrun#93守著——當晚它擋對三次,每次都攔下一個「會送出舊東西」的出貨。
而本票這件事沒有守門員,所以它發生了,而且沒有任何一步會紅燈。
⇒ 因此本票的收工標準多一條(與原有的驗收並列,不取代)
修掉當下這個 bug 不算完成;要留下一個「下次再犯會被擋住」的機制。
那個機制長什麼樣由你判斷(hook/CI check/測試/管線的一站都可以),但要滿足:
⇒ 判準要看「這個動作有沒有在做那件事」,不是「字串裡有沒有出現那個詞」。
(當晚總管修三道閘、製造了 5 次誤攔,全是這個病。)
迴歸測試寫成獨立檔案再跑,別讓閘擋住自己的測試。
為什麼加這條
不加的話,這張票修完之後,同一個形狀會在下一個沒人守的地方再出現一次——
而我們會再開一張票、再修一次。那就是 hotfix 迴圈,而平台的工作是讓它停下來。
—— [總管]
EOF
已修,PR #112(分支
fix/library-map-108)——尚未部署,issue 保持 open 等 leo21c 實證。租戶字串該從哪裡來:從「寫入這批知識的那一方」來,也就是實例 namespace(
~/.arcrun/config.yaml的api_key),不是一份手抄的環境變數預設值。不是掛到每個帳號上——portal 帳號共用同一台實例的知識庫(design D-2),帳號之間的差別是
libraries權限不是owner_id;複製一份到帳號上只是多一個會過期的副本。與 #105 收斂的是同一條原則(單一權威來源+解析不到誠實失敗+可機械驗證),落點不同是因為「誰擁有這個事實」不同。修法三段:
cypher-executor/src/lib/tenant.ts:knowledgeOwner(env)回 brandedTenantId(ARCRUN_NAMESPACE→CONSOLE_TENANT→ 丟錯,無|| 'leo');帳號層accountTenant(env)回普通 string,型別上不可能流進資料面。acr update先驗再寫:GET /kbdb/map?owner_id=<api_key>查得到庫才注入ARCRUN_NAMESPACE,查不到就一個字都不動(避免把一鍵安裝實例指向空的那一格)。no_library_grant/filtered_out/scope_mismatch/confirmed_empty。scope_mismatch以前不存在,所以設定錯誤被畫成「你沒有資料」。同族一起修(下面那道閘一次抓到):
console-dashboard.ts4 處、console-auth.ts1 處同一句話——console 首頁的規模數字與藏書地圖對 leo 也一直是空的。留下的閘:「靜態租戶字串不得用於資料面過濾」,擋在出貨路徑(
scripts/build-worker-artifacts.mjs編成品前先掃,違規→建置中止),判準盯行為不盯字詞,閘本身有 24 條測試(含 11 條零誤攔案例)且擋不到自己。驗證:cypher vitest 441 綠/14 紅(14 紅與 base
e05518a逐條相同);cli 60/60 綠;tsc 零新增錯誤;閘壞例子實跑 exit 1、build 實跑「建置中止」。◐ 未驗:端到端(
kbdb_get_map回 1851、Portal 總圖畫面、部分授權帳號)需部署到 leo21c,那道閘要 leo 親手解。部署注意事項寫在 PR ③——重點:光部署不夠,ARCRUN_NAMESPACE要真的進到 cypher 的[vars](走 wrangler 直推要自己帶--var),且CONSOLE_TENANT不要動(改了 leo 登不進 Portal)。✅ 通了——leo 實機驗收(2026-08-13)
強制更新後印出那行,AR-Mira 立刻查得到:
🔴 但它先卡了一輪,而卡住的原因不是本票
cli/dist/lib/deploy.js裡namespaceHasKnowledge出現 0 次。本票的 CLI 那半(寫
ARCRUN_NAMESPACE)在原始碼裡是對的,但 leo 的acrnpm link 到cli/dist/,而dist/不在版控——他跑的是他上次編的那份,裡面根本沒有這段程式碼。⇒ 那行沒印出來不是「保險判定沒知識」,是「寫它的程式碼不存在」。
兩者在畫面上長得一模一樣(都是沉默),我因此往 code 又查了一輪。
重編之後:
dist 含 namespaceHasKnowledge → 1 次、namespaceHasKnowledge(...) = true。這正是 #109 票上寫的那句話成真:
這次運氣沒站在我這邊。 它從「差點」變成「真的發生過」——已該補進 #109。
順帶量到的(不是本票,另有票)
9 個庫裡 8 個 triplet_count = 0(只有
kb有 1851)⇒ 就是 #87(藏書地圖是空的)。本票只管「地圖看不看得到庫」,庫裡的關係抽取歸 #87。
—— [總管]