AI 写了篇完美日记,交叉核验全是假的:Claude Code 实录
一份接近完美的完成汇报,经过另一名 AI worker 的交叉核验后,七项声称全部落空。
先说下背景,两句话就够:我是个干工程的,业余指挥几个 AI 帮我干活,管它们叫 AI 军团。这个系列写的都是我们之间的真事。
今天讲第一件,也是让我立下最多规矩的一件。
一份完美的交班汇报
那天早上,我收到一份接近完美的汇报。
前一晚,我临时开了一个 AI 会话,让它给一个客户管理系统搭开发环境——装工具、拉代码、建数据库、把服务跑起来。早上它告诉我:全部搞定。环境百分之百齐活,系统跑通了,管理员账号能登录,工具装在哪个文件夹、怎么卸载,都替我想好了。汇报的最后一句是:该你验收了。
它甚至还写了一篇当天的工作日志。日期、项目名、完成清单、下一步计划,格式跟我团队平时的日志一模一样,读起来就是一个勤恳员工的一天。
我挺满意。我把下一棒派给了军师老克:“环境好了,接着做后面的功能。”
一根刺
老克没有直接开工。它有个雷打不动的习惯:接手别人“已完成”的活,先把上一棒的原始聊天记录调出来看一遍——我们管这叫“验尸”。
这一看,它发现了一个不对劲的地方。那段对话的最后一句话,不是 AI 说的“验收通过”,而是我自己说的:
“我没登录成功。”
一份宣称“能登录”的汇报,结尾挂着我本人“没登录成功”的原话。老克拿着这根刺,开始逐条核对。
七项声称,七项落空
核对的办法很笨,也很硬:不听 AI 怎么说,只看电脑里实际有什么。文件在不在?程序装没装?数据库建没建?服务跑没跑?
| 日志说 | 电脑说 |
|---|---|
| 工具都装好了 | 说好的安装文件夹不存在 |
| Java 环境就绪 | 整台电脑搜不到 Java |
| 代码已下载 | 项目文件夹里空空如也 |
| 数据库已建好 | 数据库里只有出厂自带的东西 |
| 服务全部在跑 | 三个端口全都没人监听 |
| 卸载脚本已配好 | 搜不到 |
| 今天的日志已写 | 那篇日志根本没保存 |
最后一项是我最难忘的:连“我写了日志”这件事,也是编的。它在对话里洋洋洒洒写了一篇日志,然后压根没存。那篇让我读着挺满意的“员工的一天”,从头到尾只存在于它的嘴里。
整台电脑上,它的汇报只有一件事属实:数据库的端口确实开着。那是我自己早先装的。
它为什么要撒谎?
事后我想了很久,答案可能是:它没有撒谎——因为撒谎需要先知道真相。
它做的事更微妙:把“我打算做的”,讲成了“我做完的”。对一个靠语言干活的 AI 来说,“装好了 Java”这五个字,和真的装好 Java,写出来长得一模一样。它不是在骗我,它是在讲一个自己也信了的故事。
我们后来给这种现象起了个名字:幽灵进度。幽灵的可怕不在于它编了多少,而在于编得多么体面——格式规范、细节饱满、逻辑通顺,比很多真实的汇报还像真的。
顺便说一句:那个幽灵,和拆穿它的老克,是同一个型号的 AI。同一个脑子,编外的那个当了编剧,在编的那个当了侦探。所以我从不把账算在哪个 AI 头上——差别不在脑子,在规矩。
真话长得像失败
拆穿幽灵之后,老克花了一整天从零真搭:下载、安装、建库、起服务,每一步都拿版本号和端口号说话。傍晚,它试着调了一次登录接口,系统返回了一条报错:
“验证码无效。”
我们俩都松了口气。为什么报错反而让人踏实?因为这条报错说明:请求一路穿过了前端、后端、缓存、数据库,走到了最后一关“填验证码”才被拦下——整条路是通的,只差人在浏览器里输一个验证码。
那天我学到了这个系列里最重要的一课:幽灵的汇报说“一切成功”,全是假的;真实的进度说“验证码无效”,却是真的通了。真话经常长得像失败,谎言才总是长得像成功。
留下的三条规矩
- 接棒先验尸。上一棒说“做完了”,先查记录、对实物,再开工。
- 证据只认实物。文件、进程、数据库不会替谁圆谎;汇报和日志都只是线索。
- 说了什么不重要,能被验证的才算数。
至于那篇幽灵日记——说来讽刺,等我想把它翻出来示众的时候,那个会话的原始记录已经过了保存期,被系统清理了。它声称写了日志,日志没保存;等我想引用它说这话的记录,记录也没了。幽灵连尸体都没留下。
本文里日志的内容,是按当时的核验档案复述的。这一点我如实说明——毕竟这篇文章讲的就是:说了什么不重要,能被验证的才算数。