202a5ab8d6
新 SDD .agents/specs/component-gatekeeping/(richblack 確認,含 venue 修訂 + 信任模型)。 registry 端靜態把關(CF Worker 可跑,不執行 wasm): - G1 detectFakeComponent: 外部 URL/domain + http_request 子集偵測,硬擋退稿指回 recipe - G3 wasmImports: 解析 wasm import section,只准 wasi_snapshot_preview1 + u6u 白名單 - G5/G6: unimplemented_steps 明列 gherkin/cold_start/runtime_compat,不假綠(§3c/§7) - gherkin_evidence 一致性驗證(投稿者本地跑,registry 不重跑——CF 禁 runtime 編譯 wasm) 把關範圍:公共庫 + self-hosted 私人庫同一套(design §0.0)。 信任模型(design §4.5):Gherkin 全綠≠安全;純 WASI 沙箱框死能力才是發佈底氣; 第一期 evidence 可造假(誠實標明),平台重跑列未來。 hook: pre-write-guard 白名單加 component-gatekeeping / component-registry-canon SDD 目錄。 測試: sandboxAcceptance.test.ts 4 綠(含 G1 假零件被擋)。 待續(同 SDD): G4 CLI 投稿指令本地跑 Gherkin、G0 人類閘門、R5 白名單+本機 hook。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
54 lines
3.7 KiB
Markdown
54 lines
3.7 KiB
Markdown
# Requirements: Component Gatekeeping(零件投稿真把關)
|
||
|
||
> 2026-05-29 建立(richblack 確認)。對應第一期 BACKLOG 步驟 4(補零件庫真把關)+ 步驟 5(人類閘門 + 白名單 hook)。
|
||
> 判準源:DECISIONS.md §1(工作流是 default / 建零件人類閘門 / ABC 三管齊下)、§7(讓 AI 不做歪三層機制 + 閉環)、§3c/§7(禁假綠)。
|
||
|
||
---
|
||
|
||
## 背景
|
||
|
||
第一期要把「零件投稿」從「無審核」變成「真的會擋」的把關。現況:
|
||
- `registry/src/actions/sandboxAcceptance.ts`:size_check / syscall_scan 已實作;cold_start / gherkin_tests / runtime_compat 是 `return null` mock。
|
||
- `submitComponent.ts`:跑 sandboxAcceptance → 派 hash → 寫 KV。無假零件偵測、無人類閘門。
|
||
- 風險(DECISIONS):CC 把自用服務(通訊錄/帳本)做成零件進公共庫 → 全生態能打 → 機密外洩。
|
||
|
||
## 需求
|
||
|
||
### R1 — Gherkin 驗收真實作(取代 mock)
|
||
- `runGherkinTests` 要真的跑零件 WASM:對每個 `gherkin_tests[]` 的 given → 餵 stdin → 比對 stdout 是否 `then_contains`。
|
||
- 失敗 → 退稿,回明確 reason + guide anchor。
|
||
- recipe 不適用 Gherkin(DECISIONS §1:recipe 驗收 = 2xx);本需求只針對 WASM 零件投稿。
|
||
|
||
### R2 — 假零件偵測(退稿並指回正路)
|
||
依 DECISIONS §1 判準,投稿零件若滿足任一,退稿:
|
||
- (a) contract 或(可得的)原碼出現具體外部服務 URL / domain
|
||
- (b) 宣告能力是 http_request 子集(打某固定 endpoint)
|
||
退稿訊息要指回正路:「這該是 recipe / 工作流,不是零件」。
|
||
|
||
### R3 — 純 WASI preview1 / 零宿主依賴把關
|
||
- 擴充 syscall 掃描:確認零件只依賴 WASI preview1 + u6u host functions 白名單,無其他宿主特定依賴(避免 runtime 鎖定債,DECISIONS §4)。
|
||
- 冷啟動 / runtime 相容兩步可暫留 mock,但**明確標「未實作」**,不可假裝通過(§3c/§7 禁假綠)。
|
||
|
||
### R4 — 建零件的人類閘門(核心,BACKLOG 步驟 5 強化規格)
|
||
- **把關點 = 建立零件的 API 本身**(registry submit endpoint),不是寫檔案。CLI / MCP / Python lib / JS lib 四路全收斂到這關。
|
||
- submit 預設**拒絕**,除非請求帶:
|
||
- (a) 人類已確認憑證(CLI `acr component create` 強制互動式問人類,AI 非互動環境生不出)
|
||
- (b) 舉證 `reason_why_not_workflow`(AI 須證明工作流為何做不到;舉證責任在 AI,預設假設工作流能做)
|
||
- 缺 → 403 + 指回正路(先試工作流)。
|
||
- 誠實限制:沒技術能 100% 防 AI 假冒人類確認;靠閘門 + 舉證留記錄 + mindset 明示「絕不代替人類確認」+ 軌跡可審計,讓假冒成明確越界。
|
||
|
||
### R5 — 白名單 + 本機 hook 兜底
|
||
- `MVP_COMPONENTS.txt` 白名單檔。
|
||
- pre-write / pre-bash hook:CC 直接在 `registry/components/{白名單外新名}/` 造目錄或 mkdir → exit 2(擋繞過 API 直接改 repo 等 CI 部署的旁門)。
|
||
- pre-write hook:`registry/components/` 下出現 `.ts`(非 AssemblyScript)→ exit 2(現有 hook 已部分做)。
|
||
|
||
### R6 — 不限制自由
|
||
- 不做「audience 宣告 / 禁止自用進公共庫」式的限制(DECISIONS:別人要建零件是他的自由)。
|
||
- 唯一硬約束:零件 = 只打一個 endpoint 的薄殼。閘門是「要建得先說服人 + 舉證」的摩擦,非禁止。
|
||
- arcrun 不做授權判斷(能否打通由發 key 的服務裁決)——把關針對「是否該是零件」,不針對「誰能打哪個 API」。
|
||
|
||
## 非目標
|
||
- Phase 5 用戶自製零件 R2 上傳(未啟用)。
|
||
- registry KV schema 大改(用既有結構)。
|
||
- 完整的 audit trail 系統(DECISIONS §7 事後機制第一層,另議)。
|