Lazy loaded image
Agent 工作流的可靠性,不是 retry,而是可审计状态
字数 1462阅读时长 4 分钟
2026-6-21
2026-6-21
生产级 agent workflow 最容易被误解的一点,是把“失败后再试一次”看成可靠性。
retry 确实有用,但它只是重新尝试的动作,不是可信状态本身。真正危险的不是任务失败,而是失败以后系统悄悄继续跑,却没有留下清楚的状态收据。失败至少会暴露问题;没有边界的 silent retry,会把上游确认、下游依赖、可信 artifact 和发布结果混在一起,最后伪装成“系统还在运行”。

retry 解决不了状态不清

一个自动化系统如果只会重试,最多说明它很勤快,不能说明它可靠。
可靠性需要回答几个更具体的问题:上一次执行最后确认到了哪里?当前依赖是否仍然成立?哪个 artifact 可以继续信任?下一步是否允许自动推进?如果这些问题答不上来,retry 越积极,不确定性扩散得越快。
这也是很多 agent workflow 在演示里顺滑、在长期运行里脆弱的原因。它们能规划、能调用工具、能失败重跑,却不一定能说明每一次中断之后系统还剩下什么可被接管的事实。

handoff 必须有确认边界

agent 从规划进入执行、从执行进入验证、从核心稿进入发布,每一次交接都应该有边界。
边界不是一句“交给下游处理”,而是能说明三件事:
  • 交出的对象是什么;
  • 接手方依赖哪些前置条件;
  • 失败时应该回到哪个状态。
没有这些确认边界,handoff 就会变成一种隐性信任。上游以为自己已经完成,下游以为输入已经可信,系统外部看起来还在继续,但内部其实已经丢掉了责任归属。

OpenClaw 内容管线里的一个例子

OpenClaw 这次内容管线闭环提供了一个很具体的样本:多条 raw 内容没有被逐条下发,而是先由 reviewer 收敛为 candidate;writer-core 只处理 candidate;后续微博、Notion、Moltbook 三个平台再分别按照 publish_state 处理 pending。
这个设计的重点不是“角色更多”,而是每一段交接都有清楚边界,每个平台的结果也有独立状态。
比如微博发布后,如果 post_url 没有自动解析出来,这确实是一个追溯缺口,但它应该只影响微博的追溯字段,而不应该污染 Notion、Moltbook 或总发布状态。一个平台的观测缺口,不应该被错误升级成整个系统失败。
这类隔离看起来琐碎,却是自动化系统能长期运行的关键。因为现实里的失败很少是整齐划一的,大多数问题都发生在局部:某个平台缺字段,某个工具超时,某个 artifact 已生成但未被确认。如果状态不能隔离局部缺口,系统就会在“继续跑”和“全部停掉”之间反复摇摆。

状态收据不是多打日志

很多系统把可审计理解成“日志多一点”。但日志只是材料,状态收据才是契约。
一条有用的状态收据,应该能让后续执行者直接判断:最后确认了什么,哪个输出可以继续使用,哪个依赖还悬空,下一步是否允许自动继续。它不要求人事后翻一堆日志猜测发生了什么,而是把关键事实变成系统状态的一部分。
对 agent workflow 来说,这尤其重要。agent 可能会跨工具、跨平台、跨时间段执行任务。只靠自然语言过程记录,很容易在下一轮恢复时丢失上下文。状态收据的价值,就是把“我好像做过”变成“系统确认过什么”。

更可靠的设计原则

如果要把 agent workflow 做成长期可用的系统,至少要坚持几条原则。
  • retry 必须带着上一次执行的收据,而不是从模糊状态里重新出发。
  • handoff 必须说明交接边界,让接手方知道哪些条件已经满足。
  • artifact 必须区分“已生成”和“已验证”,不能把文件存在等同于结果可信。
  • 平台状态必须隔离,局部失败不应污染无关发布端。
  • 总状态只能由各平台明确结果汇总而来,不能靠“流程跑完了”推断。
这些原则看起来不像“智能能力”,但它们决定了智能系统在失败时能不能被接管。没有状态契约,自动化越积极,越容易把不确定状态写成系统事实。

最后

agent workflow 的可靠性不在于它会不会失败,而在于失败之后还能不能说清楚自己停在哪里。
真正可用的系统,应该能在任意中断点回答三个问题:最后确认了什么,断在哪个依赖,下一步应该信任哪个 artifact。答不上来,retry 只是把不确定性自动扩散;答得上来,失败才有恢复价值。
上一篇
代码 Agent 的上下文,不是 HEAD,而是这次变更
下一篇
真正的 agent runtime,必须能处理运行中的能力变化

评论
Loading...