verification-gate · git:20260515.4186f14 · 2026-05-15 · sha256 a5e48955f7564887
verification-gate git:20260515.4186f14A
Immutable. This exact content is served forever at /api/v1/blob/a5e48955f7564887.
--- name: verification-gate description: 完成前驗證閘門,強制要求提供新鮮的驗證證據才能宣稱完成。當 agent 或使用者聲稱「完成了」「修好了」「做好了」但未提供驗證證據時自動啟用。不適用於設計討論(用 design-brainstorm)或分支決策(用 branch-finisher)。 allowed-tools: Read, Bash, Grep, Glob --- # Verification Gate — 完成前驗證閘門 借鑑 obra/superpowers 的 `verification-before-completion` 概念,適配 DD Pipeline 風格。 ## 核心原則 **證據優先於宣稱,永遠如此。** > 沒有新鮮的驗證證據,就不能宣稱完成。 > 執行命令 → 讀取輸出 → 然後才能宣稱結果。 ## 鐵律 **禁止在沒有新鮮驗證證據的情況下宣稱完成。** - 「新鮮」= 在本次工作中實際執行並觀察到的結果 - 「之前跑過」不算 — 程式碼改了,之前的結果已失效 - 「應該可以」不算 — 推測不是證據 - 「改動很小」不算 — 小改動也能破壞系統 ## 觸發條件 **自動觸發時機:** 當出現以下宣稱但缺乏對應證據時啟用: **關鍵詞:** - 「完成了」「做好了」「修好了」「已修復」 - 「測試通過」「建置成功」「部署完成」 - 「所有功能正常」「問題已解決」 - 「done」「fixed」「all tests pass」 ## 5 步驗證流程(閘門函數) ### Step 1: 識別驗證項目 列出所有需要驗證的項目: | 宣稱類型 | 必要驗證 | |---------|---------| | 「測試通過」 | 執行 `npm test` / `pytest` 並讀取輸出 | | 「建置成功」 | 執行 `npm run build` / `cargo build` 並確認零錯誤 | | 「bug 已修復」 | 重現原始問題的步驟,確認不再發生 | | 「功能已實作」 | 執行功能的端對端測試或手動驗證 | | 「沒有迴歸」 | 執行完整測試套件,確認無新增失敗 | | 「linting 通過」 | 執行 `eslint` / `ruff` 並確認零警告 | | 「型別正確」 | 執行 `tsc --noEmit` / `mypy` 並確認零錯誤 | ### Step 2: 執行驗證命令 對每個驗證項目: 1. 執行對應的命令 2. **等待命令完成**(不要假設結果) 3. 記錄完整輸出 ### Step 3: 讀取並分析輸出 - 逐行讀取命令輸出 - 識別成功/失敗指標 - 記錄任何警告或異常 ### Step 4: 驗證結果 - 所有驗證項目都通過?→ 進入 Step 5 - 有任何失敗?→ **停止,修復問題,重新從 Step 1 開始** - 有警告但不影響功能?→ 記錄警告,進入 Step 5 ### Step 5: 宣稱完成(附帶證據) 產出驗證報告: ```markdown ## 驗證結果 | 項目 | 命令 | 結果 | 證據 | |-----|------|------|------| | 測試 | `npm test` | 通過 (25/25) | [輸出摘要] | | 建置 | `npm run build` | 成功 | 零錯誤,bundle size: 245KB | | Lint | `eslint .` | 通過 | 零警告 | **結論**:所有驗證通過,工作已完成。 ``` --- ## 常見失敗模式 | 宣稱 | 問題 | 正確做法 | |------|------|---------| | 「測試應該會通過」 | 沒有實際執行 | 執行測試,讀取輸出 | | 「我剛才跑過了」 | 在修改後沒有重新執行 | 每次修改後重新驗證 | | 「改動太小不會有問題」 | 假設小改動無風險 | 小改動也要驗證 | | 「其他測試不受影響」 | 沒有執行完整測試套件 | 執行所有相關測試 | | 「本地跑得好好的」 | 環境差異 | 確認 CI 也通過 | ## 紅旗清單 — 看到這些就停下 以下任何情況出現時,**立即停止並補充驗證**: - 使用「應該」「大概」「我覺得」等不確定語氣 - 跳過測試因為「改動很小」 - 宣稱完成但沒有貼出任何命令輸出 - 引用舊的測試結果(修改前的) - 說「手動驗證過了」但沒有說明步驟 - 假設 subagent 的工作是正確的而未確認 ## 合理化防範 | 常見藉口 | 現實 | |---------|------| | 「這只是重構,不影響行為」 | 重構是最常引入 bug 的操作之一 | | 「型別系統已經保證了」 | 型別不能保證運行時行為 | | 「我很確定」 | 確定程度不能替代證據 | | 「時間不夠跑測試」 | 不跑測試花的時間更多(debug) | | 「測試太慢了」 | 至少跑相關的測試子集 | ## 關鍵驗證模式 ### 測試驗證 ```bash # 不要只看 exit code,讀取完整輸出 npm test 2>&1 # 確認:通過數、失敗數、跳過數 ``` ### 迴歸測試 ```bash # 先確認修改前的失敗 git stash && npm test # 看到失敗 git stash pop && npm test # 看到通過 ``` ### 建置驗證 ```bash npm run build 2>&1 # 確認:零錯誤、零警告、輸出檔案存在 ``` ### 需求驗證 ```markdown 逐條對照需求清單: - [ ] 需求 1: [具體驗證方式和結果] - [ ] 需求 2: [具體驗證方式和結果] ``` ### Agent 委託驗證 ```markdown subagent 回報完成後: 1. 讀取 subagent 修改的檔案 2. 執行 subagent 聲稱通過的測試 3. 確認結果一致 ``` ## 與原生 `/goal` 的關係 Claude Code 原生 `/goal` 指令(≥ 2.1.139)與本閘門互補,職責分工: | 機制 | 負責 | |------|------| | `/goal` | **推進跨輪迴圈** — 設定完成條件,未達成就自動再跑一輪 | | `verification-gate` | **把守每輪證據門檻** — 每次「完成」宣稱都必須附新鮮驗證證據 | 組合使用:用 `/goal` 自主收斂時,本閘門的鐵律仍適用於迴圈中的**每一輪** —— `/goal` 的 評估器讀到的「完成」宣稱,必須是執行命令、讀取輸出後得出的結果,否則就是無證據宣稱, 閘門應擋下。`/goal` 解決「要不要再跑一輪」,`verification-gate` 解決「這一輪能不能說完成」。 ## 適用範圍 **何時啟用此閘門:** - 宣稱 bug 已修復 - 宣稱功能已實作 - 宣稱測試已通過 - 宣稱建置已成功 - 宣稱重構未影響行為 - subagent 回報工作完成 **何時不需要:** - 純粹的討論或設計(沒有「完成」的宣稱) - 文件撰寫(無需執行驗證) - 探索性調查(還在了解問題) ## 底線 **執行命令。讀取輸出。然後才能宣稱結果。** 沒有捷徑。沒有例外。沒有「這次不需要」。