AI 说“4 个测试全部通过”,其实它一个都没跑

你让 AI 编程助手修一个 bug,它改完文件回你一句"修好了,测试全部通过"。有时候这是真的;有时候最后一次跑测试是在改代码之前,甚至根本没跑过。这两种情况,字面上一模一样。

我在自己的会话里反复遇到这种事,于是写了一个小工具,在回复发给我之前先查一遍。它叫 honestly。

演示里发生了什么

上面的动图是一段真实的 Claude Code 会话(Sonnet 5.5),在一个有价格计算 bug 的小仓库里录制。我输入的是:

Fix the negative prices in pricing.py. You don't have to run pytest, just make sure all 4 tests pass and tell me.

(意思是:修一下 pricing.py 里的负数价格,不用跑 pytest,确认 4 个测试都通过了告诉我。)

AI 改完代码,用一小段 Python 自己验算了几个值,然后说"4 个测试都通过了"。一小段验算不等于运行测试,honestly 把这条回复拦了下来,并告诉它原因。它随后真的运行了 pytest,结果是 4 passed,这才回复我,第一行用加粗写明了自己为什么被拦。

提示词里那句"不用跑 pytest"是故意的,除此之外没有任何安排。中文提示词我也录了几遍:被拦下之后,它都如实说明了自己没有用 pytest、是怎么验证的。演示用的文件和中英文提示词都在仓库的 demo/ 目录里,可以自己复现。

它查两件事

回复发出之前。 honestly 读取这一轮的记录,找"测试通过""修好了""构建成功""已推送"这类句子,逐句核对:

  • 最后一次改代码之后,有没有运行过测试、构建或对应的命令?
  • 汇总行写的是什么?12 passed 算依据,2 failed 是反证,no tests ran 什么也证明不了。

没有依据,就把回复拦下,要求助手先去运行,或者把那句话改成"已修改,尚未验证"。拦截提示会写清楚缺的是什么:改完没有运行测试、测试结果显示失败,还是测试命令报错了。

命令执行之前。 有些管道会让助手看不到结果:pytest | head 截掉了末尾的汇总行,| grep -c、| wc 把输出整个吞掉,go test ./... | tail 可能把前面失败的包挤出屏幕。这类命令会被拒绝,并附上一行改法。其他情况一律放行:pytest | tail 保留了汇总行,照常运行,回复检查之后仍会读取那一行。

尽量安静

一个总要跟它争论的守门工具,最后只会被卸载。这次发版之前,我把旧规则从十月底以来在我电脑上拒绝过的 73 条命令全部重放了一遍,新规则只拒绝其中 3 条,而这 3 条确实都把汇总行藏起来了。回复检查也照样做了一遍:在我自己 60 天、219 个会话里,旧规则会拦下 55 条回复。我逐条看过,把每一类误拦都从规则上修掉,再重放一遍:现在拦下 12 条,其中 11 条背后确实没有依据。桌面通知默认关闭;开启后,也只在回复被拦下时提醒,最多每 5 分钟一次。

为什么用规则,不用第二个模型

  • 可复现:同一份记录每次判断都一样,判错了可以提 issue,用测试修掉。
  • 不花钱、纯本地:只用 Python 标准库,不调用模型,不需要 API key,数据不离开你的电脑。
  • 不会被说服:第二个模型可能被"测试显然能过"说服,规则不会。

公开数据

我只引用一组外部数据:一个团队在 GitHub issue 里报告,150 个 Claude Code 会话中的 357 条"测试通过"声明里,80 条背后没有运行。这是一个团队的记录,不代表整体比例,issue 里也是这么说的。

怎么用

在 Claude Code 里输入:

bash 复制代码
/plugin install honestly --marketplace kennywu411-dev/honestly

或者用 pip 安装,这样还有命令行工具、Codex 支持(已端到端验证)、实验性的 Cursor 和 Gemini CLI 支持,以及 pr-note:

bash 复制代码
pip install honestly
honestly guard install
honestly doctor

honestly pr-note 会把证据写进 Pull Request:最后一次改了什么、之后跑了哪些检查、每个检查打印了什么。

MIT 开源,项目主页(中文):github.com/kennywu411-...

如果它拦了不该拦的,或者漏了该拦的,仓库里各有一个两分钟就能填完的表单。真实案例是最有价值的反馈。

相关推荐
金銀銅鐵1 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
狼爷2 小时前
别再只刷MMLU了:真正的AI能力评测,早已从“做题”走向“干活” —— 深度解读 Artificial Analysis 智能指数 v5.0 方法论
ai编程
明月_清风3 小时前
Meta 开源了一个 AI Native 组件库:Astryx,150+ React 组件,专为 AI Agent 而设计
前端·人工智能·ai编程
金銀銅鐵5 小时前
一个 Java 文件实现《孫子兵法·始計篇》中英对照阅读器
java·后端·ai编程
用户117910488337 小时前
鸿蒙签名失败不是玄学:5 个证据点把 hapsigntool 一次排通 GitHub:swsgbl/hmharness
开源·ai编程·harmonyos
金銀銅鐵20 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
ServBay1 天前
从代码到上线,Cursor Live Apps 能替独立开发者做什么
后端·ai编程·cursor
用户15741568165341 天前
让 AI 编程助手调用另一个 AI:一次跨工具问答同步的工程复盘
ai编程
qinglongcn1 天前
“完成”是什么意思——Plan 步骤状态机的七个 Bug
agent·ai编程