← 試験の目次へ

Architect Foundations ドメイン1: エージェント型アーキテクチャとオーケストレーション(27%)

この章で学ぶこと: エージェントループの制御、コーディネーターとサブエージェントの分担、サブエージェントへの情報の渡し方、フックによる強制、タスクの分け方、セッションの再開とフォーク。

いちばん配点の大きいドメインです。本番の60問のうち約16問が出ます。

タスクステートメント この章の節
1.1 エージェントループを設計・実装する 第1節
1.2 コーディネーター・サブエージェント型の編成 第2節
1.3 サブエージェントの呼び出し・コンテキストの受け渡し・生成 第3節
1.4 強制と引き継ぎのパターンを使う多段階ワークフロー 第4節
1.5 Agent SDK のフックで横取りと正規化 第5節
1.6 タスク分解の戦略 第6節
1.7 セッションの状態・再開・フォーク 第7節

Developer Foundations で学んだ基本(ここでは繰り返しません):

この章では、その上の「設計の判断」に言葉を使います。

名前の注意: 試験ガイドはサブエージェントを起動するツールを「Task ツール」と呼びます。今の公式ドキュメントでは名前が Agent に変わりました(Claude Code v2.1.63 から。system:init のツール一覧では今も "Task" と表示されます)。試験では「Task ツール = Agent ツール」として読みます。allowedTools に入れる名前は、今は "Agent" です。


1. エージェントループ(1.1)

1.1 ループの判断は stop_reason だけで行う

stop_reason 意味 ループの動き
"tool_use" Claude がツールを呼びたい ツールを実行し、tool_result を履歴に足して、もう一度送る
"end_turn" Claude が自分で終えた ループを終える
"max_tokens" など 上限などで止まった エラーではない。続きを頼む、上限を上げるなど(Developer D4)

ツールの結果は会話の履歴に足します。だから Claude は、新しい情報を使って次の手を考えられます。

1.2 モデル主導と決定木の違い

モデル主導(エージェント) 事前に決めた決定木・ツール順序
次に何をするか Claude が文脈から考える コードが決める
向く場面 手順が前もって読めない仕事 手順が決まっている仕事、必ず守る順番があるところ
試験での使い方 ふだんはモデル主導 「必ずこの順番」(例: 本人確認の後に返金)だけ、第4節のゲートで強制する

両方を組み合わせるのがふつうです。全体はモデルに任せ、外してはいけない順番だけをコードで止めます。

1.3 アンチパターン(試験によく出る)

アンチパターン なぜだめか 正しい方法
応答の文に「完了しました」とあれば終える 自然言語は形が決まっていない。途中でも書くことがある stop_reason を見る
反復の上限(例: 10回)を主な停止手段にする 仕事の途中で切れる。上限は安全装置 上限は暴走防止として残し、主な判断は stop_reason
応答にテキストがあれば完了とみなす Claude はツールを呼ぶ前にも説明を書く stop_reason が "tool_use" なら続ける

max_turns や max_budget_usd は「安全装置」です(Developer D1 第2.3節)。設定するのは正しいですが、「これで終わりを決める」は誤りです。


2. コーディネーター・サブエージェント型(1.2)

2.1 ハブ・アンド・スポーク

           ┌─ Web検索サブエージェント
コーディネーター ─┼─ 文書分析サブエージェント
(ハブ)       ├─ 統合サブエージェント
           └─ レポート作成サブエージェント

2.2 コーディネーターの仕事

仕事 内容
タスク分解 大きな問いをサブタスクに分ける
委任 どのサブエージェントに何を頼むか決める
動的な選択 問いの複雑さで呼ぶ相手を変える。簡単な問いに毎回フルパイプラインを通さない
範囲の割り当て サブトピックや情報源の種類ごとに分け、重複を減らす
集約と評価 結果をまとめ、抜けがあれば絞った問いで再委任する

2.3 分解が狭すぎるリスク

コーディネーターの分解が狭いと、サブエージェントが全員正しく動いても、報告全体に穴が開きます。

例: 「AI が創造的な産業に与える影響」を、デジタルアート・グラフィックデザイン・写真の3つだけに分けた。音楽・文章・映画が抜ける。

見分け方: 各サブエージェントは「頼まれたこと」は正しくこなしている。問題は「何を頼んだか」。原因はコーディネーターの分解です。下流のエージェントを直しても治りません。

2.4 反復改善ループ

  1. コーディネーターがサブタスクを配る
  2. 結果を統合する
  3. コーディネーターが抜けを評価する(どの観点が足りないか)
  4. 抜けの部分だけ、絞った問いで検索・分析サブエージェントに再委任する
  5. 十分に網羅できるまで 2〜4 をくり返す

Anthropic の調査システムでも、リードエージェントが結果を見て「もっと調べるか」を判断し、必要ならサブエージェントを追加しています(Multi-agent research system)。


3. サブエージェントの呼び出しと情報の渡し方(1.3)

3.1 呼び出しのしくみ

項目 試験ガイドの書き方 今の公式ドキュメント
サブエージェントを起動するツール Task ツール Agent ツール(旧名 Task)
コーディネーターに必要な設定 allowedTools に "Task" allowedTools に "Agent"。検出のコードでは両方の名前を確かめるよう勧めている
サブエージェントの定義 AgentDefinition(説明、システムプロンプト、ツール制限) 同じ。description、prompt、tools など

AgentDefinition の tools で、種類ごとに使えるツールを絞ります(第2章 2.3 の「ツールの配分」とつながる)。

3.2 コンテキストは明示的に渡す

サブエージェントは、親の会話履歴もツールの結果も受け取りません。呼び出し間でメモリも共有しません。受け取るのは、自分のシステムプロンプトと、呼び出しのプロンプトです(フォークは例外。下の 3.5)。

だから:

3.3 構造化して出典を保つ

エージェント間で結果を渡すときは、本文とメタデータを分けた構造にします。

{
  "claims": [
    {
      "claim": "2025年の市場規模は約120億ドル",
      "source_url": "https://example.com/report",
      "document_name": "業界レポート2025",
      "page": 14,
      "excerpt": "...市場規模は約120億ドルに達した...",
      "published_date": "2025-03-01"
    }
  ]
}

散文の要約だけで渡すと、どの主張がどの出典から来たかが消えます(第5章 5.6 の出典管理)。

3.4 並列に生成する

複数のサブエージェントを同時に動かしたいときは、コーディネーターの1回の応答の中に、複数の Task(Agent)ツール呼び出しを並べます。1つずつ別のターンで呼ぶと、順番に待つことになり遅くなります。

やり方 結果
1回の応答に3つの Agent 呼び出し 3つが並列に動く
3ターンに分けて1つずつ呼ぶ 前が終わるまで次が始まらない

Anthropic の調査システムでは、リードエージェントが3〜5個のサブエージェントを並列に起動し、複雑な問いの調査時間を最大90%縮めたと報告しています(Multi-agent research system)。

3.5 コーディネーターのプロンプトの書き方

3.6 フォーク型のセッション

共通の分析を終えた時点から、別々の方針を試したいときはフォークします(第7節)。フォークしたサブエージェントは、親の会話をコピーして始まります。


4. 強制と引き継ぎ(1.4)

4.1 プロンプトの誘導 と プログラムの強制

プロンプトによる誘導 プログラムによる強制(フック、前提条件ゲート)
守られる確率 高いが100%ではない 決定的(コードが止める)
向く場面 好み、書き方、ふつうの手順 お金、本人確認、法令、取り消せない操作
例 「まず顧客を確認してください」とシステムプロンプトに書く get_customer が確認済み ID を返すまで process_refund を拒否する

試験の目印: 「本番で 12% のケースで確認を飛ばした」「誤った返金が起きた」のように、失敗に金銭的な影響があるなら、答えはプログラムによる強制です。few-shot 例やプロンプトの強調は「確率的」なので不十分です。

4.2 前提条件ゲートの例(考え方)

verified_customer_id = None  # セッションの状態

async def gate_refund(input_data, tool_use_id, context):
    # PreToolUse フック: 確認済みの顧客がいなければ、注文・返金のツールを止める
    name = input_data["tool_name"]
    if name.endswith(("lookup_order", "process_refund")) and verified_customer_id is None:
        return {"hookSpecificOutput": {
            "hookEventName": "PreToolUse",
            "permissionDecision": "deny",
            "permissionDecisionReason": "先に get_customer で顧客を確認してください",
        }}
    return {}

拒否の理由は Claude に届くので、Claude は次に get_customer を呼べます。MCP ツールの名前は Agent SDK では mcp__<サーバー名>__<ツール名> の形になるため、例では末尾で判定しています。

4.3 複数の問題を含む依頼

顧客が1通のメッセージで「返品したい」「請求が二重」「住所を変えたい」と言ったとき:

  1. 個別の項目に分ける
  2. 共有のコンテキスト(顧客 ID、注文一覧)を使って、それぞれを並列に調べる
  3. 1つの回答にまとめて返す

4.4 人への引き継ぎ(エスカレーション)の要約

人の担当者は、エージェントの会話記録を見られないことが多いです。だから、引き継ぎには構造化した要約を付けます。

項目 例
顧客 ID C-10293(確認済み)
問題の要約 同じ注文で二重に請求された
根本原因の分析 決済の再試行で2回目の請求が成立した
金額 返金予定 12,800円
すでにしたこと 注文と請求履歴を確認。返金は上限を超えるため止めた
推奨アクション 2回目の請求の取り消しを承認する

「会話の全文を渡す」は答えになりにくいです。担当者が読む時間がかかり、要点が埋もれます。


5. Agent SDK のフック(1.5)

フックの書き方は Developer D1 第2.5節 で学びました。ここでは試験の2つの使い方をおぼえます。

5.1 PostToolUse: 結果をそろえてからモデルに渡す

MCP ツールごとに、データの形がばらばらなことがあります。

ツール 日付 ステータス
lookup_order Unix タイムスタンプ 1767225600 数字 3
get_shipping ISO 8601 2026-01-01T00:00:00Z 文字 "delivered"

PostToolUse フックで、モデルが読む前に1つの形(例: ISO 8601 と文字のステータス)にそろえます。今の Agent SDK では、PostToolUse の戻り値 updatedToolOutput で結果を差し替えられます(additionalContext で情報を足すこともできる)。

利点: プロンプトで「Unix 時刻は変換して読んで」と頼むより確実で、トークンも少なくてすみます。

5.2 PreToolUse: ルール違反の操作を止めて別の流れへ

例: 500ドルを超える返金は人の承認が必要。

5.3 フックか、プロンプトか

要件 選ぶもの
必ず守る業務ルール(上限額、本人確認、禁止操作) フック
データの形をそろえる PostToolUse フック
口調、説明のしかた、判断の目安 プロンプト

公式の Claude Code のドキュメントも、「必ず決まったときに動かすこと」は CLAUDE.md ではなくフックに書くよう勧めています(Memory)。


6. タスク分解の戦略(1.6)

6.1 固定のチェーン と 動的な分解

プロンプトチェーン(固定の逐次パイプライン) 動的な分解
形 段階が前もって決まっている 途中の発見から次のサブタスクを作る
向く仕事 予測できる多面的な仕事(例: コードレビュー、決まった項目の抽出) 答えの決まっていない調査(例: 「なぜ遅いのか調べて」)
利点 各段階が簡単で、検証しやすい 新しい発見に合わせて計画を変えられる

6.2 大きなコードレビューを分ける

多くのファイルを1回で見ると、注意が分散します。詳しく見るファイルと浅いファイルが出て、同じ書き方を片方では指摘し、もう片方では見逃します。

  1. ファイルごとのパス: 各ファイルのローカルな問題を見る
  2. 統合パス: ファイルをまたぐデータの流れ、呼び出しの整合性を見る

これは第4章 4.6 の「複数パスのレビュー」と同じ考えです。

6.3 答えの決まっていない仕事の分け方

例: 「レガシーコードに十分なテストを追加して」

  1. まず構造を把握する(モジュール、入口、依存関係)
  2. 影響の大きい部分を特定する(よく使われる、壊れると困る、テストがない)
  3. 優先順位付きの計画を作る
  4. 依存関係がわかるたびに、計画を見直す

最初から全ファイルに順番にテストを書く、は誤りです。


7. セッションの状態・再開・フォーク(1.7)

7.1 道具

道具 どこで 意味
claude --resume <名前> Claude Code CLI 名前を付けたセッションを再開する(/rename で名前を付ける)
resume(セッション ID) Agent SDK 特定のセッションを再開する
continue / continue_conversation Agent SDK このディレクトリの最新のセッションを再開する
fork_session(Python)/ forkSession(TypeScript) Agent SDK 元の履歴をコピーした新しいセッションを作る。元は変わらない
--fork-session Claude Code CLI --resume と一緒に使い、新しい ID で分ける

フォークの例: 認証モジュールの分析を終えたセッションから、「JWT の方針」と「OAuth2 の方針」を別々に試す。2つの枝は別々に再開できます(Session management)。

7.2 再開するか、要約で新しく始めるか

状況 選ぶ方法
前のコンテキストがほぼ有効(ファイルは変わっていない、続きの質問) 再開する
前のツール結果が古い(ファイルが大きく変わった、日をまたいでデータが更新された) 構造化した要約を入れた新しいセッション
一部のファイルだけ変わった 再開して、どのファイルがどう変わったかを具体的に伝える。全体の再探索ではなく、絞った再分析をさせる

公式の Agent SDK のドキュメントも、別のホストで再開する方法の1つとして「再開に頼らず、必要な結果(分析、決めたこと、差分)をアプリの状態として保存し、新しいセッションのプロンプトに入れる。こちらのほうが堅牢なことが多い」としています。

古いツール結果のまま再開すると、Claude はもう存在しない関数やデータを前提に考えることがあります。


8. 試験に向けたまとめ

問われ方 答えの考え方
ループをいつ止めるか stop_reason が "end_turn"。文章や反復の上限ではない
報告に分野の抜けがある。各サブエージェントは正常 コーディネーターの分解が狭い
サブエージェントが前の結果を知らない プロンプトに中身を明示的に入れる
サブエージェントを速く動かす 1回の応答で複数の Task(Agent)呼び出し
出典が消える 本文とメタデータを分けた構造で渡す
お金・本人確認の順番を必ず守らせる フックや前提条件ゲート。プロンプトではない
ツールごとに日付の形が違う PostToolUse フックで正規化
上限を超える返金 PreToolUse フックで止め、エスカレーションへ
人に引き継ぐ 顧客 ID、根本原因、金額、推奨アクションの構造化要約
予測できる多面的な仕事 / 答えの決まっていない調査 プロンプトチェーン / 動的な分解
同じ分析から2つの方針を比べる fork_session
ファイルが変わった後の再開 変わったファイルを伝える。古すぎるなら要約で新規

9. 用語集

用語 意味
コーディネーター サブエージェントに仕事を配り、結果をまとめるエージェント
ハブ・アンド・スポーク すべての通信が中心(ハブ)を通る形
Task ツール / Agent ツール サブエージェントを起動するツール。今の名前は Agent
前提条件ゲート 前のステップが終わるまで次のツールを止めるしくみ
正規化 ばらばらなデータの形を1つにそろえること
フォーク 会話の履歴をコピーして、別の枝を作ること

出典

注意: 第4.2節のコードは考え方を示す例で、そのまま動く完全なプログラムではありません。Agent SDK と Claude Code は更新が速いので、本番前に公式ドキュメントで確かめてください(2026年11月時点の内容)。内容は上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。