複数手順の作業を頼むと、Claude Code は進捗をチェックリストで見せてくれます。
その TodoWrite が、手元の環境ではツールごと存在しない状態でした。
2.1.233 の changelog にこうあります。
Todo/task-tracking tools (TaskCreate/Get/Update/List, TodoWrite) are no longer available on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models; set
CLAUDE_CODE_ENABLE_TODO_TOOLS=1to bring them back
(Todo・タスク管理ツール(TaskCreate/Get/Update/List、TodoWrite)は Opus 4.8、Sonnet 5、Fable 5、Mythos 5 以降のモデルでは利用できない。CLAUDE_CODE_ENABLE_TODO_TOOLS=1を設定すると戻せる)
「新しいモデルだから」で終わりそうですが、条件を変えて測ったら違いました。
同じ Opus 5 でも、環境変数しだいで使えます。 消していたのは CLAUDE_CODE_ENABLE_TASKS=0 のほうでした。
まず結果
claude -p の非対話モードで条件を変え、「今使えるツールのうち Todo / Task で始まるものを挙げて」と聞いた結果です。
| モデル | ENABLE_TASKS |
ENABLE_TODO_TOOLS |
使えたツール |
|---|---|---|---|
| Opus 5 | 未設定 | 未設定 | TodoWrite |
| Haiku 4.5 | 未設定 | 未設定 | TaskCreate / Get / List / Update |
| Opus 5 | 0 | 未設定 | なし |
| Opus 5 | 未設定 | 1 | TaskCreate / Get / List / Update |
3行目が、自分の環境と同じ条件です。 CLAUDE_CODE_ENABLE_TASKS=0 が入っていました。
検証環境: Windows 10 / Claude Code 2.1.234 /
--model opusはclaude-opus-5に解決される
犯人は ENABLE_TASKS=0 だった
環境変数を見たら、こうなっていました。
CLAUDE_CODE_ENABLE_TASKS = 0
CLAUDE_CODE_ENABLE_TODO_TOOLS = (未設定)
settings.json には書いていません。 親プロセスから渡っていました。
この変数の意味は、公式ドキュメントにあります。
On other models, Claude Code provides the Task tools by default and
TodoWriteonly when you setCLAUDE_CODE_ENABLE_TASKS=0.
(それ以外のモデルでは、Claude Code は既定で Task ツールを提供し、CLAUDE_CODE_ENABLE_TASKS=0を設定したときだけTodoWriteを提供する)
つまり ENABLE_TASKS=0 は、「Task ツールをやめて TodoWrite にする」という切り替えです。
ところが新しいモデルでは Task ツールが既定で付いていません。
そこに「Task ツールをやめろ」を足すと、やめる対象がないまま、TodoWrite も出てこない。
結果、両方消えます。 これが実測の3行目でした。
戻す変数の名前と、戻ってくるものが違う
復活させる変数は CLAUDE_CODE_ENABLE_TODO_TOOLS=1 です。名前からして TodoWrite が戻りそうですが、
TaskCreate
TaskGet
TaskList
TaskOutput
TaskStop
TaskUpdate
返ってきたのは Task ツール一式。TodoWrite は入っていません。
公式ドキュメントも、この変数をそう扱っていました。
sets only
CLAUDE_CODE_ENABLE_TODO_TOOLS=1, the opt-in for the models that otherwise don't get the tools
(CLAUDE_CODE_ENABLE_TODO_TOOLS=1だけを設定する。これは、そのままではツールが付かないモデルのための opt-in である)
変数名は Todo、実体は Task。 知らないと混乱します。
Todo と Task は別物
両者は設計から違います。
TodoWrite |
Task ツール | |
|---|---|---|
| 更新の単位 | 1回でリスト全体を書き換え |
TaskCreate で1件追加、TaskUpdate で1件更新 |
| 読み出し | なし |
TaskList / TaskGet
|
| 依存関係 | なし | addBlocks / addBlockedBy で指定できる |
Task ツールには依存関係と担当者があります。 ただしこの表は公式ドキュメントの記載をまとめたもので、
依存関係を実際に作って試してはいません。
無効化の理由は公式に書かれていません。 「高機能な方へ寄せた」と読めますが、
そう書かれた文章は見つかりませんでした。推測です。
モデルによって既定が違う
環境変数なしでも、モデルで結果が割れました。
| モデル | 既定で付くもの |
|---|---|
| Opus 5 | TodoWrite |
| Haiku 4.5 | Task ツール一式 |
changelog は「Opus 4.8、Sonnet 5 以降では使えない」と書いていますが、
Opus 5 に素で聞いたら TodoWrite が返りました(-p での結果)。
なお、詳しい仕様が載っているのは Agent SDK 向けのページで、条件も SDK のバージョンで書かれています。
SDK と CLI で既定が一致していない可能性があります。 結局、自分の環境で確かめるのが早いです。
どうするか
まず自分の環境を見てください。
echo "TASKS=${CLAUDE_CODE_ENABLE_TASKS:-未設定} TODO=${CLAUDE_CODE_ENABLE_TODO_TOOLS:-未設定}"
| 状態 | どうなるか |
|---|---|
| 両方とも未設定 | モデル既定のまま。触らなくてよい |
ENABLE_TASKS=0 が入っている |
新しいモデルでは全部消える。これが原因 |
ENABLE_TODO_TOOLS=1 を追加 |
Task ツールが使えるようになる |
常に出したいなら settings.json に入れておけます。
{
"env": { "CLAUDE_CODE_ENABLE_TODO_TOOLS": "1" }
}
なお公式によれば、リストが作られるのは「3つ以上の別々の操作が必要な複雑な作業」のときです。
短い依頼では元々作られないので、そこは戻しても変わりません。
まとめ
-
原因は
CLAUDE_CODE_ENABLE_TASKS=0。 新しいモデルと組み合わさると全部落ちる -
ENABLE_TASKS=0は本来「Task ツールをやめて TodoWrite にする」設定。 やめる対象がないと、TodoWrite も出ない -
戻すのは
CLAUDE_CODE_ENABLE_TODO_TOOLS=1。 ただし戻ってくるのは Task ツールで、TodoWriteではない - Task ツールは
TodoWriteの上位版で、依存関係と担当者を持てる(ドキュメント記載。未実測) -
モデルで既定が違う(
-pで確認)。Opus 5 はTodoWrite、Haiku 4.5 は Task ツール - 公式ドキュメントは Agent SDK 向け。CLI の挙動と一致しない部分がある
「最近リストが出ないな」と思ったら、モデルではなく環境変数かもしれません。
まず CLAUDE_CODE_ENABLE_TASKS を確認してみてください。
参考
- Todo Lists — Claude Code Docs
- Claude Code changelog — 2.1.233 の項
- 検証環境: Windows 10 / Claude Code 2.1.234
※ 引用は原文と日本語訳を併記しています。訳は読みやすさを優先しているので、正確な表現は原典をご確認ください。
関連記事
- Claude Code の fork、既定ONのはずが使えなかった — 同じく、環境変数で挙動が変わっていた話
- CLAUDE.md を厚くしても意味がなかった話 — 指示より仕組みで縛るほうが効くという話