CLAUDE LABEN
SUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は明日8月17日です。残り1日となりましたLATEST — 最新は8月15日の v2.1.233 です。GitLab のマージリクエスト URL が --worktree と claude agents で扱えるようになり、MR は !N 形式で表示されますSECURITY — Windows で NT の \??\ デバイスプレフィックスを含むパスが UNC 検証をすり抜ける問題が直りました。NTLM 資格情報が漏れる経路が塞がれていますTODO — Opus 4.8・Sonnet 5・Fable 5・Mythos 5 以降では TodoWrite と Task 系ツールが既定で無効になりました。CLAUDE_CODE_ENABLE_TODO_TOOLS=1 で戻せますFORK — 8月14日の v2.1.232 で subagent_type: 'fork' が既定になり、会話全体とプロンプトキャッシュをそのまま引き継げるようになっていますMENTION — プロンプトで @ を打つと別のセッションを名前で呼び出せます。SendMessage がそのセッションへ直接届きますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は明日8月17日です。残り1日となりましたLATEST — 最新は8月15日の v2.1.233 です。GitLab のマージリクエスト URL が --worktree と claude agents で扱えるようになり、MR は !N 形式で表示されますSECURITY — Windows で NT の \??\ デバイスプレフィックスを含むパスが UNC 検証をすり抜ける問題が直りました。NTLM 資格情報が漏れる経路が塞がれていますTODO — Opus 4.8・Sonnet 5・Fable 5・Mythos 5 以降では TodoWrite と Task 系ツールが既定で無効になりました。CLAUDE_CODE_ENABLE_TODO_TOOLS=1 で戻せますFORK — 8月14日の v2.1.232 で subagent_type: 'fork' が既定になり、会話全体とプロンプトキャッシュをそのまま引き継げるようになっていますMENTION — プロンプトで @ を打つと別のセッションを名前で呼び出せます。SendMessage がそのセッションへ直接届きます
記事一覧/Claude Code
Claude Code/2026-05-25上級

Subagent 間で状態を渡す3つの設計パターン — 4ヶ月のブログ自動生成で見えた使い分け

Subagentパイプラインで親子間の状態を引き渡す3つの方法——JSONファイル・環境変数・Context Bundle——を、4ヶ月のブログ自動生成の本番運用データで比較しました。件数規模ごとの推奨レンジと、重複回避やカテゴリバランスなど実際に渡している情報の設計を紹介します。

claude-code129subagent4pipelinestatearchitecture7

プレミアム記事

Subagent を本格的に並列運用しはじめると、ほぼ全員が同じ壁にぶつかります。「親エージェントと子エージェントの間で、どうやって状態を渡せばいいのか」という壁です。Claude Code の Agent ツールはステートレスで、子エージェントは渡されたプロンプトだけを手がかりに動きます。親が知っている文脈を共有しないと、子は同じ調査をゼロからやり直してしまいます。

私自身、2014年から個人開発でアプリ事業を続けており、ここ数年はメディア運営も並行しています。Claude Lab を含む 4 サイトのブログ自動生成パイプラインを 4 ヶ月運用してきて、状態の引き渡しだけで何度も書き直しが発生しました。今回はその過程で残った 3 つのパターンと、どのスケール域でどれを選ぶべきかをまとめます。

なぜ Subagent の状態管理は難しいのか

Claude Code の Subagent モデルは、Unix のサブシェルに似ています。親プロセスが子を fork するわけではなく、純粋にプロンプト文字列を渡して新しいセッションを起動します。子セッションは独立したコンテキストウィンドウを持ち、終了時に最終メッセージだけを親に返します。

この設計は安全性とコンテキスト分離という意味では非常に良いのですが、副作用として「親から渡せる情報量にはプロンプトサイズの上限がある」という制約が生まれます。私が運用しているブログ自動生成パイプラインでは、1 サイトあたりの記事生成プロセスで以下の情報を子に渡す必要があります。

  • 過去 14 日に生成した記事のスラッグ一覧(重複回避用)
  • 直近の GSC データ(クリック数・表示回数・CTR)
  • カテゴリ別の記事数バランス
  • 進行中の実体験題材(AdMob / Crashlytics / Xcode などの観察ログ)
  • 4 サイトの相互参照を避けるための除外スラッグ集

これを全部プロンプトに直書きすると、子セッションの起動時点でコンテキストが膨れあがり、肝心の記事執筆に使えるトークンが減ってしまいます。実測で 3 万トークン中、状態渡しだけで 1.2 万トークンを消費していた時期がありました。これではプレミアム記事に必要な「実用性シグナル 3 つ以上」を入れる余裕が残りません。

パターン1: JSON ファイル経由(推奨レンジ: 〜100件/日)

最初に採用したのが、親エージェントが JSON ファイルに状態を書き出し、子エージェントが Read ツールで読み出すパターンです。

実装コード

// 親側: state を JSON で永続化
import { writeFileSync, readFileSync } from 'fs';
import { join } from 'path';
 
type PipelineState = {
  pipelineId: string;
  timestamp: number;
  recentSlugs: string[];
  gscData: Record<string, { clicks: number; impressions: number }>;
  excludedSlugs: string[];
  categoryBalance: Record<string, number>;
};
 
const STATE_DIR = '/tmp/claude-pipeline-state';
 
function writeState(state: PipelineState): string {
  const path = join(STATE_DIR, `${state.pipelineId}.json`);
  // 原子的書き込み: tmp に書いてから rename
  const tmpPath = `${path}.tmp.${process.pid}`;
  writeFileSync(tmpPath, JSON.stringify(state, null, 2), 'utf-8');
  require('fs').renameSync(tmpPath, path);
  return path;
}
 
function readState(pipelineId: string): PipelineState {
  const path = join(STATE_DIR, `${pipelineId}.json`);
  return JSON.parse(readFileSync(path, 'utf-8'));
}
 
// 子エージェントに渡すプロンプトには「パス」だけを書く
const childPrompt = `
重複回避のため、まず以下のパスから状態を Read してください:
  ${writeState(currentState)}
 
その後、トピック選定 → 記事生成 → JSON への結果書き戻しを行ってください。
`;

4ヶ月運用での観察

このパターンのオーバーヘッドは、Linux サンドボックス内で実測 12ms でした。プロンプトに直書きする方式と比べてトークン消費は 1.2 万 → 0.4 万まで圧縮できました。トークン換算で月 30 ドル前後の節約になります(Sonnet 4.6 の入力単価で計算)。

ただし運用 2 ヶ月目に問題が発生しました。Cowork のスケジュールタスクで複数サイトの生成が時間的に重なったとき、同じ JSON ファイルに対する同時書き込みが発生し、片方の更新が失われる事象が 1 週間で 3 件起きました。

対処として上記コードのように tmp ファイル経由の rename による原子的書き込みに切り替えました。Linux の rename(2) は同一ファイルシステム内で原子的に動くため、これだけで競合は解消できます。

このパターンが向く場面

私の場合、1 サイトあたり 1 日 4 本のペースでは JSON 方式が最も扱いやすく、現在もこのパターンを採用しています。状態が 100KB を超えない範囲・同時実行が 4 並列程度まで・ファイルシステムが永続的に使える環境では、最初の選択肢として推奨します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
JSON ファイル / 環境変数 / Context Bundle の3パターンを実装コード付きで比較(オーバーヘッド: 12ms / 0.3ms / 380ms)
4サイト合計 月630本の自動生成で見えた、スケール域ごとの最適選択(〜100件 / 100〜1,000件 / 1,000件超)
本番でハマった失敗3例(環境変数 32KB 制限 / JSON 同時書込競合 / Context Bundle トークン爆発)と回避策
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-05-02
Claude Code が途中で止まる・フリーズする問題の完全診断ガイド
作業を任せていたClaude Codeがぴたりと止まったとき、中断すべきか待つべきかは症状で判断できます。最多ケースのコンテキストバジェット枯渇、ツールやサブエージェントの無応答、無限ループとタスク放棄という原因カテゴリ別に、見分け方と即効性のある対処法を整理しました。
Claude Code2026-04-24
Claude Code のサブエージェントが結果を返さない時の診断手順
Claude Codeのサブエージェントが結果を返さない・止まったように見えるときの診断フローです。症状を分類する最初の3つの質問、ツール呼び出しの無限ループ、エラーが親に伝わらないパターン、出力スキーマの不在による内容ズレ、.claude/agents/のリロードまでコード例つきで解説します。
Claude Code2026-04-12
Claude Code の Sub-agent パターン — 複雑なタスクを自律的に分解・並列処理する設計手法
Claude Codeが内部で使うSub-agentアーキテクチャを解剖し、タスク分解・並列実行・結果統合を自分のプロジェクトで設計する手法を解説します。分解の粒度をCLAUDE.mdで制御する方法、並列処理のガードレール、モノレポでの実践、デバッグと監視の勘所までを扱います。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →