---
title: "进程挂了 resume 回来，agent 却僵住了：log 才是 agent 本体 | 行开心的颠倒世界"
description: "Claude Code 的进程挂掉后，resume 找回了对话，却丢了待批准的权限请求。要让 agent 真正恢复，持久化的不能只是一份 transcript，还要包括可重放的事件、工作区和副作用状态。"
canonical: "https://xingkaixin.me/posts/log-lock-in/"
language: "zh-CN"
---

# 进程挂了 resume 回来，agent 却僵住了：log 才是 agent 本体

Claude Code 的进程挂掉后，resume 找回了对话，却丢了待批准的权限请求。要让 agent 真正恢复，持久化的不能只是一份 transcript，还要包括可重放的事件、工作区和副作用状态。

2026年8月14日·1,329 字·4 分钟

[Agent](https://xingkaixin.me/tags/Agent/)[Claude Code](https://xingkaixin.me/tags/Claude%20Code/)[系统设计](https://xingkaixin.me/tags/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/)[工程实践](https://xingkaixin.me/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/)

![进程挂了 resume 回来，agent 却僵住了：log 才是 agent 本体](https://xingkaixin.me/cover/log-lock-in.webp)

那天 Claude Code 跑着一个改动挺大的任务，停在权限确认上，等我按 y。我切出去处理别的事，回来发现 ssh 断了，进程没了。

`claude --resume` 之后，会话恢复，历史一条不少，那个权限提示却没回来。agent 僵在原地，既不继续，也不重新问我，像一个话说到一半忘了下半句的人。

我一直把它当成 resume 的 bug。后来读到 Omnara 的 Ishaan Sehgal 写的[《The Log Is the Agent》](https://www.omnara.com/blog/the-log-is-the-agent)，才反应过来：权限提示为什么会消失，不只取决于 resume 怎么写，还取决于系统把什么当作可恢复的事实。

## 角色不在主机里，在存档里

他开篇拿《艾尔登法环》做类比：玩了一百小时之后，角色的等级、装备和进度不在主机这块铁里，都在存档里。换台机器，把存档同步过去，那还是你的角色。

agent 也碰到了这条边界。模型和执行进程都可以替换，要接着做同一件事，就得延续此前发生过什么。用户输入、模型输出、工具调用、工具结果、权限请求和批准，都应该写成 append-only 的事件。

不过，把对话存成 JSONL 还不够。要恢复到原位，log 还得关联工作区快照、产物版本、外部副作用和运行时配置；执行器也得知道哪些动作已经做过。漏掉其中任何一项，拉起来的都只是一个“记得聊过什么”的新进程。

我的权限请求正好漏在这条边界外。resume 读到了 transcript，所以知道我们聊过什么；它读不到待批准事件，也就不知道下一步还在等人。如果请求本身、对应的工具调用和执行状态都已持久化，新的 worker 才能继续等我按 y。

![transcript 的缺口与完整事件 log](https://xingkaixin.me/posts/images/log-lock-in/log-lock-in-01.webp)

很多 harness 已经会保存 transcript，但 transcript 只够恢复界面，不一定够恢复执行。待处理的权限请求、lease、工作区版本和副作用标识只要还散落在进程内存、文件系统和内部表里，用户就可能看到同一个结果：历史还在，agent 不动了。

## 进程可以重启，副作用不能重放

事件 log 先解决恢复问题，接着会逼着执行循环换一种写法。worker 取得临时 lease，从 log 和关联快照重建状态，前进一步，先记下调用意图，再执行副作用并写回结果。

麻烦通常出在请求已经发出、结果还没写回的时候。worker 此时崩溃，新的 worker 到底该不该再发一次？能用幂等键的调用必须复用同一个键；不能幂等的动作，恢复时得先查询或对账，不能盲目重试。否则发消息、扣款、部署都可能做两遍。

![记录意图、执行副作用与幂等回放](https://xingkaixin.me/posts/images/log-lock-in/log-lock-in-02.webp)

同一条事件链也可以从某个节点分叉：一支跑 Claude，一支跑本地模型，各探各的路。只是文件和沙箱快照也得跟着分叉，否则两支 agent 仍在改同一份现场。迁移的边界同样很具体：模型适配器只是最浅的一层，事件格式和产物引用才是要搬走的东西。

context window 装不下完整历史，执行时仍然需要 compaction。但压缩结果不能取代原始 log。compaction 是有损投影，就像物化视图不是数据库本身。保留原始 log，之后还能换一种方式重新压缩；只留下 compaction，丢掉的细节就再也找不回来了。

## 最深的锁定是 log 锁定

读到这里，我才发现自己以前把平台锁定看浅了。模型能换，API 能包一层适配，运行历史却很难搬。**谁拥有你的 log，谁就拥有你的 agent。**

能导出一份 transcript，当然比什么都没有强，但还不能让 agent 接着工作。迁移至少要带走结构化事件、工作区与产物、工具调用状态，以及一套可重放的格式。我之前写过，session 里可搜的是解法，不可搜的是路径。现在我更在意的是：这条路径由谁保存，离开平台后还能不能继续执行。

![平台使用权与完整迁出能力](https://xingkaixin.me/posts/images/log-lock-in/log-lock-in-03.webp)

各家都在提供托管的 loop、memory、sandbox 和后台执行，能替团队省掉不少基础设施工作。代价也很具体：agent 会接触你的代码、数据和决策，log 还会记下失败过程与权限选择。它能留多久、谁能查询、可以导出到什么程度，都由平台决定。

* * *

现在很多 agent 会话当天就结束，log 的重量还没显出来。但平台的基础设施选择是现在做的。等会话开始跨天、跨任务，积累了能复用的工作历史之后再迁，就成了带着全部家具搬家。

所以现在评估一个 agent 平台，我会先确认 log 存在哪里、能不能完整回放，以及能不能连同工作区和产物一起迁出。

这些问题答不上来时，我拿到的只是运行 agent 的入口。角色能不能继续活下去，仍由平台手里的那份存档决定。

## 版权声明

作者

XingKaiXin

标题

进程挂了 resume 回来，agent 却僵住了：log 才是 agent 本体

发布时间

2026年8月14日

文章链接

[https://xingkaixin.me/posts/log-lock-in/](https://xingkaixin.me/posts/log-lock-in/)

本作品采用[CC BY-NC-ND 4.0 DEED](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans)许可。

导览

展开导览
