AIレビューに棄権を許すと指摘の内訳はどう変わるか

材料を差分だけに限ってレビューさせると、返ってくる指摘はすべて断定の形で並ぶ。根拠が差分の中にあるかを、1件ずつ人が確かめることになる。指摘8件について判定に必要な場所を列挙して突き合わせると、差分だけで断定できるのは4件で、残る4件は必要な場所が差分の外にあった。差分の文脈を0行から5行へ広げると、断定は1件から5件まで動く。断定できるかどうかは指摘の性質ではなく、渡した材料の範囲で決まる。

この記事の提案を使うのは、材料が差分だけで、呼び出し元や設定ファイルを渡していないときである。

判定に必要な場所を数える

題材は TypeScript のモジュールで、差分は8ファイル・追加25行・削除16行である(スキーマで出力を固定する記事で定義したものと同じ)。仕込んだ欠陥8件について、判定に必要な場所を1件ずつ列挙した。列挙してから、その場所が差分(+ の行と文脈の行)に入っているかを突き合わせている(2026-10-12 に数えた。モデルは走らせていない)。

この差分は diff -U3 の形で、文脈は変更の前後3行である。差分に1行も入っていないファイルは src/catalog.ts と src/quote.ts の2つである。

指摘 場所 必要な場所 差分の外 判定
1 src/quote.ts:5 新しい単位の定義、古い単位で渡す呼び出し 1 棄権
2 src/seats.ts:21 確認の無い実装、ship にある確認、約束3の本文 1 棄権
3 src/log.ts:7 出力の実装、約束4の本文 0 断定
4 src/checkout.ts:17 潰している箇所、undefined を返す宣言 1 棄権
5 src/checkout.ts:32 処理の実装、約束1の本文 0 断定
6 src/checkout.ts:32 埋め込まれた値、約束5の本文 0 断定
7 src/checkout.ts:36 定数の箇所、足された設定値、設定値を読む箇所が無いことの確認 1 棄権
8 tests/checkout.test.ts:14 書き換え後の期待値、書き換え前の期待値 0 断定

断定4件、棄権4件に分かれた。棄権に落ちる理由は4通りで、どれも違う。

指摘1は、指摘の対象そのものが差分の外にある。割引率の単位を比率へ変えた側(src/money.ts)は差分に入っているが、古い単位で渡し続けている呼び出し(src/quote.ts:5)は差分に入っていない。差分を見ただけでは、その呼び出しが存在するかどうかが分からない。

指摘2は、比べる相手が差分の外にある。reserve が残数を確認しないことは差分の中で読めるが、同じクラスの ship に確認があることは差分に入っていない。差分の文脈は追加された reserve の前3行までで、ship の中の if (qty > this.available(sku)) は15行目にあり、文脈の範囲(17行目から24行目)に届かない。

指摘4は、型の宣言が差分の外にある。findItem(l.sku)! で undefined を潰していることは差分の中で読めるが、findItem が undefined を返す宣言は src/catalog.ts にあり、このファイルは変更されていないので差分に入っていない。

指摘7は、不在の確認が差分の外に及ぶ。config.retryLimit が足されたことと、再試行の回数が定数の3であることは差分の中で読める。設定値を読む箇所がリポジトリのどこにも無いことは、src/ 全体を走査しないと言えない。

断定できる件数は文脈の行数で決まる

断定になった4件のうち3件(指摘3・5・6)は、判定基準の文書の本文を必要としている。この差分は README.md の約束2の1行を書き換えているので、文脈の3行に約束1・3・4・5 が入った。入ったのは偶然である。

文脈の行数を変えて、同じ8件を振り分け直した。

差分の文脈 断定 棄権
-U0 1 件 7 件
-U1 2 件 6 件
-U2 3 件 5 件
-U3 4 件 4 件
-U5 5 件 3 件

文脈を広げるほど断定が増える。-U0 では、約束の本文が1行も入らないので、判定基準を必要とする3件が全部棄権に落ちる。-U5 では src/seats.ts の ship の確認が文脈に入り、指摘2が断定に移る。同じ指摘が、同じリポジトリに対して、差分の作り方だけで断定と棄権のあいだを動く。 指摘の側に「これは断定できる」と書かせても、その判定は渡した材料の範囲に対するものである。

棄権の4件が待っている材料は4箇所だった。

棄権の指摘が挙げる「足せば判定できる材料」
src/quote.ts    指摘 1 が待っている
src/seats.ts    指摘 2 が待っている(差分に入っていない範囲)
src/catalog.ts  指摘 4 が待っている
src/*.ts        指摘 7 が待っている(走査が要る)

4箇所を足して渡す2回目で、4件が判定に入る。足す材料が4箇所にまとまったのは、棄権の欄に「何があれば判定できるか」を書かせているからである。これが無いと、棄権した4件に対して人がそれぞれの必要な場所を考え直すことになる。

成果物

棄権の欄

指摘1件につき1欄を足す。値は2つで、棄権のときだけ1行が付く。

レビュー指示に足す「棄権」の節
## 棄権

指摘1件ごとに、次の1欄を足す。

- 判定: 断定 / 棄権

「断定」と書くのは、判定に必要な場所が**渡された材料の中にすべてある**ときに限る。
1箇所でも材料の外にある場合は「棄権」と書き、同じ欄に続けて次の1行を足す。

- 棄権の理由: <足せば判定できる材料のパス>(<その材料から何を読みたいか>)

材料の外とは、次のいずれかである。
- 渡した差分に含まれないファイル
- 渡した差分の文脈の行に含まれない行(同じファイルの別の箇所でも、
  差分に出ていなければ材料の外である)
- リポジトリ全体の走査(「どこにも無い」ことの確認)

棄権の件数が0件だった場合は、出力の末尾に「棄権なし」と書く。

3つ目の「材料の外」の定義を省くと、同じファイルの別の箇所を読んだことにして断定が書かれる。この題材の指摘2は、reserve と ship が同じファイルにあるのに、文脈の行数の違いで断定と棄権に分かれた。

棄権の指摘から足す材料を決める

棄権の理由に挙がったパスを集めて、重複を落とす。この題材では4件の棄権から4箇所が出た。2回目は差分と4箇所を一緒に渡し、1回目で断定になった4件は再掲させない。

棄権を回収する2回目
1回目で棄権になった指摘は次の <棄権の件数> 件である。
それぞれが挙げた材料を足して渡す。

<指摘の通し番号と場所の一覧>

足した材料: <パスの一覧>

この <棄権の件数> 件について、判定を断定か取り下げに決める。
1回目で断定になった指摘は再掲しない。
取り下げる場合は、材料を読んだ結果どこが違ったかを1行で書く。

取り下げを値に入れておくと、材料を足した結果として誤りだった指摘が、棄権のまま残らない。2回目に足すのは棄権の欄が挙げたパスだけである。どのファイルを材料に選ぶかという一般の判断は扱わない。

6欄を超えるときの入れ替え

指摘1件あたりの欄は6つを上限にする。判定の欄を足して7つ目になる場合、外すのは深刻度である。棄権した指摘の深刻度は判定の前の見込みなので、断定に移ってから付け直すほうが使える。断定の指摘だけに深刻度を書かせる形にすれば、欄は6つに収まる。

判定の欄を外していい条件は、材料をリポジトリ全体にしているときである。モデルが自分でファイルを開ける環境で全体を渡しているなら、材料の外という範囲が無い。その場合は棄権ではなく、探索の打ち切りの側で扱う。

欄を1つ足すと何を使うか

出力項目は1欄増える。棄権のときだけ理由の1行が付くので、この題材では8件に対して8行+4行の12行増えた。

採用できる指摘の件数は減る。1回目で直しに回せるのは断定の4件だけで、残る4件は2回目を待つ。欄を足す前は8件が断定の形で並んでいたので、見かけの件数は半分になる。減ったのは判定できる件数ではなく、判定できるように見えていた件数である。

払うのはパスの数で、棄権を回収する2回目で1増える。2回目の入力は、1回目の差分に4箇所を足したものである。この題材では足す4箇所のうち1つが src/*.ts 全体の走査なので、2回目の入力はリポジトリのほぼ全体になる。走査を必要とする棄権が混ざると、2回目の入力量は差分の大きさでは決まらない。

この欄を落としていい条件は、1回目の出力をそのまま直しに回さないときである。 出力を人が1件ずつ読んで採否を決める運用なら、根拠が材料の中にあるかどうかは読む過程で分かる。欄が要るのは、出力を読まずに件数だけを見て次の工程へ渡す段があるときに限る。

指示文の点検

棄権を許すときに確かめる項目
  • 判定の欄を「断定 / 棄権」の2値で書かせているか
  • 断定を「必要な場所がすべて材料の中にある」ときに限ったか
  • 材料の外を3通り(差分外のファイル、文脈外の行、全体の走査)で定義したか
  • 棄権のときに「足せば判定できる材料のパス」を書かせているか
  • 同じファイルの別の箇所も材料の外であると書いたか
  • 渡した差分の文脈が何行かを把握しているか
  • 棄権の理由に挙がったパスを集めて2回目を組む段取りがあるか
  • 2回目で「取り下げ」を値に入れたか
  • 棄権が0件のときに「棄権なし」と書かせているか
  • 欄が7つ目になる場合に外す欄(深刻度)を決めたか
  • 走査を必要とする棄権が、2回目の入力量を跳ね上げないかを見たか

おわりに

指摘8件について判定に必要な場所を列挙して差分と突き合わせると、差分だけで断定できるのは4件だった。棄権に落ちた4件の理由は、指摘の対象そのものが差分の外にある、比べる相手が差分の外にある、型の宣言が差分の外にある、不在の確認がリポジトリ全体に及ぶ、の4通りである。

差分の文脈を0行から5行へ広げると、断定は1件から5件まで動いた。断定になった4件のうち3件は、判定基準の文書の本文が文脈に入ったから断定できている。断定と棄権の境は、指摘の確かさではなく渡した材料の範囲に引かれる。

次に取る行動を1つ挙げる。手元のレビュー出力から断定された指摘を1件選び、その判定に必要な場所を書き出して、渡した差分に入っているかを確かめる。入っていない場所が1つでもあったなら、その1件が棄権の欄を足す理由になる。