CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-05-31上級

再現できないエージェント障害をなくす設計 — 決定論的リプレイとイベントソーシング

深夜に落ちた自律エージェントは、そのままでは再現できません。モデル出力やツール入出力など非決定の境界をイベントとして記録し、決定論的にリプレイする設計を、実装コードと運用知見つきで解説します。

Claude Agent SDK13イベントソーシングオブザーバビリティ2本番運用36リプレイ

プレミアム記事

2014年から個人でアプリを開発してきて、累計5,000万ダウンロードを超えるまでに一番こたえたのは、派手なクラッシュではありませんでした。誰も見ていない深夜に、バックエンドの自律処理が一度だけ静かに失敗し、朝になってログを開いても「なぜそうなったのか」がもう分からない、という種類の障害です。

Claude Agent SDK で自律エージェントを本番に置くと、この問題がはっきり形を変えて現れます。エージェントは外部の状態に深く依存して動きます。モデルの出力は毎回わずかに違い、ツールが叩く API のレスポンスは時間とともに変わり、Date.now() は当然進み、リトライの分岐は乱数やレイテンシで変わります。つまり、失敗した実行をそのまま「もう一度走らせる」だけでは、二度と同じ失敗にたどり着けません。

両家の祖父がともに宮大工で、組み上げたものが何十年も保つのを近くで見て育ちました。長く保つものには必ず「後から検証できる」という性質が備わっています。エージェントの設計でも私が一番大事にしているのはここで、これからお伝えするのは、失敗を後から正確に再現するための設計、すなわち決定論的リプレイ(deterministic replay)とイベントソーシングを、実装と運用の両面から具体に落とした手順です。

なぜ「もう一度走らせる」では再現できないのか

再現を妨げる原因は、エージェント実行のなかに散らばった「非決定の境界(nondeterminism boundary)」です。コードのロジック自体は決定論的でも、外界に触れる瞬間だけは毎回違う値が入ってきます。本番で観察してきた限り、境界は次の4種類に集約できます。

第一にモデル出力です。temperature: 0 でも完全な再現は保証されず、ツール呼び出しの引数が1文字違うだけで分岐が変わります。第二にツールの入出力で、外部 API・データベース・ファイルの状態は時間とともに変化します。第三に時刻で、Date.now() や日付に基づく分岐は実行のたびに別の枝へ進みます。第四に乱数とリトライで、ジッター付きバックオフやサンプリングは実行ごとに揺れます。

ここで多くの人がオブザーバビリティ基盤(メトリクス・トレース・ダッシュボード)を入れて満足してしまいますが、それは「何が起きたかの統計」を見るものであって、「特定の1回をもう一度動かす」ものではありません。事後分析に本当に必要なのは後者です。発想を変えて、これら4つの境界を通過する値をすべて追記専用ログに記録し、再実行時にはログから読み戻すようにすれば、実行は決定論的に再現できます。これがイベントソーシングをエージェントに適用するという考え方です。

イベントログのスキーマを決める

まず、1回の実行を一意に識別する runId を発番し、その実行が境界を通過するたびに連番 seq 付きのイベントを追記します。イベントは「録る(record)」モードでは実値を書き込み、「再生(replay)」モードでは読み戻すという、対称な構造にしておくのが要点です。

// events.ts — 追記専用イベントの型と最小ストア
export type BoundaryKind = "model" | "tool" | "clock" | "random";
 
export interface AgentEvent {
  runId: string;
  seq: number;            // 実行内で単調増加
  kind: BoundaryKind;
  key: string;            // 呼び出しの論理キー(例: "tool:fetch_orders")
  input: unknown;         // 録音時の入力(照合に使う)
  output: unknown;        // 境界が返した実値
  tokensIn?: number;      // model イベントのみ
  tokensOut?: number;
  costUsd?: number;
  ts: string;             // ISO8601。clock の真値ではなく記録時刻
}
 
export interface EventStore {
  append(e: AgentEvent): Promise<void>;
  load(runId: string): Promise<AgentEvent[]>;
}

実運用では EventStore を追記専用に保つことが命綱です。途中で書き換えると再現性が壊れます。私は本番では1行1イベントの JSON Lines をオブジェクトストレージに置き、開発では単純な配列で持つ、という二実装で運用しています。スキーマには必ず kindkey を持たせてください。後述するリプレイで「同じ順序・同じ呼び出し」であることを照合する鍵になります。

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

この記事の続きを読む

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

この記事で得られること
非決定の境界(モデル出力・ツールI/O・時刻・乱数)を特定し、追記専用イベントログとして記録する具体実装
失敗した1回の実行だけをオフラインで決定論的に再現するリプレイハーネスのコード
同じログからコストとトークンを実行単位で配賦し、事後分析を定量化する運用手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-06-25
前の実行が終わらないうちに次が走り出すとき — リースとフェンシングトークンで定期エージェントの多重起動を抑える
毎日決まった時刻に動く定期エージェントが、前の実行を追い越して二重に走り出す。素朴なロックが破れる瞬間から、リースとフェンシングトークン、上限付きキャッチアップまでを実装込みで整理します。
API & SDK2026-05-20
Claude Agent SDK で複数 MCP サーバを束ねるときのツール名衝突 — 名前空間と動的調停の設計
GitHub MCP と Linear MCP の create_issue が同居したとき、Sonnet 4.6 はどちらを呼ぶか分かりません。複数 MCP を束ねる Claude Agent SDK アプリで踏むツール名衝突の構造と、TypeScript で書ける Reconciler の実装、本番で踏んだ失敗パターンまでをまとめます。
API & SDK2026-04-24
Claude エージェントに長期記憶を持たせる本番設計 — 7つの落とし穴と対策パターン
Claude エージェントに長期記憶を組み込んで本番運用するときに、多くの実装が踏み抜く7つの落とし穴を、書き込み設計・PII 対策・スコープ分離・破損検知・コスト制御・移行計画までの設計パターンとして体系化した本番向けプレミアムガイドです。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →