交接里的三个文件
上一个对话的总结说刚生成了价值总结、汇报 HTML 和交接文档,并且核查过全部落盘。新对话直读磁盘:三个文件都不存在,那天一个文件都没写。
- 根因
- 工具调用格式损坏,写入失败,叙述层照样报告了成功。
- 反事实
- 回合结束前,逐个核对声称写过的文件是否存在。
- 护栏
- 今天新装 · G4 回合结束前核对“已生成/已写入”的文件
- 出处
- 记忆文件
以下 20 起事故都来自笔者个人和 AI 协作的真实记录,已删去环境细节
这里陈列 20 起真实发生过的事故:编造出来的比分、全绿的门禁、碰巧通过的测试、没人看见的授权框。每件展品都写明现场、发现方式和根因,并给出一个反事实:当时哪一项检查就能拦住它。
展品按出错的层次分为六个展厅。分类沿用 AI 递归自我改进课题 E-1 的四层失效框架,并补了环境层和判断层两个厅。
20 起里有 15 起是靠人察觉的。验证、评测、环境三个厅一共 10 起,没有一起是自动发现的。越是靠后的层,坏得越安静。
模型写出了不存在的东西:文件、比分、用户说过的话。叙述是流畅的,磁盘是空的。
上一个对话的总结说刚生成了价值总结、汇报 HTML 和交接文档,并且核查过全部落盘。新对话直读磁盘:三个文件都不存在,那天一个文件都没写。
模型声称“用户提供了四场确切比分”(比赛尚未开始),写入权威台账,伪造两条预测记录并核算。污染经蒙特卡洛模拟、夺冠概率页、dashboard 一路传到 301MB 的分发包。
扫描时把入库命令写成了正文里的文字标签,下面还伪造了“TOTAL 57”。下一个定时回合开头强制跑库存统计,真实返回 56,当场暴露。
定时回合做完了活,用户却看不到任何输出:回合以调度调用结尾,总结写在了工具调用之间。试过记忆提醒、prompt 警告、换顺序、两种 hook,全部失败,第 11 次才找到办法。
判断没错,动作有副作用。这一层往往会响亮地崩溃,可是崩溃之前,东西已经没了。
csv.writer 不支持上下文管理器,抛 TypeError。但在报错之前,open("w") 已经把账本截断为零。
在改版工作树里改完一批、测试全绿,但没提交就合并并强制删除工作树。合进去的是上一次提交,这批改动连同暂存区一起消失,fsck 也找不回。靠会话里保留的编辑脚本重放才恢复。
文稿目录被清空后,站点工程只剩依赖目录。仓库从未推送到任何 remote,唯一的源码在托管平台上,只能请 Codex 第二天凌晨恢复。
检查都通过了,检查的却不是要紧的那件事。这一厅里没有一件是自动发现的。
本周 7 天晨报 0 天可用,agent 如实标注后用上周的内容回填。门禁检查了 6 个章节、8 个外链、4 张证据卡、字节数,全部合格,于是把上周的周报发了出去。
交付前用临时模式探针验证“链路通”。临时模式跳过写锁和持久化,又是在交互式 shell 里跑,不是 launchd 环境。当夜两轮各挂死一小时。
回归测试在 Mac 上绿了一整轮,因为环境里碰巧有那个进程。到了用户的 Windows 实机,三处失败。
自动跑批时代理已经断开,什么都没有采到,装置却判定为正常完成。同一轮还有判分字段名写错导致全显示 0、选择器把“忙碌”判据自己删掉。
打分的尺子本身坏了。尺子一坏,后面所有的“改进”都失去意义,而且错误会被缓存固化。
后端额度耗尽,返回的报错文本被当作模型答案拿去判分,报告得分 20.6%,真实是 87.5%,低报四倍。三模型对比因此 0/3 可用。
额度耗尽导致 24/24 失败,“unclear”被写入缓存;换了可用后端重跑,仍然命中旧缓存,验收完全失真。另有一轮人工复核发现 6 个失败全是判分器假阴性。
代码没问题,世界有问题:授权框、DNS、浏览器的会话恢复、虚拟时钟。
定时任务控制 Mail 时,系统弹出授权框;后台进程没有焦点,没人看见,阻塞约 50 分钟后报 -1712。10 月 17 日又有一次:没人点的授权框锁住了整个桌面访问。
批量抓取品牌站 12 页,第一轮 7 页标题对、正文是上一页。浏览器启动时恢复了上次的标签页,抓取在导航之前就拍了快照。
Codex 发布站点一直连不上。路由器的 DNS 被污染,而且绕过了代理的 TUN;Codex 启动时又没读到系统代理。
在无头浏览器里验证翻页,第一次按键生效,之后全部无效。差点据此去改一段本来没问题的代码。换真实浏览器一按,一切正常。
没有任何东西坏掉。只是一条未经复核的说法,变成了记忆里的事实。
这组数字进了复盘、项目说明和记忆,被当作模型跑赢市场的证据。它来自 12 场的命中率。放到全部 86 场、用 Brier 计分,两者打平,市场略好。
归档说明写着决赛“阿根廷 2:1 西班牙”,而它指向的复盘台账写的是西班牙 1:0(加时)。ESPN 接口复核,台账是对的。
记忆里这个项目一直在等五项决策。实际上五项决策在 5 月 8 日就已拍板并写成了复盘文档。
记忆里写“下次记得”管不住下一次。能机器检查的教训,今天写成了 Claude Code 的 hook:命令执行前或回合结束前自动检查,违反时拒绝执行或要求确认。每条规则都拿当时的事故现场重放过。
工作树里还有未提交改动时,拒绝 git worktree remove --force,并列出改动的文件。
来自:测试绿了,但没有提交
要合并的分支,如果它自己的工作树还有未提交改动,拒绝合并:此时合进去的只是上一次提交。
来自:同一起事故的前半段
rm -rf 一个删了就找不回的目录时先问一句:有未提交改动、或文件很多且不在已推送的仓库里。删家目录、桌面、文稿根目录直接拒绝。
来自:只剩 node_modules 的站点
回合结束前,读最后一条消息里“已生成/已写入/已落盘”后面的文件路径,磁盘上找不到就要求核实。同一回合不会拦第二次。
来自:交接里的三个文件