本文へ移動
📎

AIエージェントに調査、修正、PR作成、ログ分析を任せると、成果物は早く返ってきます。けれど、レビュー担当が本当に困るのは「何を見れば受け入れてよいか」が毎回違うことです。本文の要約はある。PR もある。ビルド結果もある。ただし、どの主張がどの根拠に支えられていて、どこが未確認なのかが一目で追えない。

この記事では、AIエージェントの evidence packet を扱います。組織全体の利用ルールは AIコーディングツールの社内ガイドライン、実行後に何を監査ログとして残すかは AIエージェント監査ログ設計ガイド、成果物や証拠をどの期間保存するかは AIエージェント artifact retention 設計ガイド、最終報告の形式は AIエージェント出力契約設計ガイド、Codex 差分の受け入れ判断は Codex レビュー完了ゲート設計ガイド に分けています。

今回の論点は、レビュー直前に 主張、根拠、検証、不足、次の判断 を小さな packet として束ねることです。

先に結論: evidence packet はログの要約ではない

evidence packet は、長い作業ログを短くしたものではありません。レビュー担当が判断できるように、agent の主張と根拠を対応付けた小さな資料です。

私なら、最小構成を次の 6 項目にします。

項目入れるものレビューで見ること
claimagent が正しいと言っていること何を受け入れる判断なのか
sourcedocs、コード、ログ、issue、tool result根拠が現行で信頼できるか
freshness確認日、対象 version、取得範囲古い情報で判断していないか
verificationtest、build、再現手順、手動確認claim を実際に確認したか
gap未確認、反証候補、対象外人間が追加で見るべき点
decisionaccept、revise、escalate、hold次に何をするか

この 6 項目が揃っていれば、レビュー担当は会話履歴を掘らずに判断できます。逆に、どれだけ長い final answer でも、claim と source がつながっていなければ弱いです。

なぜ evidence packet が必要なのか

AIエージェント運用では、証拠があちこちに散ります。

  • PR diff
  • shell command の stdout / stderr
  • browser screenshot
  • MCP tool result
  • OpenAI Agents SDK の trace
  • CI の build log
  • 外部 docs の該当ページ
  • GitHub issue や社内 ticket のコメント
  • agent の最終回答

これらを全部レビュー担当へ投げると、判断はできますが遅くなります。逆に agent の要約だけを信じると、前提違いに気付けません。

OpenAI Agents SDK の tracing は、agent run の LLM generation、tool call、handoff、guardrail などを trace / span として扱えます。OpenTelemetry の GenAI observability も、モデル呼び出し、token、tool call、tool result を観測対象として整理しています。つまり、根拠となる raw signal は増えています。

ただし、raw signal が増えるほど、レビュー前に束ねる単位が必要になります。evidence packet は、観測ログそのものではなく、判断に必要な証拠だけを取り出した review surface です。

audit log、artifact、output contract と分ける

evidence packet が曖昧になる原因は、近い概念を混ぜることです。

近い概念主な目的evidence packet との違い
audit log後から何が起きたかを説明するすべての操作証跡ではなく、判断に使う根拠だけを束ねる
artifact retention何をどの期間保存するかを決める保存方針ではなく、レビュー時点の提示単位を決める
output contract最終回答の形を固定するfinal answer 全体ではなく、claim と evidence の対応を固定する
review gate受け入れるか落とすかを見るgate に渡す入力として evidence packet を用意する

この分担を決めると、記事や実装 PR のレビューがかなり楽になります。audit log には run_id と tool_call_id を残す。artifact store には検証結果や screenshot を置く。final answer には要約を書く。そのうえで、review gate へ渡す evidence packet には、判断に必要な claim だけを載せます。

claim を先に分解する

evidence packet で最初にやるべきことは、根拠集めではありません。agent の主張を分解することです。

悪い例はこうです。

実装しました。公式 docs に沿っています。build も通っています。

これでは、どの主張がどの根拠に支えられているのか分かりません。

良い packet は、主張を小さくします。

evidence_packet:
  subject: "billing webhook retry fix"
  claims:
    - id: "claim-1"
      statement: "retry count が 0 のときだけ webhook が再送されない"
      sources:
        - type: "failing_test"
          path: "tests/billing/webhook-retry.test.ts"
          line_hint: "retry_count_zero"
      verification:
        - command: "pnpm test tests/billing/webhook-retry.test.ts"
          result: "passed"
      gap: "production queue metrics は未確認"
      decision: "accept_with_monitoring"

ここで重要なのは、claim を「作業完了」ではなく「レビュー可能な単位」にすることです。

source には種類と信頼度を持たせる

source は URL や file path の羅列では足りません。最低限、種類と信頼度を分けます。

source type例扱い
primary_doc公式 docs、仕様、リリースノート仕様判断の優先根拠にする
repo_evidence既存コード、test、設定、AGENTS.mdこの repo での挙動判断に使う
runtime_logCI、build、production log、trace実際に起きたことの根拠にする
community_noteissue、discussion、ブログ補助情報に留める
model_summaryagent の要約source ではなく pointer として扱う

特に AIエージェント運用では、model summary を source にしない方が安全です。要約は便利ですが、根拠ではありません。要約の背後にある file、log、trace、docs を packet に入れます。

外部情報を使う場合は、freshness も一緒に置きます。

source:
  type: "primary_doc"
  url: "https://openai.github.io/openai-agents-python/tracing/"
  checked_at: "2026-08-18"
  target: "Agents SDK tracing"
  used_for: "tool call, handoff, guardrail を trace に含める前提"
  limitation: "自社の PR evidence 保存方針までは定義しない"

「公式 docs を見た」だけでは弱いです。いつ、どの対象に、何の判断で使ったのかを残します。

verification は claim ごとに置く

検証結果を最後にまとめて書くと、レビュー担当はどの主張を検証したのか分からなくなります。

verification:
  - command: "pnpm run build"
    result: "passed"

これだけでは、build が通ったことは分かります。しかし、今回の claim が security boundary、MCP scope、外部 API の idempotency なら、build だけでは検証になりません。

私なら、claim ごとに verification を置きます。

claimverification
route guard が効く認可 test、手動 403 確認
docs の仕様に合う公式 docs の対象 version、該当 section
MCP tool result が schema に合うoutputSchema validation、negative case
secret が出力されないredaction test、artifact 確認
UI が崩れていないscreenshot、主要 viewport、console error

OpenAI Agents SDK の guardrails は、tool 入力や出力の検査、tripwire による停止を扱えます。ただし guardrail があることと、今回の claim が検証済みであることは別です。evidence packet では、guardrail の存在を source にし、実際に通った検証を verification に分けます。

gap を隠さない

AIエージェントの完了報告で一番危ないのは、未確認事項が消えることです。

良い evidence packet は、弱い点を隠しません。

gaps:
  - id: "gap-1"
    type: "runtime_unverified"
    detail: "production webhook queue の実データでは未確認"
    impact: "edge case が残る可能性"
    next_action: "deploy 前に dashboard で 24h error rate を確認"

gap は失敗ではありません。レビュー判断に必要な残り作業です。

OWASP の AI Agent Security Cheat Sheet は、agent の判断、tool call、結果、監査証跡、承認、policy version などを構造化して残すことを推奨しています。実務では、この「残す」を evidence packet へそのまま詰めるのではなく、レビューで見る gap に変換する方が使いやすいです。

handoff と escalation では packet を短くする

agent 間の handoff や人間エスカレーションでは、packet を大きくしすぎると逆効果です。

OpenAI Agents SDK の handoff は、専門 agent へ処理を渡す仕組みで、handoff input に reason や priority のような小さな metadata を持たせられます。ここに全文ログを載せるより、次の agent が判断する claim だけ渡した方が安全です。

私なら、handoff 用 packet は次の 5 つまでに絞ります。

handoff_evidence_packet:
  task: "investigate failing checkout test"
  current_claim: "failure is isolated to tax rounding"
  strongest_source: "tests/checkout/tax.test.ts"
  verification_done:
    - "pnpm test tests/checkout/tax.test.ts failed before fix"
    - "pnpm test tests/checkout/tax.test.ts passed after fix"
  unresolved_gap: "EU VAT fixture は未確認"

handoff は百科事典ではありません。次の agent や人間が最初に見るべき根拠だけを渡します。

実務テンプレート

最初は、次のテンプレートで十分です。

evidence_packet:
  run_id: "agent-run-20260818-001"
  owner: "platform-ai"
  subject: "PR review for billing retry fix"
  data_class: "internal"
  claims:
    - id: "claim-1"
      statement: "retry count 0 の webhook が再送されるようになった"
      sources:
        - type: "repo_evidence"
          ref: "tests/billing/webhook-retry.test.ts"
          checked_at: "2026-08-18"
          used_for: "failure reproduction and regression check"
      verification:
        - type: "test"
          command: "pnpm test tests/billing/webhook-retry.test.ts"
          result: "passed"
      gaps:
        - "production queue metrics は未確認"
      decision_hint: "accept_after_runtime_dashboard_check"
  packet_status: "ready_for_review"

これを毎回巨大な JSON schema にする必要はありません。PR 本文、ticket comment、artifact store の metadata、agent final answer の一部、どこに置いてもかまいません。重要なのは、claim と source と verification が離れないことです。

よくある失敗

1. source を agent の final answer にする

final answer は source ではありません。source は docs、code、log、trace、tool result です。final answer は、それらを人間へ渡す表示面です。

2. freshness を書かない

AI ツールや MCP 仕様は更新が早いです。公式 docs でも確認日と対象 version を入れないと、数週間後に同じ判断を再利用してよいか分かりません。

3. build 成功を万能の検証にする

build は必要ですが、security、権限、データ境界、MCP scope、外部副作用の検証にはなりません。claim に対して適切な verification を置きます。

4. gap を「注意点」に丸める

注意点ではなく、次の判断に使える gap にします。誰が、何を見れば、accept / revise / hold に進めるのかを書く方がよいです。

5. packet を保存方針にしてしまう

evidence packet はレビュー入力です。保存期間、削除条件、incident hold は artifact retention 側で決めます。

導入手順

まず全 agent に完璧な packet を義務化する必要はありません。壊れやすい作業から始めます。

  1. PR 作成、外部 write、MCP write、security fix だけを対象にする。GitHub 上での通常レビュー導線は Codex code review 実践ガイド や Claude Code code review 実践ガイド と分け、evidence packet 自体はその前段の判断材料に留める
  2. final answer に claims / sources / verification / gaps / decision_hint を必須にする
  3. source.type を primary_doc / repo_evidence / runtime_log / community_note に分ける
  4. build や test を claim ごとの verification に移す
  5. gap がある場合は ready_for_review ではなく needs_human_decision にする
  6. 1か月後に、レビュー差し戻し理由を packet template へ戻す

この順番なら、運用負荷を増やしすぎずに始められます。

まとめ

AIエージェント evidence packet は、ログ保存でも、最終報告テンプレでもありません。レビュー前に、agent の主張、参照元、freshness、検証、未確認事項、次の判断を束ねるための小さな運用単位です。

私なら、まず PR 作成や MCP write のような高リスク作業だけに導入します。final answer を「やりました」で終わらせず、claim と source と verification を対応付ける。gap を隠さず、review gate へ渡す。ここまでできると、AIエージェントの成果物は「速いが怖いもの」ではなく、レビュー可能な作業単位になります。

参考資料

WRITTEN BY nidoneko

Full-stack engineer with 8+ years of experience in TypeScript, React, Node.js, and cloud-native development across healthcare, finance, HR, and IoT domains.

View Profile →