{
  "format": "agent-article-v0",
  "article_id": "EA-505",
  "canonical_url": "/tools/ea-505-retry-storm-circuit-breaker-nested-retry-budget-composition",
  "page_type": "reference",
  "claim_ids": [],
  "evidence_ids": [
    "EA-505-CURRENT-APPROVAL",
    "EA-505-CURRENT-BODY-READBACK"
  ],
  "unknown_ids": [
    "EA-505-UNKNOWN-01"
  ],
  "operational_object_ids": [],
  "provider": [],
  "models": [],
  "plans": [],
  "surfaces": [],
  "regions": [],
  "current_status": "CURRENT",
  "observation_status": "SPEC_ONLY",
  "freshness": "CURRENT",
  "last_verified": "2026-10-11",
  "supersedes": [],
  "superseded_by": [],
  "provenance": [
    "ORPHAN-RESCUE-EA505-20261019-C1",
    "BODY-SHA256:ce7dd6b82c8a1cb77f68ce747fa5fa26ba2bc54b457fb754a45f69f5502aca6e"
  ],
  "article_sources": [
    {
      "id": "EA-505-CURRENT-APPROVAL",
      "evidence_class": "RESEARCH",
      "title": "現行本文の監査・revision対応",
      "supports": [
        "現行台帳のAUDIT_PASSと候補・revision・本文ハッシュの対応を確認しています。"
      ],
      "limit": "監査状態と来歴の記録です。外部根拠の最新性や本文の全主張を追加保証しません。",
      "origin_class": "AUDITED_CANONICAL_RESEARCH_PACKET",
      "source_or_experiment_ids": [
        "ORPHAN-RESCUE-EA505-20261019-C1"
      ],
      "supporting_locators": [
        "1KqhJtiSb2S84rWmeYVwKcT_76dBwZ_B0ZZuAWQqH0rQ/EA_REVISION_LEDGER#ea_id=EA-505&revision_id=EA-505-R1-20261011&candidate_id=ORPHAN-RESCUE-EA505-20261019-C1",
        "EA-505-R1-20261011"
      ],
      "provenance_status": "CURRENT_CANONICAL_APPROVAL_READBACK"
    },
    {
      "id": "EA-505-CURRENT-BODY-READBACK",
      "evidence_class": "IMPL",
      "title": "現行本文の収録照合",
      "supports": [
        "公開生成入力の本文SHA-256が、監査済み候補に結び付いたハッシュと一致しています。"
      ],
      "limit": "本文の同一性の検査です。外部システムの挙動や全主張の真偽を実証したものではありません。",
      "checked_at": "2026-10-19",
      "origin_class": "IMPLEMENTATION_READBACK",
      "source_or_experiment_ids": [
        "BODY-SHA256:ce7dd6b82c8a1cb77f68ce747fa5fa26ba2bc54b457fb754a45f69f5502aca6e"
      ],
      "supporting_locators": [
        "content/staging/EA-505.md",
        "ce7dd6b82c8a1cb77f68ce747fa5fa26ba2bc54b457fb754a45f69f5502aca6e",
        "EA-505-R1-20261011"
      ],
      "provenance_status": "CURRENT_APPROVED_BODY_HASH_MATCH"
    }
  ],
  "research_sections": [
    {
      "heading": "概要",
      "text": "AIエージェントやワークフローでは、単一の「再試行回数」だけを見ても実際の外部呼び出し回数は制御できません。オーケストレータ、durable execution、エージェント実行系、provider SDK、HTTP transport、gateway、fallback、tool、output validationなどが独立して再試行すると、各層の試行回数が乗算され、障害中の下流サービスへ負荷を集中させる retry storm が発生します。本項の運用原則は、再試行を層別に棚卸しし、観測可能な各層について明示的なownerと有限budgetを定め、重複する自動再試行を可能な範囲で無効化し、実際のattempt identityを記録することです。"
    },
    {
      "heading": "なぜ問題になるか",
      "text": "AWS Builders’ Libraryは、複数階層でそれぞれ再試行すると下流負荷が乗算されることを説明し、backoffとjitter、再試行箇所の制御を推奨しています。Google SREのoverload/retry guidanceも、障害時の再試行が負荷を増幅し、回復を遅らせ得ることを扱います。AzureのRetry StormおよびCircuit Breakerパターンも、失敗中の依存先へ無制限に要求を送り続けない設計を要求します。したがって「agent側のrequest_limitが3だから最大3回」という推論は、下位SDKやtransport、gatewayが追加attemptを生成する構成では成立しません。"
    },
    {
      "heading": "主要なfailure mode",
      "text": "1. Nested retry amplification: durable engineが1 stepを再実行し、その各step内でSDK/transportが複数回retryすることでwire callが乗算されます。\n2. Retry ownership ambiguity: orchestrator、agent runtime、SDK、gatewayのどこが再試行責任を持つか不明確で、複数層が同じ障害へ反応します。\n3. Circuit breaker bypass: 上位層のbreakerが開いても、既に開始済みの下位retryや別経路fallbackが継続する場合があります。\n4. Hidden fallback/routing: gatewayやprovider内部のrouting/fallbackは、agentから観測できるrequest数と一致しない場合があります。\n5. Durable replay ambiguity: durable workflowの再実行では、前回attemptが外部効果を残したか不明なまま次attemptへ進むと、retry stormだけでなく重複副作用も生じます。\n6. Hedging/speculation: latency低減のための並列・投機要求はretryとは別機構でも、下流attempt budgetを消費します。"
    },
    {
      "heading": "具体的control / implementation implication",
      "text": "・Retry domain inventory: orchestrator/durable engine、agent runtime、model/provider SDK、HTTP transport、gateway/router、fallback、tool、output validation、hedgingを別々のdomainとして列挙します。\n・Single explicit owner per observable layer: 同一障害を複数層が無制御にretryしないよう、どの層が再試行するかを明示します。durable step retryを採用する場合、provider SDKやtransport retryを無効化または最小化できる構成ではそうします。\n・Finite budgets: attempts、elapsed time、deadline、concurrency、downstream request rateを有限値として設定します。無期限retryを既定値のまま残しません。\n・Worst-case envelope: 観測可能な層について、上位attempt × 下位retry × fallback候補 × hedged copies の最大包絡を設計時に計算します。ただしprovider内部attemptを観測できない場合、その値を推測で加算せずUNKNOWNとして扱います。\n・Backoff + jitter: 一斉再試行を避けるため指数backoff等とjitterを使い、deadlineを超える再試行を止めます。\n・Circuit breaker / load shedding: 下流障害率やlatencyが閾値を超えた場合、短時間に新規attemptを増幅させず、fail-fast、queue/backpressure、degraded modeへ移します。breakerはretry budgetの代替ではなく併用する制御です。\n・Attempt identity and telemetry: logical operation IDと各層のattempt IDを分け、どの層が何回呼んだかを観測可能な範囲で記録します。agent-visible response countだけをwire-call countとして扱いません。\n・Side-effect boundary: 非冪等な外部効果は、retry budgetとは別にidempotency/reconciliationを必要とします。timeoutを単純FAILEDとみなして再試行せず、外部状態を確認できる場合は先にreconcileします。"
    },
    {
      "heading": "適用境界",
      "text": "この設計は、LLM API、tool/API invocation、durable workflow、gateway経由のprovider routing、複数model fallbackなど、複数の自動再試行層が重なる系に適用します。単一同期呼び出しでretryが完全に一箇所へ集約されている系では管理対象は減りますが、SDK既定retryやproxy/gateway挙動は確認が必要です。"
    },
    {
      "heading": "Counterevidence / limitations",
      "text": "「再試行は常に一層だけにする」という普遍則ではありません。異なるfailure domainに対して別層のretryが合理的な場合があります。重要なのは、各層の責任・上限・相互作用を明示し、総attempt envelopeを制御することです。また、provider内部routingやretryが公開されない場合、外部からexact attempt countを保証できません。Circuit breakerも既に飛行中の要求を必ず取り消すものではなく、全providerで同一の永続化・分散整合性を持つとは限りません。"
    },
    {
      "heading": "OPEN_UNKNOWN",
      "text": "・provider内部retry/routing/fallbackのexact attempt accounting（非公開部分）。\n・breaker stateの永続化、partition時の挙動、複数worker間共有の製品別差異。\n・hedged/speculative requestを含むend-to-end budgetの製品別実装。\n・version-pinned Pydantic AI + durable execution等での独立したwire-call実測fixture。\n・provider gatewayを跨ぐ場合の内部attemptと課金/レート制限カウンタの対応。"
    },
    {
      "heading": "SAFE_WORDING",
      "text": "「agentのrequest_limitだけでproviderへの総attempt数が保証される」とは表現しません。「retryを完全に排除すべき」とも表現しません。公開可能な主張は、複数層のretryは負荷を増幅し得るため、retry domainを列挙し、観測可能な層ごとにownerと有限budgetを定め、重複retryを抑制し、backoff/jitter、breaker/backpressure、attempt telemetryを組み合わせる、という範囲です。provider内部の非公開attempt数やexactly-onceを保証しません。\n\n\nSource / provenance locator\n・Amazon Builders’ Library — Timeouts, retries, and backoff with jitter（登録済みprovenance）\n・Google SRE / SRE Workbook — retry amplification, handling overload, Niantic incident（登録済みprovenance）\n・Microsoft Azure Architecture Center — Retry Storm pattern / Circuit Breaker pattern（登録済みprovenance）\n・AWS SDK retry behavior（登録済みprovenance）\n・Pydantic AI current Retries / Durable Execution / Tool Execution documentation（2026-10-16確認記録）\n・EA_Research_Continuation_Log / EA-505 bounded refresh records（発展拡張統合管理台帳にlocator記録済み）"
    },
    {
      "heading": "監査上の確認点",
      "text": "主要claimは上記登録済み一次資料・継続調査記録へ追跡可能です。製品内部attempt数、独立fixture、breakerの分散永続性は未確認として本文で限定しました。READY、AUDIT_PASS、GIT_INTEGRATED、ACCEPTEDは本candidateでは自己判定しません。"
    }
  ],
  "human_url": "/tools/ea-505-retry-storm-circuit-breaker-nested-retry-budget-composition",
  "markdown_url": "/agent/article.md?path=%2Ftools%2Fea-505-retry-storm-circuit-breaker-nested-retry-budget-composition",
  "json_url": "/agent/article.json?path=%2Ftools%2Fea-505-retry-storm-circuit-breaker-nested-retry-budget-composition"
}