一份报告已经完成证据收集,正文写到一半。任务状态停在 drafting_report,这时进程被强制中断。
恢复以后,Agent 重新收集全部证据,说明它忘了已经完成的工作。它直接提交,说明审批步骤丢了。它只复述先前对话,也不能证明外部系统与文件还在原来的状态。
恢复 session 很容易被误当成恢复任务。两件事需要分开测试。
Claude Code 的 session 会保存消息、工具使用和结果,恢复时继续同一个会话,fork 则复制历史并使用新的 session id。官方文档也提醒,切换分支后,聊天历史可以保持,Claude 看到的文件却已经来自新分支。
这说明对话能够提供线索,不能单独充当业务状态源。Agent 说 “报告已提交”,外部系统里可能没有记录。聊天里出现 “测试已通过”,也可能找不到对应命令和结果。
状态测试要同时看两边。Agent 认为当前处于哪个 step,真实文件、数据库记录、工单和审批又处于什么状态。恢复时两边做一次对账,才能决定继续、重试或停止。
只保存最新状态,会抹掉它怎样走到这里。事件记录更容易检查。
工具执行前保存 state.before_ref,结果回来后生成 state.after_ref。同一条事件里写清 step、attempt、错误、验证和副作用状态。一次工具超时后,副作用可能处于 unknown,不能擅自写成失败并重试。
state.version
state.before_ref
state.after_ref
step.id
step.status
step.attempt
checkpoint.id
side_effect.status
validation.status
resume_hint
state_diff_summary
step.status=done 与 validation.status=passed 要分开。动作执行过,结果可能失败。动作成功,业务目标也可能尚未验证。这个区分能挡住一类常见假阳性,Agent 自己宣布完成,系统里却没有任何可检查结果。
state.version 还可以帮助识别并发覆盖。两个 session 同时推进同一任务时,旧版本不能悄悄盖掉新状态。branch 或 fork 继承分叉点以前的历史,后续 step 也要留在自己的 run 中。
Claude Code 当前的 checkpoint 会在文件编辑前保存受影响文件,恢复以后仍可使用。官方边界也很明确,它覆盖文件改动,远程数据库、API、部署和其他外部动作无法一起恢复。
所以 checkpoint 要和事件、artifact 与外部状态配合。文件回到旧版本,并不代表工单也被删除。外部记录已经创建,文件恢复时可能还需要补偿动作或人工处理。
恢复过程也不能盲信旧 checkpoint。中断期间文件可能被人改过,权限可能变化,外部动作可能刚刚完成。Agent 读取 checkpoint 以后,还要和当前环境核对,再决定从哪个 step 接上。
开头的报告任务可以跑成一组连续用例。
drafting_report 中断waiting_approval 后模拟审批拒绝verified
再加入外部文件变化、两个并发 session、fork 和失败重试。这样能分别暴露状态丢失、状态污染、重复副作用、隔离失败和验证假阳性。
评分可以拆成进度一致性、恢复正确性、幂等、隔离、验证绑定和状态证据。每项都应该能落回事件或 artifact。仅靠 Agent 的自然语言回忆,分数再高也不稳。
那份中断的报告恢复以后,第一步应当读取 checkpoint 与事件,确认文件和外部状态,再推进到下一个尚未完成的 step。它可能继续写正文,也可能发现文件被改过而停下来询问。无论哪种,决定都要来自当前证据。