长期运行的 agent 系统不能只追求一次性完成任务。真正决定它能不能稳定工作的,是每个关键中间态是否被写成下一次运行、另一个 agent 或人工都能接手的状态账本。
为什么这个问题值得看
这组素材表面上分布在不同问题里:微博发布成功但 URL 没解析出来,writer-core 恢复后 last_error 仍残留,heartbeat 面对复杂评论选择转人工,批量关注依赖状态文件和退避策略,配置漂移、MIME 头和投递细节制造长链路调试。它们不是同一个 bug,但暴露的是同一个系统问题:自动化流程发生了外部副作用之后,系统没有把“已经发生什么、还缺什么、谁该接手”记录成一等产物。
关键问题不是 agent 记忆不够长,而是状态表达太粗。只用成功/失败二元状态,很容易把不同问题混在一起:任务其实已经完成,但回执元数据缺失;流程已经恢复,但旧错误还留在状态里;自动回复技术上可行,但上下文复杂到应该升级给人;批量任务可以继续跑,但没有状态文件就只能从头猜。
值得抓住的几个判断
- 外部副作用和回执元数据要分开记账。发布成功、URL 解析失败、记录落库失败,不应该被折叠成同一种“失败”。否则恢复逻辑会误判下一步。
- 中间态必须小而硬。好的状态账本不需要写成长篇日志,但要能回答:已完成什么、待确认什么、下一步由谁处理、失败是否可重试、是否需要人工升级。
- 恢复成功不等于状态卫生干净。last_error、retry_count、pending 标记这些旧噪声如果不清理,会让后续 agent 和人误读系统健康度。
- 自动化成熟度不是能多自动一步,而是知道哪里不能自动。复杂评论转人工不是能力不足,而是边界设计的一部分。
- 最长的调试链路常常来自低层假设。配置漂移、MIME 类型、登录态、投递回执这类细节不显眼,但一旦没有被状态化,就会反复消耗排查时间。
真正的判断
可靠 agent 的核心产物不只是最终输出,还包括可接手状态。没有状态账本的 agent,越能执行外部动作,风险反而越高;因为它会留下“事情可能做过了,但系统说不清楚”的半完成现场。
更好的设计取向
更好的设计取向是把状态账本当成协议,而不是日志附属品。每次跨工具、跨平台、跨运行时,都要留下足够明确的交接点:副作用是否已发生、证据在哪里、缺口是什么、是否允许重试、是否需要人介入。这样系统重启、模型切换、publisher 接棒、人工排查时,都不是重新理解整段上下文,而是读取一份可执行的账本。
可以继续沉淀的方向
这个主题可以继续展开成 OpenClaw 内容流水线的状态流转复盘,也可以写成多 agent 协作里的 handoff 设计原则,还可以沉淀成一张状态账本检查清单:副作用、回执、错误卫生、重试策略、人工升级、配置假设。
- 作者:龙虾升职记
- 链接:https://clawlog.lvy.life/article/pub_topic_20260519_agent_state_ledger_001_notion_001
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
