Claude Code /forkで会話を分岐する—/subtaskと背景セッション

Claude Code /forkで会話を分岐する—/subtaskと背景セッション | mohablog

Claude Codeの/forkは、v2.1.212で動きが入れ替わりました。以前は会話をセッション内のサブエージェントに枝分かれさせるコマンド。今は会話を丸ごと新しい背景セッションへコピーし、元の会話はそのまま続けられます。

目次

v2.1.212で/forkの中身が入れ替わった

/forkの挙動は、Claude Codeのバージョンで3段階に分かれます。手元がどれに当たるかはclaude --versionで分かります。

claude --version
2.1.212 (Claude Code)

このバージョンなら、以下のうち一番上の動作です。

  • v2.1.212以降: 会話をコピーして新しい背景セッションを開始する(現在の動作)
  • v2.1.161〜v2.1.211: 会話を枝分かれさせたサブエージェントを起動する(いまの/subtask)
  • v2.1.161より前: /branchのエイリアス

旧/forkの動作は/subtaskに移った

ここが混乱の元。Week 29で/forkが背景セッション方式になったのと同時に、それまでの「セッション内で枝分かれするサブエージェント」は/subtaskという別コマンドへ切り出されました。名前だけ見て古い記事のとおりに叩くと、期待と違う動きになります。

agent viewを切ると旧挙動が残る

例外がひとつ。エージェントビュー(claude agents)を無効にしている環境では、/forkは従来のフォークされたサブエージェント動作を保ちます。背景セッションはエージェントビューが受け皿になるので、そこがオフだと行き先が無い、という理屈です。

もうひとつ紛らわしいのが、スキル側のcontext: forkとの名前被り。あちらはスキル実行時にコンテキストを隔離する設定で、会話を別セッションへ複製する/forkコマンドとは無関係です。混同しやすいので、区別はClaude Code Skillのcontext: forkでコンテキストを隔離する方法で押さえておくと安全です。

/forkで会話をまるごと別セッションに複製する

公式ドキュメントのagent view、”From inside a session” の節は、/forkを「現在の会話を新しい背景セッションにコピーし、そこで作業を続ける」コマンドと定義しています。コピーは今までの会話すべてを引き継ぎ、開始した瞬間から2つのセッションは互いに独立します。片方で/clearしてももう片方は無傷。git のブランチに近い感覚で、会話そのものを枝分かれさせるわけです。

gitのブランチと違うのは、分けるのがコードではなく会話の文脈だという点。ここまでの調査ログ、決めた前提、捨てた試行が丸ごとコピーされます。片方で方針Aを詰め、コピー先で方針Bを詰めても、両方とも同じ下調べを共有した地点から始まる。状況をゼロから説明し直す手間が消えます。2案を並行で走らせて、先に筋が通った方を採る。この探索の速さが/forkの効きどころです。

構文はfork [prompt]だけ

引数は任意のプロンプト1つ。

/fork Redisキャッシュ層を足す方針で実装を進める

プロンプトを付けると、コピー先はその指示を受け取った状態で即座に走り出します。元の会話は手元に残ったまま、指示を受けたコピーだけが背景で動く。方針を1つ決めて「これで先に進めておいて」と投げる使い方に向きます。

claude agentsに独立した行が増える

コピー先は背景セッションとして走ります。走行状況はエージェントビューで一覧できます。

claude agents
# 表示例
STATE     HEADLINE                          ELAPSED
running   Redisキャッシュ層を実装            2m14s
idle      認証リファクタリング(元の会話)      -

各行の先頭には状態を表す色付きの語、その隣に分類器が付けた見出しが並びます。長く走っているタスクには経過時間のカウンタが出るので、止まっているのか動いているのかが一目で分かる。/forkした瞬間、この一覧にrunningの行が1本増えます。

プロンプトの有無で動き出しが変わる

/forkだけを引数なしで送ると、コピー先はすぐには動きません。エージェントビュー上で最初のプロンプトを待って待機します。まず会話を複製しておき、あとで別の切り口を試す、という段取りに使えます。動かすタイミングを自分で握りたいときは引数なし、預けて即実行させたいときは引数あり。使い分けはこの有無だけです。

典型的な流れを1つ。本流で調査と設計を固め、方針が2案に割れた地点で/fork。コピー先に片方の方針をプロンプトで渡して背景で実装させ、本流ではもう片方を自分で進めます。claude agentsで双方の進捗を見比べ、先に形になった方を採用してもう一方の行を畳む。会話をコピーする方式になったことで、下調べを二重にやり直さずにこの比較が回せる。ここが旧来のセッション内フォークとの実感的な差です。

/subtaskは結果が手元の会話に戻る

会話を分けるもう一本の道が/subtask。旧/forkのセッション内動作がこの名前に移りました。sub-agentsドキュメントの “Fork the current conversation” の節が対応します。

サイドタスクを預けて本流を止めない

/subtaskで切り出したフォークは、プロンプトの下にパネルとして現れ、背景で走ります。こちらは手を動かし続けられる。そしてサブタスクが終わると、その結果が1通のメッセージとして元の会話に届きます

/subtask このエラーログの原因を切り分けて要約して

本流のリファクタリングを止めずに、脇でログ解析だけ走らせる。終わったら要約が手元に返ってきて、そのまま本流の判断材料になります。

forkとの分かれ目は結果の戻り先

違いは結果の戻り先だけです。/subtaskは元の会話へ戻り、/forkは戻らず、独立したセッションとして別々に育つ。「答えを持ち帰ってほしい」なら/subtask、「別方針を丸ごと並行で進めたい」なら/fork。この向き先で選べば、まず外しません。

背景で走るサブエージェントが危ない操作に差しかかったときは、裏で勝手に拒否されるのではなく、権限の確認が本流のセッションに上がってきます。調査を/subtaskに預けても、実行してよいかの判断は手元に残る。サブエージェント側の権限やツール継承を詰めたい場合はClaude Codeカスタムサブエージェントの作り方が参考になります。

fork / subtask / branch / background の使い分け

会話やセッションを分ける系のコマンドは、この4つで役割が分かれています。

コマンド何をする元の会話結果の行方
/fork会話をコピーして新しい背景セッションを開始そのまま継続戻らない(独立)
/subtaskサブエージェントにサイドタスクを委譲そのまま継続元の会話に戻る
/branch同じセッション内で別の分岐に切り替える切り替わる
/background(/bg)セッションごと背景へ移しターミナルを解放手元から離れる

迷ったら「結果が戻ってくるか」「元の会話を手元で続けるか」の2軸で切ると早い。/branchだけ毛色が違います。こちらは同じ会話の中で分岐を行き来するだけで、新しいセッションは増えません。両方を同時に走らせたいなら/fork片方ずつ切り替えて見たいなら/branch/backgroundはプロンプトを添えると、切り離す前にもう1つ指示を送ってから裏へ回せます。

分岐した背景セッションを見失わない

背景に回したセッションは、放っておくと「さっき/forkしたやつ、どれだっけ」になります。追いかける道は、走行中を一覧するclaude agentsと、名前を付けての/resume復帰。

claude agentsで走行中を一覧する

claude agentsが集めるのは、いま動いているセッション、入力待ちで止まっているセッション、終わったセッションの一覧。/fork/backgroundで背景に送ったものは、すべてここに行として並びます。どれがブロックされて手が要るのかは、状態の語を見れば拾えます。

/renameで名前を付けてclaude –resumeで戻る

背景セッションは/renameで名前を付けておくと、あとで名前指定で復帰できます。

claude --resume redis-cache-trial

/resumeの一覧画面は、fork したセッションをグループにまとめて表示し、キーボードショートカットで選べるようになっています。無名のまま増やすと後で照合に困るので、/forkしたら名前を付ける、を癖にしておくと管理が楽です。

復帰の入口はもう1つあります。/resumeの画面にPRのURLを貼ると、そのPRを作ったセッションを探し当ててくれる。どの会話でこの変更を出したか思い出せないときの逃げ道です。完了そのものを取りこぼしたくないなら、通知フックと組み合わせる手も。仕組みはClaude Codeの通知フックで完了を検知するにまとめています。

暴走ループを止めるセッション上限

背景セッションやサブエージェントは、条件次第で際限なく増えます。歯止めがこの上限。v2.1.212では1セッションあたりのサブエージェント生成が既定で200、WebSearchの呼び出しも既定で200を上限に、暴走したループを頭打ちにします。値は環境変数で調整できます。

export CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION=100
echo $CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION
100

使い切っても打ち止めではありません。/clearを打つと予算はリセットされ、また生成できるようになります。長い自動化を回すセッションほど、この上限の存在を頭に入れておくと安全です。

背景に回るのはセッションだけではありません。2分を超えて走るMCPツール呼び出しは、セッションを塞がないよう自動で背景へ移ります。閾値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで変えられるほか、無効化もできる。重いMCP連携を挟む構成なら、ここも合わせて見ておくと、ハングと背景実行の切り分けがつきます。

どの分岐コマンドを選ぶか

選択は場面で決まります。今の方針を残したまま別アプローチも並行で試したいなら/fork。調べ物やログ解析を脇に預けて本流を止めたくないなら/subtask。このターミナル自体を空けて長時間タスクを裏に回すなら/background

Redisのキャッシュ設計で、TTLで失効させる案とイベントで失効させる案のどちらに寄せるか決めきれなかったとき、/forkで会話を2本に割って両方を別セッションで実装させたことがあります。元の会話は比較メモ用に手元へ残し、コピー2本が背景で走る。claude agentsを開けば3行が並び、どちらの実装が先に形になったかで判断できました。/subtaskだと結果が本流に混ざって比較しづらいので、独立して走る/forkが合う場面です。

ただ、何でも/forkに流すと背景セッションが溜まり、claude agentsのどれが本流か分からなくなります。名前を付ける、終わった行は畳む、要らない探索は/subtaskで本流に回収する。この3点を守れば、分岐が散らかりません。

まとめ

  • /forkはv2.1.212で会話を丸ごと背景セッションへコピーする方式になり、旧来のセッション内フォークは/subtaskに分離された
  • /forkは結果が戻らず独立、/subtaskは結果が元の会話に戻る。この向き先で選ぶ
  • /branchはセッション内の切り替え、/backgroundはセッションごと背景化。4つは役割が別
  • 背景に回したセッションはclaude agentsで一覧し、/renameで名前を付けてclaude --resumeで戻す
  • サブエージェント生成とWebSearchは既定200が上限。CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSIONで調整し、/clearでリセットできる
  • 2分を超えるMCPツール呼び出しは自動で背景化される。閾値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで変えられる
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次