ADR-0003:checkpoint 采用节点级粒度¶
- 状态:已采纳
- 日期:2026-09
背景¶
崩溃恢复需要决定"多久存一次状态"。候选:每个 LLM 调用后、每个节点完成后、每轮循环后、定时快照。
决策¶
每个节点完成后写一次:save_node(执行记录)+ save_snapshot(state + statuses)。
理由¶
- 一个节点内部可能有多轮重试与修复,但对外是原子的——中间态没有恢复价值;
- 单次快照 < 200KB,一次运行 13 次写入,SQLite 完全无压力;
- 恢复粒度"整节点重跑"是可接受的:节点的副作用(工具调用)已经走缓存,模型调用有幂等前提。
代价¶
节点内部失败(例如辩论第 2 轮崩了)会整节点重跑,最坏多花一次辩论的成本。 对这个项目来说可以接受;如果单个节点成本很高,应该把循环体拆成独立节点。
恢复语义的两个硬要求¶
- 已完成节点不再执行:否则恢复等于重跑,钱白花;
- 失败节点及其下游必须重置为 PENDING:否则它们卡在终态, 既不被调度,又让下游永远等不到依赖,整个 run 静默停摆(这个 bug 实际发生过,已有测试覆盖)。