Claude にタスクを切らせて並走させたあと、状態(pending→in_progress→completed)や依存関係を書き換えたい人向け
Claude に長めの作業を5タスク・10タスクに分けて並走させていて、途中で「2番目が終わったから次に進めたい」「3番目のタスクに追加メモを書き足したい」「優先順を変えてタスク同士のつながりを組み替えたい」「もう要らないタスクを削除したい」のいずれかが発生した場面で、Claude が裏で自動的に呼び出す。私たちはチャット欄に「○○終わったから次行って」「3番目はこれも入れて」のように日本語で伝えるだけで、Claude が TaskUpdate を発火させてリストを書き換える。
TaskUpdate は、Claude Code が頭の中に持っているタスクリストの各項目を、後から書き換えるための内蔵ツールです。具体的には「pending だった項目を in_progress に切り替える」「タスクの本文に追加情報を書き足す」「他のタスクとの依存関係を組み替える」「もう要らなくなったタスクを消す」の4つを、1つのツールで全部やってくれます。
ややこしいのは、これを叩くのはユーザーではなく Claude 本人だという点です。私たちはチャット欄に「写真撮影は終わったから次のタスクを進めて」と日本語で伝えるだけで、Claude が裏で TaskUpdate を発火させてリストを書き換える、という分担になっています。さらに重要な前提として、TaskUpdate は旧式の TodoWrite を分割した後継4ツール群(TaskCreate / TaskGet / TaskList / TaskUpdate)の一翼であり、その中でも書き換え担当の位置にあります。
噛み砕くと
キッチンのホワイトボードに付箋でタスクが5枚貼ってあって、料理担当が1人いる、と想像してください。買い物に行ってきた人が「卵買ってきたよ」と声をかけたら、料理担当が付箋を剥がして「準備中」から「作業中」に位置を変える。終わった付箋は「完了」の列に動かす。要らなくなった付箋は捨てる。この「付箋を動かす作業」だけを切り出した道具が TaskUpdate です。
付箋を新しく書く道具は TaskCreate、付箋の中身を読む道具は TaskGet、ホワイトボード全体を眺める道具は TaskList、と別々に用意されています。TaskUpdate は動かす・書き直す・捨てるの3つだけ担当します。
そもそも Claude のタスクって何のこと?
Claude Code は長めの作業を頼まれると、頭の中で「今日やることリスト」を作って、1つずつ片付けます。このリストは TaskCreate で作られ、TaskList で全体を眺められ、TaskGet で個別の中身を見られて、TaskUpdate で書き換えられる、という4種類の内蔵ツールで管理されます。以前は TodoWrite という1つのツールが全部やっていましたが、機能が増えてきたので2025年中に4分割されました。
公式ドキュメントによれば、TodoWrite は Deprecated in favor of TaskCreate, TaskGet, TaskList, and TaskUpdate と明記されています。つまり後継4ツールに置き換えられて非推奨という扱いです。インタラクティブセッション、つまり私たちが普段使っている、ターミナルで claude と打って対話する画面では、もう default で新しい Task tools 側が動いています。
ただし claude -p 経由や Agent SDK 経由で動かす場合は、まだ TodoWrite が default のまま残されていて、CLAUDE_CODE_ENABLE_TASKS=1 という設定値を立てないと Task tools 側に切り替わりません。ここを忘れると、後述する通り TaskUpdate がそもそも呼ばれない事故が起きます。
「料理ブログを5タスクに分けたあと、状態を書き換えていく」を例に、実際の手順を見る
「世界の料理を1ヶ月で30品紹介する個人ブログを立ち上げる」という題材で、Claude が裏で TaskUpdate をどう発火させているかを順に見ていきます。ユーザー側の操作はチャット欄に日本語を打ち込むだけ、TaskUpdate は Claude が勝手に裏で叩きます。
ステップ1: TaskCreate で5タスクが作られる
ユーザーが「料理ブログの立ち上げ、5つのステップに分けて進めて」と頼みます。Claude が TaskCreate を5回叩いて、こういうリストが裏に出来上がります。
id=1 写真撮影機材を揃える status=pending
id=2 撮影スタジオのレイアウトを決める status=pending dependencies=[1]
id=3 最初の5品の写真を撮る status=pending dependencies=[2]
id=4 レシピ原稿を書く status=pending dependencies=[3]
id=5 WordPress にアップロードする status=pending dependencies=[4]
5つとも pending ですが、id=2 以降は dependencies で前のタスクと繋がっています。「機材を揃える」が終わるまで、レイアウト決めには進めない、という縛りです。
ステップ2: 最初のタスクに着手する
ユーザーが「機材揃えから始めて」と伝えます。Claude は最初に TaskUpdate を1回叩いて、id=1 の状態を in_progress に書き換えます。
TaskUpdate(id=1, status="in_progress")
これで「いま私は機材揃えに集中している」が明示されます。1つのタスクだけが in_progress になるのが原則で、複数同時には進めません。
ステップ3: 完了したら次のタスクの縛りが解ける
Claude が機材リストをまとめ終わったので、TaskUpdate で id=1 を completed に切り替えます。
TaskUpdate(id=1, status="completed")
このとき裏で起きるのが、dependencies の連動です。id=2 は dependencies=[1] だったので、id=1 が completed になった瞬間に「待機解除」になります。ホワイトボードの付箋でいえば、id=2 の付箋を覆っていた「先に id=1 を終わらせて」の張り紙が自動で剥がされるイメージです。
ここで初心者がやりがちな勘違いがあって、「completed にしたら id=2 が自動で in_progress になる」と思いがちですが、そうはなりません。次のタスクに進むためには、Claude がもう一度 TaskUpdate を叩いて id=2 を in_progress に上げる必要があります。あくまで「縛りが解けた」だけで、自動で動き出すわけではない。
ステップ4: タスクの本文に追加情報を書き足す
id=3「最初の5品の写真を撮る」に取りかかったところで、ユーザーが「あ、撮影は自然光だけでやって。フラッシュ禁止」と追加で伝えます。Claude は TaskUpdate を使って、id=3 の details という項目に追記します。details はタスクの本文に書かれている詳細メモのことです。
TaskUpdate(id=3, details="自然光のみで撮影、フラッシュ禁止")
これで id=3 のタスクには「自然光のみ」というメモが乗っかった状態で進みます。状態は in_progress のまま、本文だけが書き換わっています。
ステップ5: 依存関係を組み替える
途中でユーザーが方針変更を伝えます。「やっぱりレシピ原稿は撮影と並行で進めたい、原稿は写真より先に書き始めたい」。Claude は id=4 の dependencies を書き換えて、id=3 への依存を外します。
TaskUpdate(id=4, dependencies=[])
これで id=4 は id=3 の完了を待たずに in_progress に上げられるようになります。逆に「先にやっぱり撮影スタジオを決めてから原稿」に戻したくなったら、依存を id=2 に張り直すこともできます。
ステップ6: 要らなくなったタスクは削除する
議論の結果、id=5「WordPress にアップロードする」をやめて、別のメディアで公開する方針になりました。要らなくなったタスクは TaskUpdate で削除します。
TaskUpdate(id=5, status="deleted")
公式ドキュメントの説明では "or deletes tasks" と書かれていて、削除専用のツールは別に用意されていません。TaskUpdate に「deleted 状態に書き換えてくれ」と頼むのが、そのまま削除操作になります。
つまり TaskUpdate は何をしてくれるのか
- やってくれる: タスクの状態切り替えと、本文 details の追記・書き換え、依存関係の組み替え、タスクの削除。この4種類を1ツールで担当する
- やってくれる: 依存関係の連動。
completedにした瞬間、それに依存していた他のタスクの「待機ロック」が自動で外れる - やってくれない: 新しいタスクの追加。これは TaskCreate の役割で、TaskUpdate は既にあるタスクを書き換えるだけ
- やってくれない: 一度
deletedにしたタスクの復元。公式は deleted を最終状態として扱っていて、戻せない - 意味が薄い場面: タスクが1つしかない短い作業、もしくはタスク管理を使わずに直接コードを書き換えるような単発の依頼
使いどころ3シナリオ(具体題材で再現)
シナリオ1: 個人カフェのメニュー刷新を Claude に任せている途中
「春の新メニュー10品、原価計算からポップ作成までまとめてお願い」と頼んだあと、Claude が10タスクに分けて並走させているとします。3品目を作っている途中で、店主が「あ、いちごの仕入れ価格が変わったから、いちごミルクの原価を再計算して」と追加で伝えます。Claude は TaskUpdate で id=3 の details にいちごの新単価をメモして、状態は in_progress のまま継続。リスト全体は止まりません。
シナリオ2: 家計簿アプリの自作で機能ロードマップを管理している
「家計簿アプリを4機能で組む。1.入力画面、2.集計、3.グラフ、4.エクスポート」と頼んで、TaskCreate で4タスクが切られた直後に、自分の中で「あ、グラフよりエクスポートを先に作りたい」と方針が変わったとします。Claude にチャット欄で「3と4の順番入れ替えて」と伝えると、id=3 と id=4 の dependencies を TaskUpdate で組み替えてくれて、エクスポートが先に in_progress に上がります。
シナリオ3: OSS をコピーしてきた直後のリーディング作業
GitHub から興味のあるプロジェクト一式を自分のパソコンに落として、Claude に「このプロジェクトの構造を読み解いて、6つの主要ファイルを順に説明して」と頼むパターン。6タスクが TaskCreate で作られ、1つ読み終わるたびに Claude が TaskUpdate で completed に動かしていきます。途中で「README.md の理解だけは1度ストップして、私と相談したい」と伝えたら、その id の状態を pending に戻すこともできる。柔軟性が高いのが TaskUpdate の強みです。
初心者が踏みやすい落とし穴
- ユーザーが直接 TaskUpdate を叩こうとしない。TaskUpdate は Claude が裏で発火させる内蔵ツールで、人間がチャット欄から呼び出すものではない。私たちは「2番目のタスク終わったよ」と日本語で伝えればよくて、Claude が読み取って TaskUpdate を発火させる
deletedは元に戻せない。「とりあえず削除しといて」のノリでdeletedに動かすと復元はできない。一時的に外したいだけなら details に「保留中」とメモを書き足すか、pending状態のまま放置するほうが安全- 1つのタスクが
completedになっても、依存先は自動ではin_progressにならない。依存ロックが外れて「進める準備が整った」状態になるだけで、次のタスクに進むには Claude がもう一度 TaskUpdate を叩く必要がある - TaskUpdate は TaskCreate なしには使えない。書き換える対象の id が存在しないとそもそも動かない。手順は必ず「まず TaskCreate で id を生やす → そのあと TaskUpdate で書き換える」
claude -pや Agent SDK で動かすスクリプトでは TaskUpdate が呼ばれないことがある。これらは default で旧式の TodoWrite が走っているため、自分のスクリプトの先頭でCLAUDE_CODE_ENABLE_TASKS=1を設定値として渡してから起動しないと、TaskUpdate と他の Task tools 3つが発火しない。古い自動化スクリプトを使い回すときは要確認- dependencies を変更すると、他のタスクの待機状態が同時に変わる。1つ書き換えただけのつもりが、ロックが解けて複数タスクが進行可能になることがある。慎重に動かしたいときは TaskList で全体を見てから書き換えると安全
- TaskStop と完全に別物。TaskStop は
run_in_backgroundで裏に走らせた長時間処理を止めるためのツールで、タスクリスト上の項目を書き換える TaskUpdate とは別系統。「裏で走ってるプロセスを止めたい」のか「リストの項目を書き換えたい」のかで使い分ける
書き方
TaskUpdate(id, status?, details?, dependencies?)
# 状態切り替え
TaskUpdate(id=2, status="in_progress")
# 本文追記
TaskUpdate(id=3, details="自然光のみで撮影")
# 依存関係の組み替え
TaskUpdate(id=4, dependencies=[])
# 削除
TaskUpdate(id=5, status="deleted")
やってみるとこうなる
入力
ユーザーがチャット欄で
「機材揃え終わったから次のタスクに進めて」
と伝える。
出力例
Claude が裏で発火させる動き:
TaskUpdate(id=1, status="completed")
→ id=1 が完了扱いになる
→ id=2 の依存ロックが自動で解ける
TaskUpdate(id=2, status="in_progress")
→ id=2 が作業中に切り替わる
そのあと TaskList で状態を見ると:
id=1 写真撮影機材を揃える completed
id=2 撮影スタジオのレイアウトを決める in_progress
id=3 最初の5品の写真を撮る pending
id=4 レシピ原稿を書く pending
id=5 WordPress にアップロードする pending
このページに出てきた言葉
- pending
- タスクが「まだ着手していない」状態。日本語で言うと未着手・保留中
- in_progress
- タスクが「いま作業中」の状態。1つだけがこの状態を持つのが原則
- completed
- タスクが「完了した」状態。これに切り替わると依存していた他のタスクのロックが自動で解ける
- deleted
- タスクが「削除済み」の状態。一度この状態にすると復元はできない
- dependencies
- タスク同士の依存関係。Aが終わらないとBは進めない、というつながりを表す
- details
- タスクの本文。具体的に何をやるかのメモが書かれている部分
- TodoWrite
- Claude Code の旧タスク管理ツール。現在は非推奨で、TaskCreate / TaskGet / TaskList / TaskUpdate の4つに役割が分割された
- headless
- 対話画面を出さずに1回だけ命令を渡して結果を受け取るモード。<code>claude -p</code> で起動する形が代表例
- Agent SDK
- 自分のスクリプトの中から Claude Code を呼び出すための開発キット。バッチ処理や自動化に使う
- CLAUDE_CODE_ENABLE_TASKS
- <code>claude -p</code> や Agent SDK 経由で動かす時に Task tools 側を有効化するための設定値。<code>=1</code> を立てると TodoWrite ではなく TaskUpdate などが呼ばれるようになる