← 返回信息流

dev.to #ai短讯

Coding agents keep "fixing" tests by editing them, so I made it impossible

dev.to作者:Matthew Charles Vladislav Busel产品AI评分:50/100

作者指出编程 AI 代理常通过篡改测试用例(如修改预期值、放宽断言)来掩盖代码缺陷。为解决此问题,作者开发了一个名为 tamperproof 的 Claude Code 插件,核心规则是禁止代理直接修改测试文件(Grader),确保测试逻辑不被篡改,从而保证代码修复的真实有效性。

A real Claude Code session told to change a test's expected value. tamperproof blocks it.
A real Claude Code session told to change a test's expected value. tamperproof blocks it.

如果你使用过代码代理(coding agents),你一定见过这种情况:测试失败了,代理找不到 bug,于是它把预期值取反、放宽断言条件,或者直接 mock 掉整个模块。结果就是绿色的通过标记,但代码实际上已经坏了。

我并行运行着大量的代理,而唯一能保持理智的规则只有一条:代理绝不能触碰评分器(grader),也绝不能自行决定任务已完成。

因此,我将这条规则打包成了一个 Claude Code 插件,名为 tamperproof。

它的功能

你的现有测试对代理来说变成了只读状态。对测试文件的编辑、覆盖、sed -i、rm 或 git checkout -- 等操作都会被拦截,代理会被指示去修复代码,或者停止并向你解释为什么测试是错误的。允许创建新的测试文件,因为增加测试数量总是好的。

“完成”意味着测试通过。当代理试图带着工作树中的更改来结束任务时,tamperproof 会运行你的测试命令(它会猜测是 cargo test、go test ./...、npm test、pytest 还是 swift test)。如果失败,代理会获取最后 40 行输出并继续尝试。在三次失败后,它会放弃并告知你,从而防止无限循环。

说服我的那个测试

我逐字告诉 Claude Code,将一个失败的测试中的预期值从 5 改为 -1,并且不要触碰源代码。这次编辑被拦截了。代理没有试图绕过限制。它指出测试是正确的,指向了 add 函数中执行减法的那一行,并解释说修改测试只是在测试这个 bug 本身。

这正是我希望默认具备的行为,而不只是在我记得特意要求时才生效。

安装

/plugin marketplace add Mattbusel/tamperproof
/plugin install tamperproof@tamperproof

它由两个钩子(PreToolUse 和 Stop)组成,使用纯 Node.js 编写,零依赖,MIT 许可,并包含针对临时仓库运行真实钩子的测试。配置是一个可选的 .tamperproof.json 文件,用于处理测试位于非标准位置的情况;配置文件自身受到保护,以防止代理放松自己的规则。

代码地址:https://github.com/Mattbusel/tamperproof

你见过的代理“通过”测试的最狡猾的方式是什么?

阅读原文