24 讲路线 · 与 S08 配对
D08: Task Management 深挖 · 任务管理
本讲在 S08 主线之上,聚焦实现细节、边界条件与自测;导图与主线相同模块,便于对照。
建议:先读完 S08,再按下方顺序走读源码与练习。
🔬 深挖目标
任务系统把「多步工作」从模型幻觉里拽到可持久化数据结构:依赖、状态、重试与并发上限都要在代码层可验证。
🧱 数据模型(自查)
- 任务节点:id、title、状态机(pending/running/blocked/done/failed)。
- 依赖边:DAG 还是允许软依赖?失败是否级联取消?
- 调度器:与主 loop 是同线程还是 job queue?
🔁 失败与重试
| 失败类型 | 建议策略 |
|---|---|
| 工具瞬时错误 | 有限次指数退避 + 可观察日志 |
| 权限拒绝 | 不要自动重试;回到 D03 等人 |
| 模型胡写 plan | 校验 DAG 无环 + 人工 / 规则 gate |
🔗 与 Subagent
常见模式:父任务拆子任务 → 子代理执行 → 父任务合并;确认子任务失败是否会阻塞父任务依赖解析。
📖 走读顺序
- 搜索
task、todo、queue、scheduler,缩小到任务模块目录。 - 画一张 5 个状态以内的状态机,并与实际枚举对比。
- 模拟:任务 A 依赖 B,B failed,UI 与 API 各应表现什么?
✏️ 自测 1 · 参考答案:并行任务如何避免双写?
题干
若允许并行 3 个 running 任务,如何避免同一文件被双写?
结论
- 文件级锁 / 租约:任务开始前对将修改的路径集合申请锁,冲突则排队或失败 fast。
- 分区所有权:调度器把目录树切片,保证并行任务写集合不相交。
- 最后写者检测:写前读 checksum,不匹配则中止并把冲突交给模型/用户(与 git 冲突类似)。
✏️ 自测 2 · 参考答案:只存 title 不存验收?
题干
任务持久化若只存 title 不存 acceptance criteria,会有什么问题?
结论
- 模型与用户会对「什么叫完成」各说各话,无法自动验收,任务状态沦为摆设。
- 恢复会话或换人接手时,无法判断旧任务是真完成还是被跳过。
- 建议至少存:可机读的 完成条件(测试命令、文件存在、URL 返回码)或指向 spec 的链接/片段。