Claude Code Tools 研究系列(十)—— Task 家族:让 Agent 记住要做的事
内容提要
本文介绍Claude Code的Task工具家族,共6个工具,用于任务管理。核心是待办任务(TaskCreate/List/Get/Update)和运行任务(TaskStop/Output),支持拆解复杂需求、追踪进度、建立依赖及多Claude协作。关键设计包括:3步以上才建任务、状态机防假性完成、双向依赖、owner字段协作,以及activeForm强制进行时。Task家族将工作记忆外化,实现跨时间、跨上下文的持久追踪。
延伸解读
Task 家族与普通待办清单的本质区别
Task 家族不是简单的待办清单,而是将 Claude 的工作记忆外化到 runtime 存储中。与 Read、Edit 等工具不同,Task 创建后持久存在,可跨上下文、跨会话、跨多个 Claude 实例共享。这种设计让复杂任务不再依赖 Claude 的短期记忆,而是通过系统化的任务追踪来对抗遗忘,实现真正的异步协作。
状态机与依赖关系:防止假性完成
Task 的状态机严格限制为 pending → in_progress → completed,且不允许倒退,同时 blockedBy 依赖未完成时不能标记为 in_progress。这些规则防止了 Claude 在测试失败或实现不完整时草率标记完成,确保每个任务都真正完成。双向依赖(blocks/blockedBy)自动同步,增量更新避免覆盖,体现了对任务可靠性的重视。
多 Claude 协作的基石:owner 字段与共享清单
owner 字段让主 Claude 和 subagent 能通过共享任务清单协作,无需互相发送消息。主 Claude 创建任务,subagent 认领并更新状态,主 Claude 可随时查看进度。这种模式类似分布式任务队列,使多个 AI 实例能高效分工,同时保持全局可见性。
命名与设计中的刻意取舍
Task 家族刻意省略了 TaskDelete 工具,用 status=deleted 代替,将删除纳入状态机;TaskOutput 被废弃,降级为用 Read 工具读取输出文件。这些设计减少了 API 表面积,让能力复用现有原语。activeForm 字段强制使用现在进行时,将语法规则融入字段语义,促使 Claude 以进行中的视角看待任务。
Q&A
Claude Code 的 Task 家族包含哪些工具?它们分别有什么作用?
Task 家族包含 6 个工具:TaskCreate(创建任务)、TaskList(列出所有任务)、TaskGet(获取单个任务详情)、TaskUpdate(更新任务状态或元数据)、TaskStop(停止后台运行的任务)、TaskOutput(获取后台任务输出,已废弃,建议用 Read 工具读取输出文件)。前四个用于管理待办任务,后两个用于控制运行中的后台任务。
Task 家族和之前的工具(如 Read、Edit、Bash)有什么本质区别?
Task 家族是唯一具有持久状态的工具家族。之前的工具(如 Read、Edit、Bash)每次调用都是即时操作,结果在调用后即消失;而 Task 家族创建的任务会保存在系统中,可以跨时间、跨上下文追踪,直到被标记为完成或删除。这相当于将 Claude 的工作记忆外化到 runtime 存储中。
在什么情况下应该使用 Task 家族?什么情况下不应该使用?
应该使用的情况:任务需要 3 步以上、非平凡的多操作任务、用户明确要求使用 todo list、用户给出多个任务、在 plan mode 中追踪计划步骤、开始工作前标记 in_progress、完成后标记 completed。不应该使用的情况:单个直接的任务、平凡的任务、少于 3 步的简单任务、纯对话或信息性任务。核心判断是:Task 家族适用于有规模的工作,简单任务使用反而增加噪音。
Task 家族如何支持多 Claude 协作?
Task 家族通过 owner 字段支持多 Claude 协作。主 Claude 创建任务时 owner 为空,派给 subagent 后 subagent 认领并设置 owner 为自己的名字。主 Claude 通过 TaskList 可以看到哪些任务已被认领、哪些还空着,从而分配新任务。subagent 完成后释放 owner,主 Claude 可以再派其他 subagent。这样多个 Claude 实例通过共享任务清单同步工作状态,无需互相发消息。
Task 家族如何防止任务被假性完成?
TaskUpdate 工具的描述中明确要求:只有在任务完全完成时才标记为 completed。如果测试失败、实现不完整或遇到未解决的错误,必须保持 in_progress 状态。这防止了 Claude 在“大方向对了”时就标记完成,留下半成品任务。
Task 家族中的状态机是如何设计的?有哪些状态和转换规则?
状态包括 pending、in_progress、completed 和 deleted。状态流转为 pending → in_progress → completed,不允许倒退(如从 completed 回到 in_progress)。deleted 是硬删除入口,用于清理误建任务,不出现在正常列表中。此外,如果任务被未完成的依赖阻塞(blockedBy 非空),runtime 不允许将其变为 in_progress。
Task 家族中的 activeForm 字段是什么?为什么它很重要?
activeForm 是任务的进行时形式,例如“Running tests”,用于 spinner 等 UI 显示。它是必填字段,强制 Claude 在创建任务时提供祈使句(subject)和进行时(activeForm)两种形式。这个设计将语法规则融入字段语义,促使 Claude 以“正在做”的口吻看待任务,而不是“打算做”,体现了工作节拍的区别。
Task 家族中的依赖关系是如何建模的?
依赖关系通过 blocks 和 blockedBy 字段双向建模。A blocks B 等价于 B blockedBy A,runtime 自动维护双向一致性。TaskUpdate 支持 addBlocks 和 addBlockedBy 增量追加,避免覆盖已有依赖。依赖关系强制任务顺序,只有 blockedBy 为空的任务才能开始。