# Agent Side-Effect Compensation：AIエージェントの外部副作用を「巻き戻し」ではなく検証可能な補償として扱う

CURRENT_STATUS: CURRENT
OBSERVATION: SPEC_ONLY
FRESHNESS: CURRENT
PAGE_TYPE: reference
CANONICAL_URL: /tools/ea-501-agent-side-effect-compensation-ai
CLAIM_IDS: none
EVIDENCE_IDS: EA-501-CURRENT-APPROVAL, EA-501-CURRENT-BODY-READBACK
UNKNOWN_IDS: EA-501-UNKNOWN-01
OPS_IDS: none

## Summary
「補償はundoではなく新しい副作用である。元操作の結果を照合し、現在の回復権限・対象状態・後続変更・冪等性を再検証した上で実行し、最終的な業務／システム状態をreadbackする。不可逆な作用はrollbackと呼ばず、containmentまたはforward recoveryとして扱う。」

## Current judgment
「補償はundoではなく新しい副作用である。元操作の結果を照合し、現在の回復権限・対象状態・後続変更・冪等性を再検証した上で実行し、最終的な業務／システム状態をreadbackする。不可逆な作用はrollbackと呼ばず、containmentまたはforward recoveryとして扱う。」

## Scope
Agent Side-Effect Compensation：AIエージェントの外部副作用を「巻き戻し」ではなく検証可能な補償として扱う

## Confirmed

## UNKNOWN
- EA-501-UNKNOWN-01: 公開情報だけでは、独立第三者により裁定された本番agent補償インシデントの一般化可能なデータ、authority expiryとconcurrent state changeを同時に扱うversion-pinned cross-runtime fixture、nested/sub-agent間の補償所有権を横断的に標準化する契約は確立していない。これらを製品横断の保証として扱わない。

## Evidence
- EA-501-CURRENT-APPROVAL (RESEARCH): 現行本文の監査・revision対応
- EA-501-CURRENT-BODY-READBACK (IMPL): 現行本文の収録照合

## Failure / limits
代表的な失敗は、元操作の成功を見落として補償を二重適用すること、補償時に失効した権限を再利用すること、対象が後続処理で更新済みなのに古いsnapshotへ戻すこと、補償ワーカーの再試行で同じ逆操作を重複実行すること、補償の一部だけ成功して全体を成功扱いすること、不可逆副作用を可逆と誤認すること、エージェントの会話ログだけを復旧証拠にすることである。

複数エージェントやsub-agentが関与する場合は、誰が元操作を所有し、誰が補償を要求でき、誰が現在の権限を再確認し、どのcomponentが終端状態を検証するかを明示する。所有権が曖昧なまま各agentが独自に補償すると、重複・競合・相互打消しが起こり得る。
## Failure / limits
SagaやCompensating Transactionは分散副作用を扱う有力な設計パターンだが、すべての外部作用が補償可能であること、補償が元状態を完全再現すること、exactly-onceを保証することを意味しない。author-maintained OSSのWAL/recovery fixtureはprocess death後の回復設計を再現可能にするが、その結果を特定企業の本番信頼性へ一般化してはならない。研究・事例で観測されたagentの無権限操作は、会話上の意図と外部状態が一致しないfailure envelopeを補強するが、あらゆるagent製品で同じ故障率が生じる証明ではない。

また、補償のための強い権限は、それ自体が新たな攻撃面になる。通常操作より広い「復旧権限」を常時agentへ与えるのではなく、用途、対象、時間、承認、監査を限定し、必要時に再評価する。
## 要点と前提
AIエージェントがメール送信、権限変更、レコード更新、課金、デプロイ、チケット操作など外部世界へ副作用を起こすと、失敗時の復旧は単純な「undo」では成立しない。外部副作用の補償は、元操作とは別の新しい副作用であり、それ自体が権限、対象、前提状態、冪等性、監査証跡、実行結果の検証を必要とする。したがって運用上は「逆操作を呼んだ」ことではなく、補償後に期待する業務・システム状態が実際に成立したことをreadbackで確認して初めて復旧完了とみなす。

## なぜ通常のロールバックでは足りないか
データベース内の単一トランザクションと異なり、エージェントの仕事は複数サービス、キュー、人手承認、API、非同期ジョブをまたぐ。Microsoft AzureのCompensating TransactionパターンやAWSのSagaパターンが示す通り、分散処理では既に確定した各ステップを物理的に時間逆行させるのではなく、必要な補償処理を明示的に実行して整合する。補償の順序は元操作の単純な逆順とは限らず、補償自体も失敗し得る。

AIエージェントではさらに、元操作の成否が曖昧なままタイムアウトしたり、会話上の意図と実際の外部状態が食い違ったり、補償時点で権限・ポリシー・対象状態が変化したりする。このため「失敗したように見えるから逆操作する」は危険である。元操作が実は成功していた場合には二重処理になり、逆に元操作が未成立なら補償操作そのものが新しい誤変更になる。

## 運用契約
### 1. 元操作と補償操作のIDを分離する

元操作には安定した logical operation ID を持たせ、補償には別の recovery / compensation ID を発行する。補償記録から、どの元操作、対象、要求、承認、実行結果を受けて生成されたかを追跡できるようにする。補償を元操作の同一IDで上書きすると、監査時に「何が起き、何を後から行ったか」が失われる。

### 2. 曖昧な元結果を先に照合する

タイムアウト、接続断、部分応答などで元操作の結果がUNKNOWNなら、補償前に対象システムのauthoritative stateを照合する。APIレスポンス、エージェントの自己申告、トレースの終了表示だけを最終状態の証拠にしない。対象側の操作ID、レコード状態、課金状態、ジョブ状態など、業務結果に近いreadbackを優先する。

### 3. 補償時点の権限と前提状態を再検証する

元操作時に有効だった権限が、補償時にも有効とは限らない。補償直前に、現在の実行主体、回復用権限、対象identity、対象version/state、承認の有効期限、ポリシーversion、後続の正当な変更が存在しないかを再評価する。古い状態を前提にした補償で、新しい正当な変更を破壊してはならない。

### 4. 冪等性を補償側にも設計する

補償もネットワーク障害やワーカー再起動で再実行され得る。したがって「元操作が冪等だから安全」では足りず、補償操作自身に安定したidentity、重複検知、現在状態のprecondition、実行履歴を持たせる。再試行前には前回補償の結果を照合する。

### 5. 不可逆操作は偽のrollbackにしない

送信済みメール、外部公開、秘密情報の露出、第三者への通知、物理配送など、完全には取り消せない副作用がある。この場合は「ロールバック済み」と表現せず、containment、追加訂正、アクセス遮断、forward recovery、インシデント対応など、実際に可能な回復へ切り替える。補償不能性そのものを事前のapproval barrierや実行可否判定に利用する。

### 6. 終端状態を検証する

補償APIが200を返した、ワークフローがSUCCESSになった、エージェントが「元に戻しました」と報告した、という事実だけでは完了しない。対象レコード、外部サービス、依存ジョブ、派生状態をreadbackし、定義したterminal business/system stateに到達したことを確認する。確認できない場合はRECOVEREDではなくUNKNOWNとして残す。

## failure envelope
代表的な失敗は、元操作の成功を見落として補償を二重適用すること、補償時に失効した権限を再利用すること、対象が後続処理で更新済みなのに古いsnapshotへ戻すこと、補償ワーカーの再試行で同じ逆操作を重複実行すること、補償の一部だけ成功して全体を成功扱いすること、不可逆副作用を可逆と誤認すること、エージェントの会話ログだけを復旧証拠にすることである。

複数エージェントやsub-agentが関与する場合は、誰が元操作を所有し、誰が補償を要求でき、誰が現在の権限を再確認し、どのcomponentが終端状態を検証するかを明示する。所有権が曖昧なまま各agentが独自に補償すると、重複・競合・相互打消しが起こり得る。

## 実装・受入れ時に残す証拠
最低限、original operation ID、compensation ID、対象identity、元操作のauthoritative outcome、補償理由、補償前state/version、現在の回復権限とポリシーversion、承認情報、補償の冪等性キー、実行attempt、補償結果、終端readback、残存UNKNOWNを関連付ける。分散workflowでは各stepの補償可否、依存関係、順序、失敗時の再開地点も記録する。

受入れ試験では、元操作成功後の補償だけでなく、元結果UNKNOWN、補償途中のprocess death、補償の重複配送、権限失効、対象の同時更新、不可逆step混在を含める。WALやdurable workflow stateを用いる実装では、process restart後も同じoriginal/compensation identityと状態遷移を再構成できることを確認する。

## 適用境界とcounterevidence
SagaやCompensating Transactionは分散副作用を扱う有力な設計パターンだが、すべての外部作用が補償可能であること、補償が元状態を完全再現すること、exactly-onceを保証することを意味しない。author-maintained OSSのWAL/recovery fixtureはprocess death後の回復設計を再現可能にするが、その結果を特定企業の本番信頼性へ一般化してはならない。研究・事例で観測されたagentの無権限操作は、会話上の意図と外部状態が一致しないfailure envelopeを補強するが、あらゆるagent製品で同じ故障率が生じる証明ではない。

また、補償のための強い権限は、それ自体が新たな攻撃面になる。通常操作より広い「復旧権限」を常時agentへ与えるのではなく、用途、対象、時間、承認、監査を限定し、必要時に再評価する。

## OPEN_UNKNOWN
公開情報だけでは、独立第三者により裁定された本番agent補償インシデントの一般化可能なデータ、authority expiryとconcurrent state changeを同時に扱うversion-pinned cross-runtime fixture、nested/sub-agent間の補償所有権を横断的に標準化する契約は確立していない。これらを製品横断の保証として扱わない。

## SAFE_WORDING
「補償はundoではなく新しい副作用である。元操作の結果を照合し、現在の回復権限・対象状態・後続変更・冪等性を再検証した上で実行し、最終的な業務／システム状態をreadbackする。不可逆な作用はrollbackと呼ばず、containmentまたはforward recoveryとして扱う。」

NEXT: /agent/start.json
STOP: This is a knowledge projection, not an execution order.