# Design 補充:recipe 入庫把關(push 那一刻) > 2026-06-01。本檔是 `component-gatekeeping/design.md` 的單檔補充(規則 02 §4.3 允許)。 > **狀態:待 richblack review 才動 code(這是 change)。** > 背景:richblack 2026-06-01 方向修正(見下「方向定調」)+ docs/HANDOFF-self-host-harness.md。 --- ## 0. 方向定調(richblack 2026-06-01) 把關的對象與位置整個移位了,先講清楚才不會做歪: ### 0.1 零件這條路 = 封鎖,且「不再有假零件這件事」 - 零件由維護者(richblack)管理,**CC 不能自製/修改零件**。 - 封鎖機制 = **零件投稿走 GitHub PR + 人 merge**(DECISIONS §8 / design 頂部方向修正)。 AI 偽造不了 GitHub approve,這是天然人類閘門。CC 在本機產不出能進庫的零件。 - → 因此「擋假零件」(原 W1)這件事**不存在了**:CC 根本造不出零件,workflow 引用 recipe (如 `component: kbdb_get`)是**合法且未來唯一的擴充方式**,不該被當假零件擋。 ### 0.2 零件 PR 把關 = 人工,不自動化(除非未來爆量) - richblack 2026-06-01 澄清 BACKLOG 步驟5「不做 hook/自動化」的真意: **零件真實數量很少、絕大多數是 recipe** → 原本想做的「驗證零件 PR 的自動化機制」 (CI 跑 Gherkin/沙箱/向量)**不需要**,量少 → **有 PR 進來就人工檢查**。 **只有零件開發量變很大時**才回頭想自動化。 - → component-gatekeeping 的 G4/覆蓋檢查/黃金向量自動化 = **不做**(人工取代),與既有 tasks 收尾一致。 ### 0.3 真正的 harness 把關 = recipe 入庫(push)那一刻 CC 唯一能擴充的是 recipe。recipe 一律用「**推(push)**」,**自有庫與公共庫同一套指令**。 把關依庫別分強度: | 庫別 | 能做到的把關 | 機制 | |---|---|---| | **自有庫(self-hosted)** | 只能**提醒**(無法在別人機器強制) | (1) 資料外流提醒 (2) 打通檢查 | | **公共庫** | 維護者機制**檢核實際打通、真收到成功回傳** | PR/CI relay(DECISIONS §3c,第一期後)| --- ## 1. 自有庫 push 把關(self-hosted,第一期做) `acr recipe push` 的兩個提醒。**提醒級 = 告知 + 需人類明示同意,不硬擋**(self-hosted 是用戶自己的庫, 他同意後就是他的責任 — mindset §6 / data-exfil-warning 既有原則)。 ### 1.1 資料外流提醒(W2.2) - **觸發**:push 的 recipe / 或部署的 workflow 會讓「資料對外可見」——主要是產生**對外可被呼叫的 webhook** (`POST /webhooks/named/...` 對外 trigger URL),或 recipe 把本地資料 POST 到外部服務。 - **行為**:CLI 印明確警示「這個動作會讓 X 對外界可見/可呼叫,確認要繼續嗎?」→ 需人類明示同意(y/N)。 非 TTY(AI 直跑)→ 拒絕,提示「需人類確認」(mindset §7:絕不代替人類做暴露確認)。 - **與既有 data-exfil-warning 的關係**:已有 API 層 + pre-bash hook(commit 51d40ee 等)。 本項確認**涵蓋 recipe push 這條路徑**;若已涵蓋則只補文件,若沒涵蓋則補上 push 路徑的提醒。 - **誠實限制**:AI 技術上能偽造 exposure_consent。價值是法律歸責 + 軌跡可審,不聲稱不可繞過(mindset §7)。 ### 1.2 打通檢查(W2.3) - **目的**:recipe 是「指向外部 API 的指針」,正確性一半在「打不打得通」(DECISIONS §1 recipe 驗收標準 = 2xx)。 - **行為**:push 時(或 push 後)對 recipe 的 endpoint **實打一次**,回報 HTTP status。 - 2xx → 「✓ recipe 打通(HTTP 200)」 - 4xx/5xx → 「⚠️ recipe 未打通(HTTP 401/404/...)」+ 誠實標原因(如「缺 credential → 先 acr creds push」) - 連不上 → 「⚠️ 無法連線」 - **self-hosted 是提醒級**:打不通**不硬擋 push**(用戶可能就是要先 push 再設 credential),只如實回報。 - **誠實**(mindset §7):缺 credential 打不到 2xx 就誠實標「未驗收:缺 X」,不 mock 充綠燈。 ### 1.3 動到的檔案(待 review 後) | 檔案 | 動作 | |---|---| | `cli/src/commands/recipe.ts` | push 流程加 (1) 資料外流提醒 prompt (2) 打通檢查(實打 endpoint 回報 status) | | `.claude/hooks/*`(如需)| 確認 data-exfil pre-bash hook 涵蓋 recipe push;缺則補 | **不動**:cypher-executor 執行路徑、零件、credential 解密邏輯。 --- ## 2. 公共庫 push 把關(第一期後) - recipe 進公共庫 = 別人會用 → 需維護者機制檢核「**實際打通、真收到成功回傳**」(不是投稿者自報)。 - 機制:DECISIONS §3c 的 **test/relay**——push 公共庫走 relay,維護者當下親見真實打通記錄 (執行者不能驗證自己,§7 閉環)。 - **範圍**:依賴公共庫 + relay 基建,**第一期不做**(第一期是 self-hosted + 提醒級)。 - 本檔只記框架,第一期不實作。 --- ## 3. 同一套指令、不同把關強度的切分(W2.4) - `acr recipe push`(自有庫,預設)→ §1 提醒級。 - `acr recipe push --public`(公共庫,未來)→ §2 relay 檢核級。 - 同一指令、旗標分流(呼應 design §4.3 公私庫分流:`-p`/`--public`)。 - 第一期只實作預設(自有庫)路徑。 --- ## 4. 驗收標準(客觀證據,mindset §7) 第一期(自有庫提醒級): 1. `acr recipe push` 一個會產對外 webhook 的東西 → CLI 印資料外流警示 + 要人類同意;非 TTY → 拒絕。 2. `acr recipe push` 一個 endpoint 可達的 recipe → 打通檢查回報「✓ HTTP 2xx」。 3. `acr recipe push` 一個缺 credential 的 recipe → 回報「⚠️ 未打通:缺 credential」(誠實,不假綠),但仍允許 push。 4. 確認 workflow 引用 recipe(`component: kbdb_get`)**不再被任何 validate 步驟當假零件擋**(W1 已作廢)。 --- ## 5. 與既有 SDD 的一致性確認(無新矛盾) - 不動「零件投稿走 PR + 人工檢查」(§0.1/0.2,與 design 頂部方向修正、DECISIONS §8 一致)。 - 不重啟「零件 PR 自動化把關」(§0.2,與 BACKLOG 步驟5 真意一致)。 - 資料外流提醒延續既有 data-exfil-warning 原則(mindset §6),只確認涵蓋 recipe push 路徑。 - 打通檢查 = recipe 驗收標準 2xx 的落地(DECISIONS §1)。