2つ目のClaude Codeエージェントを立ち上げた。ここから問題が始まる。
1つ目のエージェントはリファクタリングの途中。2つ目は同じファイルの一部に触る機能を実装する必要がある。お互いの存在を知らない。あなたはルーター、ステートストア、コンフリクト解決者のすべてを兼任していて、使えるツールはターミナルウィンドウ間でコンテキストをコピペすることだけだ。
ほとんどの開発者がClaude Codeで壁にぶつかるのはここだ。エージェントのコーディング能力が低いからではない。何に取り組むべきかを伝えるシステムがないからだ。
コピペ問題
Claude Codeのワークフローは大抵同じように始まる。頭の中に(あるいはJiraやGitHub issueに)タスクがあって、その説明をエージェントのプロンプトに貼り付ける。「認証フローを作って」「ページネーションのバグを直して」「ダークモード対応を追加して」
エージェント1つなら、これでうまくいく。エージェントはフルコンテキストを持っていて、出力を監視でき、画面を見ているから完了もわかる。
2つ目のエージェントを追加した瞬間にひびが入る。
エージェントAがAPIレイヤーをリファクタリングしている。エージェントBが新しいエンドポイントを構築している。どちらもserver/routes.tsを触っている。互いの変更を知らない。一方がpushして他方の作業が壊れた時にコンフリクトを発見する。あるいはもっと悪いケースでは、両方ローカルでは成功するが、マージ結果がどちらのdiffにも現れない形で壊れる。
根本原因はエージェントが雑だからではない。共有ステートが存在しないからだ。「エージェントAがAPIリファクタリングを担当している」と記録された場所がない。「routesファイルが修正中だから順番を待て」というステータスがない。エージェントたちは全体像を一切把握せず、個別のプロンプトで動いている。
3つ目のエージェントを追加すると、コーディングよりコーディネーションに時間を使うようになる。
エージェントがタスクシステムに本当に必要なもの
ツールを探す前に問う価値がある。Claude Codeエージェントが良い仕事をするために実際に必要なものは何か。
驚くほど少ない。
一意の識別子。 コミットやコメントで参照できるもの。「バグを直した」はマルチエージェントのログでは役に立たない。「PROJ-47完了:フィルタービューでページネーションが誤ったカウントを返す」は追跡可能だ。
明確なスコープ。 タイトル、説明、受け入れ基準。小説ではなく、ペルソナ付きのユーザーストーリーでもなく、「完了」がどう見えるかの具体的な記述。「/usersエンドポイントはページネーションされた結果を返す。ページサイズのデフォルトは25。next_cursorフィールドは最終ページでnull。」
更新可能なステータス。 エージェントは自分がどこにいるかを示す必要がある:クレーム済み、作業中、完了。これがないと、ターミナルウィンドウを覗いて推測する作業に戻る。
依存関係の認識。「PROJ-46がマージされるまでこれを始めるな」は最も一般的なマルチエージェント障害を防ぐ:まだ存在しないコードの上に構築すること。
このリストに何がないか注目してほしい。スプリント計画。ベロシティ追跡。カンバンボード。ストーリーポイント。カラーコードされたラベル付きエピック。エージェントにプロジェクト管理の見せかけは不要だ。必要なのはタスク、ステータス、「完了」と言う方法だけだ。
CLAUDE.mdの契約
タスクシステムはエージェントに何をやるか伝える。CLAUDE.mdファイルはどうやってやるか伝える。
複数のClaude Codeエージェントを運用しているなら、各エージェントにアイデンティティと境界を定義するCLAUDE.mdがあるべきだ。これはオプションの設定ではない。協調するエージェントと互いの足を踏むエージェントの違いそのものだ。
エンジニアリングエージェント向けの簡略化した例:
## Identity
Engineer for the project. You implement features, fix bugs,
and write tests. You own implementation quality.
## What You Own
- All files under `components/` and `lib/`
- Unit tests in `__tests__/`
- You may read but not modify files under `server/`
## What You Don't Own
- Deployment configuration (that's ops)
- Issue triage and prioritization (that's the coordinator)
- QA validation (QA tests your work independently)
## Completion Protocol
Before marking any task done:
1. Run the full test suite: `pnpm test`
2. Verify your change works manually
3. Comment what you did with the commit hash
4. Push before reporting completion
境界セクションが荷重を支える部分だ。明示的なファイルオーナーシップがなければ、エージェントは迷走する。エンジニアリングエージェントが「親切に」デプロイ設定をリファクタリングする。QAエージェントがテスト対象のコードをテストの代わりに変更して「修正」する。明示的な境界がこれらの障害モードを防ぐ。
完了プロトコルも同じくらい重要だ。最も一般的なエージェントの障害を防ぐ:単にコンパイルが通っただけで完了を主張すること。「フルテストスイートを実行」と「手動で検証」は具体的なゲートだ。このプロトコルに従うエージェントは人間が信頼できる成果物を生む。これなしのエージェントは一行一行確認が必要な成果物を生む。
これを複数エージェントにスケールすると、各メンバーが自分のレーン、引き継ぎプロトコル、「完了」の意味を知るフリートが得られる。
CLI-firstのタスク管理
ワークフローに関する気づきで、自分が思った以上に時間がかかったものがある。Claude CodeエージェントはGUIインターフェースよりCLIツールのほうが劇的にうまく機能する。
考えてみれば当然だ。Claude Codeエージェントはターミナルに住んでいる。コマンドを実行し、出力を読み、結果に基づいてアクションを取れる。Web UIをナビゲートし、ボタンをクリックし、レンダリングされたページを解釈するよう求めるのは、エージェントの自然なインターフェースに逆らうことだ。
CLIベースのタスクシステムなら、エージェントは一連の流れでこれを実行できる:
# Read the task
task show PROJ-47
# Claim it
task update PROJ-47 --status in_progress --assignee agent-1
# Do the work...
# Report completion
task comment PROJ-47 "DONE: Fixed pagination. Commit: abc1234"
task update PROJ-47 --status done
コンテキストスイッチなし。ブラウザウィンドウなし。カンバンボードのスクリーンショットなし。エージェントはタスクを読み、作業し、ステータスを更新する。すべて操作環境を離れずに。
出力はマシンリーダブルでもある。エージェント全体で何が起きているか確認する必要がある時、クエリできる:
task list --status in_progress # What's being worked on?
task list --assignee agent-2 # What is agent-2 doing?
task list --blocked # What's stuck?
これが機能するツーリングの形だ。エージェントの言語を話すCLI。
