SuperAPI AI 工具集

gateguard

测试与质量

查看项目

更新于 10-15 15:55

技能介绍

用途与核心思路

GateGuard 是一个 PreToolUse 事实强制门控(Fact-Forcing Pre-Action Gate)。它的设计理念是:让 Claude 在编辑前先进行调查,而不是依赖无效的自我评估。资料指出,询问 LLM“你是否违反了任何政策”得到的答案总是“没有”,这已被实验验证;但要求它“列出所有导入该模块的文件”会迫使模型执行 Grep 和 Read,调查本身产生的上下文会改变输出。

三阶段门控

  1. DENY:阻止首次 Edit/Write/Bash 尝试。
  2. FORCE:明确告知模型需要收集哪些事实。
  3. ALLOW:在事实呈现后允许重试。

资料称没有竞争对手同时做到这三点,多数只停留在“拒绝”阶段。

主要能力

  • Edit / MultiEdit 门控:对每个文件的首次编辑进行门控;MultiEdit 逐条处理,缺少自身 file_path 的条目按调用的 file_path 处理;NotebookEdit 按 notebook_path 视作 Edit 进行门控。针对代码目标,Edit 门控要求:列出所有导入/引用该文件的文件(搜索树)、列出受影响的公共函数/类、若读写数据文件则展示字段名结构与日期格式(使用脱敏或合成值)、逐字引用用户当前指令。
  • Write 门控:首次创建新文件时要求:命名将调用该新文件的文件与行、确认没有现有文件承担相同用途(搜索树)、若涉及数据则展示字段名结构与日期格式、逐字引用用户指令。
  • 问题适配改动:门控会读取即将允许的改动(Edit 的 old_string/new_string、MultiEdit 的每个条目、Write 的内容),判断是否触及公共接口、是否处理数据、是否属于琐碎改动,从而调整提问。公共接口的判定覆盖 JS/TS、Python、Go、Rust、Shell、PowerShell 等语言;Java、Kotlin、C#、C、C++ 及批处理文件以及所有 Write 始终视为触及公共接口。
  • 按目标类别提问:门控会先对目标分类(instruction、test、prose、config、code),因为代码类问题对 SKILL.md、README、测试或 YAML 文件没有意义。分类基于项目根目录(先 CLAUDE_PROJECT_DIR,再 payload 的 cwd,再进程目录)的相对路径,并处理 worktree、Windows 风格路径等情况;每类问题都以“逐字引用用户当前指令”结尾。
  • 破坏性 Bash 门控:对 rm -rf、git reset --hard、git push --force、drop table 等命令,要求列出将修改/删除的所有文件数据、写出一行回滚步骤、逐字引用用户指令。
  • 常规 Bash 门控:每会话一次,要求一句话概括当前用户请求、说明该命令验证或产出什么。只读的内省命令(如 ls、pwd、cat、head、tail、wc、grep、rg、find、fd、tree、git status/log/diff/show 等,PowerShell 中对应命令)不会触发,直到门控首次触发;任何重定向、tee、替换、反引号、变量、环境赋值、包装器、未知命令等会使命令变为普通命令。
  • 会话状态:按会话 id 或 transcript 路径键控时闲置 8 小时后过期,回退到项目目录时闲置 30 分钟后过期。

特殊处理

  • 敏感目标:文件名如 .env、.netrc、.pgpass,或以 .env. 开头、以 .pem/.key/.p12/.pfx 结尾、以 id_rsa 等开头的文件;路径段为 auth、authn、authz、security、secrets、payment、payments、billing、migrations;或位于 .github/workflows/ 下的文件,均视为敏感目标。它们不适用先前搜索抵扣、兄弟折叠与拒绝上限,首次触碰即被拒绝。任何判定错误都按敏感处理。
  • 硬链接目标:nlink > 1 的文件或其符号链接,同样不适用上述豁免,拒绝信息会说明这一点。
  • 已算完成的判定:如果 transcript 显示调查已完成,或答案会与上次拒绝逐字重复,门控会放行并附注。规则包括豁免 glob、子代理调用、本会话已检查、先前搜索抵扣、注释或纯空白编辑、兄弟折叠、拒绝上限(GATEGUARD_FACT_FORCE_MAX_DENIALS)等。
  • 先前搜索抵扣:在当前人类回合中,若已经用 Glob、Grep、LS 或由 rg、grep、find、fd 等引导的 Bash/PowerShell 命令段覆盖了该文件,则允许通过并附注。Read 不计入。当前人类回合从最新真实用户消息或压缩点开始。

支持的文件扩展名

.js .mjs .cjs .jsx .ts .tsx .mts .cts .py .pyi .go .rs .java .kt .kts .cs .c .h .cc .cpp .cxx .hpp .hh .hxx .sh .bash .zsh .ps1 .psm1 .bat .cmd。其他扩展名、缺失或非字符串字段、超过 64 条 MultiEdit 条目、单侧超过 64 KiB 或总计 256 KiB 的情况,都会触发完整问题。

适用场景

  • 文件编辑会影响多个模块的代码库。
  • 具有特定 schema 或日期格式的数据文件的项目。
  • AI 生成代码必须匹配现有模式的团队。
  • Claude 倾向于猜测而非调查的任何工作流。

证据

资料提供两项独立 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。两者产出的代码都能运行并通过测试,差异在于设计深度。

并行批次与部分应用

首次触碰门控独立评估每个工具调用。当对尚未触碰的文件的多个编辑在同一并行批次中发送时,第一个调用被拒绝,拒绝会把该文件标记为已检查,因此该批次中的兄弟编辑会被应用,不会回滚,文件可能保留兄弟编辑而缺少被拒绝的那个。拒绝消息会指出文件名并警告批次兄弟可能已被应用,因此依赖性的编辑应按顺序发送,而非并行批次。门控无法实现批次级锁,因为钩子一次只能看到一个工具调用。

配置项

资料中提到的环境变量包括:GATEGUARD_EXTERNAL_CONTRACT_QUESTION、GATEGUARD_EXEMPT_GLOBS、GATEGUARD_FACT_FORCE_FULL_DENIALS、GATEGUARD_FACT_FORCE_MAX_DENIALS。每个问题有稳定 id,列于 docs/gateguard/change-profile.md。

限制

  • 无法实现批次级锁。
  • 并行批次可能导致部分应用。
  • 某些判定错误会按敏感或硬链接处理,可能更严格。
  • 具体安装方式、价格与平台支持资料未提供。