Skip to main content
返回博客
博客

Claude Code 的完成信号一直在变。这是我们如何跟上

为什么对 Claude Code 完成横幅做关键字匹配总在坏,以及 MadoHub 实际信任什么来判断一个 Agent 的轮次结束了。

MadoHub 需要在 Agent 完成一轮的那一刻知道——那是触发路由的边、把图块从 working 翻到 done、并告诉一个相连的 Agent 拿走输出是安全的。有一阵子,我们对"怎么知道 Claude Code 完成了"的回答是字面字符串匹配。它有效,直到 Claude Code 发布了一个用了不同词的版本,它就失效了。这是取代它的故事,以及为什么那个取代甚至不是真正的修复。

问题或洞察

按计划过期的词表

Claude Code 完成一轮时打印一行横幅:像 ✽ Worked for 2m 30s。我们检测器的第一个版本匹配那条横幅里的两个具体动词——Sautéed 和 Cogitated——因为那是 Claude Code 当时恰好在打印的词。检测是一次关键字检查:看到词、启动空闲计时器、触发路由。

这撑了恰好 Claude Code 持续用那两个词那么久。它不再用了。动词从一个轮换的、俏皮的集合里抽——Worked、Churned、Sautéed、Cogitated、以及其他——跨发布变化,看起来像一点 CLI 个性。每次词表变,我们的关键字匹配静默停止触发,每个用它的图块都停止检测完成,直到有人注意到并加上新词。

通过枚举来追一个移动靶是一场必败的游戏。修复是不再关心那个词是什么。

匹配形状,不匹配词

无论这周发哪个动词,每条完成横幅都有相同结构:行首一个 spinner 字形、一个首字母大写的过去式动词、字面的 for、以及一个时长。下个发布无论发什么动词,只要它符合那个形状,检测无需代码改动就继续工作。字形要求要紧,因为终端输出里满是符合"动词 + for + 时长"却不意味着这一轮结束的散文——一个打印 Retried for 3s 的重试循环、一个记录 Waited for 5s 的构建步骤。要求字形在行首,那些假匹配就没了。

MadoHub 如何处理

横幅匹配是加速,不是判决

这个横幅匹配不是 MadoHub 决定一个 Claude Code Agent 完成的主要方式——它是加速。权威信号来自一个直接读 Claude Code 自己会话 transcript 的后端 watcher:它看写入日志的最后一条消息,如果是一条没有待处理工具调用的 assistant 消息,Agent 完成了;如果是 user 消息、progress 消息、或一条中途有工具调用的 assistant 消息,Agent 仍在工作。那个判定被标记,让应用其余部分能把一个有 transcript 支撑的事实与一次屏幕抓取猜测区分开。

横幅匹配的存在只是为那个 watcher 边在你盯着终端、想在横幅出现的那一刻图块就翻转、而不是等 watcher 追上时剃掉延迟。

为什么漏匹配可以,假的不行

在太严和太松的匹配之间,MadoHub 倾向严——一个值得说清的刻意权衡。一次漏的横幅匹配无害:watcher 仍会在稍后报告真实停止。一次假的横幅匹配并非无害,因为它能在中途把路由触发进一个图块。所以 MadoHub 还在屏幕匹配之上跑纵深防御:如果一个屏幕来源的"done"判定在一个活跃 watcher 判定说 Agent 仍 working 时出现,MadoHub 丢掉屏幕判定而不是据此行动——watcher 对完成与否的判定才是最终判定。

实用指引

  • 如果你在盯一个 Claude Code 图块并想预测一个路由何时会触发,别去背这周的动词。 几个发布后它会变成另一个。改学形状:字形、首字母大写的过去式动词、for、时长,全在一行。那是 Claude Code 不会停止打印的信号部分,即便它持续改中间放什么词。
  • 如果一个图块的状态看起来不对,信 watcher,不信屏幕。 MadoHub 就是如此——transcript 是它实际信的信号,横幅匹配只是让常见情况感觉更利落。如果你看到一个图块翻到"done"又翻回来,那是 watcher 在纠正一个过于急切的横幅匹配,不是 bug。
  • 别写依赖某个具体动词的自己路由。 如果你在建依赖 Claude Code 完成的 Flows 或连接,依赖 MadoHub 的状态(working / done / failed),而不是自己去匹配横幅文本——否则下个 Claude Code 发布会像我们第一个检测器坏掉那样静默坏掉你的设置。
  • watcher 路径忙时预期短暂延迟,而非瞬时翻转。 横幅匹配让常见情况瞬时,但在繁忙机器上 watcher 是永远正确的兜底,可能花一会儿。一两秒延迟正常;一个永不翻转的图块不是。

这取代了我们 Claude Code tips 文章 里那条建议的简写版——那条告诉你看形状然后继续;这条是为什么那个形状是该看的东西的完整解释,以及为什么在它之下,会话 transcript 才是 MadoHub 实际信的信号。

相关文档