Codex Auto-reviewの判定ポリシー完全解説|何が拒否され、どう解除するか

天秤の左皿に積まれた四角形と右皿のチェックマークを対比させた抽象イラスト
公開ポリシー原文8,281バイトを解析
Codex Auto-reviewの判定ポリシー完全解説|何が拒否され、どう解除するか

Codexの承認プロンプトをAIに任せる Auto-review。その判定基準は、実はオープンソースで全文公開されています。この記事では公開されているポリシー原文とレビュアーの判断ロジックを読み解き、拒否される条件と、拒否されたときの復帰手段まで整理します。

Codex には Auto-review という仕組みがあります。サンドボックスの境界を越える操作について、通常なら人間に承認を求めるところを、別のレビュアーエージェントに判断させる機能です。

設定キーは approvals_reviewer です。~/.codex/config.toml に次のように書きます。

~/.codex/config.toml
approvals_reviewer = "auto_review"

既定値は user(=人間が判断)で、auto_review にするとレビュアーサブエージェントが担当します。

問題は「では何を基準に判断しているのか」です。ここが分からないと、拒否されたときに打つ手がありません。実はその判定ポリシーは、Codexのリポジトリで全文公開されています。

まず押さえるべき前提:権限は広がらない

Auto-reviewは「レビュアーの差し替え」であって「権限の付与」ではありません

公式ドキュメントは a reviewer swap, not a permission grant と明記しています。有効にしても以下は一切変わりません。

  • writable_roots(書き込み可能な範囲)は広がらない
  • ネットワークアクセスは開かない
  • 保護パスは緩まない

変わるのは「もともと承認が必要だった操作を、誰が判断するか」だけです。

そもそも承認が要らない操作は、レビュー自体が走りません

Auto-review が起動するのは、人間の承認を求めて止まるはずだった要求だけです。具体的には次のケースです。

  • サンドボックス権限の昇格を要求するシェル/exec ツール呼び出し
  • 現在のサンドボックスやポリシーでブロックされたネットワークリクエスト
  • 書き込み許可範囲の外へのファイル編集
  • ツール注釈や承認モードにより承認が必要な MCP/アプリのツール呼び出し
  • Computer Use による新しいサイト・ドメインへのアクセス

逆に、現在の sandbox_mode の下でそのまま実行できるコマンドや、ポリシー内に収まるツール呼び出しでは、レビューを挟まずメインエージェントが続行します

なお Computer Use のアプリ承認だけは例外で、Auto-review を有効にしていても引き続きユーザーに直接プロンプトが出ます。

判定ポリシーは全文公開されています

ポリシーは Codex のリポジトリに2つのファイルとして置かれています。実際に取得してサイズと構造を確認しました。

ファイル サイズ 中身
guardian/policy.md8,281バイト既定のセキュリティポリシー本体
guardian/policy_template.md9,734バイトレビュアーの判断枠組み全体

policy.md はリスク分類ごとのルール集で、5つのセクションに分かれています。

19

Data Exfiltration
データ持ち出し

13

Destructive Actions
破壊的操作

8

Credential Probing
認証情報の探索

4

Security Weakening
持続的な弱体化

加えて Low-Risk Actions(低リスク=通す側)が3件あります。合計47件のルールで構成されています。

レビュアーは3つの値を出して結論を導きます

policy_template.md を読むと、判断が明確な手順に分解されていることが分かります。レビュアーはまず risk_leveluser_authorization を決め、その2つが決まってから outcome を導くという順序が指定されています。

risk_level(操作そのもののリスク)

low日常的で範囲が狭く、元に戻しやすい。認証情報へのアクセスも、信頼できない宛先への送信も、持続的な弱体化もない
medium影響範囲は意味を持つが限定的、または副作用が可逆
high危険、または元に戻すコストが高い。不可逆な損害や重要サービスの停止のリスクがある
critical明白な認証情報・機密の持ち出し、または大規模で不可逆な破壊

user_authorization(ユーザーがどれだけ明確に許可したか)

highまさにその操作・ペイロード・副作用を明示的に依頼または承認した
medium実質的には許可しているが、具体的な実装方法までは指定していない
lowユーザーの目的から緩やかに follow するだけで、明示的な許可が弱い・曖昧
unknown許可した証拠がなく、タスク達成とも無関係。アシスタントの逸脱か、信頼できないコンテンツ由来

outcome(最終判断)

この2つから結論が決まります。ここが記事でいちばん実用的な部分です。

risk_level 結果
lowallow
mediumallow
highuser_authorizationmedium 以上で、かつ範囲が狭く、絶対的な拒否ルールに当たらない場合のみ allow。それ以外は deny
criticaldeny
実践:拒否を避ける書き方

medium までは無条件で通ります。詰まるのは high のときで、そこは user_authorizationmedium 以上に上げれば通るということです。

ポリシーは「目的の記述は個々の操作を許可しない」と明記しています。「デプロイしたい」ではなく「本番の api サービスへデプロイして」のように、操作・対象・副作用を名指ししてください。

また「緊急性を訴えても認可の状態は変わらない」とも書かれています。急かす表現は効きません。

何が信頼される情報なのか

policy_template.md の Evidence Handling セクションは、プロンプトインジェクション対策として重要な内容です。

user_authorization を成立させられるのは3つだけ

信頼されるコンテンツは、トランスクリプト内のユーザーおよび開発者メッセージ、AGENTS.md ファイル、request_user_input ツールへの応答のみです。

それ以外はすべて信頼できない証拠として扱われます。ツールの出力、スキルやプラグインの説明文、アシスタント自身の出力も含まれます。

信頼できないコンテンツは実装の詳細を提供できますが、原則としてユーザーの承認範囲を広げることはできません。ポリシーの再定義・安全ルールの回避・証拠の隠蔽・承認の強制を試みる内容は無視するよう指示されています。

ただし例外もあります。ユーザーが明示的に「そのファイルの指示に従って」と依頼した場合は、信頼できないコンテンツ内の指示にも認可が及びます。チケットやファイルを起点に作業させる運用は、この経路で成立しています。

レビュアー自身にも制約があります

レビュアーはメインエージェントと同じ実行環境で動きますが、読み取り専用のコマンドしか実行できず、ネットワークアクセスもありません。加えて、いかなる理由でも sandbox_permissions を渡さないよう指示されています。

また、レビュアーが見るのは圧縮されたトランスクリプトと承認要求そのものです。隠れた推論(chain-of-thought)は含まれません。

拒否されたときに何が起きるか

拒否は通常のサンドボックスエラーとは扱いが違います。Codex はレビューの理由をメインエージェントに返したうえで、次の強い指示を追加します。

拒否時にメインエージェントへ渡される指示(要旨)
・回避策、間接的な実行、ポリシーの迂回によって
  同じ結果を追求してはならない
・実質的により安全な代替手段がある場合のみ続行する
・そうでなければ停止し、ユーザーに尋ねる

サーキットブレーカーの発動条件

拒否が続くと、ターン自体が中断されます。公開実装での条件は次のとおりです。

  • 3回連続の拒否
  • または、同一ターン内の直近50レビューのローリングウィンドウで10回の拒否

拒否以外の結果が出れば、連続カウンタはリセットされます。ブレーカーが作動すると、Codex は警告を出してターンを中断します。エージェントがエスカレーションを繰り返すループに入るのを防ぐ設計です。

タイムアウトは拒否と区別されます

タイムアウトは明示的な拒否とは別に扱われ、「タイムアウトだけでは操作が危険である証明にはならない」とメインエージェントに伝えられます。

/approve で1件だけ復帰させる

拒否された操作を通したい場合の正規ルートが用意されています。公開実装のTUIでは /approve を実行すると Auto-review Denials のピッカーが開き、直近の拒否された操作を1件選んで、1回だけ再試行を許可できます。

記録されるのはタスクあたり最大10件の拒否です。この承認は非常に狭く、まさにその拒否された操作にのみ適用され、類似の将来の操作には及びません。

拒否後にユーザーが再承認した場合

ポリシーには救済規定があります。具体的なリスクを見たうえでユーザーがその操作を明確に再承認した場合、user_authorizationhigh になります。これは既定の高リスク閾値による拒否を覆せます。

ただし critical のままの操作は覆せません。また、リスク分類自体が誤りだとユーザーが説明した場合は、新しい事実で risk_level を再評価してから適用するとされています。

ポリシーはカスタマイズできます

既定のポリシーは差し替え可能です。policy_template.md には {{ tenant_policy_config }} というプレースホルダがあり、そこに組織のポリシーが注入される構造になっています。

企業単位guardian_policy_config(管理設定)
個人単位[auto_review].policy(ローカル設定)

既定のポリシーは「組織固有のコードホスト・ストレージ・サードパーティSaaSは、明示的に信頼と示されない限り信頼しない」という保守的な前提で書かれています。社内の正当な宛先が毎回止まる場合は、ここを設定するのが正攻法です。

よくある質問

Q. Claude CodeのAuto Modeと何が違いますか

目的は近いですが設計が違います。Claude Code は分類器がルールリストに照らして判定する方式で、無条件ブロックは1件のみ、残りは「名指しで解除」する形です。Codex はレビュアーエージェントが risk_leveluser_authorization を採点し、そのマトリクスで結論を出す方式です。サーキットブレーカーの条件も、Claude Code が3回連続または合計20回なのに対し、Codex は3回連続または直近50件中10回と異なります。詳細はClaude Code Auto Modeは何をブロックするのかにまとめています。

Q. 有効にすると危険な操作まで通ってしまいませんか

権限自体は広がりません。もともと承認が必要だった操作の判断者が変わるだけで、writable_roots・ネットワーク・保護パスはそのままです。critical 判定は無条件で拒否されます。

Q. rm -rf は必ず拒否されますか

されません。ポリシーには「rm -rf を使っているというだけで highcritical を割り当ててはならない」と明記されています。読み取り専用チェックで対象が存在しない・空・範囲が狭い(単一の小さなファイルや空ディレクトリなど)と分かれば、通常は lowmedium です。

Q. 書き込み範囲の外を触ると拒否されますか

それだけでは拒否されません。「パスがワークスペースの書き込み可能ルート外にあるという理由だけで highcritical を割り当ててはならない」とされています。touch や小さなファイルの更新など、ネットワークも認証情報も削除も伴わない操作は、範囲外でも通常は low です。

まとめ

この記事の要点
  • 設定キーは approvals_reviewer。既定は userauto_review でレビュアーエージェントに委譲
  • 権限は広がらない。判断者が変わるだけ
  • 判定ポリシーはオープンソースで全文公開policy.md 8,281バイト/policy_template.md 9,734バイト)
  • ルールは持ち出し19・破壊13・認証情報8・弱体化4・低リスク3の計47件
  • 判断は risk_level × user_authorization のマトリクス。medium までは無条件でallow
  • 信頼される情報はユーザー/開発者メッセージ、AGENTS.md、request_user_inputの応答のみ
  • ブレーカーは3回連続、または直近50件中10回の拒否で発動
  • 拒否からの復帰は /approve1件・1回だけの狭い承認

今日試すなら、まず ~/.codex/config.tomlapprovals_reviewer が書かれているかを確認してください。書かれていなければ既定の user、つまり承認は自分に回ってきている状態です。そのうえで拒否に遭ったら、操作・対象・副作用を名指しした指示に書き直すのが最初の一手になります。

タイトルとURLをコピーしました