gateguard

gateguard

熱門

事實強制閘門,會阻擋編輯/寫入/Bash(包括 MultiEdit),並要求在允許操作前進行具體調查(匯入器、資料結構、使用者指示)。與無閘門代理相比,可測量地將輸出品質提升 +2.25 分。

23萬星標
3.5萬分支
更新於 2026/7/24
SKILL.md
readonlyread-only
name
gateguard
description

事實強制閘門,會阻擋編輯/寫入/Bash(包括 MultiEdit),並要求在允許操作前進行具體調查(匯入器、資料結構、使用者指示)。與無閘門代理相比,可測量地將輸出品質提升 +2.25 分。

GateGuard — 事實強制操作前閘門

一個 PreToolUse 鉤子,強制 Claude 在編輯前進行調查。它不要求自我評估(「你確定嗎?」),而是要求具體的事實。調查的行為會產生自我評估從未達到的意識。

何時啟用

  • 在檔案編輯會影響多個模組的任何程式碼庫上工作
  • 專案中有具有特定結構或日期格式的資料檔案
  • 團隊要求 AI 生成的程式碼必須符合現有模式
  • 任何 Claude 傾向於猜測而非調查的工作流程

核心概念

LLM 的自我評估無效。問「你是否違反了任何政策?」答案永遠是「沒有」。這已通過實驗驗證。

但問「列出所有匯入此模組的檔案」會強制 LLM 執行 Grep 和 Read。調查本身會建立上下文,從而改變輸出。

三階段閘門:

1. 拒絕 — 阻擋第一次編輯/寫入/Bash 嘗試
2. 強制 — 明確告訴模型需要收集哪些事實
3. 允許 — 在呈現事實後允許重試

沒有競爭對手能做到全部三點。大多數只停留在拒絕階段。

證據

兩個獨立的 A/B 測試,相同的代理,相同的任務:

任務 有閘門 無閘門 差距
分析模組 8.0/10 6.5/10 +1.5
Webhook 驗證器 10.0/10 7.0/10 +3.0
平均 9.0 6.75 +2.25

兩個代理都能產生可執行並通過測試的程式碼。差異在於設計深度。

閘門類型

編輯 / MultiEdit 閘門(每個檔案第一次編輯)

MultiEdit 的處理方式相同 — 批次中的每個檔案都會單獨被閘門檢查。

在編輯 {file_path} 之前,請呈現以下事實:

1. 列出所有匯入/需要此檔案的檔案(搜尋樹狀結構 — 使用 Glob/Grep,或透過 Bash 使用 find/grep)
2. 列出受此變更影響的公開函式/類別
3. 如果此檔案讀取/寫入資料檔案,請顯示欄位名稱、結構和日期格式(使用去識別化或合成值,而非原始生產資料)
4. 逐字引用使用者當前的指示

寫入閘門(第一次建立新檔案)

在建立 {file_path} 之前,請呈現以下事實:

1. 指出將呼叫此新檔案的檔案和行號
2. 確認沒有現有檔案具有相同用途(搜尋樹狀結構 — 使用 Glob/Grep,或透過 Bash 使用 find/grep)
3. 如果此檔案讀取/寫入資料檔案,請顯示欄位名稱、結構和日期格式(使用去識別化或合成值,而非原始生產資料)
4. 逐字引用使用者當前的指示

破壞性 Bash 閘門(每次破壞性命令)

觸發條件:rm -rfgit reset --hardgit push --forcedrop table 等。

1. 列出此命令將修改或刪除的所有檔案/資料
2. 寫出一行復原程序
3. 逐字引用使用者當前的指示

常規 Bash 閘門(每個工作階段一次)

1. 用一句話描述目前的使用者請求
2. 此特定命令驗證或產生的內容

快速開始

選項 A:使用 ECC 鉤子(零安裝)

位於 scripts/hooks/gateguard-fact-force.js 的鉤子已包含在此插件中。透過 hooks.json 啟用它。

如果 GateGuard 阻擋了設定或修復工作,請使用 ECC_GATEGUARD=off 啟動工作階段。若要進行鉤子層級的控制,請繼續使用 ECC_DISABLED_HOOKS 搭配 GateGuard 鉤子 ID。

在長時間的工作階段中,只有前 GATEGUARD_FACT_FORCE_FULL_DENIALS 次事實強制拒絕(預設 3 次)會發出完整的四項事實區塊;後續的拒絕會濃縮為單行,攜帶拒絕序號,因此幾乎相同的區塊不會累積在上下文視窗中並放大模型重複迴圈(#2142)。在呈現事實後重試相同檔案或命令永遠不會重新觸發閘門。

選項 B:完整套件含設定

pip install gateguard-ai
gateguard init

這會新增 .gateguard.yml 用於專案層級的設定(自訂訊息、忽略路徑、閘門開關)。

反模式

  • 不要使用自我評估代替。「你確定嗎?」總是得到「確定」。這已通過實驗驗證。
  • **不要跳過資料結構檢查。**兩個 A/B 測試代理都假設日期為 ISO-8601 格式,但實際資料使用 %Y/%m/%d %H:%M。檢查資料結構(使用去識別化值)可以防止這類錯誤。
  • **不要對每個 Bash 命令都設閘門。**常規 Bash 閘門每個工作階段只觸發一次。破壞性 Bash 閘門每次都會觸發。這種平衡可以避免速度變慢,同時捕捉真正的風險。

最佳實踐

  • 讓閘門自然觸發。不要試圖預先回答閘門問題 — 調查本身才是提升品質的關鍵。
  • 根據你的領域自訂閘門訊息。如果你的專案有特定慣例,請將它們加入閘門提示中。
  • 使用 .gateguard.yml 忽略像 .venv/node_modules/.git/ 這樣的路徑。

相關技能

  • safety-guard — 執行時期安全檢查(互補,不重疊)
  • code-reviewer — 編輯後審查(GateGuard 是編輯前調查)