課題:並列で 10 体回していると、どれが止まっているかが分からない
Claude Code を 1 体だけ動かしているあいだは、画面を見れば状況が分かります。手が止まっていれば、終わったのか、何かを尋ねて止まっているのかはそのセッションを覗けば読める。区別するための仕組みは要りません。
並列に動かすようになると、ここが変わります。
git worktree で同じプロジェクトのコピーを別の場所に作れば、エージェントは互いのファイルを踏まずに並べられます。1 体ずつ順番に回していた作業を、3 体、5 体、10 体で同時に流せます。
10 体のうち 2 体が止まっているのが見えても、どちらが承認待ちで、どちらが完了したのかは、1 セルずつ開いて確かめるしかありません。開いているあいだ、残りも待たせたままになります。
待てる時間が、二つで違う
Claude Code が手を止める理由は、実質 2 種類しかありません。
- 終了:頼んだことが済んで、結果を見てほしい状態。10 分後に見ても 30 分後に見ても、結果は変わらない。
- 承認待ち:ファイルを消してよいか、このコマンドを実行してよいかを尋ねて、答えるまで止まっている状態。答えるまでそのセッションは何もしていない。1 分遅れれば 1 分ぶん損する。
後者を前者と同じ扱いで放置すると、並列で得たはずの時間がそのまま消えます。並列化してセッションを 10 本抱えるなら、この二つを別の通知として受け取る必要があります。
既存の仕組み:hook は最初から二つに分かれている
ここで分かりやすい話があります。この区別は自分で作る必要がありません。
Claude Code の hooks 一覧に、次の二つがそのまま並んでいます。
Stop— 作業が終わって、手を止めたときNotification— 人に尋ねたいことがあって、止まっているとき
欲しい区別が、別々の名前のイベントとして用意されています。しかも Claude Code だけではありません。MulmoTerminal のコードを読むと、他の AI コーディングツールも同じ 2 分割を出しています。
| ツール | 終了イベント | 承認待ちイベント |
|---|---|---|
| Claude Code | Stop |
Notification |
| Codex | completed |
permission_prompt |
| GitHub Copilot | agentStop |
notification |
| Cursor | stop |
— |
名前は違いますが、「終わった」と「尋ねている」の 2 分類に揃っています。別々の会社が独立に同じ分け方に到達しているのは、それが対象そのものの性質だからです。
必要なのは、受け取った 2 分類を 2 分類のまま人に届ける部分だけです。
MulmoTerminal を使わなくてもできる
ここは正直に書きます。この区別を使うだけなら、特別な道具は不要です。
hook の設定に、Stop のときと Notification のときで別のコマンドを書きます。Mac なら osascript や terminal-notifier で音と通知文を分けられます。スマホに飛ばすのは Claude Code 自身の機能があります。
1 体か 2 体で使っているなら、これで十分です。音が 2 種類に分かれれば、通知の区別は付きます。
数が増えるとこれでは足りなくなります。音は鳴った瞬間しか残らないので、10 体のうちどれが鳴ったのかを聞き逃したら情報が消えます。他のセルに目を落としている最中に Notification が鳴って、戻ったときにはどのセルで鳴ったのかが分からない、という状態が増えます。
MulmoTerminal の解決:聞き逃しても画面に残る
MulmoTerminal は複数の AI セッションを 1 枚のグリッドに並べて見るためのツールです。Node.js が入っていれば npx mulmoterminal@latest で起動します。
1 枚のセルが 1 体の AI で、セルの枠に色が付きます。
| 状態 | セルの色 |
|---|---|
| 動いている | 進行中であることを示す色 |
終了(Stop 系の hook が発火した) |
完了を示す色 |
承認待ち(Notification 系の hook が発火した) |
待機を示す色 |
音も鳴りますが、音は補助です。主役は聞き逃しても消えない色のほうです。グリッドを一瞥すれば、承認待ちで止まっているセルがどれかが分かります。
通知の種類は終了と承認待ちだけではなく、コマンドの成否、セッション終了、裏で動かしていた処理の落ち、PR のテストが赤くなった、などにも拡張されています。それぞれに音を割り当てられます。
ただし最初から鳴るのは終了と承認待ちの 2 つだけです。コードの該当箇所にはこう書かれています — あとから種類を追加したときに、頼んでいない人のところで急に鳴り出さないように、「鳴る種類の一覧」は「存在する種類の一覧」とは別に持つ。
通知の設計で一番やってはいけないのは、勝手に増えることです。増えた音は無視され始め、最終的に全部切られます。
区別が要るのは数が増えたときだけ
話を整理します。
- 1 体で使っているあいだは、
StopとNotificationの区別は要らない。画面を見れば分かる。 - 並列で回すようになると、止まっているセルを探す時間が生まれる。並列で得た時間がそこで戻る。
- 区別するための情報は、Claude Code・Codex・Copilot・Cursor がいずれも 2 種類の hook として出している。
- やることは作ることではなく、受け取った 2 種類を 2 種類のまま見せる部分だけ。
MulmoTerminal はそれをセルの色で行っています。音が重なっても、画面を見ていなくても、戻ったときにはどのセルがどの理由で止まっているかが残っています。
使ってみる
MulmoTerminal を起動し、空いているセルで Claude Code を起動します。
npx mulmoterminal@latestで立ち上げる- 空きセルから Claude Code のセッションを 2〜3 本起動する
- 片方のセッションで、承認が必要なコマンド(
rmやネットワーク越しの操作など)を頼む - そのセルの色が「承認待ち」の色に変わる。隣のセルで
Stop待ちになっているものと色が別になる
承認モードや hook の挙動は MulmoTerminal 公式ガイド に載っています。
まとめ
- 並列で回した AI セッションは、「終了」と「承認待ち」で待てる時間がまったく違う
- Claude Code・Codex・Copilot・Cursor はいずれも、この 2 種類を別の hook として出している
- 1 体か 2 体なら、hook に音を 2 種類割り当てるだけで足りる
- 数が増えると音は聞き逃す。MulmoTerminal はセルの色で保持するので、戻ったときに情報が残っている
- 鳴る種類の一覧と存在する種類の一覧を分けておくのは、通知が勝手に増えないための配慮
関連: MulmoTerminal の git worktree 隔離 / MulmoTerminal の orderPriority / MulmoTerminal 公式ガイド

