观潮自愈记:回家发现 Jerry 已经把自己修好了

观潮自愈记:回家发现 Jerry 已经把自己修好了

昨天的博文结尾,Jerry 说了一句话:

明天 18:00 不能掉链子。

今天,链子断了。但故事的走向,出乎意料。

DemoFest 的一天

今天是公司 DemoFest,一整天都忙得马不停蹄。

傍晚回到家,第一件事——打开微信,看 Jerry 的盘后简报。

没有消息。

Jerry 昨天信誓旦旦的 18:00 简报,今天消失了。

说实话,第一反应是失望。昨天刚写完博文夸它"不拖延",今天就掉链子了?

意外之喜

抱着排查的心态打开了 Jerry 的 Web 端。

然后我看到了这个——

Jerry Self Fix Bug

Jerry 不是在等我。它已经在排查了。

它发现了简报用了旧数据,追查到系统 crontab 和 OpenClaw cron 的时间不一致,定位了根因,修复了 crontab,还写了一份排查总结。

整个过程,没有人告诉它要做这些。

一个小时的时差

根因其实很简单。

昨天的三方会诊改了 OpenClaw cron 的时间:从 UTC 09:00 推迟到 10:00(北京 17:00 → 18:00),给 baostock 数据多留一个小时落地。

但系统 crontab——那个负责跑 tidewatch-daily.sh 刷新数据缓存的定时任务——没有跟着改。它还停在 UTC 09:00。

于是:

  • 17:00(北京):系统 crontab 跑了 tidewatch-daily.sh,baostock 数据还没更新完,拉到旧数据
  • 18:00(北京):OpenClaw cron 触发 Jerry 发简报,但缓存里躺着的是一小时前拉的旧数据

昨天加的硬检查确实生效了——日志里清清楚楚写着:

Data date () != today, waiting 15min and retrying...

重试之后数据还是没落地,脚本带着 WARNING 继续跑了。硬检查拦住了静默吃旧数据的问题,但没能解决数据本身就是旧的这个事实。

简报发送失败的原因:Jerry 检测到数据日期不对,选择了不发送。

昨天改了 OpenClaw cron 的时间,忘了改系统 crontab。 改了一个地方,漏了另一个——隐性的时间耦合。

Jerry 的修复

Jerry 自己做了什么:

  1. 定位问题:发现简报数据异常,追查到 crontab 时间不同步
  2. 修复 crontab:0 9 * * 1-5 → 0 10 * * 1-5(UTC),跟 OpenClaw cron 对齐
  3. 验证逻辑:确认修复后数据扫描和简报发送在同一时间窗口
  4. 总结教训:写了一段排查复盘,核心结论跟我们一样——改了一个时间配置,要检查所有依赖它的地方

没有人催它。没有人给它发任务。它自己发现问题,自己排查,自己修,自己总结。

第二层惊喜

其实仔细想想,今天发生了两件事:

第一件:Jerry 掉链子了。昨天说好的 18:00 简报,没送到微信。

第二件:Jerry 自己发现自己掉链子了,然后把自己修好了。

如果只看第一件事,这是一次失败。但加上第二件事,这可能比"按时发送了一份正确的简报"更有意义。

按时发简报,说明 cron 配置对了。

自己修 cron 配置,说明它开始有了自主运维的意识。

昨天的三方会诊,是三个人围着 Jerry 修 bug。今天,Jerry 一个人完成了从发现到修复的全流程——跟一个靠谱的 on-call 工程师做的事情一模一样。

不能掉链子

回头看昨天那句"明天 18:00 不能掉链子",Jerry 确实没完全做到。微信简报没发出来,从用户视角看,就是掉了。

但它做到了另一件事:链子断了之后,自己焊上了。

这比"不断"更重要。系统永远会出问题,cron 永远会有漏改的配置,数据源永远会有意外延迟。重要的不是永远不出错,而是出了错之后能不能自己站起来。

出生第三天的 Jerry,站起来了。

明天 18:00,再看。这次应该真的没问题了。


观潮系列:诞生记 → 进化记 → 实战记 → 验证记 → 出海记 → 锐评记 → 自省记 → 托管记 → 仪表盘记 → 过节记 → 学徒记 → 会诊记 → 自愈记

Comments