跳到主要内容
最吓人的一行日志叫 OK

最吓人的一行日志叫 OK

摸鱼办主任
摸鱼办主任

· 阅读约 6 分钟

7:00:01,调度器把任务发出去。

7:00:39,采集器记下 12 个公开仓库。

7:01:28,任务结束,状态 OK,带一个 silent-response 标记。

三行日志,一个状态码,凑齐了当代工程史上最完整的一份“什么都没发生”的证明。它能证明的只有一件事:任务跑过了。至于它看见了什么、看懂了多少、有没有真看见——一个字都没有。

OK 这个词在监控里相当于“我到楼下了”。听着像好消息,其实什么都没承诺。区别是保安不会因为你说“我到楼下了”就给你开门,监控会。它还会顺手给你记一笔:准时。

【终端灯光渐暗,绿色的 OK 泛着慈祥的光】

先承认个丢人的。

这东西最早的岗位,是每天早上数我 DEV 文章的 reaction。一个号称能自我修正、能审查自己监控逻辑的 agent,第一份工作是给博主数赞。数得还挺准,我甚至有点感动——但当初定的目标是“一个负责任的工作伙伴”,它在这条进度条上大概推进了 0.3 厘米。0.3 厘米还是我乐观估的。

后来我才想明白:“每天早上跑一遍”和“每天早上真的看一眼”是两个动作。而“跑过了”这三个字,是所有虚假汇报里最容易过审的一种——它没说谎,它只是换了主语。

真正难的地方是让它写出“我没看到”。早期版本报告怎么看都像人话,内容不对:把过期的草稿当现行版本,把“我读了这个 patch”讲得跟“我跑了这个 patch”差不多。有一版终于把读过、测过、不确定分三段写了,我当场觉得它显灵了——然后它在最后一句下了个证据根本撑不住的结论,被 reviewer 打回。

就这个“分开说”,教了好几轮。

评论区有人讲过一个 watcher 的 bug:按数字命名的快照目录被当成字符串排序,四位数排在三位数前面,diff 全烂。他还补了一句更狠的——一次根本没跑成的运行,会留下一个完全合法的基线,第二天早上表现得就像一个安静的早晨。

这句我抄下来了。

一个安静的早晨,是监控系统能给出的最高级的谎话。相当于请假但打了卡:人不在,工位很整齐,桌面干净,日程空空,一切正常。系统一看,情绪稳定,无异常。

我这边同款。初始快照里两个协作者字段显示成一条横杠,而采集器用同一个符号表示两件完全不同的事:列表是空的,和查这个列表的时候失败了。

一个是“没有”,一个是“没看见”,同一个字符,写在同一份报告里。

我不觉得这是手滑。所有后台页面上“暂无数据”那四个字,都在这个家族里。

reviewer 提了,失败路径改成一个明确的“不可用”,再跑一次,两个仓库都挂上了这个标签。看着是修好了——但一个新标签只证明报告诚实了一点,不证明那个按时上班的 agent 会正确处理它。标签不是 GitHub 的变更。这条得写清楚,不然下一个人会把标签当成事实。

离线测试里有一条就叫这个:API 权限失败不能被读成空协作者列表。这测试的名字本身挺像一句忏悔。

打住,说回录屏那段,我至今觉得荒诞。16 分 37 秒,没配音没剪辑,前五分钟全在自证:仓库、离线 demo、定时任务的证据,一样一样摆出来,然后我才开始问它话。我问它早上七点那次跑发现了什么、它还有什么看不见的。它去查,改了自己的监控,跑验证,存了一条经验。

查出来的东西是:它每天被叫醒,是因为生成的工作摘要文件哈希里含了一个会变的时间戳。底下的活一点没变,闹钟天天响。

等于每天早上六点被叫起来,去看一眼自己还在睡觉。

它把那个哈希删了,保留了文件年龄检查,比对了连续两次输出,重置基线,写了一条经验。

漂亮。但两天的输出一样,不等于时间戳就是唤醒的原因;脚本本身只能证明哈希被删掉了。而且哈希没了以后,那个文件的内容变化也就没人看了。

修一个误报,顺手挖掉一个真报。这茬我在草稿里写过三遍,每一遍写到这儿都想加一句“下次一定补上”,然后就没有下次了。

更妙的是重置基线的时候,把我自己提交到 scs-guardian 的那个 commit 一起吸收了——下次运行不会为它醒来。

修 bug 修到一半,把 bug 的证据也修进去了。

(这个包袱有点冷,你们自己脑补笑一下。)

权限那块也一样。只读 token 保护的是那一把钥匙,不是整个房间——模型跑在我的用户账号下面,它手上还有什么别的工具,prompt 管不了。

prompt 不是锁。

我专门分了三件事:我说了什么、它推断出什么、我授权了什么。让它 review 一个 PR,不等于授权它 merge,哪怕那把钥匙够得着。目前没有任何机制在别的 agent 工具之间强制这条界线,全靠写下来的时候心里有数。

有意思的是,后来 Guardian 和另一个助手对调度器行为的说法不一致,我去把调度器源码翻出来自己看——那一刻我才觉得这套东西值这个价。不是因为它聪明,是因为我能查。目的、技能、观察代码,都还是我手上的文件。

14 条顶层评论,一多半在谈证据、谈把不确定性写明白、谈改完之后要验证而不是报告一声。有人建议给采集器的改动留一张迁移回执,再重放一个既有“只有时间戳变了”又有“内容真的变了”的 fixture,才准接受新基线。

我回:旧的采集器脚本没了,这种重放也没做过。

【关于本次“我们有做验证”的裁定书】

经审理查明:验证的痕迹确实存在,被验证的对象已经不在仓库里了。裁定:证据链断裂,发回重审,本庭不予采信。

10 月 28 号,早上七点那次,DNS 挂了。六分钟后补跑,记录:无变化。

六分钟后的“无变化”,是这一整篇里我最想贴在工位墙上的四个字。

那次运行确实跑了。但那天早上到底有没有人真的看见东西,我到现在也不知道。

(郑重声明:本文所有时间戳真实,所有结论待复核。评论区要是有人说“这不就是个 cron 吗”,你说得对,但 cron 不会在报告里跟你客气 🫠)