6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeでPRレビューを自動化する設計と実装 ── 「AIレビューだけでマージ」を実現するまで

6
Posted at

はじめに:AIコードレビューが「実験」から「本番運用」に切り替わった

2026年4月、カウシェが公開した記事「全PRの83%をAIレビューだけでマージできるようにした」がZennのトレンド上位に入りました。toCのECプラットフォームという本番環境で、人間のコードレビューを経ずに8割超のPRを自動マージしている、という実績はインパクトがあります。

この数字が衝撃なのは精度そのものよりも、「AIコードレビューがついに品質ゲートの責任を持てる存在になった」という事実です。2024年から2025年前半までのAIレビューは、いわばスペルチェッカーの延長で、人間レビューのノイズキャンセリング用途が中心でした。ところが2025年後半から、Claude SonnetやOpusが100万トークンの長文脈を安定して扱えるようになり、リポジトリ全体をコンテキストに載せてレビューできる段階に到達しました。カウシェの事例は、この技術変化とチーム運用の整備が噛み合った結果として生まれたものだといえます。

本記事では、カウシェの事例から学べる設計パターンを抽出しつつ、Claude Code GitHub Actionsを使って自前でPRレビュー自動化を構築する際の、技術的アプローチ・運用設計・コスト試算・段階的ロールアウト戦略まで掘り下げて解説します。

なぜ2026年にAIコードレビューが一気に広がったのか

従来の静的解析との決定的な違い

SonarQube、ESLint、Semgrepといった従来の静的解析ツールは、ルールベースでパターンマッチングを行います。「このAPIは非推奨」「この書き方は脆弱性リスク」といった既知のアンチパターンを検出する仕組みです。ルールを外れた「意図の理解が必要な指摘」はできません。

AIコードレビューは、diffの前後の文脈を読み、変更の目的を推測した上でコメントを返します。たとえば「この関数の引数名がドメイン用語と乖離している」「このエラーハンドリングはユースケース上必要ない」といった指摘は、既存の静的解析ではまず出てきません。これは人間レビュアーの思考を部分的に再現できる、という点で質的な違いがあります。

長文脈モデルが解決した「PR全体を読む」問題

2025年前半までのAIレビューは、diffの断片しか見ていませんでした。関数定義だけを渡して「この関数は重複している可能性がある」と判定しても、実際にはリポジトリ内に類似関数が存在することに気づけない、という問題が頻発していました。

Claude Code GitHub Actionsは、ランナー上でリポジトリをクローンして動作します。Claudeは必要に応じて grepfind でファイルを探索し、呼び出し元を追いかけ、関連するテストまで読みに行きます。これは静的にdiffを渡すタイプのレビューツールとは根本的に異なる挙動です。

GitHub Copilot Code Reviewとの使い分け

Anthropicの比較記事や開発者コミュニティの検証によると、GitHub Copilot Code Reviewは「GitHub上のPR画面にネイティブ統合されている」という点で優位ですが、複数ファイルにまたがる文脈理解ではClaude Codeが先行しています。Claude Code GitHub Actionsはオープンソースで公開されており、1レビューあたり数セントから実行できます。一方で、Anthropicが提供する有償の「Claude Code Review」サービスは1PRあたり15〜25ドルと高額ですが、深度のあるレビューをトリガーレスで実行します。

実務的には、以下の使い分けがフィットしやすいと考えます。

  • 日常のPR:Claude Code GitHub Actions(オープンソース版)
  • 本番リリース前の重要PR:Claude Code Review(有償)または人間レビュー
  • インライン補完・軽量レビュー:GitHub Copilot

Claude Code GitHub Actionsの技術構成

インタラクティブとオートメーションの2モード

Anthropicが公式提供するanthropics/claude-code-actionは、GitHub Actionsのランナー上でClaude Codeランタイムをそのまま動かすアクションです。静的なコメント生成ではなく、ファイルを読み・gitを実行し・必要ならコードを編集してコミットまでできるエージェントとして動作します。

動作モードは2つです。

  • インタラクティブモード:PR・Issue上で @claude とメンションされると応答する
  • オートメーションモード:prompt パラメータで指示を与え、PRのオープンやCI失敗などをトリガーにヘッドレスで実行する

PRレビュー自動化にはオートメーションモードを使います。

動くレベルのワークフロー完全版

以下は実運用に近い構成です。そのままコピーすれば、オープンPRに対してClaudeがdiffをレビューしてコメントを残します。

.github/workflows/claude-review.yml
name: Claude Auto Review
on:
  pull_request:
    types: [opened, synchronize, reopened]

concurrency:
  group: claude-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  review:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    timeout-minutes: 15
    permissions:
      contents: read
      pull-requests: write
      id-token: write
      issues: write
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Get changed files
        id: diff
        run: |
          echo "files=$(gh pr diff ${{ github.event.pull_request.number }} --name-only | tr '\n' ',')" >> "$GITHUB_OUTPUT"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            REPO: ${{ github.repository }}
            PR NUMBER: ${{ github.event.pull_request.number }}
            CHANGED FILES: ${{ steps.diff.outputs.files }}

            あなたはこのリポジトリのシニアレビュアーです。
            CLAUDE.md と docs/review-rules.md のレビュー基準に従い、
            以下の観点でPRをレビューしてください。

            1. バグ・ランタイムエラーの可能性
            2. セキュリティ上の懸念(OWASP Top 10)
            3. パフォーマンス・N+1・不要なアロケーション
            4. テストの欠落
            5. プロジェクト固有のドメインルール違反

            出力形式:
            - 重大な問題は `mcp__github_inline_comment__create_inline_comment`
              で該当行にインラインコメントを残す
            - 全体所感・サマリは `gh pr comment` でPRコメントとして投稿
            - 判定結果を末尾に `VERDICT: APPROVE|REQUEST_CHANGES|COMMENT` の形式で明記

          claude_args: |
            --max-turns 12
            --allowedTools "Read,Grep,Glob,mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(git log:*),Bash(git show:*)"

押さえておきたい設定ポイントです。

  • concurrency で同一PRの新コミット時に古いレビューをキャンセルし、二重課金を防ぐ
  • timeout-minutes でランナーの暴走を止める
  • fetch-depth: 0 でコミット履歴を読めるようにする(関連変更の追跡に使う)
  • if: github.event.pull_request.draft == false でドラフトPRを除外する
  • --max-turns でエージェントの会話ターンを制限し、コストの天井を決める
  • --allowedTools で許可ツールを絞り、意図しない書き込みや外部通信を防ぐ

claude -p によるパイプライン実行

GitHub Actionsに依存したくない場合、もしくは既存のCIスクリプトに組み込みたい場合は、Claude Code CLIの -p フラグによるパイプラインモードが使えます。

gh pr diff "$PR_NUMBER" | \
  claude -p \
    --output-format json \
    --max-turns 6 \
    "以下のdiffをレビューしてください。
     バグ、セキュリティ問題、パフォーマンス懸念を指摘し、
     JSON形式で {verdict, severity, comments[]} を返してください。" \
  > review-result.json

VERDICT=$(jq -r .verdict review-result.json)
if [ "$VERDICT" = "REQUEST_CHANGES" ]; then
  gh pr comment "$PR_NUMBER" --body "$(jq -r .summary review-result.json)"
  exit 1
fi

-p フラグはヘッドレス実行、--output-format json で後段パース可能な構造化出力を得られます。レビュー結果をJSONで受け取って、後続の判定ロジックやSlack通知につなげるケースで相性がよい設計です。

巨大PRをどう捌くか:差分分割とサンプリング

Claude Sonnetは100万トークンの文脈を扱えますが、それでも「5000行のdiff全体を一気に渡すと指摘が浅くなる」という現象があります。プロンプトに含まれる情報量が増えるほど、モデルの注意が分散するためです。

現実的な対策としては以下が有効です。

  • ファイル単位でレビューを並列化する(3〜5ファイル単位のバッチに分割)
  • git diff --stat で変更規模を測り、500行を超えたら警告を出して人間レビューに回す
  • テストファイルと実装ファイルを別ジョブでレビューする(観点が違うため)
  • 自動生成ファイル(*.pb.go 、スナップショット等)は paths-ignore で除外する
on:
  pull_request:
    paths-ignore:
      - "**/*.pb.go"
      - "**/__snapshots__/**"
      - "**/generated/**"
      - "package-lock.json"
      - "yarn.lock"

レビュー品質を担保する設計

CLAUDE.mdによるレビュー基準の明文化

リポジトリルートに CLAUDE.md を置くと、Claude Codeはそれをプロジェクトの前提知識として読み込みます。ここにレビュー基準を書いておくことで、一貫した指摘が得られます。

CLAUDE.md
## コードレビュー基準

### 必ず指摘する項目(REQUEST_CHANGES)
- 未処理のエラー(try-catchの欠落、エラーの握りつぶし)
- SQLインジェクション・XSS・CSRFのリスク
- ハードコードされたシークレット(APIキー、トークン)
- N+1クエリ、`SELECT *` によるスキャン
- テストのないpublic関数の追加
- トランザクション境界の誤り(複数操作で整合性が崩れる)

### 改善提案にとどめる項目(COMMENT)
- 命名規則の軽微な不統一(既存コードと整合していればOK)
- TODOコメント(Issue番号が記載されていればOK)
- マジックナンバー(3未満の出現なら許容)

### プロジェクト固有ルール
- APIレスポンスには必ず `status` フィールドを含める
- DBマイグレーションは必ず `down` も定義する
- 環境変数は `config/` 配下で一元管理する
- gRPCメソッドごとに正常系・異常系のE2Eテストを必須とする

ポイントは「REQUEST_CHANGES」と「COMMENT」を明確に区別することです。カウシェの記事にもある通り、判定の原則を「却下すべき理由がないならApprove」としておかないと、AIは細かい指摘を積み上げて過剰にブロックしがちになります。

3人のペルソナによる並列レビュー

カウシェの事例では、3人のAI専門家ペルソナを並列で動かしています。

  • シニアバックエンドエンジニア:コード品質、規約準拠、テストカバレッジ
  • シニアアーキテクト:設計整合性、セキュリティ、ドメイン知識との照合
  • GCP専門家:DBクエリ効率、インフラ影響、非同期処理の冪等性

Claude Code Actionsで同じことをやるなら、ジョブを分割して異なるpromptを渡します。

.github/workflows/multi-persona-review.yml
jobs:
  # 変更パスを事前に判定する(github.event.pull_request.changed_files は
  # 変更ファイル「数」であってパス一覧ではないため、直接contains()はできません)
  changes:
    runs-on: ubuntu-latest
    outputs:
      infra: ${{ steps.filter.outputs.infra }}
    steps:
      - uses: actions/checkout@v6
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            infra:
              - 'db/**'
              - 'infra/**'

  quality-review:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            あなたはシニアバックエンドエンジニアです。
            コード品質・命名・エラーハンドリング・テスト観点で
            PR ${{ github.event.pull_request.number }} をレビューしてください。
          claude_args: "--max-turns 6"

  security-review:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            あなたはセキュリティエンジニアです。
            OWASP Top 10 を基準にPRをレビューし、
            深刻度をCRITICAL/HIGH/MEDIUM/LOWで評価してください。
            CRITICAL・HIGHに該当する指摘があれば REQUEST_CHANGES を返してください。
          claude_args: "--max-turns 6"

  infra-review:
    needs: changes
    if: needs.changes.outputs.infra == 'true'
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            あなたはインフラ・DB専門家です。
            クエリ効率、インデックス、マイグレーションの互換性、
            トランザクション境界の観点でレビューしてください。
          claude_args: "--max-turns 6"

GitHub Actionsの github.event.pull_request.changed_files は「変更ファイル数(整数)」を返すため、パス名で絞り込むには使えません。変更ファイルのパスで分岐したい場合は、上記のように dorny/paths-filter を使うか、ワークフロートリガー側で on.pull_request.paths フィルタを指定するのが正攻法です。

ジョブを並列実行するため、レビュー時間はほぼ1回分で済みます。観点を分けることで、1プロンプトに全観点を詰め込んだ場合よりも指摘の精度が上がります。

レビュー信頼度スコアリング

3つのペルソナから得た結果を集約して「このレビューをどれだけ信用するか」を定量化すると、自動マージの判定材料に使えます。シンプルなアルゴリズムは以下のとおりです。

信頼度 = 各ペルソナの一致度 × CIパイプライン通過率 × 変更規模の小ささ

  一致度: 3ペルソナの判定が揃っていれば1.0、分かれていれば0.5
  CI通過率: 全テスト通過で1.0、flakyが残っていれば0.7
  変更規模: 100行以下で1.0、500行以上で0.3

この信頼度が0.8以上のPRのみ自動マージを許可する、といった運用にすると、リスクを制御しながら自動化率を上げられます。

自動マージが機能する条件・しない条件

自動マージ対象(カウシェの83%)

  • 通常の機能追加、リファクタリング、テスト追加
  • CIパイプライン(E2Eテスト、lint、セキュリティスキャン)を全通過
  • AIレビューでREQUEST_CHANGESが出ていない
  • 変更規模が制御可能(例:500行未満)

人間レビュー必須(残り17%)

  • DBスキーマ変更、Proto定義変更
  • Terraform等のインフラ変更
  • 認証・決済フローの変更
  • Design Doc、大規模アーキテクチャ変更
  • 複数サービス横断の変更

これらはすべて「不可逆で影響範囲が大きく、ロールバックコストが高い」という共通点があります。AIが正しく判定できても、判定ミスが発生した際の被害が大きすぎるため、人間がゲートを持ち続けるべきカテゴリです。

判断フローの組み立て方

PR作成
  │
  ├─ パス判定(DB/認証/決済/インフラ?) ── Yes → 人間レビュー必須
  │
  ├─ CIパイプライン通過? ── No → マージ不可
  │
  ├─ 変更規模が閾値内? ── No → 人間レビュー
  │
  ├─ 3ペルソナのAIレビュー ── REQUEST_CHANGES → 修正後に再レビュー
  │
  ├─ 信頼度スコア ≧ 0.8? ── No → 人間レビュー
  │
  └─ 全条件クリア → 自動マージ

GitHubの branch protection rulerequired status checks を組み合わせると、このフローをほぼそのまま強制できます。

自動改善ループ:レビュールール自体を育てる

カウシェの事例で最も示唆に富むのは、レビュールール自体を毎晩自動改善している点です。Measure(計測)、Explore(探索)、Improve(改善)、Reflect(振り返り)、Audit(監査)の5エージェントがループで連携し、承認率・見逃し数・誤判定数をもとに検出ルールを更新します。各エージェントは前回の思考ジャーナルを読んでから実行されるため、連続性を持った改善が続きます。

自前で構築する場合は、以下のような夜間ワークフローを組むと近い効果が得られます。

.github/workflows/review-rules-evolve.yml
on:
  schedule:
    - cron: "0 18 * * *"  # 毎日3時(JST)

jobs:
  evolve:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            直近24時間のPRレビュー結果を集計し、以下を実施してください。

            1. 見逃したバグ(マージ後にrevertされたPR)を特定
            2. 誤検知(指摘されたが修正不要だったもの)を特定
            3. CLAUDE.md のレビュー基準に追加・削除すべきルールを提案
            4. `docs/review-rules-proposals.md` に変更案を追記
            5. 人間が承認する前提なのでCLAUDE.md の直接編集はしない
          claude_args: "--max-turns 20"

「人間が最後に承認する前提で、提案まで自動化する」のがポイントです。AIが勝手にルールを書き換えると、フィードバックループが発散するリスクがあるため、人間の承認ゲートは必ず残します。

導入コストの試算

Anthropic公式の発表やコミュニティ検証によると、Claude Code GitHub Actionsを使ったPRレビューのコストはおおむね次のレンジに収まります。

  • 400行程度のdiffでSonnet 4.6を使った場合:1PRあたり0.04ドル前後
  • 10名のエンジニア、1日20PRのチーム:月額24ドル前後
  • GitHub Actionsランナー実行時間:月10〜30ドル(Linux standard)

一方、有償の「Claude Code Review」サービスは1PRあたり15〜25ドルと桁違いに高くなります。これは深度のあるレビューをトリガーレスで実行する設計上の違いであり、無条件に全PRに走らせると月数千ドル規模になります。

実務的には、オープンソースの claude-code-action をベースにしつつ、本番リリース前のPRだけ Claude Code Review の有償版を走らせる、というハイブリッドが現実的です。

段階的ロールアウト戦略:10% → 30% → 83%

Step 0: 基盤整備(着手前の2〜4週間)

AIレビュー以前に、以下が揃っていることを確認します。

  • ユニットテストカバレッジ80%以上
  • E2Eテストが主要ユーザーフローをカバー
  • lintルールでコーディング規約を強制
  • PRの危険度マップ(critical/high/medium/low)の定義
  • CLAUDE.md にプロジェクト固有ルールを明文化

ここを飛ばしてAIレビューだけ入れると、ほぼ確実に「AIがOKを出したのに本番で事故」という失敗に至ります。

Step 1: シャドーモード(1〜2週目)

最初はレビューコメントだけを投稿し、自動マージは一切しません。この期間に観察すべき指標は次のとおりです。

  • AIのコメントが人間レビュアーの指摘とどれだけ一致したか
  • ノイズ(無意味な指摘)が全コメントの何%あるか
  • 見逃したバグ(人間が指摘したがAIが指摘しなかったもの)

2週間の観察で、ノイズ率が20%以下、見逃し率が10%以下に収まることを目安にします。

Step 2: 10%自動マージ(3〜4週目)

最も低リスクなカテゴリから自動マージを有効にします。具体的には次のようなPRです。

  • 単一ファイル・100行未満のリファクタリング
  • テスト追加のみのPR
  • ドキュメント更新
  • 依存パッケージのパッチバージョンアップデート

この段階で重要なのは「人間がいつでも止められる仕組み」です。具体的には、自動マージされたPRに対してSlack通知を飛ばし、15分間は手動revertできる猶予を設けます。

Step 3: 30%自動マージ(2〜3ヶ月目)

新機能追加やドメインロジックの変更まで範囲を広げます。この段階で必要になるのは、信頼度スコアリングの導入と、レビュー結果の定量計測です。

  • 週次で「自動マージされたPRのバグ発生率」を集計
  • バグ発生率がしきい値(例:0.5%)を超えたら即座に10%に戻す
  • リリース後にrevertされたPRを「見逃しケース」として自動記録し、レビュー基準にフィードバック

Step 4: 83%自動マージ(半年後以降)

ここまで来ると、人間レビューはDBスキーマ・認証・決済・インフラ・横断変更といった「不可逆カテゴリ」に集中させる運用になります。カウシェの17%という数字は、ほぼこのカテゴリの比率を反映したものと推定されます。

反対勢力への説得材料

実際に導入しようとすると、必ず出てくる懸念は以下の3つです。

「AIが見逃したら誰が責任を取るのか」

回答:責任の所在は変わりません。マージする開発者がPRの品質に責任を持つ、というルールは維持します。AIは補助であり、最終的なマージボタンを押すのは人間、または人間が承認した自動マージルールです。自動マージされたPRで事故が起きた場合、ルールの設計者(つまりチーム全体)が責任を持ちます。

「人間レビューの学習機会が失われる」

回答:人間レビューを「教育目的」「品質担保目的」「知識共有目的」の3つに分解して考えます。AIに任せられるのは「品質担保目的」の一部だけです。新人エンジニアの教育や、設計思想の共有は引き続き人間のレビューで行います。むしろAIが機械的な指摘を引き受けることで、人間レビュアーはより本質的な議論に時間を使えるようになります。

「コストがペイするのか」

回答:オープンソース版のClaude Code GitHub Actionsなら、10名規模のチームで月24ドル程度です。一方、人間のコードレビュー時間を仮に時給8000円、1PRあたり20分と見積もると、1PR約2600円、月400PRで約100万円のコストに相当します。AIが8割のPRで「ほぼ完成状態」まで指摘を済ませてくれれば、人間レビューの時間は大幅に短縮されます。

失敗時のフォールバック設計

AIレビュー自動化で絶対に避けたいのは「AIが暴走して悪影響を拡大する」ケースです。次の3つのフォールバックを必ず組み込みます。

キルスイッチ

リポジトリ変数 CLAUDE_REVIEW_ENABLED を用意し、false に設定するだけで即座に全AIレビューが止まる構成にします。障害発生時に即座に人間レビューだけの体制に戻せるよう、GitHub Actionsの条件式で制御します。

jobs:
  review:
    if: vars.CLAUDE_REVIEW_ENABLED == 'true'
    runs-on: ubuntu-latest

段階的なロールバック

自動マージ率が急激に変化した場合(たとえば1日で20%以上の変動)にアラートを出し、自動的に前日の設定に戻すワークフローを用意します。カナリアリリースと同じ発想です。

人間によるオーバーライド

Slackから /review-block PR-123 のようなコマンドで、特定のPRを強制的に人間レビュー必須に切り替えられる仕組みを用意します。AIの判定に疑問を感じた開発者が、即座にブレーキをかけられる経路を残しておくことが、心理的安全性の面でも重要です。

まとめ:AIコードレビューは「投資対象」

AIコードレビューの自動化は、もはや実験段階ではありません。カウシェの事例が示すように、適切な前提条件を整えれば、toCサービスでも8割超のPRを自動マージできる段階に来ています。

ただし、強調したいのはここでの「適切な前提条件」のほうです。テストカバレッジ、CIパイプライン、コーディング規約の明文化、人間レビューが必要な領域の明確な線引き、失敗時のフォールバック。これらがあって初めて、AIレビューは信頼できるゲートキーパーとして機能します。

Claude Code GitHub Actionsの導入自体は数十行のYAMLで完了しますが、本当に投資すべきはその前段の基盤整備です。逆にいうと、基盤整備が済んだチームにとっては、AIレビュー自動化は極めて費用対効果の高い投資になります。月数十ドルの追加コストで、レビュー待ち時間を劇的に短縮し、かつ人間レビュアーを本質的な議論に集中させられます。

まずは自チームのテストカバレッジとCIパイプラインを見直し、2週間のシャドーモードから始めてみてください。そこから自動マージ率10% → 30% → 83%への道筋は、思っているより現実的です。

参考

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?