# thin-shell-alignment — Requirements > **來源**:InkStoneCo 總管 GitHub issue #11([全面對齊] CLI/MCP 薄殼漂移系統性盤點 + 防複發機制,leo 發起)。 > **狀態**:草案,待總管/richblack 確認方向後實作。 > **建立**:2026-06-27 > **白名單**:`.claude/hooks/pre-write-guard.sh` KNOWN_SDDS 已加(2026-06-27 issue #11 授權)。 --- ## 1. 問題:CLI/MCP 系統性漂移,根因=假綠 不是單點 bug,是**系統性漂移**。總管盤查 + 本 SDD 核實確認。 **根因(issue #11 git 史盤查)=假綠**:MCP deploy 工具建於 2026-06-06 commit「薄殼原則落地 + 部署一致性」——在宣稱「一致性落地」的**同一次 commit** 裡,MCP deploy 卻打了一個不存在的端點 `/workflows/deploy`(必 404、從未端到端跑過)。違 mindset §7「完成=客觀證據非口頭宣布」。**這就是要防複發機制的理由**——光靠「宣稱對齊」會再犯。 --- ## 2. 盤點結果(總管盤 + 本 SDD 核實,file:line) ### 🔴 P0 死端點(打的 route 不存在 → 404) | 能力 | 介面 | 打的端點 | 真端點 | file:line | 歸屬 | |------|------|---------|--------|-----------|------| | 部署 | MCP | `/workflows/deploy` | `/webhooks/named`(吃 graph) | `mcp/u6u_deploy_workflow.ts:22` | **#8 ①-a + #10 ①-b**(本 SDD 不重複改)| | 執行已部署 | CLI | `/webhooks/` | `/webhooks/named/:name/trigger` | `cli/run.ts:102` | **本 SDD P0** | ✅ 核實 CLI run 死端點:`run.ts:102` 打 `${executorUrl}/webhooks/${workflowName}`(缺 `/named/` 與 `/trigger`);真端點 `webhooks-named.ts:279` 是 `/webhooks/named/:name/trigger`。確認 404。 ### 🟡 P1 架構分歧(同能力不同來源) | 能力 | CLI | MCP | 問題 | |------|-----|-----|------| | list workflow | 直連 CF KV 讀 `workflow:` 前綴(`cli/list.ts:35`,`CfKvClient`)| 讀 KBDB `/records?template=workflow_metadata`(`mcp/u6u_list_workflows.ts:26`)| 讀不同源 → 列出的東西不一樣,違 rule 07 §4 | > **本 SDD 核實補充(比總管盤點更深,2 個額外問題)**: > 1. **key 前綴對不上**:CLI list 讀 `workflow:{name}`,但部署(`webhooks-named.ts` kvKey)寫的是 **`{apiKey}:wf:{name}`** → CLI list **永遠列不到新部署的 workflow**(前綴根本不匹配,不只是「來源不同」)。 > 2. **CLI list 直連底層儲存**:`CfKvClient` 直打 Cloudflare KV REST API(繞過 cypher)→ 違薄殼更深一層(薄殼不該直碰儲存),且 self-hosted 用戶得有 CF API token 才能 list。 ### 🟢 P2 單邊能力(一邊有一邊無) - CLI only:`acr validate`(/cypher/search)、`acr creds push`(/credentials)。 - MCP only:`u6u_search_workflows`(/workflows/search,#8 新增)。 - 已對齊✅:recipe 6 能力、execute 本機 YAML(兩邊都打 /cypher/execute)。 --- ## 3. 需求(issue #11 任務 → 可驗收條目) ### R1:P0 死端點修掉 - **R1.1** CLI run 改打 `/webhooks/named/:name/trigger`(真端點),不再 404。 - **R1.2** MCP deploy 死端點**不在本 SDD 修**(歸 #8 ①-a / #10 ①-b,避免三方重複改 deploy);本 SDD 僅記其存在 + 防複發機制要能攔它。 ### R2:P1 list 來源統一 - **R2.1** CLI 與 MCP list 都讀**同一個 API 端點** `GET /webhooks/named`(KV 源,`webhooks-named.ts`),CLI 停止直連 CF KV。 - **R2.2** list 讀 KV 源(部署寫入處),**KBDB search-entry 只供 search 不供 list**(職責分:list=KV 精確列舉、search=entry 語意檢索)。對齊 #8 雙寫設計。 - **R2.3** CLI list 改走 cypher proxy(薄殼不直碰儲存),self-hosted 用戶不需 CF API token 即可 list。 ### R3:P2 單邊能力盤點決策 - **R3.1** 逐項決定:該補齊對稱的(薄殼出貨標 §5「CLI+MCP 覆蓋同組能力」)vs 刻意單邊的(記明原因,如 `creds push` 屬 CLI 慣例)。 - **R3.2** 不強求每個端點兩邊各開(齊的單位是「能力」非「端點」,decisions-summary 2026-06-15 釐清)。 ### R4 ⭐:防複發機制(本 issue 治本核心,不可省) - **R4.1** 設計一個讓「假綠」無法再悄悄發生的機制。候選(design 評估擇一/組合): - **能力對照清單**:一張表「能力 × CLI 端點 × MCP 端點 × 同源?」,新增能力必填、review 對照。 - **end-to-end smoke test**:每個薄殼能力對真實端點跑一次(非 tsc 綠),死端點當場現形。 - **PR 證據要求**:新薄殼工具必附「打的端點在 server route 清單裡存在」的證據。 - **R4.2** 守 flag 紅線:smoke test 本機/手動跑,**非 CI 高頻輪詢**。 - **R4.3** 機制本身要可驗:能攔住一個**故意的死端點**(驗收標準,issue #11 明列)。 --- ## 4. 約束(頂層鐵律) - **C1 框架級**:改全 arcrun 用戶 → 先 SDD 確認方向。 - **C2 守 rule 07**:能力只實作一次;薄殼讀同一份來源、不直碰儲存。 - **C3 守 mindset §7**:完成=leo21c 端到端客觀證據(CLI/MCP 真打通 200 非 404),非 tsc 綠。 - **C4 三方協調**:#11(全面盤點+防複發)/ #8(deploy 強制+search)/ #10(編排下沉)有交集,**deploy 那條不重複改**(本 SDD 只盤點 + 防複發涵蓋它)。 - **C5 署名**:跨 repo comment 開頭 `[arcrun CC]`。 --- ## 5. 非目標 - ❌ 改 deploy 死端點(歸 #8/#10)。 - ❌ 把防複發機制做成 CI 高頻 gate(C2 flag 紅線、rule 05 §3)。 - ❌ 強求 CLI/MCP 端點 1:1(齊的單位是能力非端點)。 --- ## 6. 開放問題(design 回答 / 待拍板) - **Q1**:R4 防複發機制採哪個/哪幾個組合?(design 給推薦 + 為何) - **Q2**:CLI list 改走 cypher proxy,需不需要新 proxy 端點,還是複用 `GET /webhooks/named`?(後者已存在,傾向複用) - **Q3**:P2 單邊能力,哪些補對稱、哪些刻意單邊?(design 逐項給判準) - **Q4**:smoke test 放哪(CLI 自帶 `acr selftest`?獨立 script?)、怎麼「本機手動跑非輪詢」?