Claude Code /code-reviewと/review—ultraはいつ回すか

Claude Code /code-reviewと/review—ultraはいつ回すか | mohablog

Claude Code のレビューコマンドは /code-review/review <pr>/code-review ultra の3系統。名前が似ているのに、走る場所も料金も待ち時間も違います。公式ドキュメントに “How ultrareview compares to /code-review and /review” という比較表があるので、そこを起点に整理しました。

目次

3つのレビューコマンドは何が違うか

公式の比較表を日本語に置き換えたものが下です。

/code-review/review <pr>/code-review ultra
対象手元の作業差分GitHub の PR作業差分または PR
実行場所ローカルセッションローカルセッションクラウドサンドボックス
深さeffort 引数でスケールセッションの effort で単一パスエージェントのフリート + 独立検証
所要時間数秒〜数分数秒〜数分およそ5〜10分
料金通常の使用量通常の使用量無料枠の後は1回 $5〜$20
向く場面書きながらの素早い確認他人の PR を approve する前大きめの変更のマージ前

ultra だけ性質が違う

上2つはローカルの1エージェントが1パスで差分を読むもの。/code-review ultra はリモートサンドボックスでレビュアーエージェントのフリートを起動し、報告される検出結果はすべて独立に再現・検証されます。スタイル指摘ではなく実バグに寄る、というのが公式の説明。ローカルのターミナルは占有されません。

/simplify と /security-review の居場所

/simplifyv2.1.147 より前、今の /code-review そのものの名前でした。v2.1.154 から役割が分かれ、現在の /simplify はバグを探さずクリーンアップだけを当てます。バグ探し目的で /simplify をスクリプトに埋めているなら /code-review --fix に置き換えが要ります。/security-review は差分を脆弱性の観点だけで見るコマンドで、こちらは分岐していません。

/code-review をローカルで回す

/code-review                        # セッションの effort で作業差分をレビュー
/code-review high                   # 広めに拾う
/code-review max --fix              # 最大範囲 + 検出結果を作業ツリーに適用
/code-review low src/auth/session.ts  # ファイル単位
/code-review main...my-feature      # ref range 指定

検出結果はファイル位置と理由が付いた形で返ります。

Found 2 issues

🔴 src/auth/session.ts:142
   Token refresh races with logout, leaving stale sessions active

🟡 src/auth/session.ts:88
   parseExpiry silently returns 0 on malformed input

effort レベルで指摘の量が変わる

引数の指定は low|medium|high|xhigh|max|ultra低いほど件数は少なく確度が高いhigh から maxカバレッジが広がる代わりに確証の薄い指摘も混ざります。引数を省いた場合はセッションの現在の effort。/effort を上げた状態で打つと、黙って深くなります。effort そのものの挙動はClaude Code ultrathinkとeffortレベルで思考の深さを制御するで別途整理しました。

v2.1.206 で、Opus 4.8 の全 effort レベルにおける /code-review の検出品質が改善されています。

レビュー対象の既定スコープ

引数なしの /code-review が見るのは、ブランチが upstream より先に進んでいるコミット + 作業ツリーの未コミット変更。ここが ultra と食い違います。ultra現在ブランチとリポジトリのデフォルトブランチの差分 + 未コミット・ステージ済み変更で、upstream の設定を見ません。

upstream が別ブランチに向いている worktree だと、同じ変更のつもりで打った2つのコマンドが別の差分を読みます。意図した範囲を固定したいなら main...my-feature の ref range 形式を渡すのが確実。この形式は「my-feature から main への PR に含まれるコミット差分」を、upstream の設定に関係なくレビューします。

–fix と –comment

  • --fix: レビュー後、検出結果を作業ツリーに適用する
  • --comment: 検出結果を GitHub PR のインラインコメントとして投稿する

/code-review ultra --fix も通ります。クラウドでの深いレビューを走らせ、結果がセッションに戻ってきた時点で作業ツリーに当てる動きです。

/review <pr> を使う場面

役割は名前より狭く、GitHub の PR を単一パスで読み取り専用レビューするだけ。手元の差分は見ません。他人の PR に approve を押す前、自分の目の前に一度通しておく用途です。

自分が書いた差分に対しては /code-review のほうが素直。対象が「手元」か「PR」かで選べば迷いません。

ultra の料金と無料枠の消え方

ultra はプラン込みの使用量ではなく使用クレジットから引かれます。公式の “Pricing and free runs” にある表がこれ。

プラン無料実行無料枠の後
Pro3回使用クレジットで課金
Max3回使用クレジットで課金
Team / Enterpriseなし使用クレジットで課金

この3回はアカウントごとの一度きりの配布で、リフレッシュしません。しかもクラウドセッションが始まった時点で1回とカウントされます。途中で止めたレビューも、完走せず失敗したレビューも、無料枠を1つ消費します。有料実行のほうは走った分だけの課金なので、そこは対称ではありません。

使用クレジットが有効でないアカウントでは、有料の ultra は起動自体がブロックされ、課金設定へのリンクが出ます。現在の設定は /usage-credits で確認可。プラン制限側の内訳は Claude Code /usage—使用量と制限の内訳をスキル単位で確認する のほうで見られます。

走らせている間

ultra はバックグラウンドタスク。セッションは使い続けられますし、ターミナルを閉じても構いません。/tasks で実行中・完了済みのレビューを一覧、詳細を開く、進行中のものを止める、まで可能。ただし停止するとクラウドセッションはアーカイブされ、部分的な検出結果は返りません。途中で止めるくらいなら、最初から打たないほうが無料枠は減りません。

起動前には確認ダイアログが出ます。レビュー範囲(ブランチレビュー時はファイル数と行数)、残りの無料実行回数、推定コスト。Claude が自分の判断で ultra を開始することはありません

REVIEW.md でレビューの当たりを決める

GitHub App 版の Code Review が読むのは、リポジトリの2ファイル。CLAUDE.mdREVIEW.mdです。効き方の強さが違うので、混ぜると事故ります。

CLAUDE.md との優先度の違い

  • CLAUDE.md: 全タスク共通のプロジェクト指示。Code Review はこれをプロジェクト文脈として読み、新しく持ち込まれた違反を nit として報告する。逆方向にも効き、PR が CLAUDE.md の記述を古くする変更なら「ドキュメントの更新が要る」と指摘してくる
  • REVIEW.md: レビュー専用。レビューパイプラインの全エージェントのシステムプロンプトに、最優先の指示ブロックとして直接注入される。既定のレビューガイダンスより優先される

REVIEW.mdそのまま貼り付けられる点に注意。@ import 構文は展開されず、参照したファイルはプロンプトに読み込まれません。効かせたいルールはファイル本体に直接書く必要があります。CLAUDE.md の書き分けは Claude CodeとGitHub Actionsでコードレビューを自動化する手順 の設計とも噛み合います。

Nit の洪水を上限で止める

既定の重要度は本番コード向けのキャリブレーション。ドキュメントリポジトリや設定リポジトリに当てると、🟡 Nit が延々と積まれます。散文と設定ファイルは、磨こうと思えば無限に磨けるので。手元の設定リポジトリで初回 @claude review を打ったとき、Nit が20件超で本命の指摘が埋もれました。上限を書いてからは読める量に収まっています。

# Review instructions

## What Important means here

Reserve Important for findings that would break behavior, leak data,
or block a rollback: incorrect logic, unscoped database queries, PII
in logs or error messages, and migrations that aren't backward
compatible. Style, naming, and refactoring suggestions are Nit at
most.

## Cap the nits

Report at most five Nits per review. If you found more, say "plus N
similar items" in the summary instead of posting them inline.

## Do not report

- Anything CI already enforces: lint, formatting, type errors
- Generated files under `src/gen/` and any `*.lock` file
- Test-only code that intentionally violates production rules

結果として、インラインコメントは最大5件 + サマリに残件数、という形に落ちます。

再レビューを収束させる

push ごとにレビューが走る設定だと、1行の修正が7周目に届きます。REVIEW.md に収束ルールを1行書けば止まります。

after the first review, suppress new nits and post Important findings only

同じ発想で調整できるものが他にもあります。

  • 検証バー: 「挙動の主張には file:line の引用が要る。命名からの推測は不可」と書くと、著者に往復1回を強いる誤検出が減る
  • スキップ規則: 生成コード・ロックファイル・vendored 依存・機械生成ブランチ。全部消すほどではないパスは「scripts/ では、ほぼ確実かつ深刻な場合のみ報告」のようにバーを上げる
  • リポジトリ固有チェック: 「新しい API ルートには結合テストが要る」。最優先で注入されるので、長い CLAUDE.md に同じことを書くより確実に効く
  • サマリの形: 冒頭に 2 factual, 4 style のような集計行を要求する

長さにはコストがあります。REVIEW.md が長いほど、一番効かせたいルールが薄まる。挙動を変える指示だけを置き、一般的なプロジェクト文脈は CLAUDE.md に残すのが公式の推奨です。

claude ultrareview を CI から呼ぶ

インタラクティブセッションなしで同じレビューを起動するサブコマンドがあります。公式の “Run ultrareview non-interactively” に対応。

claude ultrareview              # 現在ブランチ vs デフォルトブランチ
claude ultrareview 1234         # PR 番号
claude ultrareview origin/main  # ベースブランチ指定

リモートのレビュー完了までブロックし、検出結果を stdout に出し、成功で 0、失敗で 1 を返します。

終了コードとタイムアウト

  • 0: レビュー完了(検出結果の有無に関わらず
  • 1: 起動失敗、クラウドセッションのエラー、タイムアウト
  • 130: Ctrl-C による中断

0 が「バグなし」を意味しない点が要注意。バグが出ても完走すれば 0 です。ゲートにするなら stdout をパースします。フラグは2つ。

  • --json: 整形済みの検出結果ではなく生の bugs.json ペイロードを出力
  • --timeout <minutes>: 完了待ちの上限。既定30分

進捗メッセージとライブセッション URL は stderr に出るので、stdout はパース可能なまま保たれます。Ctrl-C でサブコマンドを抜けてもリモートのレビューは走り続けるので、stderr に出た URL をブラウザで追えます。

GitHub App 版のチェックランを読む

Team / Enterprise 向けの Code Review を入れている場合、チェックランの最終行が機械可読なコメントになっています。

gh api repos/OWNER/REPO/check-runs/CHECK_RUN_ID \
  --jq '.output.text | split("bughunter-severity: ")[1] | split(" -->")[0] | fromjson'

返るのは重要度ごとの件数。

{"normal": 2, "nit": 1, "pre_existing": 0}

normal が 🔴 Important の件数です。チェックランは常に neutral で完了するのでブランチ保護でマージを止めません。止めたいなら、この JSON を自前の CI で読んで判定します。

打つ前に確認する制約

認証とプラットフォーム

ultra は Claude Code on the web の基盤で走るため、Claude.ai アカウントでの認証が必須。API キーだけでサインインしているなら /login からやり直しが要ります。そして次の環境では使えません。

  • Amazon Bedrock
  • Google Cloud の Agent Platform
  • Microsoft Foundry
  • Zero Data Retention を有効にした組織

バンドルできないリポジトリ

ブランチレビューでは、リポジトリの状態をバンドルしてリモートサンドボックスにアップロードします。大きすぎるとバンドルできず、PR モードを促されます。ブランチを push してドラフト PR を開き、/code-review ultra <PR番号> へ切り替える流れ。PR モードならサンドボックスがホストから直接 clone するので、ローカルの容量は関係ありません。

逆に PR の差分が大きすぎる場合は、レビュー作業が走る前にスコープのヒント付きで拒否されます。レビュー作業が走る前に止まるので、課金は発生しません。PR モードが効くのは github.com と、Owner が Claude Code に接続した GitHub Enterprise Server のインスタンスです。

まとめ

  • 対象が「手元の差分」なら /code-review、「他人の PR」なら /review <pr>。ここで迷わない
  • /code-review の既定スコープは upstream 基準、ultra はデフォルトブランチ基準。食い違うなら main...my-feature で固定する
  • effort は低いほど少数高確度、highmax は広く拾って不確実なものも混ざる。省略時はセッションの effort が効く
  • ultra の無料枠は Pro / Max で一度きりの3回。停止・失敗でも1回消える
  • Nit が多すぎるなら REVIEW.md に上限と収束ルールを書く。CLAUDE.md より強く効く
  • claude ultrareview の終了コード 0 は「完走」であって「バグなし」ではない。ゲートにするなら --json をパースする
  • Bedrock / Vertex / Foundry / ZDR 組織では ultra は使えない
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次