From 8d8b01d2407f265e8288b66dc13ba9ce8f28f57c Mon Sep 17 00:00:00 2001 From: richblack Date: Tue, 21 Jul 2026 01:57:34 +0800 Subject: [PATCH] =?UTF-8?q?docs(sdd):=20credential-primitives-wasm=20?= =?UTF-8?q?=E5=B0=81=E5=AD=98=E9=80=B2=20archive=EF=BC=88T10=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E5=8D=B7=E5=B7=B2=E7=B5=90=E6=A1=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .claude/hooks/session-start-load-sdd.sh | 31 +++---- .claude/rules/00-sdd-protocol.md | 4 +- .claude/rules/02-forbidden.md | 13 ++- .claude/rules/03-component-architecture.md | 2 +- .claude/rules/04-current-progress.md | 92 +++++++++---------- BACKLOG.md | 11 ++- CLAUDE.md | 4 +- cli/src/lib/deploy.ts | 4 +- cypher-executor/src/routes/credentials.ts | 18 ++-- cypher-executor/wrangler.toml | 3 +- .../docs/2-architecture/00-sdd-protocol.md | 4 +- .../docs/2-architecture/02-forbidden.md | 2 +- .../03-component-architecture.md | 2 +- .../2-architecture/04-current-progress.md | 92 +++++++++---------- system-dev/docs/3-specs/README.md | 10 +- .../credential-store-migration.md | 0 .../credential-store-redesign.md | 0 .../credential-primitives-wasm/design.md | 19 +++- .../credential-primitives-wasm/tasks.md | 44 +++++++++ .../3-specs/arcrun/sdk-and-website/tasks.md | 4 +- system-dev/wiki/status.md | 43 +++++---- 21 files changed, 241 insertions(+), 161 deletions(-) rename system-dev/docs/3-specs/{arcrun => archive}/credential-primitives-wasm/credential-store-migration.md (100%) rename system-dev/docs/3-specs/{arcrun => archive}/credential-primitives-wasm/credential-store-redesign.md (100%) rename system-dev/docs/3-specs/{arcrun => archive}/credential-primitives-wasm/design.md (92%) rename system-dev/docs/3-specs/{arcrun => archive}/credential-primitives-wasm/tasks.md (88%) diff --git a/.claude/hooks/session-start-load-sdd.sh b/.claude/hooks/session-start-load-sdd.sh index a4cf830..a749e4b 100755 --- a/.claude/hooks/session-start-load-sdd.sh +++ b/.claude/hooks/session-start-load-sdd.sh @@ -18,8 +18,10 @@ cat <<'EOF' → 只能 TinyGo (main.go) 或 AssemblyScript,編譯成 .wasm 2. cypher-executor TS 裡禁止實作 credential/auth/JWT 業務邏輯 - → crypto.subtle.decrypt / sign 只准出現在 wasi-shim.ts 的 host function + → crypto.subtle.sign 只准出現在 wasi-shim.ts 的 host function + (crypto_decrypt 已廢除成永遠回失敗的 stub,credential 走 CF Workers Secrets) → {{secret.X}} template 展開屬於 WASM 零件職責 + (例外:*-seeds.ts 是資料宣告非呼叫實作,見 rule 07) → 禁止 hard-code gmail/telegram/sheets API endpoint 3. 禁止新增 Service Binding 綁零件 @@ -41,23 +43,20 @@ cat <<'EOF' 🚧 執行範圍:修改/建立/刪除 <檔案> 4. 每完成一個 task,立刻更新 tasks.md 的 [x],不批次 -🔥 當前進行中 Phase:Credential Primitives TS → WASM +🔥 當前 active SDD:以 frontmatter `status: active` 為唯一判準(不靠本檔硬寫) - SDD:docs/3-specs/arcrun/credential-primitives-wasm/ - 已完成:Phase 0.1-0.5(核心合併 + u6u-core 刪除) - 未完成硬前置: - - Phase 0.6 wasi-shim 加 host functions(kv_get / crypto_decrypt / crypto_sign_rs256) - - Phase 0.7 component-loader WASM runner 路徑 - 未完成主要任務: - - Phase 1 auth_static_key WASM 零件(TinyGo) - - Phase 2 auth_service_account WASM 零件 - - Phase 3 刪除 cypher-executor 的三套違規 TS: - * src/actions/credential-injector.ts(整檔刪) - * src/lib/jwt-signer.ts(整檔刪) - * src/lib/component-loader.ts 的 BUILTIN_API_RECIPES + BUILTIN_CREDENTIALS_MAP(整段刪) + 查法:bash system-dev/scripts/sdd-active-check.sh + 規則:system-dev/docs/3-specs/SDD-LIFECYCLE.md(單一活性鐵律,D35) + session 開場請回報三個數字:現行規格名稱 + 未完成任務數 + pending-changes 待裁決數 -⛔ 封測狀態:推遲(richblack 2026-04-19 決定) - 原因:違規 TS 未清,不封測。 +📦 已封存(closed,勿當進行中): + - credential-primitives-wasm → system-dev/docs/3-specs/archive/credential-primitives-wasm/ + 主線已達成:cypher-executor TS 不再有 credential/auth 業務邏輯 + (credential-injector.ts / jwt-signer.ts / BUILTIN_API_RECIPES 皆已移除) + credential 現行做法=CF Workers per-script Secrets + D1 目錄,arcrun 不自管加密金鑰 + → 見 .claude/rules/01-tech-stack.md「Credential 儲存規範」 + ⚠️ 殘留缺口(未隨封存視為完成):auth_mtls 從未實作、7.6 self-hosted auth 鏈 + 端到端未驗;要做需另立新 SDD。細節見該卷 tasks.md「封存時仍未完成的項目」 📚 詳細規範: .claude/rules/00-sdd-protocol.md — SDD 協議 diff --git a/.claude/rules/00-sdd-protocol.md b/.claude/rules/00-sdd-protocol.md index 1a1cfed..a9d285c 100644 --- a/.claude/rules/00-sdd-protocol.md +++ b/.claude/rules/00-sdd-protocol.md @@ -14,9 +14,7 @@ | 任務類型 | 對應 SDD | |---------|---------| -| Auth primitive WASM 零件(static_key/oauth2/service_account/mtls) | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| 清除 cypher-executor 裡的 TS 業務邏輯 | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| WASI shim host functions(kv_get / crypto_decrypt / crypto_sign_rs256) | `docs/3-specs/arcrun/credential-primitives-wasm/` | +| Auth primitive WASM 零件 / credential 儲存 / WASI shim host functions | **已封存**(`system-dev/docs/3-specs/archive/credential-primitives-wasm/`,`status: closed`)。現行規範見 `.claude/rules/01-tech-stack.md`「Credential 儲存規範」;**新工作需另立 SDD**(含未實作的 `auth_mtls`),不得掛在已封存的卷上 | | Auth Recipe 系統(recipe schema、KV 格式) | `docs/3-specs/arcrun/auth-recipe.md` | | Landing Page | `docs/3-specs/arcrun/landing-page.md` | | CLI / SDK(Python/JS) | `docs/3-specs/arcrun/sdk-and-website/` | diff --git a/.claude/rules/02-forbidden.md b/.claude/rules/02-forbidden.md index 350887c..7542e15 100644 --- a/.claude/rules/02-forbidden.md +++ b/.claude/rules/02-forbidden.md @@ -33,10 +33,13 @@ Auth primitive 必須透過 `component-worker-template/` 搭配 WASM binary 部 ## 第二類: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.ts` 的 `BUILTIN_API_RECIPES` 和 `BUILTIN_CREDENTIALS_MAP` → 整段刪除 +**清除已完成**(2026-07-20,credential-primitives-wasm 卷已封存)。下列曾違規的 TS **均已不存在**, +列此僅為「禁止重新引入」的清單: +- ~~`cypher-executor/src/actions/credential-injector.ts`~~ → 已刪(auth 走 WASM primitive) +- ~~`cypher-executor/src/lib/jwt-signer.ts`~~ → 已刪(RS256 在 auth_service_account WASM) +- ~~`component-loader.ts` 的 `BUILTIN_API_RECIPES` / `BUILTIN_CREDENTIALS_MAP`~~ → 已整段刪 + +**重新建立上述任一者 = 違規**。 **Hook 會擋**:新增任何路徑含以下關鍵字的 `.ts` 檔案: - `credential-injector`、`credential_injector` @@ -83,7 +86,7 @@ Auth primitive 必須透過 `component-worker-template/` 搭配 WASM binary 部 13 個現有的 `SVC_*` 綁定(`cypher-executor/wrangler.toml`,邏輯零件)是歷史遺產(效能優化),**保留但不新增**。 -> **2026-06-06 註(credential-primitives-wasm Phase 7)**:self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **same-zone 1042**(壓測階段 11)。**未用 service binding 解**(評估後廢:service binding 靜態、加/改要重 deploy cypher)。改用 **`global_fetch_strictly_public` compatibility flag**(cypher wrangler.toml)讓 same-zone fetch 走公網前門 → 同 zone 也通,**auth 維持 HTTP fetch、不加 binding**。故本禁令不變。 +> **2026-06-06 註**(來源:credential-primitives-wasm Phase 7,該卷已封存於 `system-dev/docs/3-specs/archive/`;**本註記述的規則仍現行有效**):self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **same-zone 1042**(壓測階段 11)。**未用 service binding 解**(評估後廢:service binding 靜態、加/改要重 deploy cypher)。改用 **`global_fetch_strictly_public` compatibility flag**(cypher wrangler.toml)讓 same-zone fetch 走公網前門 → 同 zone 也通,**auth 維持 HTTP fetch、不加 binding**。故本禁令不變。 **Hook 會擋**:bash 指令含 `wrangler tail` 以外、涉及 `[[services]]` 新增的 pattern;Edit wrangler.toml 新增 `[[services]]` 區塊時警告確認。 diff --git a/.claude/rules/03-component-architecture.md b/.claude/rules/03-component-architecture.md index bb56621..61596db 100644 --- a/.claude/rules/03-component-architecture.md +++ b/.claude/rules/03-component-architecture.md @@ -79,7 +79,7 @@ Service binding 需要 `wrangler.toml` 裡寫死 `[[services]]`,且要 redeplo **禁止新增任何 Service Binding**。所有新零件(含 auth primitive)都走 HTTP URL 路徑。 -**same-zone 1042 的解(credential-primitives-wasm Phase 7,2026-06-06)**:self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **1042**(官方 docs:「fetch from another Worker on the **same zone**」;官方 cypher 在 `cypher.arcrun.dev`、打 `*.workers.dev` 屬跨 zone 故不踩——非官方有 flag)。**解法不是 service binding**(評估後廢:靜態、加/改要重 deploy),而是 cypher wrangler.toml 加 **`global_fetch_strictly_public` flag**——讓 same-zone fetch 走公網前門 → 同 zone 也通。auth 維持 HTTP fetch、不加 binding。官方加此 flag 行為不變(本就跨 zone),self-host 被修好 → **官方與 self-host 共用同一份 toml**。 +**same-zone 1042 的解**(來源:credential-primitives-wasm Phase 7,2026-06-06;該卷已封存於 `system-dev/docs/3-specs/archive/`,**但本段規則仍現行有效**):self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **1042**(官方 docs:「fetch from another Worker on the **same zone**」;官方 cypher 在 `cypher.arcrun.dev`、打 `*.workers.dev` 屬跨 zone 故不踩——非官方有 flag)。**解法不是 service binding**(評估後廢:靜態、加/改要重 deploy),而是 cypher wrangler.toml 加 **`global_fetch_strictly_public` flag**——讓 same-zone fetch 走公網前門 → 同 zone 也通。auth 維持 HTTP fetch、不加 binding。官方加此 flag 行為不變(本就跨 zone),self-host 被修好 → **官方與 self-host 共用同一份 toml**。 **仍禁止**:為**用戶自製 / 服務專屬零件**(`gmail-worker`、`notion-worker` 之類)新增 binding——那些是 recipe 的事,不該有 binding。**workflow 層(用戶串零件)一律 HTTP URL 不變。** diff --git a/.claude/rules/04-current-progress.md b/.claude/rules/04-current-progress.md index c1e67df..9ea844e 100644 --- a/.claude/rules/04-current-progress.md +++ b/.claude/rules/04-current-progress.md @@ -1,77 +1,75 @@ # 當前進度(SessionStart 會注入此檔重點) -> 更新時間:2026-04-19 -> 權威來源:`docs/3-specs/arcrun/credential-primitives-wasm/tasks.md` -> 此檔僅摘要,詳細狀態以 tasks.md 為準。 +> 更新時間:2026-07-21 +> **權威來源=design.md frontmatter `status: active`**(機器可查),不是本檔。 +> 查法:`bash system-dev/scripts/sdd-active-check.sh` +> 本檔只是索引,任何與 frontmatter 衝突之處以 frontmatter 為準。 --- -## 封測狀態 +## 現行 active SDD -**原定明天封測,richblack 決定推遲**,原因:cypher-executor 有三套 TS 業務邏輯違反「零件一律 WASM」架構原則(Phase 1-3 要清除的程式碼),在清除前不封測。 +**RAG Portal 多人授權** — `system-dev/docs/3-specs/portal-auth/` + +依 SDD 生命週期鐵律(D35,全文 `system-dev/docs/3-specs/SDD-LIFECYCLE.md`): +任何時刻整個 repo 只允許**一份** `status: active`。所有開發任務必須對應它的 tasks, +找不到對應 → 停下來問,不准直接做。 + +**session 開場請回報三個數字**:現行規格名稱 + 未完成任務數 + `pending-changes.md` 待裁決 proposal 數。 --- -## 目前 Phase:Credential Primitives TS → WASM +## 已封存(closed,勿當進行中) -**SDD 位置**:`docs/3-specs/arcrun/credential-primitives-wasm/design.md` + `tasks.md` +### Credential Primitives TS → WASM -### 已完成 +`system-dev/docs/3-specs/archive/credential-primitives-wasm/`(2026-07-21 封存) -- **Phase 0.1–0.5**:核心合併(u6u-core 併入 arcrun、21 個零件 contract 完整、刪除重複 `credentials/` 目錄、CREDENTIALS_KV binding 確認、刪除 `matrix/u6u-core/`) -- `registry/components/` 下 21 個零件(邏輯 + API)都有 `main.go` + `.wasm` +**主線已達成**:cypher-executor TS 不再實作任何 credential / auth 業務邏輯。 +`credential-injector.ts`、`jwt-signer.ts`、`BUILTIN_API_RECIPES` / `BUILTIN_CREDENTIALS_MAP` +全數移除(最後一項 T10 於 2026-07-20 commit `20c7610` 完成)。 -### 進行中 / 未完成 +**credential 現行做法**(非被另一卷 supersede,是機制整個換掉): +- 密文 → **CF Workers per-script Secrets**(`CRED_{NAME}_{hash}`),arcrun 讀不回明文 +- 目錄 → **D1** `credentials` 表(name / service / secret_ref,不含值) +- **arcrun 不自管任何加密金鑰**;`crypto_decrypt` host function 已成永遠回失敗的 stub +- 完整規範:`.claude/rules/01-tech-stack.md`「Credential 儲存規範」 -| Task | 狀態 | 阻擋關係 | -|-----|------|---------| -| 0.6 wasi-shim 新增 `kv_get` / `crypto_decrypt` / `crypto_sign_rs256` host functions | ⬜ 未開始 | **Phase 1-3 的硬前置** | -| 0.7 component-loader 新增 WASM runner 路徑 | ⬜ 未開始 | **Phase 1-3 的硬前置** | -| 1.1-1.8 `auth_static_key` WASM 零件(TinyGo) | ⬜ 未開始 | 涵蓋 80% 服務 | -| 2.1-2.6 `auth_service_account` WASM 零件(JWT signing) | ⬜ 未開始 | Google Service Account 等 | -| 3.1-3.5 清除 `component-loader.ts` 的 `BUILTIN_API_RECIPES` | ⬜ 未開始 | 要先有 Phase 1-2 的 WASM 零件 | -| 4.1-4.4 `auth_oauth2` + `auth_mtls`(封測後) | ⬜ 未開始 | 非阻擋項 | -| 5.1-5.7 核心穩定驗證(全域搜尋確認無殘餘 TS) | ⬜ 未開始 | 封測啟動門檻 | +⚠️ **封存 ≠ 全部做完**。真實殘留缺口(要做需另立新 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)無驗證記錄 -### Phase 1-3 要**徹底刪除**的 TS 檔案(不是搬、不是改,是刪) - -| 檔案 | 違反什麼 | -|-----|---------| -| `cypher-executor/src/actions/credential-injector.ts` | AES 解密、template 展開、JWT 邏輯 —— 應在 WASM | -| `cypher-executor/src/lib/jwt-signer.ts` | RS256 JWT 簽章邏輯 —— 應在 `auth_service_account.wasm` | -| `cypher-executor/src/lib/component-loader.ts` 的 `BUILTIN_API_RECIPES`(~100 行) | gmail/telegram/line/gsheets/http_request/cron 的 TS 實作 —— 應全部走對應 WASM 零件 | - ---- - -## 下一個 session 第一件要做的事 - -**讀 `docs/3-specs/arcrun/credential-primitives-wasm/tasks.md`**,然後決定從 Phase 0.6 還是 0.7 開始。 - -0.6(host functions)和 0.7(WASM runner)是並列的前置工作,哪個先都可以,但都要在 Phase 1 開始之前完成。 +逐條核實見該卷 `tasks.md` 的「封存時仍未完成的項目」段。 --- ## SDD 索引 +> 「進行中」與否一律以 frontmatter 為準,下表僅路徑速查。 + | 子系統 | SDD | |--------|-----| -| **主要(正在動)** Credential Primitives WASM 改寫 | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| **LI (LLM Interface)** — AI 操盤手使用體驗(2026-05-16 新建,mira dogfood 痛點轉化) | `docs/3-specs/llm-interface/` | -| arcrun 總進度 | `docs/3-specs/arcrun/arcrun.md` | -| Auth Recipe 系統(schema、預建 20 個服務) | `docs/3-specs/arcrun/auth-recipe.md` | -| Landing Page | `docs/3-specs/arcrun/landing-page.md` | -| SDK + Website | `docs/3-specs/arcrun/sdk-and-website/design.md` | -| arcrun MVP 整體 | `docs/3-specs/arcrun-core-mvp/design.md` | -| Credential 長期規格(需求源) | `docs/user_requirements/credential_parts.md` | -| Platform Evolution | `docs/3-specs/arcrun-platform-evolution/design.md` | -| Tech Stack 詳細 | `docs/3-specs/tech.md` | +| **現行 active** RAG Portal 多人授權 | `system-dev/docs/3-specs/portal-auth/` | +| ~~Credential Primitives WASM~~(closed) | `system-dev/docs/3-specs/archive/credential-primitives-wasm/` | +| LLM Interface(AI 操盤手使用體驗) | `system-dev/docs/3-specs/llm-interface/` | +| arcrun 總進度 | `system-dev/docs/3-specs/arcrun/arcrun.md` | +| Auth Recipe 系統(schema、預建服務) | `system-dev/docs/3-specs/arcrun/auth-recipe.md` | +| SDK + Website | `system-dev/docs/3-specs/arcrun/sdk-and-website/` | +| arcrun MVP 整體 | `system-dev/docs/3-specs/arcrun-core-mvp/` | +| Platform Evolution | `system-dev/docs/3-specs/arcrun-platform-evolution/` | +| Tech Stack 詳細 | `system-dev/docs/3-specs/tech.md` | +| 生命週期鐵律 | `system-dev/docs/3-specs/SDD-LIFECYCLE.md` | +| 待裁決 proposal | `system-dev/docs/3-specs/pending-changes.md` | --- ## 技術備註(CC 常搞錯的點) -1. **每個 WASM 零件 = 獨立 Worker = 公開 URL**(例:`gmail.arcrun.dev`)。不是從 R2 動態讀。 +1. **每個 WASM 零件 = 獨立 Worker = 獨立 URL**。不是從 R2 動態讀。 2. **Cypher binding = YAML 裡寫 URL 清單**。不是 Cloudflare service binding。 3. **cypher-executor 只做 routing + host functions**。業務邏輯全在 WASM 零件。 4. **TinyGo 有限制**:`crypto/rsa` 支援不全 → 用 host function `crypto_sign_rs256` 讓 Worker 代簽。 -5. 詳見 `.claude/rules/03-component-architecture.md`。 +5. **credential 不自管金鑰**:走 `secret_get(ref)` 讀 CF Workers Secrets,`crypto_decrypt` 是 stub。 +6. 詳見 `.claude/rules/03-component-architecture.md` 與 `01-tech-stack.md`。 diff --git a/BACKLOG.md b/BACKLOG.md index 4ff518d..9d875a8 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -27,8 +27,15 @@ ### 🟡 P1(封測門檻 / 技術債) -- [ ] credential-primitives-wasm **Phase 0.7**(component-loader WASM runner)→ **Phase 1-2**(auth_static_key / auth_service_account WASM 零件)。0.6 已完成。 -- [ ] **Phase 3** 清除違規 TS(credential-injector.ts / jwt-signer.ts / BUILTIN_*)—— 須先有 Phase 1-2 WASM 頂上。 +- [x] ~~credential-primitives-wasm Phase 0.7 / Phase 1-2 / Phase 3~~ — **全數完成**,該卷已封存 + (`system-dev/docs/3-specs/archive/credential-primitives-wasm/`)。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 Secrets + D1 目錄。 +- [ ] **`auth_mtls` 零件從未實作**(原 Phase 4.3/4.4 遺留,`registry/components/auth_mtls/` 不存在)。 + mTLS 認證目前不支援;要做需**另立新 SDD**(封存卷不得復用)。 +- [ ] **self-hosted auth 鏈端到端驗收**(原 Phase 7.6 遺留):`global_fetch_strictly_public` flag + 是否真解 same-zone 1042,在自架帳號上從未實測。同屬需另立 SDD 的殘留缺口。 - [ ] 4 份 inline http_request host fn 抽共用 helper(dedup;假綠修是逐份改的)。 ### ⚪ P2(不擋封測) diff --git a/CLAUDE.md b/CLAUDE.md index a5d86d9..2ad2ffb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ 1. **任何 code 變動前必須先讀對應 SDD**,在回覆開頭宣告已讀清單與對應 task 編號(格式見 `.claude/rules/00-sdd-protocol.md`) 2. **零件只能用 TinyGo 或 AssemblyScript 編譯成 WASM**;`registry/components/` 下禁止 TypeScript 3. **cypher-executor TS 禁止實作 credential / auth / JWT / template 展開業務邏輯**;這些全在 WASM 零件 -4. **Cypher binding = YAML 裡的 URL 清單**,不是 Cloudflare service binding;零件串接走 HTTP URL(含 auth primitive)。self-hosted same-zone 1042 用 `global_fetch_strictly_public` flag 解,不新增 binding(credential-primitives-wasm Phase 7) +4. **Cypher binding = YAML 裡的 URL 清單**,不是 Cloudflare service binding;零件串接走 HTTP URL(含 auth primitive)。self-hosted same-zone 1042 用 `global_fetch_strictly_public` flag 解,不新增 binding(來源:credential-primitives-wasm Phase 7,該卷已封存,規則仍有效) 5. **每個 WASM 零件 = 獨立 Worker = 公開 URL**;不從 R2 動態讀(R2 只 Phase 5 啟用) 6. **修改現有程式碼,不是新建資料夾重做** 7. **每完成一個 task 立刻更新 tasks.md 的 `[x]`**,不批次 @@ -96,7 +96,7 @@ | 子系統 | 路徑 | |-------|------| | **現行 active** RAG Portal 多人授權 | `system-dev/docs/3-specs/portal-auth/` | -| Credential Primitives WASM(paused) | `docs/3-specs/arcrun/credential-primitives-wasm/` | +| ~~Credential Primitives WASM~~(**closed,已封存**) | `system-dev/docs/3-specs/archive/credential-primitives-wasm/` — credential 現行做法見 `.claude/rules/01-tech-stack.md`;殘留缺口(`auth_mtls` 未實作等)要做需另立新 SDD | | arcrun 總進度 | `docs/3-specs/arcrun/arcrun.md` | | Auth Recipe 系統 | `docs/3-specs/arcrun/auth-recipe.md` | | Landing Page | `docs/3-specs/arcrun/landing-page.md` | diff --git a/cli/src/lib/deploy.ts b/cli/src/lib/deploy.ts index 07df9a2..fe552b3 100644 --- a/cli/src/lib/deploy.ts +++ b/cli/src/lib/deploy.ts @@ -317,8 +317,8 @@ export async function downloadAndDeploy( failures.push(`D1 migration: 部署物缺 kbdb/migrations/0001_base.sql(${migPath})`); } - // 3.6 credential-primitives-wasm T2(credential-store-migration.md §2.2): - // credentials 目錄表(api_key/name/service/sensitivity/secret_ref/created_at/last_used_at)。 + // 3.6 credentials 目錄表(api_key/name/service/sensitivity/secret_ref/created_at/last_used_at)。 + // 現行 credential 規範見 .claude/rules/01-tech-stack.md「Credential 儲存規範」。 // 同一顆 D1(與 KBDB base 共用),冪等 IF NOT EXISTS,套用機制與 0001_base.sql 完全相同 // (同一個 applyD1Migration helper,同一支 CF D1 query API)。D19:這張表不含密文, // 密文本體住在 Workers per-script Secrets(見 cypher-executor/src/routes/credentials.ts)。 diff --git a/cypher-executor/src/routes/credentials.ts b/cypher-executor/src/routes/credentials.ts index 53250c6..820cb21 100644 --- a/cypher-executor/src/routes/credentials.ts +++ b/cypher-executor/src/routes/credentials.ts @@ -1,23 +1,21 @@ /** * Credentials API — 多租戶 credential 管理 * - * credential-store-migration T5(D19「擁有目錄,不擁有內容物」, - * system-dev/docs/3-specs/arcrun/credential-primitives-wasm/credential-store-migration.md §2.3-2.4/§3): + * 現行做法(D19「擁有目錄,不擁有內容物」;規範見 .claude/rules/01-tech-stack.md + * 「Credential 儲存規範」。arcrun 不自管任何加密金鑰): * - * 新寫入(POST 建立 / PUT 覆寫)一律走新家: + * 寫入(POST 建立 / PUT 覆寫): * 1. 密文值 PUT 進 CF Workers per-script Secrets(掛在本 worker 上,管理 API 唯寫, * arcrun 自己也讀不回值——D19「不持有內容物」)。 * 2. D1 `credentials` 表只寫「目錄」(api_key/name/service/sensitivity/secret_ref/ * created_at),**不含密文**。 * 不再寫 KV / 不再寫明文密文到 D1。 * - * §2.4 選項甲(傾向):client 不再 AES-GCM 加密,明文值經 TLS 送到 cypher,cypher 短暫在記憶體 - * 經手明文(不落地、不持久、不持金鑰)後直接 PUT 進 Workers Secrets。這與舊版 - * `.claude/rules/01-tech-stack.md` 記載的「傳輸格式 {name, encrypted, iv}」不同——是本 SDD - * (2026-07-03 T1.5 spike 定案)對舊格式的刻意取代,SDD §6 Q-b 仍列為需 leo 明確接受的 - * 誠實 trade-off(本次實作先落地,若 leo 不接受選項甲需回頭改)。 + * 傳輸格式:client **不做** AES-GCM 加密,明文值經 TLS 送到 cypher,cypher 短暫在記憶體 + * 經手明文(不落地、不持久、不持金鑰)後直接 PUT 進 Workers Secrets。(此為 2026-07-03 + * 定案並已落地的做法,取代更早的 `{name, encrypted, iv}` 格式;rule 01 已同步。) * - * credential-store-migration T9(§3 治理端點): + * 治理端點: * - `GET /credentials`:改讀 D1(與 `/credentials/catalog` 共用同一份 query,同時保留 * `/catalog` 別名,Console 既有呼叫不受影響)。 * - `DELETE /credentials/:name`:先查 D1 拿 secret_ref → 有則刪 Workers Secret + D1 row; @@ -35,7 +33,7 @@ export const credentialsRouter = new Hono<{ Bindings: Bindings }>(); const CYPHER_SCRIPT_NAME = 'arcrun-cypher-executor'; /** - * secret_ref 命名規則(credential-store-migration §2.3「以 CRED_ 前綴隔離命名空間」): + * secret_ref 命名規則(以 CRED_ 前綴隔離命名空間): * CRED__ * 加 api_key 的 hash 是為了避免跨租戶同名 credential(如兩個用戶都存 telegram_bot_token) * 撞名覆蓋彼此的 Workers Secret(secret 是掛在同一個 worker 上、全域命名空間,沒有租戶 diff --git a/cypher-executor/wrangler.toml b/cypher-executor/wrangler.toml index a096012..eab33e7 100644 --- a/cypher-executor/wrangler.toml +++ b/cypher-executor/wrangler.toml @@ -3,7 +3,8 @@ main = "src/index.ts" compatibility_date = "2025-02-19" workers_dev = true # global_fetch_strictly_public:讓 fetch() 走公網「前門」,解 self-hosted 的 same-zone 1042 -# (credential-primitives-wasm Phase 7,2026-06-06)。 +# (2026-06-06 拍板;規則見 .claude/rules/03-component-architecture.md)。 +# ⚠️ 尚未在自架帳號上端到端實測(原 Phase 7.6 遺留驗收缺口)。 # 病因(官方 docs):self-hosted 的 cypher 與 auth worker 同在 {sub}.workers.dev zone, # cypher fetch auth 屬 same-zone fetch,CF 預設擋(1042)。官方 cypher 在 cypher.arcrun.dev、 # 打 auth 的 *.workers.dev 屬跨 zone 故不踩。此 flag 讓 same-zone fetch 改走公網前門 → 同 zone 也通。 diff --git a/system-dev/docs/2-architecture/00-sdd-protocol.md b/system-dev/docs/2-architecture/00-sdd-protocol.md index 1a1cfed..a9d285c 100644 --- a/system-dev/docs/2-architecture/00-sdd-protocol.md +++ b/system-dev/docs/2-architecture/00-sdd-protocol.md @@ -14,9 +14,7 @@ | 任務類型 | 對應 SDD | |---------|---------| -| Auth primitive WASM 零件(static_key/oauth2/service_account/mtls) | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| 清除 cypher-executor 裡的 TS 業務邏輯 | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| WASI shim host functions(kv_get / crypto_decrypt / crypto_sign_rs256) | `docs/3-specs/arcrun/credential-primitives-wasm/` | +| Auth primitive WASM 零件 / credential 儲存 / WASI shim host functions | **已封存**(`system-dev/docs/3-specs/archive/credential-primitives-wasm/`,`status: closed`)。現行規範見 `.claude/rules/01-tech-stack.md`「Credential 儲存規範」;**新工作需另立 SDD**(含未實作的 `auth_mtls`),不得掛在已封存的卷上 | | Auth Recipe 系統(recipe schema、KV 格式) | `docs/3-specs/arcrun/auth-recipe.md` | | Landing Page | `docs/3-specs/arcrun/landing-page.md` | | CLI / SDK(Python/JS) | `docs/3-specs/arcrun/sdk-and-website/` | diff --git a/system-dev/docs/2-architecture/02-forbidden.md b/system-dev/docs/2-architecture/02-forbidden.md index 2649082..ec8c00e 100644 --- a/system-dev/docs/2-architecture/02-forbidden.md +++ b/system-dev/docs/2-architecture/02-forbidden.md @@ -83,7 +83,7 @@ Auth primitive 必須透過 `component-worker-template/` 搭配 WASM binary 部 13 個現有的 `SVC_*` 綁定(`cypher-executor/wrangler.toml`,邏輯零件)是歷史遺產(效能優化),**保留但不新增**。 -> **2026-06-06 註(credential-primitives-wasm Phase 7)**:self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **same-zone 1042**(壓測階段 11)。**未用 service binding 解**(評估後廢:service binding 靜態、加/改要重 deploy cypher)。改用 **`global_fetch_strictly_public` compatibility flag**(cypher wrangler.toml)讓 same-zone fetch 走公網前門 → 同 zone 也通,**auth 維持 HTTP fetch、不加 binding**。故本禁令不變。 +> **2026-06-06 註**(來源:credential-primitives-wasm Phase 7,該卷已封存於 `system-dev/docs/3-specs/archive/`;**本註記述的規則仍現行有效**):self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **same-zone 1042**(壓測階段 11)。**未用 service binding 解**(評估後廢:service binding 靜態、加/改要重 deploy cypher)。改用 **`global_fetch_strictly_public` compatibility flag**(cypher wrangler.toml)讓 same-zone fetch 走公網前門 → 同 zone 也通,**auth 維持 HTTP fetch、不加 binding**。故本禁令不變。 **Hook 會擋**:bash 指令含 `wrangler tail` 以外、涉及 `[[services]]` 新增的 pattern;Edit wrangler.toml 新增 `[[services]]` 區塊時警告確認。 diff --git a/system-dev/docs/2-architecture/03-component-architecture.md b/system-dev/docs/2-architecture/03-component-architecture.md index bb56621..61596db 100644 --- a/system-dev/docs/2-architecture/03-component-architecture.md +++ b/system-dev/docs/2-architecture/03-component-architecture.md @@ -79,7 +79,7 @@ Service binding 需要 `wrangler.toml` 裡寫死 `[[services]]`,且要 redeplo **禁止新增任何 Service Binding**。所有新零件(含 auth primitive)都走 HTTP URL 路徑。 -**same-zone 1042 的解(credential-primitives-wasm Phase 7,2026-06-06)**:self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **1042**(官方 docs:「fetch from another Worker on the **same zone**」;官方 cypher 在 `cypher.arcrun.dev`、打 `*.workers.dev` 屬跨 zone 故不踩——非官方有 flag)。**解法不是 service binding**(評估後廢:靜態、加/改要重 deploy),而是 cypher wrangler.toml 加 **`global_fetch_strictly_public` flag**——讓 same-zone fetch 走公網前門 → 同 zone 也通。auth 維持 HTTP fetch、不加 binding。官方加此 flag 行為不變(本就跨 zone),self-host 被修好 → **官方與 self-host 共用同一份 toml**。 +**same-zone 1042 的解**(來源:credential-primitives-wasm Phase 7,2026-06-06;該卷已封存於 `system-dev/docs/3-specs/archive/`,**但本段規則仍現行有效**):self-hosted 的 cypher 與 auth worker 同在 `{sub}.workers.dev` zone,cypher `fetch()` 打 auth 觸發 CF **1042**(官方 docs:「fetch from another Worker on the **same zone**」;官方 cypher 在 `cypher.arcrun.dev`、打 `*.workers.dev` 屬跨 zone 故不踩——非官方有 flag)。**解法不是 service binding**(評估後廢:靜態、加/改要重 deploy),而是 cypher wrangler.toml 加 **`global_fetch_strictly_public` flag**——讓 same-zone fetch 走公網前門 → 同 zone 也通。auth 維持 HTTP fetch、不加 binding。官方加此 flag 行為不變(本就跨 zone),self-host 被修好 → **官方與 self-host 共用同一份 toml**。 **仍禁止**:為**用戶自製 / 服務專屬零件**(`gmail-worker`、`notion-worker` 之類)新增 binding——那些是 recipe 的事,不該有 binding。**workflow 層(用戶串零件)一律 HTTP URL 不變。** diff --git a/system-dev/docs/2-architecture/04-current-progress.md b/system-dev/docs/2-architecture/04-current-progress.md index c1e67df..9ea844e 100644 --- a/system-dev/docs/2-architecture/04-current-progress.md +++ b/system-dev/docs/2-architecture/04-current-progress.md @@ -1,77 +1,75 @@ # 當前進度(SessionStart 會注入此檔重點) -> 更新時間:2026-04-19 -> 權威來源:`docs/3-specs/arcrun/credential-primitives-wasm/tasks.md` -> 此檔僅摘要,詳細狀態以 tasks.md 為準。 +> 更新時間:2026-07-21 +> **權威來源=design.md frontmatter `status: active`**(機器可查),不是本檔。 +> 查法:`bash system-dev/scripts/sdd-active-check.sh` +> 本檔只是索引,任何與 frontmatter 衝突之處以 frontmatter 為準。 --- -## 封測狀態 +## 現行 active SDD -**原定明天封測,richblack 決定推遲**,原因:cypher-executor 有三套 TS 業務邏輯違反「零件一律 WASM」架構原則(Phase 1-3 要清除的程式碼),在清除前不封測。 +**RAG Portal 多人授權** — `system-dev/docs/3-specs/portal-auth/` + +依 SDD 生命週期鐵律(D35,全文 `system-dev/docs/3-specs/SDD-LIFECYCLE.md`): +任何時刻整個 repo 只允許**一份** `status: active`。所有開發任務必須對應它的 tasks, +找不到對應 → 停下來問,不准直接做。 + +**session 開場請回報三個數字**:現行規格名稱 + 未完成任務數 + `pending-changes.md` 待裁決 proposal 數。 --- -## 目前 Phase:Credential Primitives TS → WASM +## 已封存(closed,勿當進行中) -**SDD 位置**:`docs/3-specs/arcrun/credential-primitives-wasm/design.md` + `tasks.md` +### Credential Primitives TS → WASM -### 已完成 +`system-dev/docs/3-specs/archive/credential-primitives-wasm/`(2026-07-21 封存) -- **Phase 0.1–0.5**:核心合併(u6u-core 併入 arcrun、21 個零件 contract 完整、刪除重複 `credentials/` 目錄、CREDENTIALS_KV binding 確認、刪除 `matrix/u6u-core/`) -- `registry/components/` 下 21 個零件(邏輯 + API)都有 `main.go` + `.wasm` +**主線已達成**:cypher-executor TS 不再實作任何 credential / auth 業務邏輯。 +`credential-injector.ts`、`jwt-signer.ts`、`BUILTIN_API_RECIPES` / `BUILTIN_CREDENTIALS_MAP` +全數移除(最後一項 T10 於 2026-07-20 commit `20c7610` 完成)。 -### 進行中 / 未完成 +**credential 現行做法**(非被另一卷 supersede,是機制整個換掉): +- 密文 → **CF Workers per-script Secrets**(`CRED_{NAME}_{hash}`),arcrun 讀不回明文 +- 目錄 → **D1** `credentials` 表(name / service / secret_ref,不含值) +- **arcrun 不自管任何加密金鑰**;`crypto_decrypt` host function 已成永遠回失敗的 stub +- 完整規範:`.claude/rules/01-tech-stack.md`「Credential 儲存規範」 -| Task | 狀態 | 阻擋關係 | -|-----|------|---------| -| 0.6 wasi-shim 新增 `kv_get` / `crypto_decrypt` / `crypto_sign_rs256` host functions | ⬜ 未開始 | **Phase 1-3 的硬前置** | -| 0.7 component-loader 新增 WASM runner 路徑 | ⬜ 未開始 | **Phase 1-3 的硬前置** | -| 1.1-1.8 `auth_static_key` WASM 零件(TinyGo) | ⬜ 未開始 | 涵蓋 80% 服務 | -| 2.1-2.6 `auth_service_account` WASM 零件(JWT signing) | ⬜ 未開始 | Google Service Account 等 | -| 3.1-3.5 清除 `component-loader.ts` 的 `BUILTIN_API_RECIPES` | ⬜ 未開始 | 要先有 Phase 1-2 的 WASM 零件 | -| 4.1-4.4 `auth_oauth2` + `auth_mtls`(封測後) | ⬜ 未開始 | 非阻擋項 | -| 5.1-5.7 核心穩定驗證(全域搜尋確認無殘餘 TS) | ⬜ 未開始 | 封測啟動門檻 | +⚠️ **封存 ≠ 全部做完**。真實殘留缺口(要做需另立新 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)無驗證記錄 -### Phase 1-3 要**徹底刪除**的 TS 檔案(不是搬、不是改,是刪) - -| 檔案 | 違反什麼 | -|-----|---------| -| `cypher-executor/src/actions/credential-injector.ts` | AES 解密、template 展開、JWT 邏輯 —— 應在 WASM | -| `cypher-executor/src/lib/jwt-signer.ts` | RS256 JWT 簽章邏輯 —— 應在 `auth_service_account.wasm` | -| `cypher-executor/src/lib/component-loader.ts` 的 `BUILTIN_API_RECIPES`(~100 行) | gmail/telegram/line/gsheets/http_request/cron 的 TS 實作 —— 應全部走對應 WASM 零件 | - ---- - -## 下一個 session 第一件要做的事 - -**讀 `docs/3-specs/arcrun/credential-primitives-wasm/tasks.md`**,然後決定從 Phase 0.6 還是 0.7 開始。 - -0.6(host functions)和 0.7(WASM runner)是並列的前置工作,哪個先都可以,但都要在 Phase 1 開始之前完成。 +逐條核實見該卷 `tasks.md` 的「封存時仍未完成的項目」段。 --- ## SDD 索引 +> 「進行中」與否一律以 frontmatter 為準,下表僅路徑速查。 + | 子系統 | SDD | |--------|-----| -| **主要(正在動)** Credential Primitives WASM 改寫 | `docs/3-specs/arcrun/credential-primitives-wasm/` | -| **LI (LLM Interface)** — AI 操盤手使用體驗(2026-05-16 新建,mira dogfood 痛點轉化) | `docs/3-specs/llm-interface/` | -| arcrun 總進度 | `docs/3-specs/arcrun/arcrun.md` | -| Auth Recipe 系統(schema、預建 20 個服務) | `docs/3-specs/arcrun/auth-recipe.md` | -| Landing Page | `docs/3-specs/arcrun/landing-page.md` | -| SDK + Website | `docs/3-specs/arcrun/sdk-and-website/design.md` | -| arcrun MVP 整體 | `docs/3-specs/arcrun-core-mvp/design.md` | -| Credential 長期規格(需求源) | `docs/user_requirements/credential_parts.md` | -| Platform Evolution | `docs/3-specs/arcrun-platform-evolution/design.md` | -| Tech Stack 詳細 | `docs/3-specs/tech.md` | +| **現行 active** RAG Portal 多人授權 | `system-dev/docs/3-specs/portal-auth/` | +| ~~Credential Primitives WASM~~(closed) | `system-dev/docs/3-specs/archive/credential-primitives-wasm/` | +| LLM Interface(AI 操盤手使用體驗) | `system-dev/docs/3-specs/llm-interface/` | +| arcrun 總進度 | `system-dev/docs/3-specs/arcrun/arcrun.md` | +| Auth Recipe 系統(schema、預建服務) | `system-dev/docs/3-specs/arcrun/auth-recipe.md` | +| SDK + Website | `system-dev/docs/3-specs/arcrun/sdk-and-website/` | +| arcrun MVP 整體 | `system-dev/docs/3-specs/arcrun-core-mvp/` | +| Platform Evolution | `system-dev/docs/3-specs/arcrun-platform-evolution/` | +| Tech Stack 詳細 | `system-dev/docs/3-specs/tech.md` | +| 生命週期鐵律 | `system-dev/docs/3-specs/SDD-LIFECYCLE.md` | +| 待裁決 proposal | `system-dev/docs/3-specs/pending-changes.md` | --- ## 技術備註(CC 常搞錯的點) -1. **每個 WASM 零件 = 獨立 Worker = 公開 URL**(例:`gmail.arcrun.dev`)。不是從 R2 動態讀。 +1. **每個 WASM 零件 = 獨立 Worker = 獨立 URL**。不是從 R2 動態讀。 2. **Cypher binding = YAML 裡寫 URL 清單**。不是 Cloudflare service binding。 3. **cypher-executor 只做 routing + host functions**。業務邏輯全在 WASM 零件。 4. **TinyGo 有限制**:`crypto/rsa` 支援不全 → 用 host function `crypto_sign_rs256` 讓 Worker 代簽。 -5. 詳見 `.claude/rules/03-component-architecture.md`。 +5. **credential 不自管金鑰**:走 `secret_get(ref)` 讀 CF Workers Secrets,`crypto_decrypt` 是 stub。 +6. 詳見 `.claude/rules/03-component-architecture.md` 與 `01-tech-stack.md`。 diff --git a/system-dev/docs/3-specs/README.md b/system-dev/docs/3-specs/README.md index 5dbd5e2..f9ba119 100644 --- a/system-dev/docs/3-specs/README.md +++ b/system-dev/docs/3-specs/README.md @@ -6,9 +6,17 @@ | 目錄 | Phase | 狀態 | |------|-------|------| -| **arcrun/credential-primitives-wasm/** | Phase 0-1 | 進行中(0.6-1) | +| **portal-auth/** | — | **現行 active**(唯一,D35 單一活性) | | **arcrun/kbdb-base/** | Phase 7 | 上線完成 + 待處理(§8) | +> 「進行中」以各 design.md frontmatter `status: active` 為唯一判準:`bash system-dev/scripts/sdd-active-check.sh`。 + +## 已封存(archive/,closed) + +| 目錄 | 封存日 | 備註 | +|------|-------|------| +| **archive/credential-primitives-wasm/** | 2026-07-21 | 主線達成(cypher-executor TS 無 credential/auth 邏輯)。現行做法=CF Workers Secrets + D1 目錄。殘留缺口 `auth_mtls` 未實作、7.6 端到端未驗 → 要做需另立新 SDD | + ## 主線 | 目錄 | 內容 | 狀態 | diff --git a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/credential-store-migration.md b/system-dev/docs/3-specs/archive/credential-primitives-wasm/credential-store-migration.md similarity index 100% rename from system-dev/docs/3-specs/arcrun/credential-primitives-wasm/credential-store-migration.md rename to system-dev/docs/3-specs/archive/credential-primitives-wasm/credential-store-migration.md diff --git a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/credential-store-redesign.md b/system-dev/docs/3-specs/archive/credential-primitives-wasm/credential-store-redesign.md similarity index 100% rename from system-dev/docs/3-specs/arcrun/credential-primitives-wasm/credential-store-redesign.md rename to system-dev/docs/3-specs/archive/credential-primitives-wasm/credential-store-redesign.md diff --git a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/design.md b/system-dev/docs/3-specs/archive/credential-primitives-wasm/design.md similarity index 92% rename from system-dev/docs/3-specs/arcrun/credential-primitives-wasm/design.md rename to system-dev/docs/3-specs/archive/credential-primitives-wasm/design.md index 0f46054..a8d4ad5 100644 --- a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/design.md +++ b/system-dev/docs/3-specs/archive/credential-primitives-wasm/design.md @@ -1,10 +1,27 @@ --- -status: paused +status: closed superseded_by: "" --- # Design Document: Credential Primitives TS → WASM 改寫 +> 📦 **本卷已封存(2026-07-20 收卷,2026-07-21 移入 `3-specs/archive/`)** +> +> **完成狀態**:主線目標「cypher-executor TS 不再實作 credential/auth 業務邏輯」已達成—— +> `credential-injector.ts`、`jwt-signer.ts`、`BUILTIN_API_RECIPES` 全數移除,auth 走 +> `auth_static_key` / `auth_service_account` WASM 零件。最後一項 T10(廢除自管加密金鑰) +> 於 2026-07-20 完成(commit `20c7610`)。 +> +> **被什麼取代**:不是被另一份 SDD supersede(故 `superseded_by` 留空)。credential 的**現行做法** +> = CF Workers per-script Secrets(密文)+ D1 目錄(metadata/secret_ref),arcrun 不自管任何 +> 加密金鑰;`crypto_decrypt` host function 已成永遠回失敗的 stub。現行規範見 +> `.claude/rules/01-tech-stack.md`「Credential 儲存規範」,遷移過程記錄見本目錄 +> `credential-store-migration.md`。 +> +> ⚠️ **封存時仍未完成的項目**(未隨主線收尾,見 tasks.md 卷首清單):Phase 4(`auth_oauth2` +> / `auth_mtls` 兩個 primitive 從未實作)、Phase 5 封測門檻逐條複查、以及數項端到端測試。 +> 若日後要做 OAuth2 / mTLS 認證,**需另立新 SDD**,不是恢復本卷。 +> > ⚠️ **本檔的 credential 儲存/解密段落已過時**(`crypto_decrypt` 現為永遠回失敗的 stub, > credential 值改由 CF Workers Secrets 託管、經 `secret_get(ref)` 取用)。遷移已於 > 2026-07-20 完成,見 `credential-store-migration.md`;現行做法見 diff --git a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/tasks.md b/system-dev/docs/3-specs/archive/credential-primitives-wasm/tasks.md similarity index 88% rename from system-dev/docs/3-specs/arcrun/credential-primitives-wasm/tasks.md rename to system-dev/docs/3-specs/archive/credential-primitives-wasm/tasks.md index e4bc312..78ce88d 100644 --- a/system-dev/docs/3-specs/arcrun/credential-primitives-wasm/tasks.md +++ b/system-dev/docs/3-specs/archive/credential-primitives-wasm/tasks.md @@ -1,8 +1,52 @@ # Implementation Tasks: Credential Primitives TS → WASM +> 📦 **本卷已封存(2026-07-21 移入 `3-specs/archive/`,design.md `status: closed`)**。 +> 下方勾選狀態**不再維護**;封存時的真實盤點見「封存時仍未完成的項目」段。 + > ⚠️ **歷史記錄**:文中 credential 加解密相關的完成記錄描述的是舊機制,該機制已於 > 2026-07-20 完全移除(見 `credential-store-migration.md` T10)。僅供考古,勿依此操作。 +--- + +## 📌 封存時仍未完成的項目(2026-07-21 逐條核實,不當作完成) + +**核實方法**=直接查 code 現況,不採信勾選狀態。分三類: + +### A. 未勾但**實際已達成**(勾選過期,非真缺口) + +| Task | 核實證據 | +|---|---| +| 1.9 刪除 `credential-injector.ts` | 檔案不存在(`ls` 確認);T10 於 20c7610 移除 | +| 5.2 `credential-injector.ts` 不存在 | 同上 | +| 5.3 `jwt-signer.ts` 不存在 | 檔案不存在 | +| 5.4 無 `BUILTIN_API_RECIPES` / `BUILTIN_CREDENTIALS_MAP` | 全 repo grep 0 筆 | +| 5.5 `crypto.subtle.decrypt` 只在 wasi-shim | grep 0 筆(該 host fn 已成 stub,連 decrypt 都沒了) | +| 5.6 `crypto.subtle.sign` 只在 wasi-shim | grep 僅 `wasi-shim.ts:641` 一處 ✅ | +| 4.1 / 4.2 `auth_oauth2` | `registry/components/auth_oauth2/{main.go, .wasm, contract}` 齊備,且 `auth-dispatcher.ts:121` `SUPPORTED_PRIMITIVES` 已含 `'oauth2'` | + +### B. 未勾且**確實未完成**(真缺口,日後要做需另立新 SDD) + +| Task | 現況 | +|---|---| +| **4.3 / 4.4 `auth_mtls`** | `registry/components/auth_mtls/` **不存在**,從未實作。mTLS 認證目前不支援 | +| 1.7 / 1.8 static_key 端到端測試(openai / twilio) | 無記錄。機制本身已由 Phase 8.5 的 Notion 端到端實證涵蓋,但這兩條指定服務未各別驗過 | +| 2.6 service_account 端到端(google_sheets_sa) | 無記錄;與 7.6 同一條驗收鏈 | +| 3.5 / 3.6 gmail / http_request 端到端 | 無記錄 | +| **7.6 self-hosted auth 鏈端到端驗收** | 未完成。這是 Phase 7 唯一的客觀驗收項(`global_fetch_strictly_public` flag 是否真解 same-zone 1042,在自架帳號上從未實測) | +| 5.1 20 個 auth recipe seed 全數可用 | 未逐條驗證 | + +### C. 已作廢的驗收條件(criteria 本身過期,不算缺口) + +| Task | 為何作廢 | +|---|---| +| 5.7 全域 `interpolate` 回 0 筆 | 現況 5 個 TS 檔仍有 `interpolate`(`graph-executor` / `recipe-expander` / `component-loader` / `routes/recipes.ts` / `auth-recipe-seeds`)。但這是 **recipe 層的 URL/參數展開**,非 credential template 展開;當初訂此條時未區分兩者。credential 的 `{{secret.X}}` 展開確實已全在 WASM | +| 5.8 TS 中 `{{secret.` 回 0 筆 | 現況 `auth-recipe-seeds.ts` 有 10+ 筆。但依 rule 07「`*-seeds.ts` 是資料宣告非呼叫實作」已明文豁免,**此條與現行規則牴觸**,以 rule 07 為準 | +| 5.9 起「封測門檻」整段 | 封測狀態早已不是本 repo 的活躍議題(現行 active SDD=`portal-auth`) | + +> **結論**:主線目標(清除 cypher-executor 的 credential/auth TS 業務邏輯)**已達成**,故收卷。 +> 真正的殘留缺口是 **`auth_mtls` 從未實作** 與 **一批端到端驗收未跑**(尤以 7.6 self-hosted +> auth 鏈為最)。這些**不隨本卷封存而視為完成**;要做請另立新 SDD 並依 SDD-LIFECYCLE.md 走。 + **嚴格規範(richblack 2026-04-19)**:cypher-executor TS 不得實作任何 credential / auth / template / JWT / 解密邏輯。全部走 TinyGo WASM + host functions(方案 B)。 **封測狀態**:推遲(richblack 2026-04-19 決定)。先完成 Phase 1-3 清除違規 TS,再啟動封測。 diff --git a/system-dev/docs/3-specs/arcrun/sdk-and-website/tasks.md b/system-dev/docs/3-specs/arcrun/sdk-and-website/tasks.md index 454223b..480a581 100644 --- a/system-dev/docs/3-specs/arcrun/sdk-and-website/tasks.md +++ b/system-dev/docs/3-specs/arcrun/sdk-and-website/tasks.md @@ -4,13 +4,13 @@ 按 Design 的四個 Phase 實作。原則:修改不重建,SDK 是 HTTP API thin wrapper,加密只在 client 做 encrypt(不做 decrypt)。 -**前置依賴**:必須先完成 `credential-primitives-wasm/tasks.md` 的 Phase 0-3(核心合併 + WASM primitives),確認核心穩定後才開始建三個介面。 +**前置依賴**:~~必須先完成 credential-primitives-wasm 的 Phase 0-3~~ → **依賴已解除**(該卷 Phase 0-3 已完成並於 2026-07-21 封存至 `system-dev/docs/3-specs/archive/credential-primitives-wasm/`)。 --- ## Phase 0(前置):核心合併 + WASM 改寫 -> 詳見 `.agents/specs/arcrun/credential-primitives-wasm/tasks.md` +> ✅ 已完成並封存:`system-dev/docs/3-specs/archive/credential-primitives-wasm/tasks.md` > > 摘要: > - 合併 u6u-core → arcrun(搬 builtins、刪重複 credentials) diff --git a/system-dev/wiki/status.md b/system-dev/wiki/status.md index e4e8f5c..17bfe82 100644 --- a/system-dev/wiki/status.md +++ b/system-dev/wiki/status.md @@ -200,16 +200,23 @@ metadata: ## 🔄 進行中的 Task -### credential-primitives-wasm +### ~~credential-primitives-wasm~~ → 📦 已封存(2026-07-21) -- [x] Phase 0.1-0.5:核心合併、21 個零件 contract 完成、CREDENTIALS_KV binding 確認 -- [x] Phase 0.6:wasi-shim 新增 host functions(kv_get / crypto_decrypt / crypto_sign_rs256) - - 決策:host function 實作位置 = cypher-executor/src/lib/wasi-shim.ts - - 待驗:component-loader 能否正確呼叫 WASM runner -- [ ] Phase 0.7:component-loader WASM runner 路徑(依賴 0.6) -- [ ] Phase 1.1-1.8:auth_static_key WASM 零件(TinyGo) -- [ ] Phase 2.1-2.6:auth_service_account WASM 零件(JWT signing) -- [ ] Phase 3.1-3.5:清除 cypher-executor 三套違規 TS(credential-injector.ts / jwt-signer.ts / BUILTIN_*) +**不再是進行中的 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 @@ -283,11 +290,12 @@ metadata: **推遲**(richblack 2026-04-19 決定,後延至 2026-06-08 依舊推遲) -**原因**: -- Phase 1-3(auth WASM + 清除違規 TS)未完 -- 待 credential-primitives-wasm 完整交付 +**原因(2026-07-21 更新)**: +- ~~Phase 1-3(auth WASM + 清除違規 TS)未完~~ ✅ **已完成**,credential-primitives-wasm 卷已封存 +- 殘留:`auth_mtls` 未實作、self-hosted auth 鏈端到端未驗(均需另立新 SDD) -**啟動條件**:Phase 1-3 完成 + 壓測 Haiku 自癒能力驗證 +**啟動條件**:原「Phase 1-3 完成」已達成;壓測 Haiku 自癒能力驗證仍待做。 +封測是否啟動屬 leo 的決定,不由本檔認定。 --- @@ -301,9 +309,11 @@ metadata: ### 🟡 本周 -3. [ ] credential-primitives-wasm Phase 0.6-0.7(host function + WASM runner)→ Phase 1-2(auth WASM 零件) +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. [ ] 清除 cypher-executor 違規 TS(Phase 3:credential-injector.ts / jwt-signer.ts / BUILTIN_*) +5. [x] ~~清除 cypher-executor 違規 TS(Phase 3)~~ ✅ 完成(三者 grep 皆 0 筆,T10 於 2026-07-20) +5b. [ ] **`auth_mtls` 零件從未實作**(封存卷殘留缺口,要做需另立新 SDD) +5c. [ ] **self-hosted auth 鏈端到端驗收**(原 7.6,同上需另立 SDD) ### ⚪ 未來 @@ -318,7 +328,8 @@ metadata: | 資源 | 位置 | 用途 | |------|------|------| | 總進度 | `docs/3-specs/arcrun/arcrun.md` | 全景進度表 | -| 當前 Phase SDD | `docs/3-specs/arcrun/credential-primitives-wasm/` | design + tasks | +| 現行 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` | 自檢清單 |