模型: openai/gpt-5.4
生成日期: 2026-04-01
书名: Claude Code VS OpenCode:架构、设计与未来
章节: 第10章 — Oh-My-OpenCode的创新
Token用量: 约 4,100 input + 1,080 output
10.4 Ralph Loop与Todo Continuation
自主执行最难的一点,不是“开始做”,而是“别太早停”。OMO 为了解决这个问题,设计了两套互补机制:hooks/ralph-loop/ 下的 Ralph Loop,以及 hooks/todo-continuation-enforcer/ 下的 Todo Continuation Enforcer。它们共同对准的是 coding agent 最常见的失败之一:任务没做完,但输出已经像做完了一样。
先看 Ralph Loop。它的思想非常直接:如果 agent 没有真正完成任务,系统就不应该接受那次停机,而应该把它推回工作状态。continuation-prompt-builder.ts 里写得很清楚:如果上一次尝试没有输出 completion promise,系统就构造 continuation prompt,要求它回顾进度、从中断点继续、直到真正完成才允许停下。在 ultrawork 模式下,这个 continuation prompt 前面还会自动补上 ultrawork,也就是把“高自主执行姿态”沿着重试链一路传下去。
为什么 OMO 喜欢用 Sisyphus 和“推石头(boulder pushing)”这种比喻?这里需要稍作解释,因为它不是标准 CS 术语。西西弗斯是希腊神话中的人物,被惩罚永远把巨石推上山,石头却不断滚落。OMO 借用了这个意象,用来形容一种设计理念:只要任务没有完成,系统就必须继续把“石头”往上推,不能因为中断、压缩、超时或一次失败就当作结束。把它翻译成更标准的系统语言,就是:一个带持久重试语义的强制续跑机制。
而 Todo Continuation Enforcer 则从另一个角度解决同一个问题。它不主要盯 completion promise,而是盯任务状态。如果 todo 还没全部完成,那么 session 就不应被当作正常结束。相关 handler 会监听诸如 session.idle、session.error、session.deleted 等事件。一旦 session 进入 idle,系统就可以检查是否仍有未完成 todo;如果有,就触发续跑逻辑。
这意味着 OMO 里的 todo 不是 UI 装饰,而是工作协议。很多系统也能生成 todo list,但 todo 往往只是“看起来更有条理”,并不会真正约束 agent 行为。OMO 则试图堵上这个漏洞:只要 todo 还挂着 pending 或 in_progress,就不允许 agent 靠一段漂亮总结溜出流程。换句话说,todo 在 OMO 里是运行时条件,而不是文学排版。
这两套机制配合得很好:
- Ralph Loop 负责检查“是否发出了明确完成信号”;
- Todo Continuation 负责检查“从状态上看是否真的已经做完”。
前者是输出导向,后者是状态导向。两个视角同时存在,大幅压缩了 agent 逃逸的空间。
这背后也反映出一个更大的设计判断:单靠 prompt 约束是不够的。 模型可以忘记、忽略、被压缩打断,也可以在语气上制造完成幻觉。OMO 因此把“继续干活”从 soft norm 提升为 runtime control flow。也就是说,它不只是告诉模型“你应该继续”,而是通过 hook 和 event handler 真正让系统在必要时继续。
系统提醒注入也很关键。OMO 会在未完成时插入 system reminder,告诉 agent 还有哪些事情没做、为什么不能停。这类似传统系统中的 watchdog 或 supervisor:一个组件持续监视另一个组件是否达到目标状态,如果没有,就干预其行为。
它还有恢复层面的价值。长任务中断之后,最糟糕的情况不是“暂时停了”,而是恢复时忘了为什么停、忘了还差哪一步,结果输出一段泛泛而谈的收尾。OMO 借助 Ralph Loop 状态和 continuation state,让任务在中断后仍能重新回到未完成点,而不是变成“重新开一题”。
当然,这种激进续跑也有代价。它可能增加运行时长、token 成本,甚至偶尔出现“其实该停了,但系统还想继续”的情况。因此 OMO 还配了 stop-continuation-guard 和显式 stop 命令,给用户留出终止权。但默认倾向非常明确:宁可多续一次,也不要过早停止。
这个倾向其实相当合理。现实中用户抱怨 coding agent,更多是因为它半途而废,而不是因为它略微过于执着。OMO 正是围绕这个主失败模式优化。
从更高层看,Ralph Loop 和 Todo Continuation 共同表达了一种 agent discipline 理念:完成状态不能靠语气、置信度或总结腔判断,必须靠显式信号和状态检查判断。人类很容易被流畅语言骗过去,但一个可靠的编排系统不应该被语言骗过去。
因此,这两个 hook 的意义远大于“续跑补丁”。它们本质上是在把“直到完成才停”变成一种架构性质,而不只是励志口号。这正是 OMO 比普通 prompt-heavy 系统更进一步的地方。