--- name: durable-execution description: Checkpoint management and state persistence for long-running agents. Use when executing tasks that span multiple steps, need failure recovery, or require idempotent operations. Covers checkpoint strategy, state management layers, event sourcing, and recovery patterns. --- # 持久化执行 — 检查点与状态管理 > 可靠是规模化的前提。每个长时任务都必须有可恢复的检查点。 ## 🎯 何时使用 - 任务预计超过 5 个步骤 - 任务涉及文件修改(需要回滚能力) - 任务依赖外部服务/API - 任务需要在中断后恢复 ## 📦 三层状态管理 | 层级 | 内容 | 本项目的实现 | |---|---|---| | **系统层** | 工作流 ID、超时、重试配置 | update_plan 记录任务 ID 和进度 | | **执行层** | 当前活动、执行进度、等待事件 | checklist_write 分步骤记录 | | **业务层** | 已完成工作、中间产物 | git diff + 编译结果作为验证 | ## 🔄 检查点策略 ### 触发时机 ``` 时间触发:每完成 1 个关键步骤 事件触发:编译通过 / 失败后 状态变化:每次代码修改后(git diff 可见) ``` ### 检查点内容 ```yaml checkpoint: step_id: "string" status: "pending | in_progress | completed | failed" inputs: { } # 该步骤的输入参数 outputs: { } # 该步骤的产出 error_message: "" # 失败原因 timestamp: "ISO8601" # 时间戳 ``` ### 恢复流程 ``` 失败检测 → 定位最新检查点(update_plan / checklist) → 分析失败原因(编译错误 / 测试失败 / 逻辑错误) → git restore 撤销本次修改 → 从失败点修复(不从头开始) → 继续执行 → 恢复验证(确认状态一致性) ``` ## ♻️ 幂等性模式 ### 模式 1:唯一标识 每个操作生成唯一 ID,已执行则跳过: ``` generate_code(task_id="abc123") if executed(task_id="abc123"): return cached_result # 已执行,跳过 ``` ### 模式 2:状态检查 执行前检查目标是否已达成: ``` if file_exists("src/utils/helper.js"): return # 已生成,跳过 ``` ### 模式 3:补偿操作 不可逆操作提供回滚机制: ``` try: modify_file(path) except: restore_from_git(path) # 补偿操作 ``` ## 📝 事件溯源(简化版) 每次操作产生不可变事件记录: ``` 事件流(按时间顺序): ① 人类提交任务 → ② Agent 制定计划 → ③ 修改文件 → ④ 编译检查 → ⑤ 数据流验证 → ⑥ 人类审查 → ⑦ 提交代码 ``` 每次事件可通过 `git log` + `update_plan` 追溯。 ## ⚡ 本项目的检查点命令速查 ```bash # 查看当前进度 grep -n "^[0-9]\+\." <(cat AGENTS.md | grep -A 100 "工作流程") # 回滚最近的修改 git checkout -- # 查看修改历史 git log --oneline -10 # 查看未提交的变更 git diff --stat HEAD ``` ## ⚠️ 常见陷阱 | 陷阱 | 表现 | 解决 | |---|---|---| | 不设检查点 | 失败后全部重来 | 步骤间自动 save_checkpoint | | 幂等性缺失 | 重复执行导致错误 | 唯一 ID / 状态检查 | | 状态不一致 | 检查点与实际不符 | git diff 验证后再恢复 | | 检查点过大 | 保存和恢复慢 | 只保存增量状态 |