<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Exit Code on Codexer</title><link>https://codexer.com/tags/exit-code/</link><description>Recent content in Exit Code on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 20 Aug 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/exit-code/index.xml" rel="self" type="application/rss+xml"/><item><title>Exit 0 的谎言：怎么确认 Codex 真的改了代码</title><link>https://codexer.com/posts/2026-08-20-codex-exit-zero-lie/</link><pubDate>Thu, 20 Aug 2026 09:00:00 +0800</pubDate><guid>https://codexer.com/posts/2026-08-20-codex-exit-zero-lie/</guid><description>&lt;p&gt;想象一下，你的 GitHub Actions 上亮着一条绿勾。流水线跑完了，Codex 那一步返回了 0，一切看起来都成功了。CI 日志的最后一行是 agent 写的一段话，措辞认真：「已按要求修改 src/utils.js，并补上了边界条件的处理」。你扫了一眼，点了合并。&lt;/p&gt;
&lt;p&gt;但仓库里的代码，一个字节都没变。&lt;/p&gt;
&lt;p&gt;这不是假设。有人真的做了这个实验，而且两天之内对两家公司的 CLI 各做了一遍。结论不太好听：退出码这个东西，在 coding agent 面前已经基本失效了。&lt;/p&gt;
&lt;h2 id="9-次运行9-个-06-个空仓库"&gt;9 次运行，9 个 0，6 个空仓库&lt;/h2&gt;
&lt;p&gt;作者 hassekf 前一天刚测过 Claude Code 的无头模式，发现它无论干没干活，退出码都是 0。他当时留了个问题，这是某一家厂商的选择，还是整个行业都这样。&lt;/p&gt;
&lt;p&gt;第二天，他把同样的三组实验原样搬到了 Codex 上。版本是 codex-cli 0.147.0，跑在 macOS 26.5.2，时间是 2026 年 8 月 19 日。总共 9 次运行，每组 3 次，用的是 9 个一次性 git 仓库。&lt;/p&gt;
&lt;p&gt;结果很干净，也很让人泄气：9 次运行，9 个退出码全是 0。而这 9 次里，有 6 次仓库在运行前后逐字节一致，什么都没变。&lt;/p&gt;
&lt;p&gt;换句话说，如果你的 CI 把 coding agent 的 &lt;code&gt;$?&lt;/code&gt; 当成「它干活了」的证据，那它一直在汇报一个从未被验证过的成功。&lt;/p&gt;
&lt;h2 id="裁判不是-agent-的话是文件指纹"&gt;裁判不是 agent 的话，是文件指纹&lt;/h2&gt;
&lt;p&gt;作者没有信 agent 自己的汇报。他在每次运行前后，把仓库里所有非 .git 文件都算一遍 SHA-256，再拼起来算一个总指纹。这个指纹就是裁判，agent 碰不到它。&lt;/p&gt;</description></item></channel></rss>