版本对照 · 15

Todo / 任务追踪工具的模型门控

TodoWrite 是 v1,Task 四件套是 v2,两套互斥。2.1.16 起默认走 v2。2.1.233 起 Opus 4.8、Sonnet 5、Fable 5、Mythos 5 及更新家族上两套都不给模型;设置 CLAUDE_CODE_ENABLE_TODO_TOOLS=1 可恢复Task工具的提供。

1. 两套系统#

TodoWrite(v1)Task 四件套(v2)
工具TodoWriteTaskCreate / Get / Update / List
数据todos: [{id,status,subject}],按 agentId 存 appState磁盘任务文件:taskId、status、owner、blocks / blockedBy
2.1.233 isEnabled!isTodoV2Enabled() && isTodoToolsEnabled()isTodoV2Enabled() && isTodoToolsEnabled()
版本事实
0.2.93CHANGELOG:Todo 列表。v1 引入。
1.0.0bundle 只有 TodoWrite,无 TaskCreate / TaskList。
2.1.16CHANGELOG:new task management system,含 dependency tracking。v2 引入。
2.1.19CLAUDE_CODE_ENABLE_TASKS;changelog:设 false 暂时保留旧系统。
2.1.88ENABLE_TASKS 为真则强制 v2,否则交互走 v2、非交互走 v1。TodoWrite.isEnabled = !isTodoV2Enabled()
2.1.229–232ENABLE_TASKS !== false,默认全会话 v2;ENABLE_TASKS=0 回退 v1。2.1.232 叠 tengu_vellum_ash
2.1.233叠加 isTodoToolsEnabled()vellum_ash 消失,rosy_wren 出现。定义仍在 bundle 里。
// 2.1.88 TodoWriteTool
isEnabled() { return !isTodoV2Enabled() }

// 2.1.88 utils/tasks.ts
export function isTodoV2Enabled(): boolean {
  if (isEnvTruthy(process.env.CLAUDE_CODE_ENABLE_TASKS)) return true
  return !getIsNonInteractiveSession()
}

// 2.1.233
function isTodoV2Enabled() {
  return V.CLAUDE_CODE_ENABLE_TASKS !== false
}

官方 tools-reference:未门控模型(如 Opus 4.7)默认给 Task 四件套;TodoWrite 要在已有任务工具的会话里设 ENABLE_TASKS=0

2. 2.1.233 模型门控#

2.1.233(2026-08-14):Opus 4.8、Sonnet 5、Fable 5、Mythos 5 及同家族更新模型上,Task 四件套和 TodoWrite 默认都不提供。

字符串2.1.2292.1.2312.1.2322.1.233
CLAUDE_CODE_ENABLE_TODO_TOOLS0002
tengu_rosy_wren0001
tengu_vellum_ash10

2.1.229–232 没有模型家族表,也没有 ENABLE_TODO_TOOLS / rosy_wren。2.1.233 对 claude-opus-5 的 capture:20 个工具,无 Task 四件套、无 TodoWrite。

3. 门控机制#

3.1 模型表

const TASK_TRACKING_GATED_FAMILIES = [
  ["opus",   [4, 8]],
  ["sonnet", [5]],
  ["fable",  [5]],
  ["mythos", [5]],
]

// modelMeetsFamilyMin(id, table):claude-<family>-<ver> 逐位比较,整体 >=
// isUngatedForTaskTracking(id) = !modelMeetsFamilyMin(id, TASK_TRACKING_GATED_FAMILIES)

3.2 三层

isBgOrTakeover()              // 后台会话 / bgTakeover
todoToolsOptIn()              // SDK / 宿主 opt-in
getMainLoopCanonicalModel()

isTodoV2Enabled()             // ENABLE_TASKS !== false
isTodoToolsEnabled()          // 后台 / SDK / 老模型 / env / rosy_wren
isTaskListToolsEnabled()      // isTodoV2Enabled && isTodoToolsEnabled
函数管什么为真时
isTodoV2Enabledv1 / v2 互斥Task 系列候选;TodoWrite 候选关掉
isTodoToolsEnabled模型 + 场景 + 逃生门这套任务追踪工具允许出现
isTaskListToolsEnabledTask 四件套 isEnabled两扇门都开

TodoWrite 的 isEnabled!isTodoV2Enabled() && isTodoToolsEnabled()

3.3 挂载点

工具2.1.2322.1.233
TaskCreate / Get / Update / ListisTodoV2Enabled() && !tengu_vellum_ashisTaskListToolsEnabled()
TodoWrite!isTodoV2Enabled() && !tengu_vellum_ash!isTodoV2Enabled() && isTodoToolsEnabled()

定义、schema、prompt 都还在 bundle 里——isEnabled() === false 时对模型不可见。

4. 官方说明#

tools-reference · Task tool availability

Those models keep track of multi-step work without a written checklist, and the tools’ definitions and reminders take up context, so Claude Code leaves them out. Without them, Claude adds nothing to the task list while it works.

这些模型能跟住多步工作,不需要书面清单;工具的定义和提醒会占上下文,所以 Claude Code 把它们拿掉。没有这些工具时,Claude 工作时不会往任务列表里写任何东西。

Agent SDK · Todo tracking

Claude tracks multi-step work without a written todo list, and Claude Code leaves the task-tracking tools out of sessions by default. You don’t need anything on this page for Claude to work through multi-step tasks on those models.

在这些模型上,Claude 不靠书面 todo 列表就能跟住多步工作,Claude Code 默认不把任务追踪工具放进会话。这些模型上走完多步任务,不需要本页的任何内容。

代码两处一起停:工具 isEnabled 为 false,task_reminder 先查 isTaskListToolsEnabled()

例外:后台 / bgTakeover 始终给;SDK todoToolsOptIn();未进门控表的模型走 v1/v2 互斥。逃生门:env + rosy_wren

ENABLE_TODO_TOOLS=1

env 只把 isTodoToolsEnabled() 短路为 true。Task 四件套还要 v2 开着;TodoWrite 还要 ENABLE_TASKS=0

场景TASKSTODO_TOOLSTodoWriteTask 系列
老模型默认未设未设
老模型回退 v10未设
新模型默认未设未设
新模型 + env未设1
新模型 + env + 回退 v101

5. 可借鉴点#

  1. isEnabled() 动态门控,比编译期裁剪灵活
  2. claude-<family>-<ver> 逐位比较
  3. v1 / v2 互斥 + env 回退
  4. 后台/无人值守先于模型家族表
  5. env(用户)+ GrowthBook(厂商)两扇逃生门