---
name: status
description: 當前進度、進行中 Phase、已知問題、下一步（動態文件，每 session 更新）
metadata:
  type: project
  last_updated: 2026-08-07
---

# 當前進度（動態）

> **更新頻率**：每次 session 結束時更新此檔。
> **新對話開始時讀此檔第一段**（3 分鐘概覽）。

---

## 📍 當前位置

> **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.<subdomain>.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.<subdomain>.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.<ctx.workerSubdomain>.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 是同一子網域的兄弟，
位址推導得出來。**少一個必須注入的變數，就少一個會被漏掉的東西。**
