/note/tech

AIレビューは3層でまわす

要約:

■ 1. 発表の前提と方針

  • 今日のゴール:
    • 明日から使う方式を1つ持ち帰ってもらうこと
    • 追加課金なしで回しているAIレビューの組み合わせを5分で示す
  • 追加課金なし:
    • Claude、ChatGPT、Cursorなど、すでに払っているサブスク(定額)の範囲で使えるものだけを対象とする
  • 自分で測った数字:
    • 評判や印象ではなく、同じ条件で並べて測ったスコアで選ぶ
  • あくまで運用の一例:
    • 前提が違えば最適な組み合わせも変わる

■ 2. AIレビューの3層

  • 同じAIレビューでも、走るタイミングが違えば役割が違う
  • ローカル:
    • push前に手元のPCで、自分が実行する
    • 修正してすぐ再実行できる
  • PR時:
    • PRを出した時にGitHub上でボットが自動で読む
    • 自分が忘れても走る
  • デイリー:
    • 毎日スケジュール実行し、依存関係の脆弱性や古いバージョンを検知する
  • 3層の比較軸:
    • 誰が動かすか、見る範囲、費用、強みの4観点で並べる
  • ローカルの位置づけ:
    • 自分がコマンド1つで動かし、今回の差分を見る
    • サブスク枠を消費し、修正ループが短いことが強み
  • PR時の位置づけ:
    • GitHub Appが自動で動かし、PRの差分を見る
    • 費用は無料からプラン内の従量、独立した第二の視点が強み
  • デイリーの位置づけ:
    • スケジュール実行が自動で動かし、リポジトリ全体と依存関係を見る
    • GitHub標準機能中心で無料、毎日実行して予防的に検知することが強み
  • 費用の前提:
    • 2026年9月時点、Claude Max 20x、ChatGPT Pro、Cursor Pro+、Devin Pro、Copilot Proの契約での話

■ 3. ローカル層のレビューコマンド

  • ローカルのコマンドは3つ:
    • どれもサブスク内で、名前が似ていても見る対象と得意分野が違う
  • Claude Codeの /code-review:
    • 今の変更(差分)を見る
    • バグ、デグレ(動いていたものが壊れること)、偶然安全で脆い箇所を指摘する
    • マージを止めるか決めるゲートの役割
  • Claude Codeの /security-review:
    • ブランチ全体の変更を見る
    • 攻撃シナリオ付きの監査を行い、確信度で切るので誤検知が少ない
  • Codexの /review:
    • 作業中のコードとブランチ比較を見る
    • 挙動の変化やテスト不足を指摘し、参照先のクラスまで自分で読みに行く
  • コマンド構成の変遷:
    • Claude Codeは元々 /code-review、/review、/security-review の3つ
    • v2.1.223でPR用の /review が /code-review に統合され、今は実質2つ(/review は別名として残る)

■ 4. 自作コマンド /ai-review

  • 3つを1コマンドに統合:
    • 2つのレビューに同じ差分を渡して突合し、リスクがあれば3つ目のレビューを走らせる
  • 並列起動:
    • Claude Codeの /code-review と Codexの /review を、互いに見せずに同時実行する
  • 突合:
    • 一致した指摘は採用する
    • 片方だけの指摘は根拠のコードで確認する
  • 自動昇格:
    • 認証、秘密情報、大きな差分なら /security-review を追加する
  • 自作部分の範囲:
    • レビュー本体は各ツールの純正コマンド
    • 自作なのは並列起動、突合、昇格判定の部分

■ 5. 2つのAIにレビューさせる理由

  • 補い合える:
    • 別の会社の別のモデルなので、片方が見落としてももう片方が拾ってくれることがある
  • 別々に見せる:
    • 片方の結果を先に見せると、それに引きずられる
    • 互いの結果を知らない状態で同時に実行する
  • 割れたら確かめる:
    • 片方だけが指摘したものは、コードを読んで本当かどうか確かめる
    • 片方だけが見つけた本物の指摘は記録に残す

■ 6. /security-review への昇格条件

  • 条件に該当すればスクリプトが自動で起動し、省略するには明示的な指示が要る
  • 条件A 変更パス:
    • 触ったファイルの場所で判定する
    • auth、payment、migration、.sql、middleware、workflows、Dockerfile、lockfileが対象
    • 判定はgrepで行い、モデルを使用しない
  • 条件B 追加行の内容:
    • 危険になりやすい書き方を判定する
    • exec、eval、暗号、SQLの文字列結合、innerHTML、deserialize、検証の無効化が対象
    • 判定はgrepで行い、モデルを使用しない
  • 条件C 規模:
    • 差分の大きさを判定する
    • 20ファイル超、または追加1,000行超が対象
    • git diffの数で判定する
  • 条件D 指摘あり:
    • どちらかがセキュリティ分類で指摘した場合が対象
    • injection、XSS、SSRF、認可、秘密情報が該当し、突合の結果で判定する
  • 条件E 判定が割れた:
    • セキュリティ分類で2つの判定が不一致の場合が対象
    • 片方はHigh、片方は指摘なしといった状態を突合の結果で判定する
  • 起動ルール:
    • 5条件のうち1つでも該当すれば自動起動する
  • 秘密情報の例外:
    • .envや鍵ファイルが差分にあればCodexへ送らない

■ 7. push前フックによる強制

  • レビューを通したかを人力ではなくフックが検査する
  • 記録:
    • /ai-review が結論(pass / fix / block)とHEADのSHAを残す
  • 照合:
    • push対象のSHAと記録を比べ、無い、または違うなら拒否する
  • 判定:
    • block、昇格未実施、未コミット差分だけの記録なら拒否する
  • 通過:
    • すべて満たせばpushできる
    • レビュー後にコミットし直すとSHAが変わりやり直しになる
  • 用語:
    • SHAはコミットごとに付く一意のID
    • フックはgitの操作時に自動で走るチェック

■ 8. ベンチマークによる選定

  • 雰囲気で選ばない:
    • セキュリティ特化の方式が強そうという印象で選びたくなかった
  • 対象:
    • 脆弱性サンプル集(OWASP Benchmark)からJavaコード110件
    • 11分野 × 危険5件・安全5件で構成する
  • 採点:
    • 各AIに危険か安全かを判定させる
    • スコアは検出率から誤検知率を引いた値で、1.0が満点
    • 0は危険と安全を区別できていない状態
  • 公平性:
    • 判定のヒントを与えない
    • 正解ラベルを参照できない隔離環境で実行し、全件の判定を強制する
  • 測定範囲の限界:
    • 測っているのはセキュリティ脆弱性の検知力だけ
    • コード品質や設計の指摘など他の得意分野は含まず、この一面で総合優劣は決まらない

■ 9. ベンチマークの結果

  • 最新世代で5方式が同時に満点(1.000):
    • Claude Opus 5 の code-review、Claude Opus 5 の review(PR)
    • Claude Fable 5.1 の code-review、Claude Fable 5.1 の review(PR)
    • claude-security(Opus 5)
  • 満点に届かなかった方式:
    • Codex GPT-5.6-Sol の review は0.982
    • Claude Opus 5 の security-review は0.964
    • Codex GPT-6-Astra の review は0.945
    • Cursor の security-review は0.927
  • 測定条件:
    • 同一110件、中立プロンプト、隔離環境で実施
    • review(PR)はGitHubのPRを読むモード、claude-securityは公式プラグインの全体走査
    • Fable 5.1は8月末の追加測定
  • Astraの内訳:
    • 検出は55/55だが誤検知が3件

■ 10. 数字から決めた役割分担

  • 一番スコアが高いもの1つに寄せず、性格の違いで役割を分ける
  • Claude Codeの /code-review:
    • 見逃しが少なく再現率が高い、最新世代で満点
    • マージを止めるか決める入口に置く
  • Claude Codeの /security-review:
    • 誤検知ゼロが持ち味で、確信度で切るぶん見逃しはある
    • 拾った疑いが実際の問題か誤検知かを確かめる役
  • Codexの /review:
    • 別ベンダーで0.982のスコア
    • 差分の外の参照先まで自分で読みに行く
    • Claude Codeと意見が割れた箇所を見つける役

■ 11. PR時の層

  • GitHub Appとして入れておくだけで、自分が忘れても走る
  • 構成:
    • AIレビュアー5つと依存監査1つによる自動レビュー
  • Amazon Q Developer:
    • AWS提供、プレビューのため無料だが月間行数制限あり
    • セキュリティ寄りで誤検知あり
  • Devin Review:
    • Cognition提供、Devinアカウントがあれば無料
    • 提案diff付きで質が高い
  • GitHub Copilot:
    • GitHub提供、Copilot Proのプラン内
    • 差分の一般的なレビューを担う
  • Codex:
    • OpenAI提供、ChatGPTプラン内のクレジットを使用
    • ローカルと同じCodexがPRでも読む
  • Cursor Bugbot:
    • Cursor提供、Pro以上に包含、1回$1〜1.5相当を使用量枠から消費
    • バグ検出特化
  • Socket Security:
    • Socket提供、publicリポジトリは無料
    • 依存パッケージの供給網リスクを見る
  • 測定の前提:
    • 2026-09-15に実証リポジトリ(pj-pilot)の直近PRで実測したレビュアー
    • 費用は各社公式の2026年8〜9月時点の情報
    • Bugbotは2026年5月に独立課金($40/月)を廃止しプラン包含へ移行

■ 12. デイリーの層

  • GitHubの標準機能を、自作の見回りで全リポジトリに強制する
  • Dependabot:
    • GitHub標準機能
    • 依存パッケージの脆弱性と更新を毎週PRで通知する
  • Secret scanning:
    • GitHub標準機能
    • 秘密情報の混入を検知し、push自体をブロックする
  • sweeper(自作):
    • 毎朝の見回りを行う自作のGitHub Actions
    • 06:00に全リポジトリを巡回する
    • DependabotやSecret scanning、CI、ブランチ保護が入っていなければ自動で入れる

■ 13. 組み合わせる理由: スイスチーズモデル

  • スイスチーズモデル:
    • 安全工学で使われる考え方
    • 1枚の防御は必ず穴があるので、複数枚を重ねて事故を防ぐ
  • どの層にも穴があり、穴の位置が違う層を重ねると貫通しにくくなる
  • 層1 ローカルの穴:
    • 実行のし忘れが起きる
    • 人の記憶に頼ると抜けるので、フックで機械的に実行を促す
  • 層2 PR時の穴:
    • 1つのボットに頼らない
    • 性格の違う5つを並べてレビューの品質を上げる
  • 層3 デイリーの穴:
    • 毎日監視する
    • 変更がなくても、脆弱性や古い依存関係に対応する

■ 14. ローカルを厚くする理由

  • 先にローカルで潰すほど、PR時の層は軽く安くなる
  • 修正ループが短い:
    • 指摘、修正、再レビューが手元で完結する
    • PRに出してから直すと往復が増える
  • 従量課金なし:
    • BugbotやCodexのPRレビューは使用量枠を消費する
    • ローカルで指摘を直してから出せば回数が減る

■ 15. PR時の層を外さない理由

  • PR時の価値は効率ではなく、自分に依存しないこと
  • 自分が忘れても走る:
    • ローカルは人の操作が起点だが、PR時はGitHub Appが起点
    • 急いでいる日も、エージェントが勝手に出したPRも、同じように読まれる
  • 書いた本人と別の視点:
    • ローカルで使ったClaude CodeとCodex以外の4つのAIも読む
    • 自己採点は人間もAIも甘くなりがち
  • レビューの実行忘れを仕組みで減らす:
    • DORA 2026がレビュー無しマージの増加を品質リスクと警告している
    • 指摘への対応は会話解決必須で強制し、実行忘れはフックと自動ボットで減らす
    • DORAはGoogleのDevOps調査プログラムで、出典はDORA State of AI-assisted Software Development 2026

■ 16. サブスク範囲で使えるかの早見表

  • 追加費用なしか、Team / Enterprise限定かは機能ごとに違う
  • Claude Code の /code-review と /security-review:
    • サブスク内で使え、全プラン対応
  • Claude Code の claude-security プラグイン:
    • Pro以上なら使えるが、使用量枠の消費が大きい
  • Claude Code の /code-review ultra:
    • 無料は3回まで、以後は1回$5〜25の別課金
  • Claude Code の Code Review(GitHub App):
    • サブスク内では使えず、Team / Enterpriseのみ
    • 1回$15〜25の別課金
  • Codex の /review(CLI):
    • サブスク内で使え、FreeからEnterpriseまで全プランに含まれる
  • Codex の @codex review(GitHub):
    • サブスク内で使えるが、Codex cloud接続が必要
    • 専用の使用量枠を消費する
  • Codex の codex-security(CLI):
    • Proのみ対象で、Plusは対象外
    • research preview段階
  • Cursor の Bugbot:
    • サブスク内で使えるが、含まれる枠を超えるとon-demand課金
  • 情報の前提:
    • 2026年9月時点の各社公式ドキュメントに基づく
    • 全機能の一覧と根拠はZenn記事に整理されている

■ 17. まとめ

  • ローカル:
    • push前にローカルで実行する
    • Claude Codeの /code-review と /security-review、Codexの /review を使う
  • PR時:
    • PRを出したら自動で走らせる
    • GitHub Appを入れておき、指摘は一次情報で裁定する
  • デイリー:
    • 毎日自動で実行する
    • DependabotとSecret scanningを有効にするだけ
  • 全部サブスクの範囲:
    • 追加課金なしで回せる
    • ただしローカルもサブスク枠は消費する
  • 参考記事:
    • コードレビューのスコアの測り方と結果(110件)は zenn.dev/yukkie1114/articles/3d927e8c28e085
    • 最新世代のスコアとサブスクで使えるかの整理は zenn.dev/yukkie1114/articles/f13672584add05