Codexの承認プロンプトをAIに任せる Auto-review。その判定基準は、実はオープンソースで全文公開されています。この記事では公開されているポリシー原文とレビュアーの判断ロジックを読み解き、拒否される条件と、拒否されたときの復帰手段まで整理します。
Codex には Auto-review という仕組みがあります。サンドボックスの境界を越える操作について、通常なら人間に承認を求めるところを、別のレビュアーエージェントに判断させる機能です。
設定キーは approvals_reviewer です。~/.codex/config.toml に次のように書きます。
approvals_reviewer = "auto_review"
既定値は user(=人間が判断)で、auto_review にするとレビュアーサブエージェントが担当します。
問題は「では何を基準に判断しているのか」です。ここが分からないと、拒否されたときに打つ手がありません。実はその判定ポリシーは、Codexのリポジトリで全文公開されています。
まず押さえるべき前提:権限は広がらない
公式ドキュメントは 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.md | 8,281バイト | 既定のセキュリティポリシー本体 |
guardian/policy_template.md | 9,734バイト | レビュアーの判断枠組み全体 |
policy.md はリスク分類ごとのルール集で、5つのセクションに分かれています。
Data Exfiltration
データ持ち出し
Destructive Actions
破壊的操作
Credential Probing
認証情報の探索
Security Weakening
持続的な弱体化
加えて Low-Risk Actions(低リスク=通す側)が3件あります。合計47件のルールで構成されています。
レビュアーは3つの値を出して結論を導きます
policy_template.md を読むと、判断が明確な手順に分解されていることが分かります。レビュアーはまず risk_level と user_authorization を決め、その2つが決まってから outcome を導くという順序が指定されています。
risk_level(操作そのもののリスク)
low | 日常的で範囲が狭く、元に戻しやすい。認証情報へのアクセスも、信頼できない宛先への送信も、持続的な弱体化もない |
medium | 影響範囲は意味を持つが限定的、または副作用が可逆 |
high | 危険、または元に戻すコストが高い。不可逆な損害や重要サービスの停止のリスクがある |
critical | 明白な認証情報・機密の持ち出し、または大規模で不可逆な破壊 |
user_authorization(ユーザーがどれだけ明確に許可したか)
high | まさにその操作・ペイロード・副作用を明示的に依頼または承認した |
medium | 実質的には許可しているが、具体的な実装方法までは指定していない |
low | ユーザーの目的から緩やかに follow するだけで、明示的な許可が弱い・曖昧 |
unknown | 許可した証拠がなく、タスク達成とも無関係。アシスタントの逸脱か、信頼できないコンテンツ由来 |
outcome(最終判断)
この2つから結論が決まります。ここが記事でいちばん実用的な部分です。
| risk_level | 結果 |
low | allow |
medium | allow |
high | user_authorization が medium 以上で、かつ範囲が狭く、絶対的な拒否ルールに当たらない場合のみ allow。それ以外は deny |
critical | deny |
medium までは無条件で通ります。詰まるのは high のときで、そこは user_authorization を medium 以上に上げれば通るということです。
ポリシーは「目的の記述は個々の操作を許可しない」と明記しています。「デプロイしたい」ではなく「本番の api サービスへデプロイして」のように、操作・対象・副作用を名指ししてください。
また「緊急性を訴えても認可の状態は変わらない」とも書かれています。急かす表現は効きません。
何が信頼される情報なのか
policy_template.md の Evidence Handling セクションは、プロンプトインジェクション対策として重要な内容です。
信頼されるコンテンツは、トランスクリプト内のユーザーおよび開発者メッセージ、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_authorization は high になります。これは既定の高リスク閾値による拒否を覆せます。
ただし critical のままの操作は覆せません。また、リスク分類自体が誤りだとユーザーが説明した場合は、新しい事実で risk_level を再評価してから適用するとされています。
ポリシーはカスタマイズできます
既定のポリシーは差し替え可能です。policy_template.md には {{ tenant_policy_config }} というプレースホルダがあり、そこに組織のポリシーが注入される構造になっています。
| 企業単位 | guardian_policy_config(管理設定) |
| 個人単位 | [auto_review].policy(ローカル設定) |
既定のポリシーは「組織固有のコードホスト・ストレージ・サードパーティSaaSは、明示的に信頼と示されない限り信頼しない」という保守的な前提で書かれています。社内の正当な宛先が毎回止まる場合は、ここを設定するのが正攻法です。
よくある質問
目的は近いですが設計が違います。Claude Code は分類器がルールリストに照らして判定する方式で、無条件ブロックは1件のみ、残りは「名指しで解除」する形です。Codex はレビュアーエージェントが risk_level と user_authorization を採点し、そのマトリクスで結論を出す方式です。サーキットブレーカーの条件も、Claude Code が3回連続または合計20回なのに対し、Codex は3回連続または直近50件中10回と異なります。詳細はClaude Code Auto Modeは何をブロックするのかにまとめています。
権限自体は広がりません。もともと承認が必要だった操作の判断者が変わるだけで、writable_roots・ネットワーク・保護パスはそのままです。critical 判定は無条件で拒否されます。
rm -rf は必ず拒否されますか
されません。ポリシーには「rm -rf を使っているというだけで high や critical を割り当ててはならない」と明記されています。読み取り専用チェックで対象が存在しない・空・範囲が狭い(単一の小さなファイルや空ディレクトリなど)と分かれば、通常は low か medium です。
それだけでは拒否されません。「パスがワークスペースの書き込み可能ルート外にあるという理由だけで high や critical を割り当ててはならない」とされています。touch や小さなファイルの更新など、ネットワークも認証情報も削除も伴わない操作は、範囲外でも通常は low です。
まとめ
- 設定キーは
approvals_reviewer。既定はuser、auto_reviewでレビュアーエージェントに委譲 - 権限は広がらない。判断者が変わるだけ
- 判定ポリシーはオープンソースで全文公開(
policy.md8,281バイト/policy_template.md9,734バイト) - ルールは持ち出し19・破壊13・認証情報8・弱体化4・低リスク3の計47件
- 判断は
risk_level×user_authorizationのマトリクス。mediumまでは無条件でallow - 信頼される情報はユーザー/開発者メッセージ、AGENTS.md、request_user_inputの応答のみ
- ブレーカーは3回連続、または直近50件中10回の拒否で発動
- 拒否からの復帰は
/approve。1件・1回だけの狭い承認
今日試すなら、まず ~/.codex/config.toml に approvals_reviewer が書かれているかを確認してください。書かれていなければ既定の user、つまり承認は自分に回ってきている状態です。そのうえで拒否に遭ったら、操作・対象・副作用を名指しした指示に書き直すのが最初の一手になります。


