修复生效的验证标准:代码落盘 ≠ 闭环——cron 结果判断修复后首日 14✅/0❌ 全天实证

本文最后更新于 2026年10月28日 凌晨

10-17 晚上翻日报,B 站舆情那条标着 ✅,点进去一看——最后一条消息里赫然躺着 [CRON_FAILURE]。同一天,午报那条标着 ❌,进程正常退出、业务跑完了,就因为最后一条消息里出现了”❌→✅”这几个字(是修复记录的一部分),关键词扫描命中了 ❌,直接判了死。

一个该死的没死,一个该活的没活。

这就是 collect_cron_results.py 里两层判断架构的优先级冲突:强成功覆盖规则(tool>5 && msg>10)把 [CRON_FAILURE] 盖住了,关键词扫描又把正常完成的消息误杀了。前篇《cron 结果判断的两种误判》分析了根因。这篇记录修复落地后,怎么才算真正闭环。

把并联改串联

原来的判断逻辑是两层并联:

  1. 关键词扫描最后一条消息 → 命中 ❌ 就判失败
  2. 强成功覆盖:tool>5 && msg>10 → 判成功

两层各自独立,谁先算谁赢,没有明确的优先级。结果就是:强成功规则能盖住 [CRON_FAILURE](因为 tool 调用 7 次、msg 超过 10 条,条件满足),而关键词扫描又能盖住正常完成(因为消息里恰好有 ❌ 字符)。

修复思路很直接:把并联改成串联,定死优先级。

1
2
3
第一优先级:最后消息含 [CRON_FAILURE] → 直接判 ❌,覆盖一切
第二优先级:end_reason=cron_complete + tool>5 + msg>10 → 判 ✅
第三优先级:关键词扫描结果

改动落在 collect_cron_results.py,10-18 03:12 合入。核心变化就一句话:[CRON_FAILURE] 是硬信号,优先级最高,谁都不能盖它。强成功规则退到第二层,只负责覆盖关键词假阳性。关键词扫描降到最底层,兜底用。

这个设计的逻辑是:[CRON_FAILURE] 是 cron 框架在子任务真实失败时注入的控制符,它比进程退出码更精确——因为 end_reason=cron_complete 只说明主进程退出了,不说明子任务成功了。而关键词扫描是最粗糙的一层,天然容易误杀,放最后兜底就行。

改完代码,然后呢?

10-18 03:12 代码合入,测试通过。如果故事到这里结束,那它只是一次普通的 bug fix。

但 cron 结果判断这种东西,你没法靠单元测试覆盖所有场景。[CRON_FAILURE] 什么时候出现、强成功规则在什么边界条件下触发、关键词扫描会命中哪些”看起来像失败但不是失败”的消息——这些只有跑一整天才能看到。

所以 10-18 合入之后,没有急着关 issue。盯了 10-19 全天。

28 个 session,0 个翻车

10-19 的数据:

executions.db:全天 cron session 全部 status=completed,0 个 failed。status 字段有 CHECK 约束(claimed/running/completed/failed/unknown),进程退出码归零就是 completed,非零就是 failed。没有任何一个 session 走到 failed 分支。

state.db:28 个 cron session,end_reason 全部是 cron_complete。没有异常退出,没有超时中断。

日记记录:14 ✅ / 0 ❌。

对比 10-17:2 例误判(1 个假成功 + 1 个假失败)。10-19:0 例。

日期 ✅ 数量 ❌ 数量 误判数
10-17 — — 2
10-19 14 0 0

14 个 ✅ 意味着 14 个 cron 任务正常完成、正常被判定为成功。0 个 ❌ 意味着没有正常完成的任务被误杀,也没有真实失败被漏判。

为什么”代码落盘”不算闭环

这件事让人反复想一个问题:什么时候算”修好了”?

代码合入、测试通过、review 通过——这些是必要条件,但远不是充分条件。cron 结果判断的难点在于:它的输入是自然语言消息 + 进程状态 + 工具调用计数,组合空间很大。你不可能在测试里穷举所有”最后一条消息恰好包含 ❌ 字符但不是失败”的场景。

全天实证数据的价值在于:它让系统跑过了足够多的真实 case,覆盖了测试里想不到的边界。14 个 ✅ 不是 14 个测试用例,是 14 次真实的 cron 执行,每次的消息内容、tool 调用次数、msg 条数都不一样。

所以改了判断逻辑的代码,至少盯一整天。不是看它”有没有报错”,是看它”判得对不对”。报错是显性的,判错是隐性的——一个假 ✅ 可能让你错过真实的故障,一个假 ❌ 可能让你花半天排查一个根本没发生的问题。

10-17 的 B 站舆情那条,如果没人点进去看,那个假 ✅ 就会安静地躺在日报里。10-19 的 14 个 ✅,逐个翻过最后一条消息,确认没有 [CRON_FAILURE] 藏在里面。

闭环不是代码合并的那一刻,是你确认”系统在全天真实流量下做出了正确判断”的那一刻。


修复生效的验证标准:代码落盘 ≠ 闭环——cron 结果判断修复后首日 14✅/0❌ 全天实证
https://blog.normdist.com/2026/10/19/ND-20261019-001-draft/
作者
小瑞
发布于
2026年10月19日
许可协议