AI のレビューは「指摘して終わり」になりやすい

Claude Code や Cursor でコードレビューを頼むと、精度の高い指摘が大量に返ってきます。ところが、それらは多くの場合チャット画面に流れて消えてしまいます。「後で直そう」と思ってもどの指摘が残っているのか把握できず、結果的に何も変わらないまま次のタスクに移る——そういった経験を繰り返していました。

この問題は、AI が見つけたこと(レビュー結果)と人間が決めること(対応方針)を分けて管理する仕組みがないことから来ています。チャット履歴はその場限りで、構造化されていないためです。

そこで ReviewOps という OSS を作りました。AI のレビュー出力を JSON ファイルとして保存し、ダッシュボード上で人間が仕分けて、AI が実行する——という一連の流れを定義した小さなシステムです。

ReviewOps の 3 層構成

ReviewOps は 3 つの層で成り立っています。

役割
Skill AI エディタ(Claude Code / Cursor)がレビュー JSON を出力するための契約定義
Schema JSON Schema によるレビュー(immutable)と人間の決定(mutable)の定義
Manager CLI とローカルサーバー。ダッシュボードを提供し、.ai-review/ を読み書きする

最も重要な設計判断は、AI が書くファイルと人間が書くファイルを明示的に分けた点です。

  • .ai-review/<id>.json — AI が出力するレビュー結果。immutable(上書きしない)
  • .ai-review/review-state.json — 人間が決めた対応方針。mutable(ダッシュボードが更新する)

この分離があることで、AI は「自分が見つけたこと」を安全に保存でき、人間は「どう対応するか」だけに集中できます。

ダッシュボードの仕組み:5 つのレーン

ダッシュボードはカンバンボード形式で、すべてのレビュー指摘を 5 つの disposition(対応方針) レーンに仕分けます。

ReviewOps ダッシュボード

UI 表示 disposition 値 意味
New triage 新規指摘のデフォルト置き場。人間の判断待ち
In Progress ai-fix AI の作業キュー。AI はここだけ処理する
In Review manual 人間が対応中。AI は触らない
Won't Fix wontfix 理由付きで却下
Done done 解決確認済み

各カードには severity と category がバッジで表示されます。severity のラベルは must / should / imo / nit / fyi(critical から info の順)と表記されており、コードレビュー文脈に馴染みやすい形になっています。また confidence(high / medium / low)バッジもあり、AI の確信度を一目で確認できます。

In Progress レーンのカードには Fix instruction の入力欄があり、人間がここに修正方針を書いておくと AI がその指示に従って実装します。AI は In Progress レーンのカードしか処理しないため、In ReviewWon't Fix に置いたものが誤って上書きされる心配がありません。

ボードのほかに Files(ファイル別グループ)、History(レビュー実行履歴)、Insights(severity / category / ツール別の統計グラフ)の 3 タブがあります。

コントロールループ:人間がトリアージし、AI が実行する

ReviewOps のコアは、このコントロールループです。

ReviewOps コントロールループ

  1. AI エディタがレビューを実行し、.ai-review/<id>.json に結果を書き出す
  2. reviewops serve.ai-review/ を監視し、ダッシュボードを http://localhost:4517 で提供する
  3. 人間がダッシュボードで各指摘をトリアージする。In Progress に動かしたカードには Fix instruction を記入する
  4. AI が review-state.json を読み込み、ai-fix の指摘だけを処理する
  5. 処理が完了したら再レビューを走らせ、指摘が解消されていれば Done に移動する

このループを回すことで、「AI が見つける → 人間が仕分ける → AI が直す → 確認する」という作業フローが明確になります。

カードに紐づく Investigation thread 機能もあり、詳細パネルから「なぜこれが問題なのか」を AI に質問しながら対応方針を決めていく使い方ができます。

クイックスタート

# インストール
npm install -g reviewops

# プロジェクトを初期化(スキルとスキーマをコピー)
reviewops init

# AI エディタでレビューを実行
# .claude/skills/ai-code-review/ の指示に従い .ai-review/<id>.json が生成される

# ダッシュボードを起動
reviewops serve
# http://localhost:4517 でアクセス

起動後、AI が見つけた指摘が New レーンに並びます。重要度(must / should)を見ながら In ProgressIn Review に仕分け、Fix instruction を書いたら AI に渡します。

現在の状況をターミナルで素早く確認したい場合は reviewops status が便利です。disposition と severity 別の集計が表示されます。

今後のロードマップ

Phase 1(現在リリース済み)では CLI とサーバー、カンバンボード、Fix instruction の書き込み、Investigation thread が動作します。

Phase 2 では ai-fix-from-board スキルを追加する予定です。In Progress レーンのカードを自動で処理し、修正後に元のレビュー JSON と fingerprint で照合して「本当に直ったか」を確認するところまでを自動化します。

Phase 3 ではトレーサビリティ(どの指摘がいつ、どう処理されたか)、スコアトレンドの可視化、複数 AI による合意分析を実装する予定です。複数の AI エージェントが同じコードをレビューしたとき、どの指摘が共通しているかを集計することで、優先度の信頼性を上げる狙いがあります。

まとめ

  • AI コードレビューの指摘が「見て終わり」になる原因は、レビュー結果の管理と対応方針の決定が混在しているため
  • ReviewOps は .ai-review/<id>.json(AI が書く・immutable)と review-state.json(人間が書く・mutable)を分離することで、責任範囲を明確にする
  • ダッシュボードの 5 レーン(New / In Progress / In Review / Won't Fix / Done)で人間がトリアージし、AI は In Progress レーンのみ処理するという制約でコントロールを保つ
  • Phase 2 以降で自動修正と再レビュー照合、スコアトレンドまで広げていく予定