防止 AI 改不该改的:repo 级 guardrail 实战

CLAUDE.md / AGENTS.md 列禁区路径、.cursorignore 让 agent 读不到、CODEOWNERS + 分支保护强制 review、pre-commit hook + secret 扫描——四层护栏比礼貌指令稳。

这篇讲什么

AI agent 第一次改到 prod.config.ts、删掉 .env.local、或”顺手整理”一个 migration 文件之后,你就明白:礼貌的指令并不泛化。这篇是真正能撑住的那套护栏:写进 repo 的规则、文件系统级的 deny list、分支保护、以及让不安全的改动在落地前就能被看见的工作流形状。

这篇适合谁看

把 Cursor、Claude Code、Codex 或任何 agent 类工具的写权限放进真实 repo 的所有人——独立开发者、小团队,尤其是 repo 涉及 secret、infra、生产数据的人。如果你目前唯一的护栏是”我礼貌地拜托 agent”,这篇就是写给你的。

什么时候适合用

第一次让 agent 在真实 repo 上自主跑之前。也包括 agent 改到了不该改的东西之后——那一刻你的规则才会真的被写下来。

开始前准备

  • 盘点 repo 里已有的敏感物:.env*、凭证、infra 配置、migration、部署脚本。列清单。
  • 确认 .gitignore 已经把 secret 排除——pre-commit hook 看的是 git,不是文件系统。
  • 至少装一个 secret 扫描器(gitleaksdetect-secrets、GitHub secret scanning)。pre-commit hook 形式最稳。
  • 选定哪个分支是”仅人类”(通常是 main),规划分支保护强制 review。

具体步骤

  1. CLAUDE.md / AGENTS.md 根目录列禁区路径。 写具体:infra/migrations/.env*secrets/**/credentials.json。模糊规则(“配置文件小心点”)不泛化。
  2. .gitignore 风格的忽略,或 agent 原生的 ignore 文件.cursorignore.claudeignore 等),让 agent 连读都读不到。上下文里没有 = 改不到。
  3. 关键文件强制人工 review ——用 CODEOWNERS 加 main 分支保护。agent 可以提议,你来批准。
  4. 在干净的 tree 上跑 agent(无未提交本地改动),这样 git status 显示的全是 agent 的改动,不混。
  5. 用 pre-commit hookgitleakspre-commit 框架)——agent 和你都漏看时的最后防线。
  6. main 开分支保护:必须 PR、必须过 status check、不许 force push、至少一个人工 review。agent 即使想直推也推不上去。

一个具体的 CLAUDE.md 段落

## agent 禁区文件
- .env, .env.*, .env.local, .env.production
- infra/**, terraform/**, k8s/**
- migrations/**
- src/lib/secrets/**
- prisma/schema.prisma(读可以,改必须人工 PR)
- package-lock.json(只允许 `npm install` 改)
- VERSION, CHANGELOG.md(仅人改)

## 禁止的操作
- git push --force, git push --force-with-lease
- 任何已经推到 origin 的分支上的 git rebase
- npm publish, pnpm publish, yarn publish
- 项目根目录的任何 rm -rf

具体路径很重要。模糊指导会变成玄学。

为什么”礼貌地拜托”会失败

  • agent 跨 session 会重置;口头规则不持久。
  • 长上下文会退化;写在顶部的规则可能被回放,中间的规则会被忘。
  • 不同 agent(Cursor / Claude Code / Codex)尊重的约定不同。
  • 即使有规则,agent 也会给自己找边界例外(“我必须改这个才能修 bug”)。
  • 没有执行机制(hook、分支保护)的规则只是建议,不是护栏。

建议的操作流程

护栏(写下的规则 + ignore 文件 + hook + 分支保护)-> 在干净 tree 上跑 agent -> 审 diff -> 人提交或批准 PR -> push。每一层都很便宜,叠在一起就能抓住上一层漏掉的。

FAQ

  • 单人开发也要分支保护吗?: 要。它还能拦住凌晨 2 点慌乱中的你自己。
  • 如果我希望 agent 改一个本来被保护的文件呢?: 临时去掉规则、做完、恢复规则,分两个独立 step 提交。不要”就这一次”地放宽规则。
  • pre-commit hook 的摩擦值得吗?: 你只要泄过一次 .env 就觉得值。装上 gitleaks 然后忘了它。
  • 能跑 shell 的 agent 怎么办?: 用沙盒 / 容器;shell 工具只允许 allow-list 命令。永远不让 agent 跑 sudo 或生产部署命令。
  • AI 项目要 CODEOWNERS 吗?: 要;把 infra/migrations/、安全敏感文件标成必须人工 reviewer。
  • 如果 agent 真的改了被保护的文件?: pre-commit 应当拦住;万一过了,git revert 那个 commit,把路径加进 ignore。别在同一处第二次怪 agent。

容易踩的坑

  • 只口头说一次”别动 X”——规则必须写进 repo,否则一个 session 就遗忘。
  • CLAUDE.md / AGENTS.md —— agent 每个 session 自己发明约定。
  • 在脏 tree 上跑 agent ——你的改动混进 agent 的改动,review 不可能。
  • 让 agent 直推——唯一的人工 checkpoint 被绕过。
  • 跳过 pre-commit hook ——“我在 review 里抓得住”终究有一次抓不住。
  • 模糊规则(“小心一点”)——泛化不可预测;只用具体路径。

相关阅读

标签: #AI 编程 #教程