本文へ移動
🧭

AIエージェントに実装を任せ始めると、次に詰まるのは「レビューもAIに任せてよいのか」です。自己レビューをさせれば十分なのか、browserで画面確認までさせるべきなのか、Claude Code code review や ultrareview をどこで使うのか、最後に人間は何を見ればよいのか。この順番を決めないまま導入すると、レビューが増えたのに merge 判断はむしろ曖昧になります。

この記事では、AI review harness を AIエージェントが作った差分を、段階的な検証レーンに流す設計 として整理します。Harness Engineering の全体像は Harness Engineering とは?、Codex の画面確認は Codex browser use ガイド、Claude Code のPRレビュー機能は Claude Code code review 実践ガイド、最後の受け入れ判断は Codex レビュー完了ゲート設計ガイド に分けています。

今回扱うのは、自己レビュー、決定論的検証、browser検証、深いPRレビュー、人間ゲート のつなぎ方です。

先に結論: review harness は4段に分ける

AIレビューは、強いレビュー機能を1つ選ぶ話ではありません。実務では次の4段に分けた方が安定します。

段階目的代表的な手段通してよい差分
Self checkエージェント自身に明白な漏れを直させるchecklist、local /code-review、lint、test小さな実装、文言、軽い修正
Evidence check動作証拠を集めるtest log、screenshot、browser use、traceUI、API、権限、状態遷移
Deep review人間が読み飛ばす欠陥を探すClaude Code Code Review、ultrareview、security scanauth、billing、migration、権限変更
Human gatemerge / deploy の責任を確定するdiff、work log、証跡、残リスク確認すべて

私なら、AIが作った差分をいきなり「AIレビュー済み」とは呼びません。まず本人にチェックさせる。次に実行結果を出させる。リスクが高ければ別のレビューlaneに回す。最後に人間が受け入れ条件だけを見る。この順にします。

review_harness:
  self_check:
    required:
      - scoped_diff_summary
      - changed_files_reason
      - local_tests_or_reason
  evidence_check:
    required_when:
      - ui_change
      - api_contract_change
      - permission_or_auth_change
  deep_review:
    required_when:
      - auth
      - payment
      - data_migration
      - external_write
      - security_boundary
  human_gate:
    required:
      - scope_match
      - verification_log
      - unresolved_risk
      - rollback_or_revert_plan

ポイントは、レビューを「感想」ではなく 状態遷移 にすることです。どの条件を満たしたら次の段へ進むのか、どこで止めるのかを明示します。

なぜAIレビューだけでは足りないのか

OpenAI の Harness Engineering 記事では、エージェントがPRを作り、ローカルレビューや追加のagent reviewを依頼し、フィードバックへ応答しながら反復する運用が説明されています。同時に、UI、ログ、メトリクスをエージェントが読める形にする重要性も書かれています。

ここから分かるのは、レビュー品質はモデル単体ではなく、レビュー対象を読める形にしているかで決まるということです。diffだけを読ませるより、起動手順、失敗ログ、画面状態、trace、受け入れ条件を渡した方がレビューは具体的になります。

Harness Engineering の原型を説明したブログでも、失敗したら「次回から同じ失敗を防ぐ仕組み」を作ること、AGENTS.md のような指示と、スクリーンショットやテストのような実際のツールを組み合わせることが強調されています。

つまり review harness は、次のようなものです。

  • レビュー観点を毎回プロンプトで思い出させない
  • 画面やログを人間の感想ではなく証拠として残す
  • AIレビュー結果をそのまま承認にしない
  • 高リスク差分だけ深いレビューへ昇格する
  • 最後の責任境界を人間側に残す

「AIがレビューしたからOK」ではなく、「AIがどの証拠を見て、どの条件まで確認したか」を残す設計です。

Self check: まず本人に戻す

最初のレビューは、差分を作ったAIエージェント自身に戻します。ただし、自由文で「確認して」では弱いです。

Before finalizing, run a self check:
- List the files you changed and why each file was necessary.
- Confirm the request scope did not expand.
- Run the existing relevant verification command, or explain why no command exists.
- Identify one plausible regression and how you checked it.
- Do not claim browser verification unless you actually opened the page.

この段階の目的は、深い欠陥探しではありません。明白なスコープ逸脱、検証漏れ、説明不能な変更をその場で落とすことです。

私がよく使う判定は次です。

観点通す条件止める条件
scope依頼されたファイル・機能に収まっているunrelated refactor が混ざる
verification既存コマンドを実行済み、または未実行理由が具体的「たぶん動く」だけ
regression影響範囲を1つ以上言語化できる影響範囲を答えられない
evidencelog、diff、screenshot などがある最終報告だけがある

local /code-review のような軽いレビューは、この self check と相性がよいです。PR全体の深い監査ではなく、作業中に「この差分は明らかに危ないか」を早く見る用途に寄せます。

Evidence check: 画面・ログ・テストをレビュー可能にする

AIレビューが弱くなる典型は、レビュー対象がdiffだけのときです。UI変更なら実画面、API変更ならrequest / response、非同期処理ならlog、権限変更なら拒否ケースの証拠が必要です。

Codex browser use のような仕組みは、ここで使います。目的は「AIにブラウザを触らせること」ではなく、画面状態を review artifact にすることです。

evidence_packet:
  branch: feature/settings-overflow
  route: http://localhost:4321/settings/billing
  viewport: 390x844
  state: over_quota_warning
  checked:
    - no_horizontal_scroll
    - warning_text_does_not_cover_cta
    - console_has_no_new_error
  artifacts:
    - screenshot_mobile_settings_billing.png
    - pnpm_build_log.txt
  not_checked:
    - production_billing_submit

この粒度で残すと、人間は「本当に画面を見たのか」を聞き直さずに済みます。逆に、次のような報告は review harness では証拠不足です。

UIを確認しました。問題ありません。

どのURLか、どのviewportか、どの状態か、何を未確認にしたかがないためです。

Deep review: 高リスク差分だけ別laneへ昇格する

Claude Code の Code Review docs では、PRに対して複数の専門agentが並列に確認し、logic error、security vulnerability、edge case、regression を探す仕組みとして説明されています。一方で、PRをapproveしたりblockしたりするものではなく、既存のレビューworkflowを保つ前提です。

ultrareview はさらに深いレビューlaneです。公式docsでは、/code-review ultra が remote sandbox で reviewer agent fleet を起動し、通常のlocal /code-review より広いcoverageと独立検証を狙うものとして説明されています。ただし、研究preview、利用条件、費用、投稿可否、diff上限があります。

ここで重要なのは、すべてのPRを深いレビューに回さないことです。深いレビューは強いですが、遅く、費用があり、結果を読む負荷もあります。

私なら次の条件で昇格します。

昇格条件使うレビュー理由
auth / permission / billingCode Review + ultrareview読み飛ばしの影響が大きい
migration / data repairultrareview +人間確認rollback不能な副作用がある
public UI の重要導線browser evidence + Code Review見た目とロジックの両方が必要
security boundarysecurity scan + Code Review専用toolとPR reviewの責務が違う
文言・小さなCSS修正self check + browser evidence深いレビューの費用対効果が低い

AIレビューを重ねるほど安全になる、とは限りません。どのレビューが何を見たかが重複し、誰も最終判断しない状態になるからです。深いレビューは「重要差分を止めるための昇格先」として使います。

Human gate: 人間は全部を読み直さない

review harness を作る理由は、人間がすべてのdiffを最初から読み直すためではありません。人間が見るべきものを絞るためです。

最後に人間が見るのは、次の4つで十分なことが多いです。

  1. 依頼範囲とdiffが一致しているか
  2. 検証証跡が対象状態を覆っているか
  3. AIレビューの未解決findingが残っていないか
  4. merge後に戻す手段があるか

テンプレートにするとこうです。

## Human review gate

Scope:
- Requested:
- Changed:
- Out of scope:

Evidence:
- Commands:
- Browser / screenshot:
- Logs / traces:

AI reviews:
- Self check:
- Code Review:
- Ultrareview:
- Security scan:

Decision:
- Accept:
- Hold:
- Rollback / revert plan:

この gate で Accept に進めないなら、AIに「直して」と戻すより、どの段階へ戻すかを指定します。

問題戻す先
依頼範囲から外れているSelf check
画面証拠が足りないEvidence check
重要findingが残っているDeep review後の修正
merge後の戻し方がないHuman gateで保留

戻し先を決めると、AIエージェントは同じ修正を雑に繰り返しにくくなります。

REVIEW.md と AGENTS.md は分ける

review harness を作るとき、すべてを AGENTS.md に入れたくなります。これは早い段階で破綻します。通常の作業指示、コマンド、禁止事項、レビュー観点、PRテンプレートが1つに混ざると、エージェントも人間も読みません。

私は次のように分けます。

ファイル役割書く内容
AGENTS.md作業全体の共通ルールコマンド、禁止操作、Git運用、応答方針
REVIEW.mdレビュー専用の観点重点リスク、severity、見なくてよいstyle指摘
PR template人間の受け入れ判断検証、スクリーンショット、rollback
scripts決定論的な検証lint、test、schema check、screenshot取得

レビュー専用の判断は REVIEW.md に寄せます。たとえば、style nit を出しすぎるAIレビューなら、REVIEW.md に「style only の指摘は出さず、bug / security / regression を優先」と書きます。逆に、絶対に落としたい禁止操作は自然言語ではなく script や permission に寄せます。

小さく始める設定例

最初から全自動レビュー基盤を作る必要はありません。私なら、最初の1週間は次だけにします。

week_1_review_harness:
  required_for_every_ai_change:
    - self_check_summary
    - verification_command_or_reason
    - changed_files_reason
  required_for_ui_change:
    - local_url
    - viewport
    - screenshot_or_browser_comment_summary
  required_for_high_risk_change:
    - second_ai_review
    - unresolved_findings_list
    - rollback_plan
  human_gate:
    - scope_match
    - evidence_match
    - final_accept_or_hold

ここで運用して、実際に漏れたものだけを追加します。毎回「テストを忘れる」なら command を固定する。毎回「画面を見たと言うだけ」なら browser evidence を必須化する。毎回「PRでstyle指摘だけ増える」なら REVIEW.md を直す。この順番が Harness Engineering です。

よくある失敗

1. AIレビューを承認者にしてしまう

AIレビューはfindingを出す役です。承認者ではありません。特に外部write、権限変更、顧客データ、課金、認証は、人間のaccept条件を残します。

2. browser確認を「見た」だけで終える

画面確認は、URL、viewport、state、checked、not_checked まで残して初めてレビュー証跡になります。スクリーンショットがあっても、どのbranchの画面か分からなければ弱いです。

3. 深いレビューを普段使いする

ultrareview や深いmulti-agent reviewは、高リスク差分に絞る方が続きます。小さな修正まで毎回回すと、費用、待ち時間、finding消化で運用が止まります。

4. 失敗した段階を記録しない

レビューで見つかった問題が、self check不足なのか、evidence不足なのか、deep reviewでしか見つからない性質なのかを残さないと、次回の改善につながりません。

review_failure_log:
  finding: "mobile CTA was hidden behind sticky footer"
  caught_by: human_gate
  missed_by:
    - self_check
    - browser_evidence
  fix_to_harness:
    - require mobile viewport screenshot for checkout route
    - add sticky footer overlap item to REVIEW.md

この記録があると、次回から同じ失敗を防ぐ仕組みにできます。

まとめ

AI review harness は、AIレビュー機能の寄せ集めではありません。AIエージェントが作った差分を、自己レビュー、証拠化、深いレビュー、人間ゲートへ流すための設計です。

小さく始めるなら、まず self check と verification log を必須にします。UI変更だけ browser evidence を足し、auth / billing / migration / permission のような高リスク差分だけ deep review へ昇格します。最後に、人間はdiff全体を読むのではなく、scope、evidence、unresolved finding、rollback を見ます。

この順番にすると、レビューは「AIにもう一度見てもらう」ではなく、次に同じ失敗を起こさないためのハーネスになります。

参考にした一次情報

WRITTEN BY nidoneko

Full-stack engineer with 8+ years of experience in TypeScript, React, Node.js, and cloud-native development across healthcare, finance, HR, and IoT domains.

View Profile →