はじめに
Claude Code(Anthropic公式CLI)には「エージェント」機能があり、~/.claude/agents/*.md にルールを書くだけで専門エージェントを定義できます。
「これで組織を作れるのでは?」と思い、VS Code拡張「Claude Session Manager(CSM)」を開発しながら、取締役を頂点とした部署制のマルチエージェント体制を構築しました。
ようやくうまく機能してきたと思ったのですが、4/9のアップデートで仕様が変わったと見え、取締役が暴走して全部自分でやり始めるという、リアル組織でもありがちな問題が発生しました。また、今まで役割に紐づけたセッションに対して投げていて一貫性が保ててたのに、やたらセッションが増えてしまい、仕事の内容も前の記憶が無いことからわけのわからないものが出来上がってきたりしてだいぶ泣けました。
問題1: 取締役が全部自分でやる
最初の問題は取締役が子エージェントに仕事を振らないこと。
ユーザーが「CSMのバグを直して」と言うと、取締役は自分でコードを読み始めて、自分で修正しようとします。CSM開発部に投げてくれない。
原因: 取締役のルールに「委任しろ」とは書いてあったが、具体的な委任方法が書いていなかった。「子エージェントに作業を委任する」という抽象的な指示だけでは、AIは自分でやった方が速いと判断してしまう。
問題2: dispatch が壊れていた
子エージェントに指示を送る /dispatch スキルを作ったが、これが根本的に壊れていた。
# 旧dispatch: 毎回新規セッションを作る
claude --agent csm-dev -p "バグを直して" > output.txt
問題点:
-
--agentは毎回新しいセッションを作る。前回の会話が引き継がれない - 子エージェントに「前回の続き」という文脈がない
- 出力が0バイトで失敗しても気づかない(取締役のセッション summary では分からない)
問題3: Agent ツールは履歴が残らない
Claude Code内蔵の Agent ツール(subagent_type)を使えば親子間でやりとりできますが、子エージェントのセッション履歴が残らない。
Agent ツール: 親 ←→ 子(対話可能だが子の履歴は親セッションに埋没)
--agent: 親 → 子(新規セッション。一方通行)
--resume -p: 親 → 子(既存セッション継続。一方通行だが履歴蓄積)
やりたいのは「子の履歴を残しつつ、親子間で反復的にやりとりする」こと。
解決: --resume -p ループ
最終的にたどり着いた方法:
1回目: claude --resume <子のsessionId> -p "これを実装して" > result.txt
→ result.txt を読む
2回目: claude --resume <子のsessionId> -p "ビルドエラーを直して" > result2.txt
→ 子のセッションに会話が蓄積される
--resume で既存セッションに接続するので、子エージェント側から見ると普通に会話が続いている。新しいセッションは作られない。
これを /ask-agent スキルとして実装しました。
/ask-agent の設計
スタンドアロンスクリプト化
最初はスキル定義(markdown)の中にPythonコードを埋め込んでいましたが、シェルのクォートエスケープ問題で壊れました。
# これが壊れる(markdownの中のbashの中のpython)
```bash
python -c "
m = re.match(r'^model:\s*[\"'\'']*([^\"'\'']+)', line)
"
解決策: スタンドアロンPythonスクリプトに切り出す。
# c:/xampp/.claude/scripts/ask-agent.py
# エージェント名からsessionId・model・effort・permissionModeを一発取得
python ask-agent.py csm-impl
# 出力: 85f20b35-...|opus|high|acceptEdits
スキル定義はこのスクリプトを呼ぶだけ:
### Step 1: エージェント設定の取得
python c:/xampp/.claude/scripts/ask-agent.py {agent-name}
permission-mode の重要性
-p モードで子エージェントを呼ぶとき、--permission-mode の選択が決定的に重要:
| モード | -pとの相性 | 動作 |
|---|---|---|
acceptEdits |
✅ | 編集系を自動許可(推奨) |
auto |
✅ | ほぼ全自動 |
plan |
❌ | 計画だけ出力して実行されない |
default |
❌ | 確認待ちで止まる |
plan モードで -p すると、子エージェントは「計画はこうです。実行していいですか?」と聞くが、-p モードでは誰も応答できない。結果、計画だけ出力して終了。
子エージェントのルールには「-pモードでは自己判断で進め、不明点は出力に書け」と明記することが必須。
モデル名の罠
Claude Code CLIは短縮名(opus, sonnet)を受け付けますが、sonnet-1m は受け付けません。
claude --model sonnet # ✅ OK
claude --model sonnet-1m # ❌ "There's an issue with the selected model"
claude --model claude-sonnet-4-6[1m] # ✅ 正式モデルID
さらに、セッションのJSONLには日付付きモデルID(claude-haiku-4-5-20251001)が記録されるため、完全一致で比較すると不一致になります。
// ❌ 完全一致 — 日付付きIDにヒットしない
const reverseMap = { 'claude-haiku-4-5': 'haiku' };
model = reverseMap[actualModel]; // undefined
// ✅ 部分一致
function resolveModel(raw) {
if (raw.includes('opus')) return 'opus';
if (raw.includes('sonnet')) return 'sonnet';
if (raw.includes('haiku')) return 'haiku';
}
QA レビューの回し方
品質管理部(qa)エージェントにコードレビューを依頼したら、17件の指摘が返ってきました。
CRITICAL: 0件(前回対策済み)
HIGH: 6件(N+1クエリ、コード重複)
MEDIUM: 6件(動作バグ1件含む)
LOW: 5件
特に重要だったのは:
- M-2: onDidReceiveMessage多重登録バグ — Webviewパネルを使い回すたびにハンドラーが蓄積し、メモ保存が複数回実行される
- H-6: N+1パターン — 100件のセッション表示で最大300回のファイル読み込みが発生 → 3回に削減
QAエージェントが指摘 → CSM開発部が修正 → QAエージェントが検証、という流れが実際に機能しました。
CSM(Claude Session Manager)の役割
これらの問題を管理するために開発したのがCSMです:
- 会話一覧: セッションJSONLを軽量パース(先頭32KB + 末尾32KB)
- エージェント管理: 組織ツリー表示、モデル不一致検知(⚠️バッジ)
- セッション紐づけ: エージェントとセッションの関連付け、モデル不一致時の自動修正提案
-
/ask-agent hookインストール:
claude -pの安全ガードをワンクリック設定
学んだこと
- AIに「委任しろ」と言うだけでは委任しない。 具体的な手順(スキル・スクリプト)を用意する必要がある
-
セッション継続が命。
--agent(新規)と--resume(継続)の違いを理解しないと文脈が消える -
-pモードは制約が多い。 permission-mode、Extended Thinking、AskUserQuestion すべて制限される - モデル名は正規化が必要。 短縮名・正式ID・日付付きIDの3パターンを吸収する設計にする
- スキル定義にコードを埋め込まない。 スタンドアロンスクリプトに切り出す
おわりに
マルチエージェント運用は「組織設計」そのもの。ルール・権限・通信手段を整備しないと、一番能力の高いエージェント(取締役)が全部自分でやろうとします。
Claude Session Manager は Microsoft Marketplace で公開しています:
https://marketplace.visualstudio.com/items?itemName=ratorin.claude-session-manager
ソースコード内の /ask-agent スキルや ask-agent.py スクリプトも参考にしてください。