AIエージェント開発・運用の事故録 #01
AIレビューを、
安心の儀式にしない
レビュー予算・停止条件・再レビューGateの設計
公開日:2026年8月25日 著者:飯田 友広(Tomohiro Iida)
この記事の結論
AIレビューには、対象範囲、リスク分類、1差分あたりの予算、再実行条件、停止条件を先に決めます。
「不安が消えたら終わり」は停止条件になりません。回数上限に達したら自動実行を止め、人間判断へ渡します。
機械検査のPASSとリスク分類はレビュー需要の算出にとどめ、実行許可とは別レイヤーへ置きます。
同じ指摘を毎回人が読まないよう、指摘をtest・CI・Gateへ移します。
観測できない予算を推測で埋めず、UNOBSERVABLEとして記録します。
AIによるコードレビューを工程へ足すと、レビューを通した差分は安全になったように見えます。
ところが、レビューの対象範囲、強度の決め方、1差分あたりの上限、再実行の条件、終了条件を決めていない場合、レビューは品質の検査ではなく、不安を薄めるための儀式になります。
Netsujoでも、同じ差分へレビューを重ね、同種の指摘を人が毎回読み直す状態が発生しました。
結論は次のとおりです。
AIレビューには、レビュー対象の範囲、リスク分類、1差分あたりの予算、再レビュー条件、停止条件を先に決めます。
そして、機械検査のPASSとリスク分類は「どれだけレビューが必要か」を算出するだけにとどめ、実行してよいかどうかの許可とは別レイヤーに置きます。
本記事が扱うのは、レビュー予算、停止条件、再レビューGateという設計側です。レビューを何回まで回すか、どこで終えるか、指摘をどこへ移すかを、感覚ではなく数値と条件で決めます。
Incident Card
INCIDENT:
同じ差分に対するAIレビューへ、範囲・回数・費用・停止条件の定義がないまま運用していた
SYMPTOM:
レビューを繰り返しても指摘が収束せず、同種の指摘を人が毎回読み直していた
FALSE_ASSUMPTION:
レビュー回数を増やすほど品質は上がるので、レビューは多いほど安全である
ROOT_CAUSE:
レビュー対象の範囲、強度の決め方、1差分あたりの上限、再実行の条件、終了条件が実装されていなかった
IMMEDIATE_FIX:
1差分あたりの自動レビュー回数へ上限を置き、上限に達したら自動実行せず人間判断へ渡す
SYSTEM_FIX:
レビュー要求の算出(機械検査・リスク分類)と、実行許可(runtime status・予算・owner認可)を別レイヤーへ分離する
REMAINING_RISK:
上限内でも指摘の質は保証されず、レビュー予算の消費telemetryを観測できない場合があるレビューを重ねても、指摘は収束しなかった
観測できた事実は次のとおりです。
- 差分ごとにAIレビューを回す運用を始めた
- 同じ差分へ再レビューを重ねると、前回と同種の指摘が再び返ってきた
- 指摘はテキストとして残るが、次の差分へ自動では効かず、人が毎回読み直していた
- レビュー1回あたりの待ち時間と費用が積み上がった
- 「レビューを通した」ことが安心材料になり、通したあとに何が保証されたのかを説明できなかった
削減率や工数の定量比較は未計測です。この記事で確認できるのは、回数上限・対象範囲・停止条件をリポジトリ上の実装として持っている状態までです。
誤った前提:レビューは多いほど安全である
レビューは無料ではありません。時間、費用、待ち時間、そして人の注意力という有限資源を消費します。
回数上限のないレビューは、実質的に「終了条件が存在しない」ことと同じです。終了の判断を人の感覚へ委ねると、条件は「不安が消えたら」になります。これは条件ではありません。同じ差分へ何度でも回せてしまいます。
もう一つの誤りは、レビューの出力を保証と読むことです。レビューが返すのは指摘であって、正しさの証明ではありません。
根本原因:レビュー要求と実行許可が同じ層にあった
最初の設計では、機械検査がPASSしたら自動でレビューを呼んでいました。この形では「検査PASS=実行許可」になります。
現在のリポジトリでは、この2つを明示的に分離しています。scripts/quality/run-quality-gate.mjsの冒頭には、機械検査とリスク分類はレビュー需要を計算するだけであり、runtime実行を許可しないと書かれています。
.quality/codex-review-policy.jsonにも同じ規則が入っています。
executionAuthorization:
source: .claude/agent-os/vendor/runtime-tools.json
rule: classification_or_machine_check_pass_never_authorizes_runtime_execution
missingTelemetry: unknown_not_inventedレビューが必要かどうかと、いま実行してよいかどうかは、別の問いです。前者は差分から計算できます。後者はruntimeの状態、予算、認可に依存します。
その場の対処:1差分あたりの回数上限を置いた
まず、自動レビューを何回まで回してよいかを決めました。判定はscripts/quality/prepare-codex-review.mjsのdecideCodexEligibilityに集約されています。残っている門は3つだけです。
if レビュー対象の変更ファイルが0件:
NOT_ELIGIBLE
if 機械検査が未実施:
NOT_ELIGIBLE # 先に quality gate を PASS させる
if 機械検査が FAIL:
NOT_ELIGIBLE # 直してから再実行する
if reviewCount >= maxReviewsPerPullRequest:
NOT_ELIGIBLE # 以降は自動実行せず人間判断
else:
ELIGIBLEmaxReviewsPerPullRequestは.quality/codex-review-policy.jsonで3です。
ただし、この3はレビュー需要を算出するbundle準備側のループ上限です。同じファイルのlimitsNotesは、この値を「bundle準備のために残している需要ループの歯止め」と説明し、実行してよいかどうかは別レイヤーが持つと明記しています。実行可否は.claude/agent-os/vendor/runtime-tools.jsonにあるruntimeの可用性と予算が決めます。上限値と実行許可を同じ層に置かないことが、この設計の要点です。
差分の大きさでは止めていません。サイズ上限で止めると、大きい差分ほどレビューされないという逆転が起きるためです。代わりにlargeDiffFiles(25ファイル)とlargeDiffChangedLines(800行)を助言値として持ち、超えた場合は「分割したほうが指摘精度は上がる」と警告だけ返します。
仕組みへの変換:レビューを5つの層へ分ける
レビューを一つの塊として扱うと、上限も停止条件も置けません。次の5層へ分けます。
| 層 | 決めること | 実装 |
|---|---|---|
| review scope | 何をレビュー対象へ含めるか | .quality/codex-review-policy.jsonのexclude |
| risk classification | 推論強度をどこまで上げるか | scripts/quality/classify-change-risk.mjs |
| review budget | 1差分あたりの回数・文脈量・出力量 | 同policyのlimitsとcontext |
| rerun条件 | どういうときに再レビューするか | scripts/quality/prepare-codex-review.mjs |
| exit condition | いつ終えるか | 上限到達で自動実行を止め、人間判断へ渡す |
review scope:読ませないものを先に決める
対象範囲は「何を読ませるか」ではなく「何を読ませないか」から決めます。policyのexclude.pathsには.next/**、node_modules/**、coverage/**、**/*.min.js、**/*.map、画像やフォントなどのバイナリが並びます。除外したファイルは件数だけ報告します。
package-lock.jsonはmanifestOnlyとして扱います。全文は渡しませんが、依存変更のシグナルとしては数えます。
渡すのは差分限定のbundleだけです。リポジトリ全体を探索させると、入力量が差分と無関係に膨らみ、予算の見積りが成立しません。
risk classification:判断不能を安全側へ倒す
classify-change-risk.mjsはファイル単位でリスクを割り当てます。設計上重要な点は2つです。
- テストファイルはHighパターンへ一致してもMedium止まりにします。本番挙動を直接変えないためです。本番コードが同時に変わっていれば、そちらの判定でHighになります。
- ルールに一致しないファイルはLowへ落とさずMediumにします。判断できないことを、安全だと読み替えません。
分類の用途は推論強度の選択です。reasoning.highCategoriesにはauth、billing、db-schema、data-destruction、customer-data、env-deploy、signal-diagnosis、infrastructureの8カテゴリが入っています。それ以外はmediumです。
review budget:入力量と出力量の両方へ上限を置く
回数だけを絞っても、1回あたりの入出力が青天井なら費用は止まりません。policyは両側へ上限を持ちます。
| 種別 | 設定名 | 値 |
|---|---|---|
| 回数 | maxReviewsPerPullRequest | 3 |
| 指摘件数 | maxFindings | 5 |
| 出力語数 | maxOutputWords | 1200 |
| 文脈行数 | maxTotalContextLines | 2000 |
出力側へ上限を置く理由は費用だけではありません。指摘が数十件返ると、人は上から順に読んで疲れます。指摘件数の上限は、読む側の予算でもあります。
rerun条件:再レビューの入口を1つに固定する
再レビューは「気になったから」では起動しません。起動条件は次に固定します。
- レビュー対象の変更が存在する
- 機械検査が実施済みでPASSしている
- この差分の自動レビュー回数が上限未満である
機械検査がFAILしている状態でレビューを回すと、機械で判定できる問題をAIに読ませることになります。順序は逆にしません。
exit condition:終わり方を先に書く
停止条件は次の3つだけです。
EXIT_1: レビュー対象の変更が無い
EXIT_2: 自動レビュー回数が上限(3回)に到達した → 以降は人間判断
EXIT_3: 実行許可が無い(runtime status / 予算 / owner認可)「指摘が0件になったら終わり」も停止条件にはしません。0件は観点の外に問題が無いことの証明ではないためです。終了は回数と状態で決めます。
指摘をtest・CI・Gateへ移す
レビュー予算を守る最大の方法は、同じ指摘を二度と人へ届かせないことです。指摘は性質ごとに移し先が違います。
| 指摘の性質 | 移し先 | 例 |
|---|---|---|
| 機械で真偽を判定できる | test / check script | 禁止クラス、canonical、表記規則 |
| 変更してよい範囲の逸脱 | Gate | 対象パス外の編集、共有台帳への書き込み |
| 状態の取り違え | Controller | PR state、SHA一致、deploy対象 |
| 設計判断・優先順位 | 人間 | 何を作るか、どこまで作るか |
レビューの価値は、指摘を出したことではなく、その指摘が次から機械側で止まる状態へ移ったことにあります。移せない指摘だけが、人の読む対象として残ります。
予算を使い切ったとき、何を止めて何を残すか
停止の設計で間違えやすいのは、停止を能力の剥奪と同一視することです。このリポジトリの正本.claude/agent-os/vendor/runtime-tools.jsonでは、Codex runtimeのstatusがemergency_stopped、reason_codeがCODEX_SPEND_EMERGENCY_STOPである一方、capability_revokedはfalseです。停止は一時的なruntime状態であり、reviewerやimplementerとしての資格は保持しています。
止まる操作と残る操作も分けています。
| 区分 | 内容 |
|---|---|
| 禁止 | start_session、exec、automated_review、rerun、delegated_invocation |
| 許可 | 既存のCodex artifactを読む |
| 再開 | resume_contract.defaultはdeny |
再開は既定で拒否です。例外はowner_authorization_id、token_budget_snapshot、spend_budget_remaining、exact_scope、expected_sha、spend_cap_usd、expires_atの全項目が同時に揃い、期限とSHAとscopeが一致するときだけ成立します。
観測できない予算値は推測で埋めません。実際のscoped overrideにはtoken_budget_snapshotとspend_budget_remainingがUNOBSERVABLEとして記録され、invented: falseが併記されています。予算が見えないことと、予算が十分にあることは別です。
再利用できるチェックリスト
- レビュー対象へ含めないパスを列挙してあるか
- 生成物・build成果物・バイナリを除外しているか
- リスク分類が「判断不能」を安全側(Low以外)へ倒しているか
- 1差分あたりの自動レビュー回数へ上限があるか
- 上限到達後に何が起きるかを決めてあるか
- 出力側(指摘件数・語数)へも上限があるか
- 再レビューの起動条件が「機械検査PASS後」に固定されているか
- 指摘の移し先(test / CI / Gate / 人間)が決まっているか
- レビューの実行回数と入出力量を記録しているか
- 実行許可が、レビュー要求の算出とは別レイヤーにあるか
10番が最後に残る要点です。ここが同じ層にあると、検査を通すこと自体が実行の理由になります。
Evidence
| 内容 | 分類 | 根拠 |
|---|---|---|
| 1差分あたりの自動レビュー回数上限は3である | IMPLEMENTED | .quality/codex-review-policy.jsonのlimits.maxReviewsPerPullRequest |
| 指摘件数5件・出力1200語・文脈2000行の上限がある | IMPLEMENTED | 同ファイルのlimitsとcontext |
| 自動レビューの門は「対象変更あり」「機械検査PASS」「上限未満」の3つだけである | IMPLEMENTED | scripts/quality/prepare-codex-review.mjsのdecideCodexEligibility |
| 機械検査とリスク分類はレビュー需要の算出であり実行許可ではない | IMPLEMENTED | scripts/quality/run-quality-gate.mjs冒頭と同policyのexecutionAuthorization |
| ルール未一致のファイルはLowへ落とさずMediumにする | IMPLEMENTED | scripts/quality/classify-change-risk.mjsのclassifyFile |
| レビュー実行回数と入出力量を記録・集計する仕組みがある | IMPLEMENTED | scripts/quality/record-codex-usage.mjs |
| Codex runtimeは停止中だが能力は剥奪されていない | IMPLEMENTED | .claude/agent-os/vendor/runtime-tools.jsonのcapability_revoked: false |
| 再開は既定denyで、7項目が揃ったときだけ成立する | IMPLEMENTED | 同ファイルのresume_contract |
| 全件レビューへ戻す決定は2026-08-11に行われ、2026-08-21に置き換えられた | OBSERVED | governance/decisions/DEC-020.yamlのeffective_fromとsuperseded_by |
| 同じ差分へレビューを重ねると同種の指摘が返ってきた | OBSERVED | 運用時の観測 |
| 上限導入によるレビュー費用の削減量 | INFERRED | 削減率は未計測。回数上限が存在する状態までを確認 |
| 指摘の移し先を4区分へ固定する運用 | PROPOSED | 現時点では分類方針であり、全指摘の自動振り分けは未実装 |
適用限界
- ここで示した数値はNetsujoの運用目安であり、普遍的な正解ではありません。
- レビュー費用や工数の削減効果は未計測です。この記事は上限と停止条件を持つ状態までを扱います。
- 予算の消費量を外部から観測できない場合があります。実際に
UNOBSERVABLEとして記録されている項目があります。 - 決定の正本は移動します。2026-08-11の全件レビュー方針は2026-08-21のruntime policyへ置き換えられました。過去の決定文書を現在の運用として読まないでください。
残るリスク
- 上限内で実行しても、指摘の質は保証されません。回数の設計は、内容の正しさとは別です。
- 大きい差分ほど指摘精度は落ちます。サイズで止めない設計は、その代わりに警告と分割判断を人へ残しています。
- 指摘をtest・CI・Gateへ移す作業自体に工数がかかります。移す価値のない指摘まで機械化すると、検査の維持費が増えます。
- 停止条件を厳しくしすぎると、必要なレビューまで止まります。停止は一時状態として扱い、再開条件を先に書いておく必要があります。
- レビューを通した差分が安全である、という読み替えは設定では防げません。何を検査していないかを毎回書き残す運用が要ります。
まとめ
AIレビューを増やしても、範囲・分類・予算・再実行条件・停止条件が無ければ、レビューは安心の儀式になります。
review scope
+
risk classification
+
review budget(回数・入力量・出力量)
+
rerun条件
+
exit condition
+
指摘の移し先(test / CI / Gate / 人間)この6つを先に決め、レビュー要求の算出と実行許可を別レイヤーへ置きます。終わり方を先に書いていないレビューは、終われません。
よくある質問
レビュー回数の上限は3回が適切ですか
Netsujoの運用目安です。普遍的な正解ではありません。指摘が収束しない差分は、回数を増やすより分割したほうが精度は上がります。上限到達後に人間判断へ渡した回数を記録し、実データで調整してください。
指摘が0件なら、レビューを終えてよいですか
0件は「その観点では見つからなかった」という意味です。正しさの証明ではありません。停止条件は回数と状態で決め、0件をもって安全と記録しません。
リスク分類でLowと判定された差分はレビュー不要ですか
分類の用途を、呼ぶか呼ばないかの判断に使うと、分類自体が外れたときに何も検出されません。現在の実装では、分類は推論強度の選択に使い、機械検査がPASSした差分は内容と大きさによらずレビュー対象にします。
AIレビューを止めているあいだ、品質はどう担保しますか
停止するのは実行であって、役割ではありません。機械検査は止めずに回し、機械で判定できない部分は人間のレビューへ戻します。
指摘をtestへ移す判断はどうしますか
同じ種類の指摘が2回出たら移す、を目安にします。1回目は個別の学びです。2回目からは、人の注意力ではなくシステムの欠陥として扱います。
この記事の著者

飯田 友広
代表取締役
Netsujo株式会社 代表取締役。京都発のWeb3・AI実装スタートアップを2023年6月に創業。Webサイトを営業基盤として捉え、経営・営業・検索・生成AI・コンバージョン・計測を横断して課題と改善優先順位を整理する「Netsujo SIGNAL」を設計・運営。京都ビッグデータ活用プラットフォーム参画(小規模企業会員・ベンチャー)、同プラットフォーム発のワーキンググループ「Chain Up KYOTO」参画(2026-03-10)、IVS2026サイドイベント「なぜ京都でWeb3.0ビジネスなのか」を京都府庁旧議場で開催(2026-07-02・Netsujoとして主催、企画・登壇・運営/京都府デジタル政策推進課は共催)。京都美術工芸大学での講義・龍谷大学でのセミナー実績、ITコミュニティ「みやこでIT」(connpassメンバー614名・イベント167件・2019年2月から運営)運営。NPO法人NEMTUS理事、BAR KRYPTO運営。ソーシャル企業認証「S認証」認証企業(2026年2月認証・2026年4月公表)。技術領域はWeb3/ブロックチェーン/DID/NFT/生成AI/コミュニティ運営。
プロフィールを見るこの記事が向いている方
AIコードレビューを工程へ入れたものの、回数と費用の上限を決めていない開発責任者
同じ指摘を毎回人が読み直している状態を、test・CI・Gateへ移したいチーム
レビューの停止条件を「不安が消えたら」から、機械で判定できる条件へ変えたい方
— 壁打ち相談
読者のよくある相談
記事を読んだ後に「自分の状況だとどう判断すべきか」を整理するための壁打ち相談を受け付けています。下記のような相談例が当てはまる方は、お気軽にご連絡ください。
Q. AIレビューをいつ終えてよいか決まっていない
回数上限と状態で終了を定義し、上限到達後は自動実行せず人間判断へ渡します。
Q. レビュー費用と待ち時間が読めない
回数だけでなく、文脈行数と出力語数にも上限を置き、実行量を記録します。
Q. 同じ指摘が毎回返ってくる
機械で真偽を判定できる指摘はtestやcheckスクリプトへ移し、人が読む対象から外します。
上記いずれかが該当する場合、初回30分の壁打ち相談で論点整理に対応します。記事に書ききれない個別事情を踏まえた判断材料が必要な段階こそ、壁打ちが活きやすいフェーズです。