メインコンテンツまでスキップ

Run store と回帰比較(runs / --baseline)

River Review はレビュー実行(run)の結果をプロジェクトローカルの Run store.river/runs/)に保存し、過去の実行と比較して回帰(新規・解消された指摘)を確認できます。CI に組み込めば「この PR で指摘が増えていないか」を機械的に追跡できます。

各フラグ・サブコマンドの一覧は Stable Interfaces(CLI リファレンス) を参照してください。本ページは使い方(how-to)に絞っています。

全体像

やりたいことコマンド
レビュー実行を保存するriver run <path> --save
保存済み実行の一覧を見るriver runs list
保存済み実行の差分(回帰・振動)を見るriver runs diff <id1> <id2> [<id3>...]
保存済み実行全体の集計ダッシュボードを見るriver runs summary
任意の baseline JSON と比較するriver run <path> --baseline <prev.json>

1. レビュー実行を保存する(--save

river run--save を付けると、実行結果が Run store に保存されます。

river run . --save

保存に成功すると、標準エラー出力に保存先が表示されます。

Run saved: 2026-06-06T08-30-00-000Z-a1b2c3 → /path/to/repo/.river/runs/2026-06-06T08-30-00-000Z-a1b2c3.json

Run store の場所

  • 既定: レビュー対象リポジトリ直下の .river/runs/(プロジェクトローカル)
  • リポジトリが特定できない場合のフォールバック: ~/.river/runs/(グローバル)

各実行は <runId>.json という 1 ファイルとして保存されます。runId は ISO タイムスタンプ + 短いハッシュ(例: 2026-06-06T08-30-00-000Z-a1b2c3)で構成され、ファイル名の辞書順が時系列順と一致するよう設計されています。

.river/runs/ は実行ログであり、リポジトリにコミットする必要はありません。.gitignore に追加して運用するのが一般的です。

保存される内容

各 run record(JSON)には次の情報が含まれます。

  • runId / timestamp / phase / reviewMode
  • mergeBase / defaultBranch / changedFiles
  • findings(指摘)/ suppressedFindings(抑制された指摘)
  • finalSummary: findingsCount / suppressedCount / overviewCount / changedFilesCount / tokenEstimate

2. 保存済み実行の一覧(river runs list

Run store に保存された実行を新しい順で表示します。

river runs list
Stored runs (/path/to/repo/.river/runs):

2026-06-06T08-30-00-000Z-a1b2c3 phase=midstream findings=4 suppressed=1 files=7 2026-06-06T08:30:00.000Z
2026-06-05T17-10-00-000Z-d4e5f6 phase=midstream findings=6 suppressed=0 files=5 2026-06-05T17:10:00.000Z

保存済み実行がない場合は No stored runs found in ... と表示されます。

3. 2 つの実行を比較する(river runs diff

保存済みの 2 実行を runId で指定し、指摘の回帰を比較します。

river runs diff 2026-06-05T17-10-00-000Z-d4e5f6 2026-06-06T08-30-00-000Z-a1b2c3

## Regression Review Summary という Markdown が出力されます。

項目意味
New findings1 つ目になく 2 つ目に現れた指摘(回帰)
Resolved findings1 つ目にあり 2 つ目で消えた指摘(解消)
Persisting両方に存在し、スコア変化が小さい指摘
Score changed両方に存在するが composite スコアが ±0.05 以上動いた指摘
Regression scoreNew − Resolved。正なら指摘が純増(悪化)

New / Resolved / Score changes の各セクションには、対象ファイルと指摘内容が一覧表示されます。

指摘の同一性は fingerprint で判定されます。ファイルパス・ルール・指摘内容(メッセージ要旨)が同じ指摘は同一とみなされ、行番号のズレは無視されます。

3+ run での振動検知

runId を 3 件以上指定すると、振動(oscillation)検知が有効になります。

river runs diff <run-id-1> <run-id-2> <run-id-3>

振動とは、一度 Resolved(解消)になった指摘が後続の run で再び New として現れる現象です。AI による revise(修正提案)が別の問題を引き起こす自己修正ループのシグナルとなります。

出力の Oscillated findings セクションには、解消後に再出現した指摘が一覧表示されます。--output json で出力すると oscillated 配列として機械的に消費できます。

4. 集計ダッシュボード(river runs summary

Run store 全体を集計した Markdown ダッシュボードを表示します。

river runs summary
## River Review Dashboard

| Metric | Value |
|---|---|
| Total runs | 12 |
| Total findings | 48 |
| Total suppressed | 6 |
| Suppress rate | 11.1% |
| Avg findings/run | 4.0 |

加えて、Severity / Confidence の分布表が出力されます。複数実行を横断した品質トレンドの把握に使います。

5. 任意の baseline と比較する(--baseline

runs diff が「保存済み 2 実行の比較」なのに対し、--baseline新しく実行した結果を、任意の過去レビュー JSON と比較します。main ブランチ等で生成した基準(baseline)をファイルとして持っておき、PR ブランチで回帰チェックする用途に向きます。

river run . --baseline ./baseline-findings.json

--baseline に渡す JSON は次のいずれかの形式を受け付けます。

  • findings の配列そのもの([ { ... }, { ... } ]
  • findings(または issues)キーを持つオブジェクト({ "findings": [ ... ] }

出力は runs diff と同じ ## Regression Review Summary 形式です。比較に失敗した場合は Warning: --baseline comparison failed: ... が出力され、レビュー自体は継続します。

baseline ファイルの作り方

--output json で実行結果を保存しておけば、そのまま baseline として再利用できます。

# main で基準を作成
git switch main
river run . --output json > baseline-findings.json

# PR ブランチで回帰チェック
git switch feature/my-change
river run . --baseline ./baseline-findings.json

CI への組み込み例

PR で指摘が純増したら気付けるようにする最小例です。

# 基準(main の指摘)を成果物として持っている前提
river run . --baseline ./baseline-findings.json --save

--save を併用すると、各 PR の実行も Run store に蓄積され、後から river runs summary でトレンドを確認できます。

関連ページ