--- name: status description: 當前進度、進行中 Phase、已知問題、下一步(動態文件,每 session 更新) metadata: type: project last_updated: 2026-08-07 --- # 當前進度(動態) > **更新頻率**:每次 session 結束時更新此檔。 > **新對話開始時讀此檔第一段**(3 分鐘概覽)。 --- ## 📍 當前位置 > **2026-08-09(執行紀錄保留期補前端,arcrun-rag#21 交辦,commit `889b70b` main,已 push gitea)**: > P7 後端(4ca23c2)早已完成,但 portal 管理頁零命中「保留期」相關字樣——leo 只能自己 curl。 > 補 `console-ui/public/portal/index.html` 管理頁「執行紀錄保留期」卡片(純薄殼,呼叫既有 > `GET/PUT /portal/admin/execution-log-retention`,未動後端)。**本機真瀏覽器 E2E 驗證**: > 起 kbdb+cypher-executor 兩個真 `wrangler dev`(local D1 套用 migrations 0001-0006)+本機 > 靜態伺服 portal+`UI_ORIGINS` 解 CORS,走真實首次設定流程建帳號登入 → 改天數/勾「不刪除」 > 存檔、reload 頁面值仍持久(雙向都測過:90→45→90、數字→不刪除→數字),Network 每筆 > GET/PUT 皆 200,console 無新增紅字。**未部署**(紅線:只 commit+push,未動任何 Cloudflare > 實例/未重打 arcrun-rag-ui bundle)——已在 arcrun-rag#21 comment 說明,要讓管理者在正式 > portal 看到需另走 build-ui-bundle+出貨流程。**順手發現**:console-ui 無本機 dev/test script > (package.json 只有 deploy/verify),此次是手工兜 wrangler dev + python http.server, > 建議後續補 `npm run preview:local`。 > **2026-08-09(語意搜尋「故障要照實說是故障」,leo 直令,local commit main)**: > leo 看到 portal 橫幅「語意搜尋還沒開通⋯匯出診斷檔給我們幫你打開」原話痛罵: > 「**語義搜尋已經確定是一安裝就提供的功能⋯我沒有不開通這個功能,是壞了, > 沒有人會把 bug 美化成沒提供沒開通**」。本輪修四層: > 1. **文案**:portal(`console-ui/public/portal/index.html`)+console 兩處橫幅與設定頁 > 全改「語意搜尋目前故障/我們的問題/你不用做任何事」,禁「開通/尚未啟用」框架; > kbdb `capability_hint` 同步改(`degraded_reason: module_off`)。 > 2. **查詢向量化失敗不再偽裝成空結果**(leo 點名的謊):`embed.ts` `semanticSearch` > 改丟 `EmbedQueryFailedError`(舊行為 `if(!vec) return []`=「額度用完」被顯示成 > 「查無資料」);route 層接住 → 誠實降級 keyword+`degraded_reason: embed_query_failed`。 > 瀏覽器實測:真 AI binding + bogus 模型(5007 No such model)→ 橫幅照實說暫時故障。 > 3. **源頭機制修掉**(為什麼裝好的實例會失去語意搜尋): > ① `cli update.ts` `kbdb_embed === true`→`!== false`——config 缺欄位時 redeploy 會把 > [[vectorize]]+[ai] binding 靜默剝掉(wrangler deploy 整份覆蓋);init 預設同步翻成 Y/n。 > ② `arcrun-rag deploy-all.mjs`:`ensureVectorizeIndex` 失敗以前只印 warning 續行 > (youlin 07-20 那輪「本輪跳過」就這樣出貨)→ 改**致命中止**+失敗時 GET 複核 > index 是否其實已存在。 > 4. **順手自癒**:搜尋 hydrate 時發現孤兒向量/下架殘影 → 背景 deleteByIds+is_embedded > 歸零(0.971 殘影病原不再累積);空結果且 pending>0 → 背景 backfill 一批(embedOnWrite > fire-and-forget 失敗以前沒有任何機制會回來補)。no_index 拆兩態:pending>0=故障文案、 > pending=0=誠實說「還沒有資料」(新裝未同步不是故障)。 > **測試**:kbdb 146/146 綠(新增 `search-semantic-degraded.test.ts` 6 案+selftest 1 案); > cli tsc 乾淨+10/10;deploy-all DRY_RUN 24 worker 斷言 PASS。瀏覽器端到端(local wrangler > dev 18787/18788+portal 真登入)兩種故障畫面截圖驗過。**未部署 prod(D20 閘)**; > 別 session 未 commit 的 `.component-builds/*` 與 `graph-executor.ts` 未動未代提。 > **2026-08-07 晚(檢修孔第一版,local commit 未 push,main)**:leo 直接指令「先把檢修孔做出來 > 發版,不必先知道 Oscar 的病是什麼」——解掉「查不出封測者的病,因為拿不到他那邊資料;拿不到 > 資料是因為沒有檢修孔」的死結。**規格中途被 leo 簡化過一次**:從「免授權層/同意後才交」兩層 > 機制,收斂成「設定頁一顆按鈕、按下去下載一個 JSON 檔、用戶自己把檔案傳出去」(同意天然內建 > 在「他自己按、自己傳」這個動作裡)。 > > **已完成(3 個 local commit,`matrix/arcrun`,sha `9344562`→`83aa1f6`→`5388f40`)**: > 1. `kbdb/src/embed.ts` `embedSelfTest()` + `GET /embed/selftest?owner_id=`——挑一筆已標記 > 「已嵌入」的卡片拿自己的內容查自己,只回 `{enabled,tested,passed,note}`(不回內容/id)。 > 這是唯一能分辨「從沒嵌過」vs「嵌了但 index 查不到自己」(Arcrun#11 那種故障)的方法, > 單看 backfillStatus 的 pending/embedded 計數看不出後者。 > 2. `cypher-executor/src/routes/portal-data.ts` `GET /portal/data/diagnostics`——聚合 > embed 健康狀態+`library_count`/`triplet_count`(只讀 `/map` 回應的數字,`narrative`/ > `top_entities` 讀完即丟)+`bundle_version`+`instance_url`。沿用既有 `requirePortalUser`。 > 3. `console-ui/public/portal/index.html` 設定頁「疑難排解」panel+「匯出診斷檔給我們看」按鈕。 > > **端到端實測方式**(真跑不是模擬):本地起兩個真 `wrangler dev`(kbdb:18787/ > cypher-executor:18788,local D1+KV,真的跑過 migrations),HTTP API 種一個 portal_user > +一筆 triplet_count=67 的 library_map;瀏覽器工具**真的登入、真的點按鈕**,Network 面板 > 看到 `GET /portal/data/diagnostics → 200`,頁面狀態列顯示「已下載」。兩種故障情境(module > 未開/embedded=0;module 開了但 self_test.found_itself=false)都各自產出可判讀的 JSON, > 貼給 leo 核對過。 > > **測試**:kbdb 12 新測試+既有 110 全綠;cypher-executor 3 新測試綠(既有 1 個 `/portal` > HTML 殼 404 失敗案用 `git stash` 驗證是既有問題非本次造成);console-ui 既有輕量測試 > 18/18 綠。隱私紅線有機械測試守(斷言回應 JSON 不含卡片內容/entity 名/entry id)。 > > **⏸ 未完成/待人**:**尚未 push GitHub**(D20 閘,需 leo 跑 `scripts/github-arm.sh`)→ > push 後版本要走 `products/arcrun-rag/installer/scripts/release.mjs` 注版號 → Oscar 在他 > 自己實例的設定頁按「立即更新」重跑安裝才會真的拿到這顆按鈕(self-hosted,不會自動生效)。 > **這件事沒有 SDD**(leo 直接指令的臨時檢修孔,非任何 active SDD 的 task;`workflow-discovery` > 是目前唯一 active SDD,本次改動與它無關,屬於「有人閘直接授權」的例外路徑,未走 pending-changes > 提案流程——如需要補一份小 SDD 記錄,下個 session 可以評估)。 > > **收工時意外發現**(誠實記錄):本機有既有背景機制會把 local commit 自動鏡到 Gitea > (`gitea/main` 在最後一次 commit 後幾秒就更新到同一個 sha,`git reflog` 時間戳對得上), > 全程沒有手動下過 `git push`。與 CLAUDE.md 記載的「Gitea 永 private,只有 GitHub 走 D20」 > 模型一致,非本次操作觸發,僅供下個 session 知悉。 > **2026-07-28(t95+t96 搜尋缺陷修復,main)**:portal 搜尋兩缺陷修復——t95 CJK/ASCII > 邊界自動補空白(`normalizeCjkQuery`,查詢端,不動索引);t96 graph 節點精確 0 鄰居 > → fuzzy fallback(`findBestNodeMatch`/`fuzzyFindNode`,contains 比對+最短名優先)。 > 純函式 + integration 各 6/2/4 案,tasks.md Bugfix 已標 [x]。 > B5 分支衝突面:同一行 `libraries` 欄位(可一行解)。待 leo 本機跑 vitest 驗收 >(sandbox symlink 封鎖,靜態分析確認邏輯正確)+ commit+部署。 > > **2026-07-19(#39 藏書地圖 M5,分支 `feat/console-library-map-home`)**:**library-map SDD M5(GUI > 首頁)PR 已開,等審+gated 部署(merge 後需 leo 閘 redeploy cypher-executor)**。R4 落點裁定= > console **總庫搜尋頁搜尋框上方**(rag profile 該頁即首頁;full profile 它是全館入口——駕駛艙是 > 狀態面不是庫導覽面,地圖跟搜尋同頁「點庫卡片→帶 library filter 進庫搜尋」動線最短、一份實作 > 兩 profile 全吃)。兩段式渲染:GET /kbdb/map 先出庫卡片(narrative+top entities+triplet 數+ > 更新時間),逐庫 GET /kbdb/map/:library 補 degree/跨庫 bridges/commit_hash(詳圖失敗維持名字 > 版不擋渲染);proxy 端(kbdb-proxy.ts)owner_id **不強制注入只透傳**(同 M4 MCP 語意——現行 > backfill map block owner=NULL,強制注入=首頁永遠假空狀態);/map 空/錯誤=誠實空狀態(指引 > recompute backfill)不擋搜尋。測試:proxy 9 新測+console 頁 6 新測全過;tsc 16 行既有 > ExecutionContext.tracing 錯誤與 executor.test 1 失敗=main 基線就有(stash 對照實證),非本分支引入。 > > **2026-07-19(#39 藏書地圖 M4,分支 `feat/mcp-library-map-inject`)**:**library-map SDD M4 PR 已開, > 等審+gated 部署(merge 後需 leo 閘 redeploy arcrun-mcp)**。兩件(design §4): > ① MCP tool `kbdb_get_map`(無參數=全館每庫一行;帶 library=詳圖,slot JSON 字串容錯 parse 成 > 物件,parse 失敗當空陣列;404/空庫誠實回報+POST /map/recompute backfill 指引;description 含 > 「不確定該查什麼時,先呼叫此工具」)——走既有 KBDB service binding(kbdbFetch),與 #68 同族薄殼。 > ② server instructions 注入:`buildLibraryMapInstructions` 連線時拉 GET /map 渲染成每庫一行 > (`{library}:{narrative}|核心:{top3}|{n} triplets`)嵌 instructions;**快取選型=isolate 內 > TTL 快取(成功 5min/失敗 1min)**,因 stateless StreamableHTTP 每個 HTTP request 都重建 > McpServer,「每次現拉」實際是每個 tool call 都多打一次;timeout 1.5s,任何失敗回 null 靜默略過 > **絕不擋 MCP 連線**(鐵律)。測試:假 KBDB binding 17 新測(全 76/76 過)+tsc 乾淨。 > > **2026-07-19(#39 藏書地圖 M1+M2,分支 `feat/library-map-base`)**:**library-map SDD M1+M2 PR 已開, > 等審+gated 部署(merge 後需 leo 閘 redeploy kbdb+首次 backfill 逐庫呼 recompute)**。 > M1:`library_map` template(migration 0003 seed+runtime ensure,D6 零建表);核實 triplet 按庫定位= > **不足**(prod triplet template 無 library slot、entries metadata.library 未標記)→ 走 SDD 預案: > recompute 冪等補 optional `library` slot(改 template 不動表),值待 ingest M3 補寫。 > M2:kbdb base `POST /map/recompute?library=`(degree top-N/predicate 分布/跨庫 bridges/count, > 聚合 SQL 住基本盤=D6 歸屬裁定;順序安全 supersede;過渡 `source_prefix` fallback 讓舊 triplet 靠 > source_uri 歸庫)+`GET /map`(每庫一行)+`GET /map/:library`。測試:node:sqlite 真 SQLite 實跑 > 聚合 SQL+Hono route 行為,45/45 過、tsc 乾淨。 > > **2026-07-19(#68 MCP graph tool)**:`kbdb_graph_neighbors` PR 已開(分支 > `feat/mcp-graph-neighbors-tool`),等審+gated 部署(merge 後需 leo 閘 redeploy arcrun-mcp)。 > 薄殼:MCP 新 tool 調 `/q/:ns/graph_neighbors` 同步查詢端點(#28 地基),補齊 D17 KBDB MCP > 三模式(關鍵字/語義/圖)。graph_traverse 未加(repo 內無該 workflow 定義可對齊,不猜)。 > > **2026-07-19 本 session(bugfix:kbdb search 兩缺口 #66/#67,分支 > `fix/search-source-filter-and-semantic-threshold`,雲端總管交辦)**: > - **#66/#67 修復 PR 已開(雲端總管交辦),等審+gated 部署**。 > - #66:`/entries/search` keyword 路徑 source 參數解析後丟棄(#5.1 只接了 listEntries 那半)→ > `searchEntries` 尾端加 `source?`(positional caller 全不用改)+同款 json_extract 謂詞, > route keyword/semantic 降級兩處傳入。 > - #67:semantic 固定 topK=20 零閾值 → route 曝 `top_k`(預設 20、封頂 100)/`min_score` > (預設 0=不過濾),semanticSearch 依閾值截低分尾,回應 entry 附 `score` 欄(加欄不改形, > 向後相容)。 > - 驗證:kbdb vitest 33/33 綠(新增 search-source-and-score.test.ts 13 條)+ tsc 0。 > 不動表(D6)、不部署——merge 後需 gated redeploy kbdb worker(leo 閘)。 > > **2026-07-14 上一 session(bugfix:PBKDF2 CF runtime 上限+http_request 1042 flag,分支 `fix-pbkdf2-cf-limit`,PR 待總管審不 merge)**: > - **T6-cloud 部署抓到的框架蟲**:CF Workers **正式 runtime** PBKDF2 上限 100,000 iterations—— > portal-auth 設 600k → `crypto.subtle.deriveBits` 真雲直接拒絕 → `/portal/admin/bootstrap` 500 > (uncle6 實撞,證據 arcrun-rag `docs/manual/uncle6-deploy-record.md`)。**miniflare 無此限制= > 本機測試全綠的假象**(新教訓:平台 crypto 限額 miniflare 不模擬,涉 WebCrypto 參數上限的驗收 > 只有真雲驗得出)。 > - **修(小刀)**:`portal-auth.ts` `PBKDF2_ITERATIONS` 600_000→**100_000**+註明平台封頂(儲存 > 格式自帶迭代數,未來放寬可無痛升);design.md D-5 加修訂註+tasks.md 加 Bugfix 記錄。 > verify 相容性確認:迭代數從儲存值解析,**補測試「驗 600k 舊 hash 仍通」**(miniflare 造)綠; > 誠實邊界=真雲 deriveBits 同樣封頂、600k hash 真雲仍拒,但真雲 bootstrap 從未成功→雲端零存量 > hash、無遷移面。 > - **同 PR 順手(部署 agent 點名)**:`.component-builds/http_request/wrangler.toml` > compatibility_flags 補 `global_fetch_strictly_public`(self-hosted 同帳號 fetch 1042 正解, > Arcrun#33 同族;官方本就跨 zone 行為不變,原理同 cypher 前例 rules/03 1042 段)。 > - **驗證**:cypher tsc 0;全套 169/170(唯一失敗=executor「不存在的零件」pre-existing); > portal 三套 56/56 全綠(含新 600k 相容測試);http_request `wrangler deploy --dry-run` 打包過。 > - 不 merge 待總管審(B 類流程);merge 後部署仍走 gated leo21c/uncle6 wrangler 直推。 > > **2026-07-14 上一輪(portal-auth P4:admin 帳號+庫管理頁——本 SDD 最後一棒,PR 待總管審不 merge)**: > - **實作(分支 `portal-auth-p4-admin-ui`,3+1 小步 commit)**:① `portal.ts` 補 **last-admin > 鎖死保護**(總管派工明定、design 未明寫)——PATCH 停用/降級「最後一個 active admin」→ 409 > (另一 admin 是 disabled 不算數;只在目標是 active admin 且會失格時才多打一次 list,平時零成本)。 > admin API 其餘 P2 已交付(users CRUD/reset-password/libraries 含 graph_source)**不重做**。 > ② `portal-ui.ts` 加「管理」頁(admin-only nav,前端藏=UX、真閘=/portal/admin/* role 403): > 帳號管理(列表/新增/停用啟用/重設密碼+每帳號勾選可查庫含 `["*"]` 全庫連動)+庫目錄管理 > (登記/停用/graph_source 標記)。**一次性密碼只在畫面顯示一次**(otpbox 關閉即逝,server 只存 > hash、明碼不落庫不進 log)。③ 工作流頁 P4 項=P3 已交付,零改動沿用。 > - **驗證**:新增 `tests/portal-admin.test.ts` 14 項;cypher 168/169(唯一失敗=executor「不存在的 > 零件」pre-existing);kbdb 20/20;兩包 tsc 0;dry-run 打包過;inline JS node --check 過。 > **端到端隔離雙 worker(9790/9791,demo 8787/8788 不碰)41/41 全綠**:bootstrap→建帳號拿一次性 > 密碼→新 user 登入→勾庫**同一 session 搜尋即時變化**(1→2 筆、越庫 404→200)→停用 session 立即 > 失效→重設密碼舊密 401 新密 200→last-admin 409+降級即時生效(原 admin session 變 403)→一般 > user 打 admin API 403→HTML 殼加 admin 頁後仍零租戶字串/零 /kbdb//零 API key/零 Mira。 > - **portal-auth SDD P1-P4 全完成,待 T6-cloud 排練上真環境**(部署清單沿 P1:Vectorize `library` > metadata index+reindex backfill;gated leo21c wrangler 直推,B 類流程)。不 merge 待總管審。 > > **2026-07-14 上一輪(portal-auth P3:Portal UI+查詢 enforce——本 SDD 最大件,PR #52 待總管審不 merge)**: > - **實作(分支 `portal-auth-p3-portal-ui`)**:① `routes/portal-data.ts`(安全核心)——`/portal/data/*` > server-side enforce:session→回讀 user record→server 注入 `owner_id=CONSOLE_TENANT`+`library=<集合>` > 轉發 KBDB;**前端絕不下發租戶字串**(vs console 把 tenant 交給前端直打 /kbdb/*);caller 自帶 > owner_id/library 被靜默覆蓋;entries/:id 逐筆驗租戶+庫(越庫/跨租戶/不存在同一句 404 不洩存在性); > graph D-4 粗閘(來源庫=portal_library `graph_source` 標記、無標記預設 general;無權 403);workflows > D-8(`PORTAL_SHOW_WORKFLOWS` 預設 admin;唯讀+最近執行,無 webhook_url/trigger 把手)。 > ② `routes/portal-ui.ts`——`/portal` 單檔 HTML 殼(登入/搜尋三模式+source 溯源+卡片詳頁/設定改 > 密碼看權限主題;graph 模式與工作流頁按 `/portal/session` 新能力欄位 `graph_allowed`/`workflows_visible` > 顯示,真閘在路由層)。③ P1 順延項補上:kbdb-proxy `/kbdb/search`+`/kbdb/entries` 透傳 `library`。 > ④ portal_library seed 加 `graph_source` slot+ensurePortalTemplates 冪等 grow 舊 template 缺 slot+ > admin libraries PATCH 可標記。 > - **UI 重用取捨**:複製 console 樣式子集(紙感/明體/琥珀/深淺主題)而非抽共用模組——抽共用要動 > console.ts(違「console 現狀不動」鐵律);代價=樣式雙份、改版要兩邊同步(誠實記)。 > - **驗證**:cypher 154/155(唯一失敗=executor「不存在的零件」pre-existing,stash 複驗)+新增 > `tests/portal-data.test.ts` 21 項;kbdb 20/20;兩包 tsc 0;`wrangler deploy --dry-run` 打包過。 > **端到端隔離雙 worker(9790/9791,demo 8787/8788 不碰)47/47 全綠**:越庫 id 直讀 404(含跨租戶 > id)、攻擊參數 `library=hr&owner_id=other-tenant` 被 server 覆蓋、graph 無權 403→授 general 後放行、 > admin 全庫 3 筆+跨租戶第 4 筆不可見、權限 PATCH 即時生效(同一 session)、HTML 殼零租戶字串/零 > X-Arcrun-API-Key/零 Mira+inline JS node --check、semantic 誠實降級仍 enforce、改密碼全鏈。 > - **不 merge 待總管審**(B 類流程);部署後 leo21c 線上驗(semantic 線上路徑仍依 P1 部署清單 > Vectorize `library` index+reindex backfill)。下一棒 P4(admin 帳號管理頁)。 > - **附帶**:P2 舊 session 測試補 P3 能力欄位 mock;wrangler.test.toml 補 ANALYTICS_KV+KBDB_GRAPH_URL > 假 host。本 session 同時補記 #47-#51 五件的 wiki 斷層(見下段)。 > > **2026-07-13/14 補記(RAG Portal 線五連發——前五個改動當時漏寫 wiki,leo 點破接關斷層,此段補上)**: > - **PR #47**(commit 2e1005e):console rebrand Mira→Arcrun+`CONSOLE_BRAND` var 可覆蓋品牌字樣(Gitea #21)——console 是引擎共用件不寫死產品名。 > - **PR #48**(commit cbebb36):`CONSOLE_PROFILE=rag` 頁面裁剪(企業產品樣:搜尋落地、只留搜尋/工作流/設定;未設=full,Mira 實例零影響)——是 config 裁剪不是 auth。 > - **PR #49**(commit 18c0846):**portal-auth SDD 立卷**(`system-dev/docs/3-specs/portal-auth/`,Gitea #24 Portal 拆分+#25 多用戶登入);純設計文件。總管審過+leo 裁 D-4=A(graph 粗閘)/D-8=admin(工作流頁)。 > - **PR #50**(commit 7f40964):portal-auth **P1**——KBDB「庫」filter 地基(`metadata_json.$.library`,D1 COALESCE→general fallback+Vectorize `$in` 主路徑、寫入端正規化;kbdb 17/17 測試綠)。 > - **PR #51**(commit 1260d8c):portal-auth **P2**——portal_user 模型+認證 API(KBDB 萬用表零新表、`{tenant}::portal` 子 namespace、PBKDF2-SHA256 600k、bootstrap 走 console owner session、admin CRUD+節流;cypher 20 項單元+雙 worker e2e 33/33)。 > - 以上均**不 merge 待總管審**的 PR 正規流程(#47/#48 已 merge 進 main,#49/#50/#51 已 merge——見 git log——部署另走 gated leo21c wrangler 直推)。下一棒=P3 Portal UI+查詢 enforce(本 SDD 最大件)、P4 admin 頁。 > **2026-07-04 本 session(Mira Console 完整版 UI,Arcrun#3 console 系,總管派工)**: > - **實作(commit f9e44ab)**:`/console` 依 claude design 定稿(紙感暖黑「2a」,`system-dev/docs/6-user/Mira Console 設計規劃/` 於頂層 repo)+ brief 8 頁資訊架構全面重寫成單檔 SPA(hash routing、零外部資源、手機優先+≥1024px 側欄+底部五 tab)。`/console/dashboard` 免登入獨立頁同步換視覺(呼吸球「安/趕/滯」)。 > - **後端小補(全唯讀/薄殼)**:① `GET /credentials/catalog`(D1 目錄 metadata list,絕不回密文,D19)② `GET /console/inbox-data`(inbox 清單,session 鎖——訊息原文屬機敏,計數才免登入)③ `GET /kbdb/graph/neighbors/:name`(cypher 代轉 kbdb-graph-plugin,token 只在 server 側;plugin base = `KBDB_GRAPH_URL` 或 `kbdb-graph-plugin..workers.dev` 現算)④ types 加 `KBDB_GRAPH_URL?`。 > - **誠實分層**:語意搜尋未啟用→banner 讀 search 降級訊號(不假結果);搜尋 chips 用 entry_type(KBDB 真能篩的欄位,不編造「電腦筆記/手機筆記」分類);憑證「刪除」標即將開通(DELETE 仍舊 KV 路徑,接了會假綠,見 mistakes #24);設定頁 vectorize「開關」標即將開通(需部署端 kbdb_embed);關聯查無 triplet →「尚無關聯資料」。v0 零件/recipes 查詢區收進工作流頁折疊區(不砍功能)。 > - **驗證(本機,未部署)**:tsc exit 0;vitest 26/27(1 失敗 stash 複驗=pre-existing「不存在的零件回傳失敗」);`wrangler deploy --dry-run` 打包過;inline JS 求值後 `node --check` + 純函式行為測試全過(XSS escape/時間容錯,驗證法固化 mistakes #24)。 > - **✅ 已部署 leo21c(2026-07-04 總管親跑,leo 明示「部署」)**:手工注入(live worker settings API 拉真實 binding 對齊)→ dry-run 核對 7KV/D1/13SVC/6vars 與 live 一致 → wrangler deploy(Version 13b86bda)→ toml 已還原乾淨。**驗收全綠**:/console 200+新視覺(title=Mira Console);/console/dashboard 200+dashboard-data 真資料(green light/progress-guard beat);/kbdb/search 401=auth by-design 非迴歸;/credentials/catalog 401 誠實要 key(非 404,端點在);/console/inbox-data 401 session 鎖生效。 > - **部署注意(留總管)**:不跑 acr update(mistakes #23 codeload 陷阱),走 leo21c wrangler 直推 cypher-executor 單 worker;關聯視圖需 leo21c 有部署 kbdb-graph-plugin(沒部署→前端誠實顯示不可達,不擋其他頁);`CONSOLE_TENANT`/`WORKER_SUBDOMAIN` 沿既有注入。SDD 缺口沿 07-02 未解(search-console SDD 未建,rule 4.3 需 richblack 確認,本次照派工先實作、誠實記錄)。 > - **二輪(leo 實測三回饋,本機已修未部署)**:① 深/淺主題切換+**預設淺色**(CSS custom properties 兩份色板:淺=宣紙米白紙紋+墨字、琥珀調深 #8a5f1e 過 AA;深=原定稿原值不動;localStorage `arcrun_console_theme`,head 預載防閃色;入口=登入/setup 小鈕+側欄項+設定頁開關,dashboard 頁同步支援)② 登入/首次設定置中(根因 `.view.on{display:block}` 蓋掉 authwrap flex → 補 `.authwrap.view.on{display:flex}`)③ fetch 斷網裸「Failed to fetch」→ `friendlyErr()` 誠實文案「連線中斷」+駕駛艙/dashboard 60 秒定時器常駐自動重試。驗證:tsc 0、vitest 26/27(同 pre-existing)、三層跳脫驗證全綠(#24 手法)、淺色板 WCAG 對比實算(正文 12.2:1/琥珀 4.82/ok 4.58/err 5.17)。金琥珀例外(按鈕漸層/狀態球/toast/gcenter)兩版刻意不變。 > > **2026-07-02 上個 session(雲端工人 T-loop1d,Arcrun#3 搜尋/控制台頁 v0,跨多 repo 第二次壓測)**: > - **實作**:`cypher-executor/src/routes/console.ts`(GET /console,單檔 HTML+原生 JS 薄殼)+ `index.ts` 掛載。三查詢區全打既有端點:`/kbdb/search`、`/workflows/search`(同源,X-Arcrun-API-Key)、components 打「同帳號」`arcrun-registry..workers.dev`(WORKER_SUBDOMAIN 現算,不硬打官方 registry.arcrun.dev)、recipes 打 `/public-recipes`(公庫免 auth)。vectorize 狀態直接讀 KBDB search 回應的 `mode`/`capability_hint`,沒開新端點。tsc/vitest 綠(既有 1 個無關失敗,`不存在的零件回傳失敗` 測試,stash 驗證 pre-existing)。commit `981dc25` 已 push Gitea main。 > - **框架級發現(mistakes #23)**:`acr update` 部署源永遠是 GitHub codeload tarball(`uncle6me-web/Arcrun` main),跟本地/Gitea checkout 完全脫鉤——雲端工人只能碰 Gitea(D20),照 issue 字面指示跑 `acr update` 會部署到蓋掉自己剛做的改動的舊版,回報成功卻是假綠。本次改用手工複刻 `injectWranglerConfig` 注入邏輯(CF API 查真實 KV id 對齊 dry-run)、直接 `wrangler deploy` 單一 worker(cypher-executor),避免碰 GitHub 又讓改動真的上線;部署後立刻 restore `wrangler.toml`,不留帳號 id 進 git。**此路只適合單 worker 小改動**;牽動多 worker 時的正解懸而未決,留 leo 裁(部署繞開 GitHub 鐵律 vs acr CLI 硬綁 codeload.github.com 的結構性衝突)。 > - **端到端驗證(leo21c,curl 證據)**:`GET /console` 200;`GET /kbdb/search?mode=semantic` 200(誠實降級 keyword + capability_hint,該帳號 KBDB 目前 0 entries,真實狀態非 bug);`GET /workflows/search` 200(0 筆,該帳號無 named workflow);`GET /public-recipes?q=telegram` 200 真回 `telegram_send` 紀錄;`GET arcrun-registry.leo21c.workers.dev/components/search` 200。Playwright 瀏覽器點擊測試因沙盒 outbound proxy policy 擋 registry.arcrun.dev/workers.dev 連線未能跑通(環境限制,非部署問題),改以 curl 逐端點驗證 + 手動覆閱 JS 邏輯替代。 > - **SDD 缺口**:issue 要求新 SDD 目錄 `docs/3-specs/arcrun/search-console/` + 改 pre-write-guard `KNOWN_SDDS` 白名單——但本 repo 整個 `docs/` 與 `.claude/` 都在 `.gitignore`(只存在 leo 本機),Gitea clone 拿不到,也無法確認 SDD 白名單機制實際路徑。未落地此步驟,回報 issue,等本機 CC 或 leo 補。 > - Arcrun#3 issue comment 已回報(署名 `[cloud-worker]`),sprint 表 T-loop1d 已勾。 > **2026-06-28 上個 session(issue #13 零件退役殘留收尾,步驟1+2 done)**: > - **issue #13 步驟1(merge caa8e10)**:3 個示例 yaml 的 `component: telegram` → recipe canonical_id `telegram_send`(commit a234201)。 > - **issue #13 步驟2(merge 764f657)**:清 `cli/src/commands/parts.ts` 降級零件殘留——telegram/gmail/sheets/line 改 recipe canonical_id、移除已刪的 ai_transform_compile/run(commit 225aa9f)。 > - **關鍵發現①(gmail 假綠避免)**:gmail **讀取**(`fetch_unread` / `action: list`)**無對應 recipe**,硬塞 `gmail_send`(寄信)=語意不符的假綠 → **留 TODO 待 seed 補 `gmail_list`**,不硬塞。 > - **關鍵發現②(第三污染源是設計非殘留)**:#13 提的「offline validate 不檢查零件」是 by design(offline 刻意跳過遠端查),**不當 bug 修,留 issue**。 > - **教訓沉澱**:parts.ts 是手寫常駐清單必 stale → **退役 SOP 要同步清「AI 搜尋零件的三個源」**(示例 yaml / parts.ts / validate)。已記 mistakes #22 + card [[零件退役要清三源]]。 > - **未 push/merge 由總管統一處理**(本 session 只 wiki-capture)。issue #13 步驟1+2 done;validate 缺口留 issue。 > > **2026-06-27 上個 session(issue #8 地基1 + wiki-init 補骨架)**: > - **wiki-init 補骨架**:wiki 已初始化過(push 檔活躍),補了從沒建的 pull 層——`cards/decisions/` 13 張決策原子卡(Haiku 改寫 11+範本 2,含 gloss/實體/typed-edge)、TAXONOMY 換成 arcrun 軸(子系統/形態)、principles 填 13 條、INDEX 真實視圖。raw source 0 異動,無真斷鏈。 > - **issue #8([地基1] workflow description slot + search_workflow,北極星入口)**:新開 SDD `docs/3-specs/workflow-discovery/`(白名單已加)。leo 拍板 4 點(方案C雙寫/Q2 description 由操盤CC據實生成用戶可改/提示式回填/base通用entry_type filter)+ 方向①(MCP 改打 /webhooks/named)。 > - ✅ **已實作 tsc 全綠**:1.1 `/webhooks/named` 強制 description|2.2+Q4 KBDB base 通用 entry_type filter(改4處:searchEntries/semanticSearch/route/proxy)|2.1 部署雙寫 embeddable entry(注意 KBDB 用 metadata_json 字串)|3.1 cypher `/workflows/search`|3.2 MCP `u6u_search_workflows`|4.1 `/workflows/backfill-search-entries`|1.3b `GET /webhooks/named` 補 description/created_at 欄位。 > - ⏸ **卡待總管定**:Phase 1.2/1.3(MCP deploy 改打 /webhooks/named)卡在 ①-a/b/c——實作期發現 /webhooks/named 吃 graph 非 YAML,YAML→graph 編排寫在 CLI push.ts 介面層,MCP 複製=違 rule 07。①-c(先通債另開 issue)我推薦,待總管定。 > - **完成標準**:tsc 綠≠完成,框架級待 leo21c 端到端實證(強制填擋空/搜尋命中/租戶隔離/降級 hint/MCP 不再 404)。issue open。 > - **已 merge 進 main**(fast-forward,3 commit:934b926 #4/5/7/8 功能 / 558e80b wiki-init / 5d38b59 #11 薄殼對齊)+ push origin main。repo Actions `enabled:false`(leo 關),merge **未觸發部署**。**merge≠部署**:#5/#7/#8/#11 端到端待 leo21c wrangler 直推(Mira 線)。 > - **issue #11 全做**(P0 run 死端點/P1 list 同源/R4 防複發機制:對照清單+smoke+自驗能攔);P2 validate 依賴 #10、tag resource_id 語意債待方向①。 > - **issue #12(self-hosted MCP 缺 CYPHER_EXECUTOR binding)✅ 修+merge main(commit 222a382)**:根因非總管假設的 strip 誤清,是 **TOML 坑——mcp toml `services=[...]` inline 在 [vars] 後被吸成 vars.services**(binding 消失);修法 inline→`[[services]]` array-of-tables(對齊官方 cypher)。wrangler --dry-run 雙向驗(修法後 binding 在/舊版變 env.services)。**端到端待 leo21c acr update 重部 MCP**;連帶解鎖 #11 self-hosted MCP + mira #6 門鈴 + acr push。見 mistakes #21。 > - 署名鐵律:跨 repo comment 開頭 `[arcrun CC]`(#12 issue 慣例,非本次 bug)。 > > **2026-06-26 上個 session(issue #4/#5/#6/#7 一批)**: > - **#6**(base `PATCH /records/:id`):✅ updateRecord + route,三表 append-only 不破。tsc 綠,端到端待 leo21c。issue open。 > - **#4**(07-thin-shell §3.1 自力救濟階梯 + code-node 規則):✅ 兩份 07 同步 + 02-forbidden §5.2 連動。§3.5 階梯(自家API→補API/第三方→workflow/code-node 補丁/純計算→code-node)。**code-node 只定規則未實作零件**(wishlist C1,另案)。純文檔。 > - **#5**(KBDB 查詢缺口,普世視角):source 過濾 ✅(json_extract metadata_json,零建表)+ cypher proxy 透傳;documents 聚合 ❌不做(走 graph MCP);DELETE proxy ⏸擱置(依賴頂層 T8);embed-on-write →併#7;能力對照文件 ✅ `docs/4-guides/kbdb-capabilities.md`。 > - **#7**(vectorize 全包,從零):✅ base embed 模組 `kbdb/src/embed.ts`(精耕只 embed `metadata.embed:true`)+ entries route 接 embed-on-write/semantic search/capability_hint + kbdb_embed 開關(config/deploy ensureVectorizeIndex REST/init 問)+ MCP kbdb_search mode:semantic。**抓修 deploy 順序 bug**(embed 注入要在 stripOfficialOnlyBindings 之後,否則 [ai] 被清)。kbdb/cypher/cli/mcp tsc 全綠,**端到端待 leo21c 部署開 Vectorize index**。 > - SDD:kbdb-base tasks Phase 10(#6)/11(#5)/12(#7)。4 issue 各 comment 回報、**全留 open**(待端到端/頂層)。**未 commit**(待人決定)。 | 項目 | 狀態 | |------|------| | **Phase** | Credential Primitives TS → WASM(§0.1-0.5 完成,0.6-1 進行中) | | **主線** | kbdb-base §7.5 已上線(公庫/私庫雙向、UUID 身份、市場數據) | | **近期完成** | MCP self-hosted bug 三修(2026-06-08) | | **已部署(2026-06-09 上午)** | §8 P0 cron 止血;§7.8 onboarding P0/P1/P2;CLI 1.3.3 publish | | **已部署(2026-06-09 下午,Haiku 壓測暴露)** | **http_request+claude_api+kbdb_upsert_block+km_writer 假綠根因修復**(非 2xx 回 error envelope,4 worker 已 deploy);**acr run self-hosted 修復**(本機 YAML 直接走 /cypher/execute 不需先 push + res.ok 擋 + .yaml 容忍);**D1-in-update 修復**(update 漏建 D1 → 補 ensureD1Database,D1 已建 count:1);**CLI 1.3.4 publish**;llms.txt/.env.example 加 D1 Edit 權限 | | **Haiku 自主壓測(test_arcrun/5)結論** | onboarding 治好(兩輪都裝+init 沒跳過、走對路建 recipe 不建零件);但暴露 4 真 bug(見下);Haiku 仍會假綠(curl 繞過說成 arcrun 成功、D1 沒建謊報成功)→ 印證「執行真相要系統能驗,不能信 AI 嘴巴」 | | **已驗證(2026-06-13 壓測 leo21c)** | **401 假綠根治全鏈驗證**:host fn error envelope → 零件 parsed["error"] → cypher isFailure(),leo21c 實測 401 回 `success:false`(真紅);**`{{credential.notion_token}}` 注入實證打通**:真讀到 Notion Recipes 資料(「蕃茄蘑菇燉雞」+ iCook 連結),§8 credential 機制生效;**acr update 部署系統一輪修完**(CLI 1.3.5 部署假綠露出、pnpm-workspace 缺檔補齊 23/23 全綠、1.3.6 失敗帶 stderr、1.3.7 manifest 跳過、1.3.8 共享 install 治本);check-release.sh + local-deploy.sh 全形括號 set-u crash 修復 | | **已完成(2026-06-14,matrix 重整交棒)** | **① SDD 遷移收尾**:.agents/specs → docs/3-specs 全改(hooks5/rules5/CLAUDE.md/wiki + 2-architecture 鏡像/README/HANDOFF/4-guides),.agents 刪除,pre-write-guard 白名單刷成 10 個實存 SDD(SessionStart + rule4.3 已驗)。**② KBDB 資料層 MCP 薄殼**(kbdb-base Phase 9.1):mcp/src/tools/kbdb_data.ts 6 工具(template/record/query/search),守鐵律不給建表/SQL,mcp tsc exit 0;CLI(9.2)後補。**③ 修 LI M3 斷鏈**(見 mistakes #15):skills/examples 5 工具 + sync 從 v3 /blocks /search 改打基本盤 /entries,base 加 page_name 過濾,search 誠實降級 LIKE,mcp+kbdb tsc exit 0 | | **已完成(2026-06-14 晚,HANDOFF §3b)** | **修 MCP self-hosted 認證 401**(mcp-account-source.md §5.5):根因=MCP partner-auth 把 Bearer 拿去 KBDB 驗證 partner,namespace 明碼非註冊 partner→401;cypher 端 X-Arcrun-API-Key 不驗證直接當分區 key→CLI 通。修法①+②:① `MULTI_TENANT=false` 時 partner-auth 把 Bearer 明碼直接當 org_namespace(types/middleware/wrangler,官方 SaaS 行為不變共用同碼);② mcp-setup 把 api_key/namespace 寫進 .mcp.json `headers.Authorization`(裸檔不送 header 是次因)。mcp+cli tsc exit 0、partner-auth 9 tests 綠 | | **已處理(2026-06-25,issue #3 官方庫誤寫善後)** | **① 清理 SOP runbook 備妥**(`docs/5-records/2026-06-24-official-kbdb-cleanup-leo-misdelete.md`):14-E 遷移期 mira 誤寫 ~11 萬 `owner_id=leo` 進官方 prod `arcrun-kbdb`(database_id `0c580910…`)。三道防誤刪閘(備份先行 d1 export → 核實 entry_type+時間範圍確認範圍乾淨 → 刪後驗證 count=0+孤兒 entry_values=0+其餘不受影響)。**補關聯刪除範圍**:`entry_values`(slot-link,外鍵指 entries)先刪孤兒、`templates.created_by=leo` 單獨核實勿盲刪。**DELETE 不由 CC 跑**(不可逆+官方憑證+需人類明示,mindset §7)→ runbook 由 leo(官方運營方)親自執行。**【2026-06-25 已端到端執行完畢】** chaperone 模式逐步跑:核實誤寫 **111,368 筆**(value 93,790/note 13,671/block 3,907,全 06-15~06-24 遷移期、孤兒=0、無 leo template)→ 45MB 備份 → leo 點頭後 `DELETE FROM entries WHERE owner_id='leo'`(changes=111368)→ 驗證 leo 殘留=0/孤兒=0/官方庫其餘只剩 smoke_ns_1×2+null×1(3 筆烟霧殘留,非 leo)。備份已刪、`.gitignore` 補 `*.sql` 防誤 commit、gh issue #3 已回報客觀證據可關閉。**② 願景 acr migrate 雙向遷移記 BACKLOG.md**(對齊 wishlist C7,牽動 cli+cypher+kbdb,未來方向)。已 gh issue #3 comment 回報,**暫不 close 待 leo 跑完清理回報 count 歸零**。**③ 順手消 status 矛盾**:credential 401 真實狀態=**已端到端實證打通**(2026-06-13 Notion `{{credential.notion_token}}` 真讀到資料),tasks.md 8.5 原標 `[ ]`(OpenAI 路徑沒走)已補 `[x]`(Notion 達同等證據,機制與服務無關)。**純文檔/runbook,無 code 變動** | | **已修+merge prod(2026-06-24,issue #2 框架 bug)** | **self-hosted cypher KBDB_BASE_URL 注入缺口修復**(總管經 GitHub issue #2 交辦):根因=`injectWranglerConfig` self-hosted 分支只注 database_id/MULTI_TENANT,**漏注 KBDB_BASE_URL** → cypher `/kbdb/*` fallback 到官方 `arcrun-kbdb.uncle6-me`(self-hosted 資料寫進官方庫、隔離破損)。修:deploy.ts self-hosted 分支加 `KBDB_BASE_URL` 改寫成 `arcrun-kbdb..workers.dev`,比照既有注入模式;init/update 共用此注入點一處修兩條路。驗:tsc exit 0、真實 cypher toml 注入 subdomain=leo21c → `arcrun-kbdb.leo21c.workers.dev`(comment 行不動)。**已 merge main+push**(commit 9c4333d、merge ba00b98)、**CLI npm publish 1.3.13**(修的是 CLI 注入邏輯 → self-hosted 用戶裝 npm 套件才到手,光 git 不生效;local-deploy.sh §6 自動 bump+publish;release-check 全綠)、**issue #2 已關閉**。**端到端落庫實證歸 mira dogfooding 帳號**(需 leo21c token 跑 acr update + wrangler d1 execute 收綠燈,不卡本框架修復)。⚠️ 與 issue 描述出入:cypher toml **本就有** KBDB_BASE_URL(寫死官方),比「沒有」更糟(`??` fallback 根本不觸發)→ 修法是就地改寫而非新增。**慣例落地**:總管↔arcrun 交辦走本 repo GitHub issue(已寫進 CLAUDE.md)| | **已部署+端到端驗收(2026-06-15,總管交棒 3 件)** | **① CLAUDE.block.md 重寫**(HANDOFF §6,Haiku 能懂):補三盲點=recipe 是公共投稿非私人腳本/缺能力補 API 不准 recipe-工作流拼裝(附口訣)/自製零件退場路徑(claude_api 刪、kbdb 走 acr kbdb 薄殼、假零件改 recipe);README 零件vsrecipe 段同步對齊。**② cypher proxy 補 /kbdb/entries CRUD**(kbdb-base 9.6,解鎖 mira _kbdb_client.py 主線):POST/GET list/GET :id/PATCH :id 純轉發基本盤;租戶隔離同 9.5(寫入注 owner_id、list 強制本租戶、PATCH 剝 owner_id、刻意不開 DELETE)。**③ arcrun_report_feedback 改打 /entries**(kbdb-base 9.7,9.4 漏網):舊 POST /blocks 是死 route(404 假紅)→改 entry_type=agent-feedback。**端到端 prod 驗收全綠**:無key→401、跨租戶 list count=0、owner_id hijack 被剝、page_name lookup 通、/blocks→404 確認、agent-feedback 寫入經 proxy 讀回 count=1。cypher+mcp tsc exit 0、已部署官方 58309bb9、CLI npm 1.3.12、smoke 資料已清。**交棒 mira**:leo21c 改 _kbdb_client.py 打 cypher /kbdb/entries 即可遷移 | | **已部署+自驗(2026-06-15,HANDOFF §6b 部署斷層解決)** | **leo21c cypher 落後 → 已重部,`/kbdb/entries` 回 200**(解鎖 mira 14-A 主線遷移)。**根因不是 GitHub lag**(origin/main==本地,含 entries route):① `acr update` 的 content-hash manifest(deploy.ts:198-225)把 cypher 當未變動跳過 → `--force` 清空 manifest 全部重部;② **更深陷阱**:repo `.env` line 3 active `CLOUDFLARE_ACCOUNT_ID=58309bb9`(官方)被 CLI 載入覆蓋 config.yaml 的 leo21c `51a01bfa`(env>config,config.ts:174)→ leo21c token 對官方帳號認證 → KV「Authentication error」中止 → 解:部署時 `CLOUDFLARE_ACCOUNT_ID=51a01bfa… acr update --force`(記憶 [[selfhosted-deploy-account-override-trap]])。**部署 23/23 全綠**(含 cypher/kbdb/mcp)+ seed(10 API+23 auth)+cron migrate。**自驗**:`/kbdb/entries?limit=1`→200 真 body(非假綠)、`/kbdb/templates`→200、`/kbdb/records?limit=1`→404(**非回歸,proxy 本就無 bare list route,只有 POST + by-template/:t + :id**);缺口② MCP initialize(Bearer leo)→200(MULTI_TENANT 注入生效、KBDB binding 隨 mcp 上線)。全域 acr 已升 1.3.12(npm 本就有,非重發)。**純部署無 code 變動** | | **已部署(2026-06-15,MCP self-hosted 401 注入缺口修補)** | **根因=部署沒注入 MULTI_TENANT**(非 code bug):partner-auth.ts MULTI_TENANT 分支對,但 mcp toml 該行原是註解、injectWranglerConfig 注 KV/subdomain 卻漏注 MULTI_TENANT → worker env undefined → 走 partner-key → self-hosted 401。修:deploy.ts 加 injectMultiTenant(DeployContext.selfHosted;init/update 帶旗標;mcp toml 改 active [vars])。本地驗注入真實函式 PASS(mcp/cypher 各 1 行 active MULTI_TENANT=false 在 [vars] 下);官方 MCP partner 路徑回歸 401(不變)。CLI npm 1.3.11。**端到端交棒 mira**:leo21c 重跑 acr update(CLI≥1.3.11)→ curl Bearer leo /mcp 應 200。SDD §5.5.1 | | **已部署+端到端驗證(2026-06-14 晚)** | **KBDB CLI 薄殼解卡(9.5+9.2)已上 prod**:cypher `routes/kbdb-proxy.ts` 純轉發 + CLI `commands/kbdb.ts`(acr kbdb)。**端到端煙霧測試全綠**(curl cypher.arcrun.dev/kbdb/*):無key→401、建template→200(created_by=租戶)、租戶隔離 query+search 都 0 筆跨租戶。CLI npm 1.3.10。**煙霧測試抓到 2 真 bug 並修**:①proxy fallback 寫死舊死的 kbdb.finally.click→改現役 arcrun-kbdb + cypher [vars] KBDB_BASE_URL;②kbdb searchByTemplate `\|\| true` stub 讓 owner_id 過濾失效(跨租戶洩漏)→改 SQL JOIN entries 真過濾。三 worker(cypher/mcp/kbdb)都已 deploy 官方帳號。**self-hosted MCP 那條未測**(官方不設 MULTI_TENANT,待 leo21c 部署 HANDOFF §3)。⚠️ prod 留了 smoke_contact 測試 template(掛 smoke_ns_1,不污染真租戶,template 無 delete API) | | **待處理** | §8 P1/P2 recipe/workflow list 遷 D1(需 D1 先穩,現已可建);4 份 inline host fn 抽共用 helper dedup;arcrun.dev/llms.txt serve;mcp worker 偶發 fetch failed(網路抖動,重跑即過,非 bug);**LI M3 實環境驗收**(需 KBDB_BASE_URL 跑 sync + 叫工具,目前只驗 tsc+dry-run);**mira 波次2 主線遷移**(arcrun 端 cypher 已部 leo21c、/kbdb/entries 實測 200,**已交棒待 mira CC 改 _kbdb_client.py**)|~~KBDB /kbdb/entries 缺口~~✅~~MCP report_feedback 死 route~~✅~~self-hosted MCP 端到端實測~~✅(2026-06-15 leo21c initialize 200,見上)~~leo21c cypher 落後/部署斷層~~✅(2026-06-15 §6b 解)~~self-hosted cypher KBDB_BASE_URL 漏注入(issue #2 隔離破損)~~✅(2026-06-24 merge prod,端到端待 mira 帳號驗) | --- ## 🔄 進行中的 Task ### ~~credential-primitives-wasm~~ → 📦 已封存(2026-07-21) **不再是進行中的 task**。卷移入 `system-dev/docs/3-specs/archive/credential-primitives-wasm/` (design.md `status: closed`)。Phase 0-3 + 7 + 8 全數完成:auth_static_key / auth_service_account / auth_oauth2 WASM 零件到位;`credential-injector.ts`、`jwt-signer.ts`、 `BUILTIN_API_RECIPES` / `BUILTIN_CREDENTIALS_MAP` 全數移除(grep 0 筆,T10 於 2026-07-20 commit `20c7610`)。 **credential 現行做法**:CF Workers per-script Secrets(密文)+ D1 目錄(metadata/secret_ref), arcrun 不自管加密金鑰,`crypto_decrypt` host function 已成永遠回失敗的 stub。 規範見 `.claude/rules/01-tech-stack.md`「Credential 儲存規範」。 ⚠️ **封存 ≠ 全部做完**(要做需另立新 SDD,不得掛回封存卷): - **`auth_mtls` 從未實作** — `registry/components/auth_mtls/` 不存在,mTLS 認證不支援 - **原 7.6 self-hosted auth 鏈端到端未驗** — `global_fetch_strictly_public` flag 是否真解 same-zone 1042,在自架帳號上從未實測 - 端到端測試 1.7/1.8/2.6/3.5/3.6/5.1 無驗證記錄 ### kbdb-base - [x] §7.5:公庫/私庫雙向、UUID 身份、市場數據(2026-06-07 deploy) - [x] §8 P0:cron 止血(2026-06-09)。scheduled.ts 每分鐘 list → 單一 key `cron-idx:_all` get(新增 lib/cron-index.ts;webhooks-named push/delete 維護;migrate-cron-index 一次性遷舊)。1440 list/日 → 0。cypher tsc exit 0 - [ ] §8 P1/P2:recipe/workflow list 遷 D1(透過 kbdb worker /entries HTTP API 雙寫,**不加 binding**,用 cypher binding 狗糧)。另開 session 做(大、易出錯,需專注+壓測) - **狀態**:架構拍板(richblack 2026-06-09:用 kbdb /entries HTTP,service binding 才需問),未動 code ### onboarding(self-hosted-init §7.8,2026-06-09 交付) - [x] P0:acr init 偵測先於動作 + 裝完驗收(cli/src/lib/preflight.ts)。冪等。 - [x] P1:acr whoami(+--json)+ MCP arcrun_whoami(AI 別自己 curl 猜帳號) - [x] P2:mcp-setup 寫完印「請重啟 client」(D3) - [~] P3(部分,2026-06-09 push c152f5f):repo 加 `.env.example` 範本(每格白話說明、值留空, `.gitignore` `!.env.example` 放行)+ llms.txt 教 AI「先 cp .env.example .env、帶用戶填值」。 已 push main → 公開 repo 生效(raw 200 已驗)。仍待:arcrun.dev/llms.txt serve(landing/public 缺檔)。 ### LLM Wiki 建設 - [x] 階段一:目錄結構建立、分類規則表、檔案掃描(101 個 .md) - [x] 階段二:mistakes.md + decisions-summary.md + INDEX.md + status.md(本檔) - [x] 階段三:文件遷移執行(2026-06-14 完成)— SDD 實體已在 `docs/3-specs/`;hooks(5)/rules(5)/CLAUDE.md/wiki 全部從舊 `.agents/specs/` 改指 `docs/3-specs/`;`.agents/steerings/tech.md`(已與 `docs/3-specs/tech.md` 同步) 連同空 `.agents/` 刪除。SessionStart hook 與 pre-write-guard 白名單(10 個 SDD 目錄全對齊)已驗證。 另收尾活指針:docs/2-architecture/ 鏡像、docs READMEs / HANDOFF / 4-guides 的 arcrun-local 指針一併改新路徑。 刻意保留:docs/5-records 歷史 incident/migration 記錄、跨 repo(polaris/mira、matrix/kbdb)路徑、 docs/3-specs/** SDD 內文(改 SDD 內文=change,需另確認)、README 遷移對照表。 - 🟡 待補:modules/ (cypher-executor、wasi-shim、recipe-system 等) --- ## ⚠️ 已知問題 / 待處理 > 2026-06-09 更新:已解項標 ✅;🔴/🟡 為仍待處理。本次 Haiku 壓測新發現的 bug 加在表內。 | 問題 | 優先級 | 狀態 | 備註 | |------|--------|------|------| | ~~**credential 注入 401**~~ | ✅ 已解 | **8.1-8.5 全完成(2026-06-25 確認)** | 機制(auth_static_key `resolve_credentials` + graph-executor `resolveCredentialRefs`)已端到端實證:2026-06-13 Notion `{{credential.notion_token}}` 真讀到資料(同等於 8.5 OpenAI 驗收,機制與服務無關)。tasks.md 8.5 已補 `[x]` | | §8 P1/P2 recipe/workflow list 遷 D1 | 🔴 高 | 架構已拍板未動 code | 走 kbdb /entries HTTP 雙寫不加 binding;依賴 D1(現已可建)。另開 session 做 | | 4 份 inline http_request host fn 抽共用 helper | 🟡 中 | 待 dedup | http_request/claude_api/kbdb_upsert_block/km_writer 各自複製貼上同段(這次假綠修也是逐份改) | | `arcrun.dev/llms.txt` 404 | 🟡 中 | 未 serve | landing/public 缺檔;GitHub repo 內正常(test/5 走 GitHub 不阻擋) | | MCP account-source | 🟡 中 | 記錄中 | self-hosted MCP 指官方不指自己(§5.2 已知) | | recipe submitted 後沒有 uuid | 🟡 中 | 待驗 | submit-p 應回 uuid,CLI 拿不到 | | ~~KV list 爆量~~ | ✅ 已解 | §8 P0 部署 | cron list→單 key get,1440/日→0(2026-06-09) | | ~~onboarding 缺陷(4 項)~~ | ✅ 已解 | §7.8 P0/P1/P2 + P3 部分 | CLI 1.3.4,Haiku 壓測證實裝+init 不跳過 | | ~~D1 建不起來~~ | ✅ 已解 | update 補 ensureD1Database + token 加 D1 權限 | 2026-06-09,D1 已建 count:1 | | ~~http_request 401 假綠~~ | ✅ 已解 | host fn 非 2xx 回 error envelope | 4 worker deploy;auth_sa 不套 | | ~~acr run self-hosted 404 爆~~ | ✅ 已解 | 本機 YAML 走 /cypher/execute + res.ok 擋 | CLI 1.3.4 | | ~~npm publish~~ | ✅ 已解 | token 在 .env NPM_API_TOKEN | 走 local-deploy.sh step 6,別手動繞 | --- ## 🧪 測試進度 ### 壓測 2026-06-08(Haiku 乾淨重測) - **目標**:kbdb-base §7.5 公庫/私庫 + UUID 驗收 - **對象**:Haiku(全程自主操作) - **測試檔**:`/test_arcrun/3/test_to_haiku.md`(9 個步驟) - **撞牆記錄**:`/test_arcrun/撞牆記錄.md` - **狀態**:準備妥當,awaiting Haiku run ### 前次壓測(2026-06-07) - ✅ kbdb-base §7.5 上線前驗收(16 項通過) - 📋 發現 onboarding 四缺陷(Cold.1-8) --- ## 🚫 封測狀態 **推遲**(richblack 2026-04-19 決定,後延至 2026-06-08 依舊推遲) **原因(2026-07-21 更新)**: - ~~Phase 1-3(auth WASM + 清除違規 TS)未完~~ ✅ **已完成**,credential-primitives-wasm 卷已封存 - 殘留:`auth_mtls` 未實作、self-hosted auth 鏈端到端未驗(均需另立新 SDD) **啟動條件**:原「Phase 1-3 完成」已達成;壓測 Haiku 自癒能力驗證仍待做。 封測是否啟動屬 leo 的決定,不由本檔認定。 --- ## 📋 下一步(優先級)— 2026-06-25 更新 ### 🔴 最優先 1. [x] ~~**credential 注入 401 修復**~~ ✅ **已端到端實證打通**(2026-06-13 Notion `{{credential.notion_token}}` 真讀到資料;tasks.md 8.5 已補 `[x]`)。機制完成,非阻擋。 2. [ ] **§8 P1/P2 recipe/workflow list 遷 D1**:D1 現已可建(依賴解除)。走 kbdb /entries HTTP 雙寫不加 binding。 大、易出錯,另開乾淨 session + 壓測。**← 現在的真.最優先未做項。** ### 🟡 本周 3. [x] ~~credential-primitives-wasm Phase 0.6-0.7 → Phase 1-2(auth WASM 零件)~~ ✅ 完成,卷已封存 4. [ ] 4 份 inline http_request host fn 抽共用 helper(dedup;這次假綠修是逐份改的) 5. [x] ~~清除 cypher-executor 違規 TS(Phase 3)~~ ✅ 完成(三者 grep 皆 0 筆,T10 於 2026-07-20) 5b. [ ] **`auth_mtls` 零件從未實作**(封存卷殘留缺口,要做需另立新 SDD) 5c. [ ] **self-hosted auth 鏈端到端驗收**(原 7.6,同上需另立 SDD) ### ⚪ 未來 6. [ ] `arcrun.dev/llms.txt` serve(landing/public 補檔) 7. [ ] 補 wiki modules/(文件遷移階段一~三已於 2026-06-14 完成) 8. [ ] MCP account-source、recipe submit uuid 回傳 --- ## 🔗 相關資源 | 資源 | 位置 | 用途 | |------|------|------| | 總進度 | `docs/3-specs/arcrun/arcrun.md` | 全景進度表 | | 現行 active SDD | `bash system-dev/scripts/sdd-active-check.sh` | 唯一判準=frontmatter `status: active`(D35 單一活性) | | ~~credential-primitives-wasm~~(closed) | `system-dev/docs/3-specs/archive/credential-primitives-wasm/` | 已封存,勿當進行中 | | 壓測 case | `/test_arcrun/2/test_case.md` / `3/test_to_haiku.md` | 功能驗收 | | 事件復盤 | `/docs/incidents/` | 歷史踩坑 | | 常犯錯誤 | `.claude/wiki/mistakes.md` | 自檢清單 | | 架構決策 | `.claude/wiki/decisions-summary.md` | 設計參考 | --- ## 版本日誌 | 日期 | 變動 | |------|------| | 2026-06-08 | 初建。MCP bug 修正完成、wiki 系統搭建、壓測 Haiku 進行中 | | 2026-06-08(補) | Haiku 壓測發現 Cold 驗證缺陷:init 無強制檢查點 → 假綠風險。記入 mistakes.md §11 | ## ✅ 2026-08-08 深夜|leo 的 youlin 登入修好了(瀏覽器實證) 📍 **repo**:`matrix/arcrun`(`cypher-executor/src/index.ts` CORS 自動放行,commit `07cc7f5`) + `matrix/arcrun/.github-public/installer/scripts/deploy-all.mjs`(有注入的部署路徑) 三元組:`登入從斷到通 >> 靠 >> matrix/arcrun:cypher-executor/src/index.ts 從 WORKER_SUBDOMAIN 自動推導 portal origin` ### 決定性的一個差別 ``` 修復前 按登入 → 「連線中斷——請檢查網路後重試」 ← 請求根本送不出去(CORS 擋掉) 修復後 按登入 → 「email 或密碼錯誤」 ← 請求送到了、後端回答了 ``` **「連線中斷」vs「密碼錯誤」就是全部**——我用假帳號,被拒絕才是正確行為。 ### 對外四件(stage 環境,`*.workers.dev` 依 leo 08-07 判準屬例外) ``` ② DNS 172.67.138.117 ③ apiBase https://arcrun-cypher-executor.youlin-hsieh-dev.workers.dev ← 已注入 ④ CORS access-control-allow-origin: https://arcrun-rag-ui.youlin-hsieh-dev.workers.dev 頁內實測 fetch /console/auth-status → {ok:true, status:200} ``` 📌 **console 那幾行紅字是部署前的殘留**——同一個分頁不會清空。 用**頁內 `fetch` 實跑**才是可信的判準,不是讀 console 歷史。 ### 部署方式與它的誠實限制 用 `deploy-all.mjs`(**有注入**的腳本路徑,非手動 wrangler): `KV 9/9 齊、D1 有、subdomain ✓、24 顆全部成功、3 個 secret 完好未被洗掉`。 收工後 `git checkout` 清掉它弄髒的 15 個 `wrangler.toml`(已知行為,工作區歸零)。 🔴 **限制要說清楚**:這驗的是「**程式碼修對了**」,**不是「安裝器裝出來的結果**」。 **環境分離(t217)沒做完之前,這是能做到的最接近的驗證。** ### 今天真正被根治的 不是「補上 UI_ORIGINS」,是**讓它不再需要被注入**——portal 與 cypher 是同一子網域的兄弟, 位址推導得出來。**少一個必須注入的變數,就少一個會被漏掉的東西。**