跳转至

ADR-0003:checkpoint 采用节点级粒度

  • 状态:已采纳
  • 日期:2026-09

背景

崩溃恢复需要决定"多久存一次状态"。候选:每个 LLM 调用后、每个节点完成后、每轮循环后、定时快照。

决策

每个节点完成后写一次:save_node(执行记录)+ save_snapshot(state + statuses)。

理由

  • 一个节点内部可能有多轮重试与修复,但对外是原子的——中间态没有恢复价值;
  • 单次快照 < 200KB,一次运行 13 次写入,SQLite 完全无压力;
  • 恢复粒度"整节点重跑"是可接受的:节点的副作用(工具调用)已经走缓存,模型调用有幂等前提。

代价

节点内部失败(例如辩论第 2 轮崩了)会整节点重跑,最坏多花一次辩论的成本。 对这个项目来说可以接受;如果单个节点成本很高,应该把循环体拆成独立节点。

恢复语义的两个硬要求

  1. 已完成节点不再执行:否则恢复等于重跑,钱白花;
  2. 失败节点及其下游必须重置为 PENDING:否则它们卡在终态, 既不被调度,又让下游永远等不到依赖,整个 run 静默停摆(这个 bug 实际发生过,已有测试覆盖)。