A Field Guide to Agent Architecture

サブエージェント / マルチエージェント / ハーネス 三つの言葉を、土台から積み上げて理解する

結論: ハーネス=器、サブエージェント=専門家、マルチエージェント=組合せ方。

どれも「AIが動く仕組み」を指す言葉ですが、見ている階層が違います。
一番外側のハーネス、その中で呼び出される専門家サブエージェント
そしてサブエージェントを束ねて使う設計パターンマルチエージェントです。

三つの関係を一枚で

まず大枠の関係を掴むのが先決です。三者は対等な選択肢ではなく、入れ子構造になっています。

LAYER 1 — 一番外側の器
ハーネス
Harness · the runtime
AIモデル本体に手足(ツール)と感覚器(フック・コンテキスト・権限)を取り付けて、 ひとつのアプリケーションとして動かす枠組みそのもの
Claude Code というCLIアプリ、その中で動くツール群、設定ファイル、フック、セッション管理、メモリ、 すべてを束ねる「土台」が harness です。今このセッションも harness の中で走っています。
LAYER 2 — 器の中で呼び出される専門家
サブエージェント
Subagent · the specialist
親の Claude(オーケストレーター=指揮役の親 AI)が、特定の役割に特化した別の AI を起動して仕事を任せる仕組み。
独自のコンテキスト・独自のシステムプロンプト・独自のツール権限を持ち、最終結果だけが親に返ります。 quality-checker、fact-auditor、site-analyzer などはすべてサブエージェントです。
LAYER 3 — 専門家の組合せ方
マルチエージェント
Multi-agent · the design pattern
複数のサブエージェントを並列・直列・階層的に組合せてひとつの目的を達成する設計パターン。 単独 AI では出ない精度や多面性を、役割分担と独立視点で実現します。
このプロジェクトの GPT-5 Mini Triad(QC+FA+SD+DA の四並列検証)が代表例です。
Harness ⊃ Subagent ⊃ Multi-agent pattern
ハーネス Harness
AIに「環境」を与える土台。これがなければモデルは何もできない。

正体

LLM そのものは入力を受けて出力を返すだけの存在です。ファイルを読むことも、 コマンドを叩くことも、フックで制約をかけることも、メモリを保存することもできません。
これを「アプリケーションとして使える状態」に組み上げているのがハーネスです。 Claude Code(このCLI)、ChatGPT のデスクトップアプリ、Cursor、それぞれ別のハーネスです。

ハーネスが提供するもの

  • ツールの定義と実行(Read / Write / Bash / Edit など)
  • 権限管理(許可リスト・PreToolUse フック)
  • コンテキスト管理(過去メッセージの保持・圧縮)
  • セッション・履歴・引き継ぎ
  • フック(Stop / SessionStart / PreToolUse 等)
  • メモリ(MEMORY.md など永続化層)
  • サブエージェント呼び出しの仕組みそのもの

本プロジェクトでの実体

  • CLI: Claude Code(Anthropic 提供の公式 CLI)
  • 設定: .claude/settings.local.json
  • フック: scripts/quality_gate/*.py
  • メモリ: ~/.claude/projects/.../memory/
  • セッション: .claude/.current_session_id
  • プロジェクト指示: CLAUDE.md

「ハーネスを変える」の意味

Stop hook(応答完了直前に走る検査スクリプト)を追加する、permission を許可する、 CLAUDE.md にルールを書く、これらはすべてハーネスへの介入です。AI 本体の中身は変えていません。
ハーネス層で物理的に強制すれば、モデルがどれだけ賢く言い訳しても通らなくなります。 「AI 実行禁止操作」「ゲート12 Staging Queue ACK」が PreToolUse フック (ツール実行直前に走る検査)で物理ブロックされているのが好例です。

サブエージェント Subagent
親 AI が呼び出す、別コンテキストで走る独立した AI。

本質的な特徴

親の Claude(このセッションを進めている AI)が、Agent ツール経由で別の AI を一時的に起動します。 この子 AI は次の3つを独自に持ちます。

子 AI が持つ独自のもの

  • 専用システムプロンプト(役割定義)
  • 独自のコンテキストウィンドウ(AI が一度に覚えていられる会話の窓。親の履歴は見えない)
  • 限定されたツール権限(例: 読み取りのみ)
  • 場合によっては別モデル(例: GPT-5 Mini)

親 AI が受け取るもの

  • 子 AI の最終応答(テキストのみ)
  • 中間ツール結果は見えない
  • 子のコンテキストは破棄される
  • =親のコンテキストを汚さない

呼び出しの実体

# 親 AI から見たサブエージェント呼出
Agent({
  subagent_type: "quality-checker",
  description: "成果物検証",
  prompt: "このHTMLを検証してください..."
})
# → 子 AI が独立コンテキストで起動 → 検証結果テキストだけ返る

このプロジェクトの .claude/agents/ に定義されているサブエージェント(10件)

名前役割モデル
quality-checker成果物検証(提出前の必須ゲート)GPT-5 Mini
fact-auditor事実主張の独立裏取りGPT-5 Mini
sophistry-detector詭弁・責任回避・スコープ縮小の検知GPT-5 Mini
devil-advocate反証材料のみを探す悪魔の代弁人GPT-5 Mini
gate-auditorGoogle Ads ゲートロジックの独立監査Claude
site-analyzerHTML 構造解析と SEO 診断Claude
article-rewriterブログ記事の SEO リライト案生成Claude
blog-writer文字起こしから SEO ブログ記事生成Claude
x-post-writer文字起こしから X 投稿文生成Claude
instagram-writer文字起こしから Instagram キャプション生成Claude

※この他に Anthropic 公式の汎用組込エージェント(general-purpose、Explore、Plan、claude-code-guide 等)も Agent ツール経由で利用可能。これらはプロジェクト固有定義ではなく Claude Code に標準搭載。

なぜサブエージェントを使うのか

① コンテキスト保護

  • 大量ファイル探索で親の履歴が埋もれる事態を防ぐ
  • 子 AI が読んだ生データは破棄され、要約だけが返る

② 独立視点(バイアス排除)

  • 親 AI が書いた応答を、親自身が検証すると甘くなる
  • fact-auditor は親の応答を「初めて見る」状態で監査

③ 並列処理

  • 独立タスクを同時起動して時間短縮
  • 例: site-analyzer × 3 ドメインを同時診断

④ 役割分離

  • 専門プロンプトで該当領域の精度を上げる
  • 汎用 AI に「全部やれ」と頼むより質が高い
マルチエージェント Multi-agent System
複数のサブエージェントを束ねた「設計パターン」。それ自体は実体ではない。

正体は「組合せ方」であって「物」ではない

サブエージェントが役者だとすれば、マルチエージェントは脚本です。 1人の役者でも複数の役を演じられますが、「群像劇という構成」が成立するのは脚本があるから。
AI 業界で「マルチエージェントシステム」と呼ばれるものは、複数のサブエージェントが 協調・分業・相互検証する設計を指します。

主要なパターン

並列パターン

Parallel

  • 独立した役割の AI を同時起動
  • 各々が独自視点で結果を返す
  • 親が統合判断する

直列パターン

Pipeline

  • A の出力 → B の入力 → C の入力
  • 各段階で品質を磨いていく
  • 例: 調査 → 分析 → 提案

階層パターン

Hierarchical

  • オーケストレーター AI が下位 AI を指揮
  • 下位がさらに別 AI を呼ぶ
  • 大規模タスクの分解

本プロジェクトの実装:GPT-5 Mini Triad Verifier(v5.4)

親の Claude(本セッションは Opus 4.7)が応答を生成 → 即座に4つの GPT-5 Mini サブエージェントが 並列起動して、それぞれ別の観点で監査します。
同モデル系列バイアスを物理排除するため、検証側はすべて他社モデルに固定しています。

親 AI
Claude
応答生成
draft
Stop hook
trigger
QC
quality
FA
fact audit
SD
sophistry
DA
devil's adv.
↓ 並列実行 ↓
統合判定
PASS / FAIL
内川様へ表示
if PASS

単一 AI で検証すると「自分の応答を擁護」してしまう癖が物理的に出ます。 他社モデル ✕ 役割分離 ✕ 並列 の三層で、その癖を構造的に潰しているのがこのシステムです。

内川様の現状の使い方:陸上アカデミア業務での実装例

抽象論ではなく、本プロジェクト F:\claude-work\ で実際に走っている具体例で 三者がどう絡み合っているかを示します。

例 1 — Google 広告 mutation のゲート12(マルチエージェント+ハーネス)

  • ハーネス層scripts/quality_gate/gate_ads.py が PreToolUse フックで exec_ads_*.py 実行を物理ブロック
  • サブエージェント層gate-auditor が「攻撃者視点でゲートをすり抜ける mutation 書き方」を独立監査
  • マルチエージェント設計:mutation_dispatcher(Telegram 通知)+ gate-auditor(独立監査)+ Telegram ACK 物理隔離 の三層で循環参照を切断
  • 背景:trial-009 LIFF URL 全角数字混入で ¥46,332/3 日消失した教訓から構築

例 2 — 成果物提出前の QC(サブエージェント単独)

  • HTML/文章/プラン/調査報告 を内川様に出す前に quality-checker 1 体だけを呼ぶ
  • FAIL → 修正 → 再呼出を PASS まで反復(このターンは 2 ループで PASS)
  • ダメ出しは .claude/quality-checker-learned.md に L+連番で蓄積
  • Stop hook(ハーネス層)が事後検証で漏れを検知し画面表示

例 3 — 応答送信直前の四並列監査(マルチエージェントの中核実装)

  • Claude(本セッションは Opus 4.7)が応答を draft
  • Stop hook が fact-auditorsophistry-detectordevil-advocatequality-checker を並列起動
  • 全員が PASS/OK/収束を返さない限り応答が画面に出ない(HARD BLOCK)
  • このターンで内川様が見ている BLOCK ループはこの実装そのもの

例 4 — LP/HTML 制作(サブエージェント直列パターン)

  • site-analyzer で既存 LP の HTML 構造解析・SEO 診断
  • article-rewriter で SEO 観点のリライト案生成
  • blog-writerx-post-writerinstagram-writer で文字起こしから各媒体に最適化
  • 直列で次の段階に渡すパイプライン型マルチエージェント

例 5 — セッション間の引き継ぎ(ハーネス層のメモリ機能)

  • ~/.claude/projects/.../memory/MEMORY.md に項目別ファイル+index で保存
  • SessionStart hook で並列セッション一覧を自動注入
  • .claude/.current_session_id で並列 Claude Code 同士の競合管理
  • サブエージェントは別コンテキストなので memory を共有しない(ハーネスが親 Claude にだけ注入)

例 6 — Telegram Bot 経由 ACK(ハーネス物理隔離)

  • mutation 計画 → tmp/mutation_queue/pending/ 投入
  • scripts/cron/mutation_dispatcher.py が広告 Bot で内川様通知
  • 内川様 Telegram ACK → dispatcher が approved/ へ移動
  • AI は Telegram 応答を偽装不可=ハーネス層での物理隔離設計

領域別の現状:どこに専用エージェントがあって、どこに無いか

内川様の業務 3 領域(広告/ProLine/AI トミー布石くん)について、専用サブエージェントが .claude/agents/ に定義されているかを整理します。

領域専用サブエージェント現在の運用
広告関連 gate-auditor 1件のみ
(mutation ゲートの独立監査)
mutation 実行・full audit・objective audit は直接スクリプト(ads_full_audit.py 等)を Bash で叩く運用
ProLine 関連 無し 直接スクリプト(proline_*.py 群)と ProLine MCP で実測
AI トミー布石くん関連 無し knowledge/fuseki/マークダウン/ 21 ファイルのナレッジを親 AI が直読みして判断

3領域とも「内川様の最終クリック必須」(広告有効化/ProLine 編集/配信文言)の領域のため、 AI に切り離す前提が無く、専用エージェント化されてこなかった、というのが構造的な理由です。

サブエージェント化する余地(拡張案)

ads-objective-auditor(仮)

  • 役割:objectives/<cid>_*.yaml と実態(広告文・KW・除外・final_url)を独立視点で突合
  • 効果:「Claude が自分の作った広告を自分で評価する」バイアスを排除
  • 既存 ads_objective_audit.py をエージェント化する形

proline-scenario-mapper(仮)

  • 役割:ProLine MCP fetch 結果から親子シナリオ階層・配信フロー図を独立生成
  • 効果:「シナリオ ✕✕✕ 未実装」と memory を実測代替で誤発信する文書信仰の構造的防止
  • fact-auditor 強化版とも言える

tommy-fuseki-writer(仮)

  • 役割:トミー布石くんナレッジ準拠で布石文・反応者向けレスポンス3要素を生成
  • 効果:親 AI の説明的表現混入チェッカー兼ライター
  • 既存 blog-writer 系列と同じ構造で起こせる

導入する場合の手順

  • .claude/agents/<name>.md に frontmatter(name / description / tools / model)+本文を Write
  • 親 AI が Agent ツール経由で subagent_type: <name> 指定で起動可能になる
  • 不要になれば該当 .md を削除するだけで戻せる

三者が絡み合う典型シーン(このセッションそのもの)

「サブエージェント/マルチエージェント/ハーネスの違いを HTML 解説して」という依頼の処理

  1. ハーネスが SessionStart hook で並列セッション情報・MEMORY.md・CLAUDE.md を親 AI に注入
  2. 親 AI が HTML を Write(ハーネスのツール経由)
  3. 親 AI が サブエージェント quality-checker を Agent ツールで起動
  4. QC FAIL → 修正 → 再 QC で PASS 取得(サブエージェント反復ループ)
  5. 応答送信直前に Stop hook(ハーネス)が マルチエージェント四並列監査を発火
  6. fact-auditor/sophistry-detector/devil-advocate/quality-checker が並列で本文を検査
  7. 全員 PASS → 内川様の画面に表示 / 1 体でも FAIL → HARD BLOCK で画面表示拒否

この一連の流れで、ハーネス(土台)・サブエージェント(個別実体)・マルチエージェント(並列監査の設計)が 同時に役割を果たしています。三者は対立する選択肢ではなく、層構造で同居します。

「マルチエージェント」と「サブエージェント複数呼出」の違い

ここが混同されやすい点です。
サブエージェントを3つ呼ぶ=即マルチエージェント、ではありません。 役割分担と統合判断の設計があって初めてマルチエージェントです。

単なる複数呼出マルチエージェント
役割設計同じ役割を量で叩く異なる役割を分担
結果の使い方個別に消費統合判断 / 突合
独立性の意図偶然設計上の必須要件
3ファイルを3つの Explore で同時探索QC+FA+SD+DA で応答を多面検証

三者の比較

同じ軸で並べると差が見えます。

観点 ハーネス サブエージェント マルチエージェント
階層 一番外側の器 器の中で呼び出される実体 サブエージェントの組合せ方(パターン)
具体例 Claude Code、Cursor、ChatGPTアプリ quality-checker、Explore、fact-auditor GPT-5 Mini Triad、調査→分析→提案パイプライン
選択するもの どのCLI/アプリを使うか どの専門家を呼ぶか どう組合せるか
変更頻度 稀(プロダクト乗換) セッション中に何度も タスク種別ごとに設計
実体性 アプリケーション 独立した AI プロセス 設計パターン(実体は複数のサブエージェント)
このプロジェクトでの所在 .claude/CLAUDE.md .claude/agents/ 配下の定義 Stop hook + 並列 Agent 呼出の設計

使い分け:どの言葉を使うべきか

議論の場面で、どの単語を出すと噛み合うか。

ハーネスの話をすべき時

When you mean — Harness

  • 「Claude Code から Cursor に乗り換えるべきか」
  • 「フックで物理ブロックする仕組みを増やしたい」
  • 「permission 設定を全 PC で共有したい」
  • 「メモリの保存場所を変えたい」
  • =AI の環境そのものを議論する時

サブエージェントの話をすべき時

When you mean — Subagent

  • 「探索を任せたい」
  • 「コンテキストを汚したくない作業がある」
  • 「専用プロンプトで精度を上げたい仕事がある」
  • 「親 AI とは別モデルで検証したい」
  • 個別の専門家を呼びたい時

マルチエージェントの話をすべき時

When you mean — Multi-agent

  • 「複数視点で検証する仕組みを作りたい」
  • 「単一 AI では出ない精度を出したい」
  • 「分業させて速くしたい」
  • 「相互監視で偏りを潰したい」
  • システム全体を設計する時

三行で覚える

ハーネスは、AI を動かすための。Claude Code そのもの。 フック・権限・メモリ・セッションを束ねる土台層で、ここを変えると AI 全体の挙動が変わります。

サブエージェントは、親 AI が呼び出す独立した別 AI。 別コンテキスト・別プロンプト・別権限で動き、最終結果だけが親に返ります。 コンテキスト保護・独立視点・並列処理・役割分離のために使います。

マルチエージェントは、サブエージェントを束ねて使う設計パターン。 単に複数呼ぶことではなく、役割分担と統合判断の意図がある時にだけ「マルチエージェント」と呼びます。 本プロジェクトの GPT-5 Mini Triad が典型例です。

入れ子で覚えてください。
Harness ⊃ Subagent ⊃ Multi-agent pattern