Appearance
哪些 Runtime 事实必须持久化:Tool、Checkpoint 与 Approval
前置:Runtime 事实怎么落表:Run、Node Execution 与 Attempt Identity
核心问题:Tool 已成功、Checkpoint 未提交或 Approval 等待跨进程时,哪些记录必须持久化才能在恢复时判断真实状态?
三类记录分别回答三个问题
text
ToolExecution → 这次 logical operation 到底执行到哪里?
Checkpoint → Runtime 能从哪个一致状态恢复?
Approval → 谁批准/拒绝了哪个具体动作版本?它们可以存在同一个数据库,但不能压成一个含糊的 run_state.json,否则 retry、resume 和 audit 都很难独立判断事实。
Tool Execution Record:保存 Attempt 与 External Identity
核心字段通常包括:
text
operation_id
attempt_id
run_id / node_id
tool_name / schema_version
args_hash
status
remote_request_id / result_ref
normalized_error
started_at / finished_at例如支付请求 timeout 后,Runtime 可以利用稳定 operation_id 或 provider request id 查询远端状态,判断是 retry、reuse result 还是进入 reconciliation。
Checkpoint:保存一致恢复切片,不是随手 dump dict
Checkpoint 通常需要:
text
run_id / checkpoint_id
parent_checkpoint
state_version / schema_version
completed + pending state
payload/ref
created_at如果 checkpoint 声称 Node 已完成,但对应 ToolExecution completion 还没有形成 durable fact,恢复时就会出现“快照认为做过、执行记录却无法证明”的矛盾。因此 Checkpoint Store 必须服从 Runtime 的 commit protocol,而不是独立定时保存任意内存对象。
Approval:必须绑定到具体 Action Version
审批不是浏览器里一个等待中的 Promise。至少要保存 proposed action/hash、关键参数版本、requester/approver、decision、edited args、expiry 和关联 operation/checkpoint。
例如用户批准的是:
text
deploy artifact=v7 to staging之后 artifact 已变成 v8,就不能复用旧 approval。Action identity/version 变化意味着需要重新验证甚至重新审批。
一个 Crash Window 怎么依赖这三类记录
text
approval APPROVED(op-9)
→ Tool attempt started(op-9, attempt-1)
→ remote deploy succeeded
→ CRASH before local completion恢复时不能只看 checkpoint 然后重新 deploy。Runtime 应读取 Approval + ToolExecution identity,查询/对账远端 op-9,确认已经成功后补写 completion,再生成新的可恢复 checkpoint。
这也是为什么“数据已经持久化”不等于“系统已经形成安全恢复边界”。表结构必须支持中间事实和未知结果。
如何验证
| 场景 | 必须成立 |
|---|---|
| Tool timeout 后进程重启 | operation/attempt identity 仍可用于 reconciliation |
| Approval 后 action 参数改变 | 旧 approval 不能直接授权新 action |
| Checkpoint 写入前 crash | 恢复根据 durable execution facts 判断,不凭内存状态猜测 |
| 两小时等待后新 Worker resume | Approval/Checkpoint 都能独立读取并关联同一 Run/operation |
自测
- ToolCall、Checkpoint、Approval 都要持久化,但它们的生命周期和 authority 不同。为什么不能塞进一个 JSON blob 就结束?
- 恢复时 pending approval 与已执行 Tool 记录冲突,哪类记录必须先被 reconciliation?