Files
Arcrun/system-dev/docs/2-architecture/02-forbidden.md
T
Leo 8d8b01d240 docs(sdd): credential-primitives-wasm 封存進 archive(T10 完成,卷已結案)
leo 2026-07-21 明令封存:卷已完成,留主目錄會讓未來 session 誤以為進行中。
最後一項 T10(廢除自管加密金鑰)已於 20c7610 完成(移除約 2500 行)。

- git mv 整卷 → system-dev/docs/3-specs/archive/credential-primitives-wasm/
  design.md status: closed;superseded_by 留空(據實:非被另一卷取代,是機制整個換掉)
- 卷首補「封存時仍未完成的項目」——逐條查 code 核實,不當作完成:
  真缺口=auth_mtls 從未實作、7.6 self-hosted auth 鏈端到端從未驗;
  另有勾選過期(auth_oauth2 其實已完成)與驗收條件已作廢(與現行 rule 07 牴觸)者
- 修好 14 處引用(原盤點 10 處,實際更多):session-start-load-sdd.sh 內容嚴重過期
  (把已完成 Phase 寫成進行中)→ 改為以 frontmatter 為判準;四份 rules、CLAUDE.md、
  BACKLOG、3-specs/README、deploy.ts、credentials.ts、wrangler.toml 逐一按性質處理
- 額外:system-dev/docs/2-architecture/ 有四個規則檔重複副本(06-08 遷移遺留)
  → 同步修好,否則留一份過期真相(今日第三次撞到「同一資訊兩份副本」的債)
- 02-forbidden.md §2.1 列的三個「待刪違規 TS」其實早已不存在
  → 改標刪除線+禁止重新引入(過期文件同時製造假待辦與假進行中)

驗證:sdd-active-check exit 0(active 仍恰一份=portal-auth);
session-start-load-sdd.sh exit 0;cypher-executor 與 cli typecheck 全綠;
測試 187/188(唯一 fail 為 pre-existing,stash 覆驗相同)。

未動:pre-write-guard.sh 的 KNOWN_SDDS 白名單不含 archive 路徑
(放寬 guardrail 需明確授權,留待決定)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 01:57:34 +08:00

7.7 KiB
Raw Blame History

禁止行為清單(零容忍)

這份清單由 .claude/hooks/*.sh 強制執行。違反會 block 工具呼叫(exit 2


第一類:零件實作層級的禁令

1.1 禁止在 registry/components/ 下建立 TypeScript 檔案

零件只能用 TinyGo.go)或 AssemblyScript.ts 但需 asconfig.json)實作,並編譯成 .wasm。 cypher-executor/registry Worker 或 .component-builds/ 內的 TS 不算零件邏輯,那是 WASI shim。

Hook 會擋:新增 registry/components/*/{檔案}.ts(除非目錄內有 asconfig.json 明確標記為 AssemblyScript)。

1.2 禁止建立新的 auth_* 目錄以外的 auth 實作

所有 auth 邏輯只能在:

  • registry/components/auth_static_key/
  • registry/components/auth_oauth2/
  • registry/components/auth_service_account/
  • registry/components/auth_mtls/

不可以出現 cypher-executor/src/auth-primitive/cypher-executor/src/lib/auth-*.tsauth-worker/credential-worker/ 等目錄。

Hook 會擋mkdirWrite 到上述違規路徑。

1.3 禁止用 wrangler init/generate 建立 auth/credential/jwt 相關的 TS Worker

Auth primitive 必須透過 component-worker-template/ 搭配 WASM binary 部署。

Hook 會擋bash 指令含 wrangler (init|generate) ... auth_... credential_... jwt_ 的 pattern。


第二類:cypher-executor TS 的禁令

2.1 禁止新增任何 credential / auth / jwt 相關的 TS 檔案

已存在但要刪Phase 1-3 範圍):

  • cypher-executor/src/actions/credential-injector.ts → 刪除(走 WASM auth primitive
  • cypher-executor/src/lib/jwt-signer.ts → 刪除(RS256 移入 auth_service_account WASM
  • cypher-executor/src/lib/component-loader.tsBUILTIN_API_RECIPESBUILTIN_CREDENTIALS_MAP → 整段刪除

Hook 會擋:新增任何路徑含以下關鍵字的 .ts 檔案:

  • credential-injectorcredential_injector
  • jwt-signerjwt_signer
  • auth-dispatcher 的 TS 若嘗試在裡面實作 credential 解密 / template 展開 / JWT signingblock

2.2 禁止在 cypher-executor 任何 TS 裡實作以下邏輯

這些邏輯全部屬於 WASM 零件職責:

  • AES-GCM 解密(crypto.subtle.decrypt)— 只准出現在 wasi-shim.tscrypto_decrypt host function
  • RSA-SHA256 簽章(crypto.subtle.sign with RSASSA-PKCS1-v1_5)— 只准出現在 wasi-shim.tscrypto_sign_rs256 host function
  • Template 展開({{secret.X}} / {{runtime.X}} 替換)— 只能在 WASM 零件內
  • PEM → PKCS8 解析
  • JWT header/payload/signature 組裝
  • Token exchange(拿 service account JWT 換 access_token
  • 具體 API call 實作(例如 gmail send / telegram sendMessage / google sheets append

Hook 會擋

  • Write/Edit 到 cypher-executor/src/ 下的 .ts 時,內容含:
    • crypto\.subtle\.decrypt 且檔名不是 wasi-shim.ts
    • crypto\.subtle\.sign.*RSASSA 且檔名不是 wasi-shim.ts
    • interpolateTemplate\{\{secret\. 的模板邏輯
    • BUILTIN_API_RECIPESBUILTIN_CREDENTIALS_MAP(新增用)
    • gmail.googleapis.com/gmail/v1/users/me/messages/send 類 hard-code API URL
    • api.telegram.org/bot.*sendMessage
    • sheets.googleapis.com/v4/spreadsheets
    • notify-api.line.me/api/notify

2.3 cypher-executor TS 的合法職責(允許)

  • HTTP routingHono routes
  • workflow 執行排程(graph-executor.ts
  • 呼叫 WASM 零件(透過 HTTP fetch 到對應 Worker URL,或 Service Binding fallback
  • 提供 host functionwasi-shim.tskv_get / crypto_decrypt / crypto_sign_rs256
  • KV/R2/Service Binding 存取封裝

第三類:架構層級的禁令

3.1 禁止新增 Service Binding

Cypher binding 不是 Cloudflare service binding。它是 YAML/KV 裡的 URL 清單。

零件串接(workflow 層)一律走 HTTP URL,不走 [[services]]

13 個現有的 SVC_* 綁定(cypher-executor/wrangler.toml,邏輯零件)是歷史遺產(效能優化),保留但不新增

2026-06-06 註(來源:credential-primitives-wasm Phase 7,該卷已封存於 system-dev/docs/3-specs/archive/本註記述的規則仍現行有效):self-hosted 的 cypher 與 auth worker 同在 {sub}.workers.dev zonecypher fetch() 打 auth 觸發 CF same-zone 1042(壓測階段 11)。未用 service binding 解(評估後廢:service binding 靜態、加/改要重 deploy cypher)。改用 global_fetch_strictly_public compatibility flagcypher wrangler.toml)讓 same-zone fetch 走公網前門 → 同 zone 也通,auth 維持 HTTP fetch、不加 binding。故本禁令不變。

Hook 會擋bash 指令含 wrangler tail 以外、涉及 [[services]] 新增的 patternEdit wrangler.toml 新增 [[services]] 區塊時警告確認。

3.2 禁止以「從 R2 取 WASM」為設計

平台內建零件已 bundle 進各自 Worker,不從 R2 取。 R2 只在 Phase 5(用戶自製零件)啟用。

Hook 會警告TS 中出現 env.WASM_BUCKET.get( 的新增 code(除非在明確標註的 Phase 5 user-submit 路徑中)。

3.3 禁止複製貼上 Worker 程式碼到新目錄

要改 gmail 零件 → 改 registry/components/gmail/main.go,重新編譯、部署。 不准新建 gmail-v2/new-gmail/gmail-worker/ 等目錄。

Hook 會擋mkdirWrite{component-name}-v2/new-{component-name}/{component-name}-worker/ 類路徑。

3.4 禁止在 SDK 內做 server 職責

  • 禁止SDK 裡做 server 端解密、credential-injector 重實作、workflow executor、auth recipe 解析
  • 允許SDK 做 HTTP thin wrapper + client 端加密(AES-GCM

第四類:流程層級的禁令

4.1 禁止沒讀 SDD 就動 code

00-sdd-protocol.md

4.2 禁止批次更新 tasks.md

每完成一個 task 就立刻 mark - [x]。不准「先全部做完再一次更新」。

4.3 禁止新建 SDD 而不事先與 richblack 確認

SDD 屬於架構決策,必須人確認。CC 不可以自行在 docs/3-specs/ 底下建新目錄。 例外:在現有 SDD 目錄內新增 requirements.md / design.md / tasks.md 的單檔補充(需在 CLAUDE.md 已註記的 SDD 範圍內)。


第五類:薄殼原則的禁令(詳見 07-thin-shell.md

5.1 禁止在薄殼介面(cli/src/、arcrun-mcp/src/)實作業務邏輯

能力只實作一次,放在 APIcypher-executor 端點)。薄殼只做介面轉換 + 暴露。

Hook 會擋(規則 7.x,範圍 cli/src/arcrun-mcp/src/ 的 .ts/.js):

  • 7.1 新增 seedApiRecipes / seedAuthRecipes / seedRecipes 編排函式(seed 是 API 行為,§4.1 反例)
  • 7.2 介面層拼裝 upsert(同函式內 PATCH + POST + upsert/找則改否則建 字樣)
  • 7.3 client 端「全部成功才做下一步」gate(deployFullyOk 類,§4.1 反例)

5.2 禁止用 recipe / 客製零件補 API 缺的能力

缺能力 → 去補 API endpoint,不是在 recipe 層拼湊或用零件繞過(hook 偵測不到語意,靠 code review)。

5.3 禁止同一 API 能力在不同介面用不同參數簽名 / 連不同帳號

validate 在 CLI 吃 YAML、MCP 卻要 api_key+graph = 底層分歧。薄殼差異只能來自介面慣例。 所有薄殼讀同一份身份來源(見 07 §4)。


Hook Block 訊息格式

當 hook 擋住一個操作時,訊息格式統一為:

❌ BLOCKED by arcrun CLAUDE rules
違反項:<禁令編號,例如 2.2>
原因:<簡短說明>
正確做法:<該改去哪裡、該用什麼方式>
參考:.claude/rules/<對應檔案>

這樣 CC 拿到錯誤訊息後有機會自行導正,不是被擋死就愣住。