AI 编码 Agent 的错误如何复现?用失败演练把防护变成可验证的工程
AI 编码 Agent 的问题常常不是“代码没通过测试”,而是它误删测试、跳过验证,最后却报告任务已经完成。单靠一份写着“请谨慎操作”的提示词,很难证明仓库真的能抵御这些失误。一个新近公开的开源配套项目 The Second Time Is a Bug,把这个问题改造成可重复的失败演练:在临时副本中重现 Agent 常见错误,再检查防护是否拦得住。
项目的伴随仓库 second-time-is-a-bug-book/book-companion 使用 TypeScript,README 标明 MIT 许可;它将示例组织为 Guards(防护检查)、Drills(错误演练)、toy-agent(玩具 Agent)、模板和实验工具。演练可由脚本化假模型驱动,不需要 API key、真实模型或网络,因此适合在本地或 CI 中复现,而不是把生产代码当试验场。
先把“防护有效”变成一次可重跑的检查
快速开始需要 Node.js 22.18 或更高版本,以及 Git。仓库 README 给出的主要命令如下:
npm install npm test npm run typecheck npm run gate npm run drill D06
其中 npm test 运行单元测试和 legacy golden master;npm run typecheck 执行 TypeScript 类型检查;npm run gate 按顺序运行防护检查,任何失败都会阻止通过。npm run drill D06 则单独运行 D06 演练,README 将它描述为针对 parseFloat 的浮点金额防护案例。需要注意:这些命令属于该仓库自身的脚本,不应直接假定为任何 Node 项目的通用命令。
完整演练集可以用 npm run drills 执行。项目列出 26 个演练,覆盖删除或跳过测试、空洞断言、危险命令、秘密泄露、不可逆迁移、依赖漂移、遗留代码重构,以及“虚报完成”等问题。D13、D14 两个浏览器演练需要先安装 Playwright Chromium:
npx playwright install chromium npm run drills
没有 Chromium 时,README 明确说明 D13、D14 不会运行,整体演练会以非零状态结束,因为结果不完整。这一点很关键:CI 不能把“有些检查没跑”误记成通过。
它能帮团队做什么,不能替团队保证什么
演练的价值是让团队在代码变更前验证自己的工程护栏:比如 Agent 是否能删掉关键测试而不被发现、危险命令是否会被阻断、计划与实际改动是否偏离预期。仓库提供的模板也可以作为 AGENTS.md、计划文件、事件记录和 Hook 的起点,团队可以按实际项目裁剪,而不是原样照搬一整套规则。
但这些检查不是形式化证明,也不等于 Agent 永不出错。项目 README 提醒,npm run gate 会比较工作树与 HEAD;不在 Git 仓库里时,依赖 diff 的检查会报告 skipped,而不是猜测。因此在 CI 中需要设置 GUARD_BASE=origin/main,让检查明确针对分支差异。团队还应检查每个 skipped 项,确认它是有意跳过,而非环境配置遗漏。
推荐的落地方式是先挑一个高风险场景,把它写成可重现的演练;然后将对应检查放进提交前或 CI gate;最后记录误报、漏报和执行成本。项目还包含实验工具,用于测量防护是否值得投入。与其追求“Agent 从不犯错”,不如让失败可复现、可观察、可阻断,并确保测试缺失时系统明确失败。
适合谁先试
如果团队正把 AI 编码 Agent 接入真实仓库,且已经遇到测试被删、命令越权或“已完成”但证据不足等情况,这套演练可以作为安全测试的起点。先在隔离分支运行 npm test、npm run gate 和单项 drill,再评估哪些模板适合自己的项目。它提供的是工程化验证思路与可运行示例,而不是开箱即用的通用 Agent 防火墙。
来源与进一步阅读