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>
This commit is contained in:
2026-07-21 01:57:34 +08:00
parent df1b953d1f
commit 8d8b01d240
21 changed files with 241 additions and 161 deletions
+9 -1
View File
@@ -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 |
## 主線
| 目錄 | 內容 | 狀態 |
@@ -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`;現行做法見
@@ -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,再啟動封測。
@@ -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