◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-05-25上級

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

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

claude-code132subagent4pipelinestatearchitecture7

✦ プレミアム記事

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-08-28
名前に混ざった見えない文字を、プラグインを入れる前に洗い出す小さなスクリプト
プラグインやスキルの名前に不可視文字や制御文字が混ざっていても、ターミナルの一覧では見分けがつきません。実際に6つの紛らわしい名前を並べて ls の出力を比べ、導入前に走らせる点検スクリプトと、その点検が拾えない範囲までを整理しました。
⟐ Claude Code2026-08-26
キャッシュのTTLを1時間に延ばすかは、離席の長さではなく戻る場所で決めています
Claude Code v2.1.242 で promptCacheTtl と subagentPromptCacheTtl が追加されました。1時間キャッシュが効く条件は離席時間ではなく、同じ作業ディレクトリと同じ git 状態へ戻るかどうかです。判断の順番と、効いているかを確かめる手順を書き残します。
⟐ Claude Code2026-06-12
Android の戻るボタン広告ゲートを入れ子から並列独立構造へ — Claude Code と進めた終了フロー再設計の記録
戻るボタンの広告が「出ない」と「出すぎる」を同時に起こした原因は、入れ子分岐に埋め込まれた暗黙の優先度でした。壁紙アプリ v2.1.0 で広告ゲートを並列独立構造へ作り直した過程を、Kotlin実装・Claude Codeへの依頼内容・テストまで含めて記録します。