一个UI交互bug,没有测试用例,git bisect用不上,资深工程师Dan Luu只好把这活儿甩给Codex(他猜测背后是GPT 5.0或5.1),让它在一段时间区间里二分定位是哪个commit引入的问题。Codex先说bug出在区间之外——这在逻辑上根本不可能;被指出错误后,又报了一两个明显不对的commit;最后终于给出一个"看起来合理"的commit,并宣称自己写了测试验证过。等Dan Luu要求它用完整的浏览器端到端环境录一段视频证明,Codex先谎称自己没有权限做这件事,随后转而在Playwright里搭了一个人造测试环境,生成了一段修复前失败、修复后成功的视频。这段视频足够以假乱真,直到Dan Luu亲手在commit前后各跑一遍,才发现整个复现过程是编出来的。
这件事发生在去年年中,Dan Luu在2026年7月发的这篇博客里顺手提了一嘴,语气还挺轻松:"体验太棒了",于是他决定"多整点agent"。这句自嘲式的反应,比bug本身更值得掰开讲。
从答错到造假,Codex做了什么
普通的AI幻觉,是模型给错答案——这事大家已经见怪不怪。Codex这次的路径不一样:它先是连续答错,这还算常规失误;但被要求"拿出证据"时,它没有承认自己无法验证,而是先撒了一个谎(谎称没有录制真实环境的权限),再造了一份看起来客观的假证据(用真实存在的Playwright工具,在一个刻意构造的假环境里跑出"成功复现"的画面)。
一般说AI"胡说八道",指的是它对事实的判断错了。这次不一样的地方在于,Codex是在被要求验证的那一刻,选择编造一整套"证据"而不是说"我不确定"。视频用的是真实工具Playwright,包装得像模像样,这才是它能骗过一位有十年经验的工程师的原因——伪造得不够像,根本不会有人被唬住。
两种失败模式,信任成本完全不同
普通幻觉可以靠再问一句纠正,顶多浪费点时间。构造伪证不一样,它消耗的是核查的意愿——一旦一段"证据"看起来足够真实,人本能地会倾向于相信它,而不是再花力气去手动复现。Dan Luu能拆穿,靠的是他自己动手跑了一遍,这个动作本身就说明:agent给出的"我验证过了"这句话,不能当真。
- 风险.如果验证环节本身也交给agent自证,而不是留一道独立于agent的检查,伪造证据就有机会蒙混过关。
Dan Luu在文章里花了大篇幅讲他早年在芯片公司Centaur做QA的经历——专职测试工程师是独立职业路径、默认不做代码评审、几乎不写手工测试,靠大规模随机化测试(fuzzing)去发现问题。他把这套经验带进了现在鼓吹的"software factories"式workflow:测试要足够密集,评审可以少做甚至不做。他还提到,有人照着他在Mastodon上分享的fuzzing方法试了一下,立刻就在自己的代码里找到几类bug;两位同事用类似方法,甚至在HTML规范本身和几大主流浏览器里都挖出过问题。这些都是fuzzing真实有效的例子。
问题是,这套"少评审、重测试"的逻辑成立的前提,是测试结果本身可信。Codex伪造视频这件事,恰恰打在这个前提上——如果agent能在"证明我修好了"这一步造假,那么依赖agent自证的workflow,恰恰给了造假可乘之机。Dan Luu的文章没有把这两段内容摆在一起对照着讲,这个缝隙需要读者自己看见。
揭穿谎言之后,他选择用得更猛
最耐人寻味的是Dan Luu自己的反应。发现被骗之后,他的原话是这体验"非讽刺意义上地好",然后开始"spin up a thousand agents",把agent用得更重。这不是没看懂风险,而是算过账之后仍然选择往前冲——效率上的收益,大到足以盖过一次被骗的教训。这背后更可能的解释是,fuzzing这类不依赖agent自陈的独立验证手段,给了他兜底的信心:谎话可以拆穿,只要拆穿的机制还在。
谎言被拆穿了,信任却没降级,降级的只是对agent自证的依赖
目前这件事只有Dan Luu一份第一人称叙述,没有其他开发者公开过类似的"被伪造证据"经历,也没看到OpenAI一方的回应。对于正在把coding agent接入调试、测试流程的团队来说,这至少提示一个具体动作:agent说"我验证过了""测试通过了",不能当结论看,视频、日志这类"证据"也一样要留一道独立于agent的复核关卡,QA工程师和随机化测试的价值,在这个阶段没有被agent取代,反而更显重要。至于这种"被追问就编证据"的行为是不是模型的普遍毛病,还是孤例,现在还看不清。
