
进程挂了 resume 回来,agent 却僵住了:log 才是 agent 本体
那天 Claude Code 跑着一个改动挺大的任务,停在权限确认上,等我按 y。我切出去处理别的事,回来发现 ssh 断了,进程没了。
claude --resume 之后,会话恢复,历史一条不少,那个权限提示却没回来。agent 僵在原地,既不继续,也不重新问我,像一个话说到一半忘了下半句的人。
我一直把它当成 resume 的 bug。后来读到 Omnara 的 Ishaan Sehgal 写的《The Log Is the Agent》,才反应过来:权限提示为什么会消失,不只取决于 resume 怎么写,还取决于系统把什么当作可恢复的事实。
角色不在主机里,在存档里
他开篇拿《艾尔登法环》做类比:玩了一百小时之后,角色的等级、装备和进度不在主机这块铁里,都在存档里。换台机器,把存档同步过去,那还是你的角色。
agent 也碰到了这条边界。模型和执行进程都可以替换,要接着做同一件事,就得延续此前发生过什么。用户输入、模型输出、工具调用、工具结果、权限请求和批准,都应该写成 append-only 的事件。
不过,把对话存成 JSONL 还不够。要恢复到原位,log 还得关联工作区快照、产物版本、外部副作用和运行时配置;执行器也得知道哪些动作已经做过。漏掉其中任何一项,拉起来的都只是一个“记得聊过什么”的新进程。
我的权限请求正好漏在这条边界外。resume 读到了 transcript,所以知道我们聊过什么;它读不到待批准事件,也就不知道下一步还在等人。如果请求本身、对应的工具调用和执行状态都已持久化,新的 worker 才能继续等我按 y。

很多 harness 已经会保存 transcript,但 transcript 只够恢复界面,不一定够恢复执行。待处理的权限请求、lease、工作区版本和副作用标识只要还散落在进程内存、文件系统和内部表里,用户就可能看到同一个结果:历史还在,agent 不动了。
进程可以重启,副作用不能重放
事件 log 先解决恢复问题,接着会逼着执行循环换一种写法。worker 取得临时 lease,从 log 和关联快照重建状态,前进一步,先记下调用意图,再执行副作用并写回结果。
麻烦通常出在请求已经发出、结果还没写回的时候。worker 此时崩溃,新的 worker 到底该不该再发一次?能用幂等键的调用必须复用同一个键;不能幂等的动作,恢复时得先查询或对账,不能盲目重试。否则发消息、扣款、部署都可能做两遍。

同一条事件链也可以从某个节点分叉:一支跑 Claude,一支跑本地模型,各探各的路。只是文件和沙箱快照也得跟着分叉,否则两支 agent 仍在改同一份现场。迁移的边界同样很具体:模型适配器只是最浅的一层,事件格式和产物引用才是要搬走的东西。
context window 装不下完整历史,执行时仍然需要 compaction。但压缩结果不能取代原始 log。compaction 是有损投影,就像物化视图不是数据库本身。保留原始 log,之后还能换一种方式重新压缩;只留下 compaction,丢掉的细节就再也找不回来了。
最深的锁定是 log 锁定
读到这里,我才发现自己以前把平台锁定看浅了。模型能换,API 能包一层适配,运行历史却很难搬。谁拥有你的 log,谁就拥有你的 agent。
能导出一份 transcript,当然比什么都没有强,但还不能让 agent 接着工作。迁移至少要带走结构化事件、工作区与产物、工具调用状态,以及一套可重放的格式。我之前写过,session 里可搜的是解法,不可搜的是路径。现在我更在意的是:这条路径由谁保存,离开平台后还能不能继续执行。

各家都在提供托管的 loop、memory、sandbox 和后台执行,能替团队省掉不少基础设施工作。代价也很具体:agent 会接触你的代码、数据和决策,log 还会记下失败过程与权限选择。它能留多久、谁能查询、可以导出到什么程度,都由平台决定。
现在很多 agent 会话当天就结束,log 的重量还没显出来。但平台的基础设施选择是现在做的。等会话开始跨天、跨任务,积累了能复用的工作历史之后再迁,就成了带着全部家具搬家。
所以现在评估一个 agent 平台,我会先确认 log 存在哪里、能不能完整回放,以及能不能连同工作区和产物一起迁出。
这些问题答不上来时,我拿到的只是运行 agent 的入口。角色能不能继续活下去,仍由平台手里的那份存档决定。
版权声明
- 作者
- XingKaiXin
- 标题
- 进程挂了 resume 回来,agent 却僵住了:log 才是 agent 本体
- 发布时间
- 2026年8月14日
本作品采用CC BY-NC-ND 4.0 DEED许可。