ソフトウェア変更のコントロールレイヤーを構築するため、1億4,300万ドルを調達しました。詳しく見る

AI生成PRのコード説明可能性:レビュアーのための実践ガイド

by
Brandon Gubitosa

Brandon Gubitosa

August 13, 2026

1 min read

Cover image

1,400行の差分が待ち構えるPRを開いたとします。説明文には「決済Webhookのリトライロジックを実装」とあり、テストは通っていて、コードはきれいに見えます。不自然なほどきれいに、です。まるで一度も調子の悪い日を過ごしたことのない人が書いたかのように。

それもそのはずです。コードの大半はエージェントが書き、いまあなたはそれを承認する立場にいます。

ここに不都合な事実があります。長年頼ってきたレビューのやり方は、作者が何を考えていたかを再構築し、その意図に照らしてコードを確認できることを前提にしています。エージェントがコードを書いた場合、再構築すべき人間の思考プロセスはそもそも存在しません。つまりあなたがレビューしているのは、作者の推論ではなく、ただの出力です。

このガイドでは、その条件下でどうレビューするかを扱います。まず変更自身に自分を説明させ、人間の判断が本当に必要な行にだけ読む時間を使う、という進め方です。

このワークフローの背後にある、より広いインターフェースモデルについては「Why explainability is the new observability layer for pull requests in the agentic SDLC」(英語)をご覧ください。

AI生成PRが従来のコードレビューを機能不全にする理由

人間のコードレビューは、いくつかの前提の上に発展してきました。AI生成コードは、その前提を崩します。

前提1:作者は変更を理解している

同僚からPRが届けば、「なぜチャネルではなくミューテックスを選んだのか」と質問でき、相手は答えを持っています。エージェントからPRが届いた場合、「作者」は金曜の午後に3文のプロンプトを書いた同僚かもしれず、なぜコードがそう動くのかを本人も本当に知らないのです。

前提2:きれいなコードは慎重に書かれたコード

470件のオープンソースGitHubプルリクエストを分析した「AIと人間のコード生成の実態レポート」によると、AIが関与した変更はPRあたり10.83件の問題を含み、人間のみのPRの6.45件を上回りました。データセットの中で最も差が開いたのは可読性で、AIコードの問題は3倍超に達します。一見一貫して見えるのに、そのコードベース固有のパターンを破っているためです。

前提3:深刻なバグは見た目でわかる

AIコードが人間のコードから最も乖離するカテゴリーは、流し読みでは見つけられないものばかりです。同じ470件のPR分析によると:

  • ロジックと正確性の問題は、AIのPRで75%多く発生しました。
  • エラーハンドリングと例外パスの欠落は、2倍近く多く発生しました。
  • セキュリティの問題は最大2.74倍で、パスワードの不適切な扱いと安全でないオブジェクト参照が上位を占めました。

これらを捕まえるには、レビュアーがいったん自分のワークフローを離れ、自分が書いていないコードのエッジケースを歩き回る必要があります。欠陥の発生率が上がったまさにそのタイミングで、頼りにしてきた直感は弱くなりました。この板挟みこそが、このガイドが存在する理由です。

コード変更における説明可能性とは何か

説明可能性は、隣接する2つの概念と混同されがちです。境界線を引いておきましょう。

コメントやドキュメントは、執筆時点で人間が考えていたことを記録します。オブザーバビリティ、つまりログやトレースやCIの出力は、実行時に何が起きたかを記録します。この区別はAIエージェントがそもそも信頼を獲得できるかどうかを左右するものであり、同じ論理はエージェントが生成するコードにも当てはまります。

コード変更にとっての説明可能性は、レビュー時点に存在します。変更が何を意図し、どの挙動を変更し、何を壊しうるのかを再構築するものです。

実務上は、レビュアーがすべての行を読まずに次の5つの質問に答えられるとき、その変更は説明可能だと言えます:

  • 意図:この変更は、平易な言葉で言えば何を達成しようとしているのか?
  • 挙動:ファイルではなく、システムのどの挙動が変わったのか?
  • 影響範囲:この変更は何に触れ、何に依存し、何から依存されているのか?
  • 根拠:動作するという主張を何が裏付けているのか?
  • リスク:最初に壊れるとしたらどこで、どの程度深刻か?

CodeRabbitのレンジサマリーは、変更されたコード範囲ごとに挙動レベルの説明を添付します

5つすべてに答えられるレビュアーは、1,400行のPRにも責任を持って対応できます。ひとつも答えられないレビュアーは、どれだけ丁寧に読んでも構文のパターンマッチングに終始し、本当の欠陥は、本人の知らないうちに下された制御フローの判断の中に隠れたままになります。

レビュアーのワークフローを再構築する

AI生成PRをレビューするための実践的な手順を紹介します。全体を貫くテーマは、判断が重要な場所に認知リソースを集中させ、それ以外の場所では変更自身に説明させる、というものです。

ステップ1:ファイルを開く前に意図を問いただす

まずPRの説明文から始めます。チームがプロンプトや計画を保存しているなら、それも読みます。そして、どんなリンターよりも多くのAI由来の欠陥を捕まえる質問をひとつ投げかけます。宣言された意図は、差分の範囲と一致しているか?

エージェントはやりすぎます。「Webhookハンドラーにリトライロジックを追加して」というプロンプトから、HTTPクライアントのリファクタリング、依存関係の更新、そして途中で読んだだけの無関係な関数の「改善」まで含んだ差分が生まれることがあります。そうした追加変更のひとつひとつが、レビュー済みPRの皮をかぶった未レビューのスコープです。差分が意図を超えていたら、分割するか差し戻します。90秒のスコープ確認が、最悪の類のサプライズを日常的に防いでくれます。

ステップ2:差分より先にウォークスルーを読む

変更を挙動ごとにまとめたガイド付きウォークスルーやPRサマリーは、読み込みを始める前に変更の全体像を与えてくれます。見るべきは、どの挙動が追加・変更され、各部分がどうつながっているかです。これが「Change Stack」の中核にある考え方です。Change Stackは、作者に説明する力があったなら語ったはずの階層化された説明として、PRを整理します。

CodeRabbitのChange Stackは、中央に差分、右側にレイヤーのコンテキストを配置し、プルリクエストをレビュー可能なレイヤーに整理します

ここで読書計画も立てます。1,400行のうち、本当の判断を含むのはたとえば200行で、新しいリトライポリシーや変更された冪等性チェックがそれに当たります。残りは配管作業です。計画は、その200行を精読し、残りは自動化に任せる、というものになります。10,000行のPRを100行のPRと同じようにレビューできる人はいません。トリアージこそがレビューの中核スキルになり、トリアージには地図が必要です。

ステップ3:影響範囲をトレースする

変更の良し悪しを評価する前に、何に触れているかを確定させます。

  • 変更された関数を、どの呼び出し元が叩いているか?
  • 変更された契約を、どのサービスが消費しているか?
  • 無害に見えるスキーマ変更が、3つ先のリポジトリのコンシューマーを壊さないか?

依存関係を手作業でマッピングするのは、まさに人間が最も苦手で、セマンティック分析が最も得意とする領域です。差分を一度なめるだけではなく、意図的なコンテキストエンジニアリングを通じてコードベース全体の関係を推論する変更グラフは、あなたがgrepで午後を潰すはずだった問いに数秒で答えます。

どんなツールを使うにせよ、影響範囲がわかるまでは何も承認しない、という原則を守ってください。

ステップ4:エージェントが考えなかったパスを攻める

いよいよ、選び出した200行を敵対的に読みます。データ上AIコードで多発する失敗モードは、3つの確認でカバーできます。順序は差分に合わせて構いません。

欠落したエラーパス

AI生成コードは、nullチェック、早期リターン、網羅的な例外処理をしばしば省略します。ハッピーパスひとつごとに、呼び出しがタイムアウトしたら、空が返ってきたら、例外を投げたらどうなるかを自問してください。コールサイトあたり10秒の質問で、AIコードでは2倍近く多い失敗モードを狙い撃ちできます。たいていの場合、次のようなギャップをあぶり出すにはそれで十分です:

# エージェントが書いたコード
def process_webhook(payload):
    event = parse_event(payload)
    handler = HANDLERS[event.type]      # 未知のtypeならKeyErrorになるのでは?
    result = handler(event)
    mark_processed(event.id)            # handler()が先に例外を投げていたら?
    return result

悪用可能性

セキュリティの問題がAIのPRで最大2.74倍にのぼる以上、認証、認証情報、オブジェクトアクセスに触れる箇所には、「動くか?」だけでなく「悪用できるか?」という質問を向けるべきです。認証情報が承認済みのヘルパーを通っているか、オブジェクト参照が所有権を検証しているか、機密情報がログに落ちていないかを確認します。

ローカルな流儀

可読性における3倍のギャップは、AIコードが汎用的な命名や、どこか他人のコードベースから輸入されたイディオムに流れることを意味します。ローカルなパターンを破るコードは、将来の読み手全員から理解の時間を奪います。そして将来の読み手には、マージされたものから学習する他のエージェントも含まれるのです。

ステップ5:根拠を要求する

「テストは通っています」は、コードを書いたモデルがテストも書いた場合には低いハードルです。AIがコードを書けば書くほど、コードレビューに独立性が必要になる理由もここにあります。相関した盲点は盲点のままで、自分の宿題を自分で採点するジェネレーターは、同じエッジケースを自信満々に二度見逃します。

自明でない変更については、独立した根拠を求めてください。ステップ4で特定した失敗パスを実際に叩くテスト、さらに望ましいのは経験的な再現です。「これは並行負荷の下で競合する」という指摘が出たとき、その主張を証明ないし反証するサンドボックス実行は、どんなコメントスレッドよりも速く決着をつけます。

ステップ6:システムに教える

エージェント時代に最も変わったのが、レビューのこの部分です。人間を正せば、相手は覚えています。エージェントを正しても、その修正を永続化しない限り、エージェントは覚えていません。

解決したひとつひとつの指摘は、チーム全体の規約を書き込むチャンスです。「リトライには必ずlib/resilienceのデコレーターを使う」「ペイロードのボディは絶対にログに出さない」。学習(Learnings)とガイドラインとして記録された修正は、作者やエージェントを問わず、その後のPRへ引き継がれていきます。マージされたPRの中に消えていくレビューコメントは一度きりの労力ですが、標準になったレビューコメントは複利で効く労力です。

CodeRabbitでAI生成PRを説明可能にする

レビューにおける人間の役割はなくなりません。それはまさに上で挙げた判断、つまり意図を秤にかけ、リスクを評価し、システムを本当に理解していなければ下せない決定の中に生き続けます。

チェックリストの機械的な部分はすべて、PRがあなたの注意を消費する前に実行できます。CodeRabbitは、まさにそのレイヤーとして作られています。

CodeRabbitは、あなたが1行読む前に、プルリクエストを説明可能な変更に変えます:

  • ガイド付きウォークスルーとロジック図:Change Stackが差分を意図と挙動で整理するため、生の行ではなく地図から読み始められます。
  • 実際のコードベースコンテキストに基づく影響範囲:レビューは差分だけでなくコードベース全体を推論し、読む時間を投じる前に、変更が何に触れ、何に依存しているかを浮かび上がらせます。
  • 信頼のために作られた指摘:CodeRabbitは指摘を周辺コードに照らして検証してから提示します。疑わしい失敗モードが再現可能な場合は、サンドボックス実行がコメントスレッドより速く決着をつけます。
  • 定着する標準:あなたが記録した修正は学習(Learnings)とガイドラインになり、チームが制御できる範囲設定に従って、CodeRabbitがその後のレビューに適用します。

コードはこれからも、あなたが読めるより速く届き続けます。それでも主導権を握り続ける方法が、説明可能性です。

共有

Share on XShare on LinkedinShare on Reddit
CR_Flexibility.

AI生成PRのコード説明可能性に関するよくある質問