别再用 ToDo 糊弄 AI:用 DAG 把 Claude 团队"锁"在正确顺序里
跑多个 Agent 做项目,最怕什么?不是某个 Agent 写出 bug,而是某个 Agent 跳步。
前端 Agent 开始写页面了,后端 API 还没定义好。测试 Agent 开始跑集成测试了,数据库迁移还没执行。这种事在人类团队里也会发生,但人会自己判断"这个还没好,我等一下"。LLM 不会。你给它一个 ToDo 列表,它看到"写前端页面"这个条目,直接就开干了,不管上面的"定义 API 接口"有没有打勾。
Claude Code v2.1.16 引入的 Tasks 功能,就是来治这个病的。
01 什么是 Tasks
Tasks 是 Claude Code 新增的跨会话持久状态管理功能。和以前的 ToDo 列表最大的区别在于:它用有向无环图(DAG)来描述任务之间的依赖关系。
DAG 是一个计算机科学里的老概念,用图来表示事物之间的先后顺序。有向表示有方向(A 必须在 B 之前),无环表示不能形成循环(A 依赖 B、B 依赖 A 这种情况不允许)。
放到实际项目里就是:你可以明确告诉 Claude,"Run Tests"这个任务依赖于"Build API","Build API"又依赖于"Database Migration"。Claude 会强制执行这个顺序,"Run Tests"在"Build API"完成之前根本不会被启动。
这听起来像是很基础的功能。确实是。但对 LLM 来说,"按顺序做事"恰恰是最容易出错的地方。
02 临时 ToDo 列表为什么不够用
一个常见的做法是在 prompt 里给 Agent 写一个 ToDo 列表:
- 数据库迁移
- 开发 API
- 写前端
- 跑测试
看起来很清楚。问题是,这个列表只是文字。它没有强制力。Agent 读到这个列表,理解了先后顺序,但在实际执行的时候可能因为上下文太长、注意力漂移、或者某个步骤的输出格式不符合预期,就跳到了第三步。
LLM 的一个常见失败模式是:它会"合理化"自己的跳步行为。"前端框架可以先搭起来,API 接口可以先用 mock 数据"。听起来有道理,但如果你的 API 设计还没确定,mock 数据的结构可能和最终 API 完全不一样,前端代码等于白写。
DAG 解决的就是这个问题。它不是建议,是约束。当任务 B 的前置任务 A 还没完成时,Agent 拿不到任务 B 的执行权限。不存在"先做着再说"的可能。
03 持久状态管理意味着什么
Tasks 的另一个重要特性是持久化。
以前用 Claude Code 跑长任务,如果中途断开连接——网络不稳定、笔记本合上了、Token 额度用完了切换账号——上下文就丢了。重新连接后,Agent 不知道之前做到哪了,要么从头开始,要么你手动告诉它"你已经完成了步骤 1 和步骤 2,从步骤 3 开始"。
Tasks 把任务状态写到持久存储里。每个任务的状态(未开始、进行中、已完成、已阻塞)都有记录。断开重连后,Agent 读取 Tasks 状态,知道自己该从哪里接着干。
这对长时间运行的多 Agent 项目特别关键。一个全栈应用的开发流程可能跨越好几天,Agent 会话中途断开是常态。没有持久状态管理,每次重连都要花时间重建上下文,浪费 token 也浪费时间。
04 一个全栈项目的 DAG 长什么样
我拿一个典型的全栈 Web 项目举例。假设你要做一个带用户认证的任务管理应用,DAG 大概会是这样的依赖关系:
数据库 Schema 设计 → 数据库迁移执行 → API 端点开发 → 认证中间件 → 前端页面开发 → 端到端测试 → 部署配置
这里面有些任务可以并行。API 端点开发和认证中间件可以同时进行(因为它们都只依赖数据库迁移完成)。前端页面和端到端测试不行(测试依赖前端完成)。
用 DAG 描述这些依赖关系之后,Lead Agent 会自动识别出可以并行的任务,分配给不同的 Agent 同时执行。该串行的步骤严格串行,该并行的步骤自动并行。
和人类项目经理画甘特图做排期本质上是同一件事,只是这里的"项目经理"是一个 Claude Agent。
05 什么项目适合 DAG,什么项目不需要
不是所有项目都需要 DAG 编排。
如果你的任务是线性的——改一个 bug、加一个小功能、重构一个文件——单 Agent 按顺序执行就够了。加 DAG 反而增加复杂度。
DAG 编排真正有价值的场景有两个特征:多个 Agent 参与,任务之间有非平凡的依赖关系。
"非平凡"的意思是:不是简单的"先做 A 再做 B"线性链,而是有分叉、有汇合、有并行路径。比如前面说的全栈项目,数据库迁移之后分叉出 API 开发和认证中间件两条并行路径,在前端开发的时候又汇合到一起。
如果你的项目有超过六七个任务步骤,其中有些可以同时做、有些必须按顺序来,DAG 能帮你省掉手动协调的麻烦。如果任务步骤少于五个,或者全部是线性依赖,一个简单的顺序列表就够用了。
还有一种情况:你对 Agent 的执行顺序不放心。你之前踩过坑——Agent 跳步导致返工、前面的任务没做完就开始后面的——那 DAG 是一个保险。它用系统级的约束替代了 prompt 里的口头约定,可靠性高出一个量级。
VentureBeat 的报道提到,Tasks 功能让 Agent 能"工作更长时间、跨会话协调"。我觉得更准确的说法是:它让多 Agent 协作从"靠提示词自觉"进化到了"靠依赖图强制"。前者像是口头约定,后者像是合同。
参考链接: https://venturebeat.com/orchestration/claude-codes-tasks-update-lets-agents-work-longer-and-coordinate-across https://code.claude.com/docs/en/agent-teams https://docs.anthropic.com/en/docs/claude-code/common-workflows