local-review
GitHub PR またはローカルブランチのタイトル+説明・コミット・差分を、動的トリアージで深度を変えてレビューする。PR 作成前のセルフレビューに使う。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
GitHub PR またはローカルブランチのタイトル+説明・コミット・差分を、動的トリアージで深度を変えてレビューする。PR 作成前のセルフレビューに使う。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | local.review |
| description | GitHub PR またはローカルブランチのタイトル+説明・コミット・差分を、動的トリアージで深度を変えてレビューする。PR 作成前のセルフレビューに使う。 |
| argument-hint | [PR番号 | PR URL | ブランチ名 | 省略時は現在ブランチ] [--base <branch>] |
| allowed-tools | Bash(git diff:*), Bash(git log:*), Bash(git fetch:*), Bash(git config get:*), Bash(git rev-parse:*), Bash(gh pr view:*), Bash(gh pr diff:*), Bash(gh repo view:*), Read(**), Grep(*), Glob(*), Task, AskUserQuestion |
このセッションは配管(入力取得・ルータ起動・ディスパッチ・集約・表示)に徹する。 レビュー観点は REVIEW.md が唯一の真実源で、ここには書かない。
file:line + severity + 規約参照1つで自己完結させる。先生役の長文解説は不要。gh pr comment 等は一切叩かない。引数 $ARGUMENTS からモードを決め、タイトル・説明・コミット・差分を取得する。
観点・ディスパッチ・集約は共通で、ここだけがモードで差し替わる。
| 引数 | モード |
|---|---|
| 数字 / GitHub PR URL | PRモード |
| ブランチ名 / 省略(現在ブランチ) | ローカルモード |
--base <branch> | base 上書き(既定 main)。PRモードでは無視 |
次の2コマンドは依存がないため、1メッセージ内の2 Bash tool call として同時発行する(逐次実行しない):
gh pr view <N|URL> --json title,body,author,baseRefName,headRefName,commits,files
→ title と body を連結して「タイトル+説明」1つの文章として扱う。commits からコミットメッセージ群、files(path / additions / deletions)から変更ファイル × 追加/削除行数(numstat 相当)を得る。gh pr diff <N|URL> → 差分本文(変更ファイル × 行範囲)。ファイル一覧は gh pr diff --name-only。PRモードの numstat は
filesから取る。gh pr diff | git apply --numstatのような即興コマンドは使わない(git applyは書き込み系で許可すべきでない・&&/|の複合コマンドは静的解析が allowlist にマッチせず毎回権限確認が出る)。
base を解決する(--base 指定値、無ければ main)。差分計算の前に必ず git fetch origin <base> を実行し、
以降は origin/<base> を基準にする(ローカル base が古いと merge-base が遡り、マージ済み変更が混入するため)。
git config get branch.<現在/指定ブランチ>.description の全体を1つの文章として読む
(1行目がタイトル相当・残りが本文だが分割せず通しで読む)。
AskUserQuestion でユーザーに聞く。git log origin/<base>..HEAD --format='%H%n%s%n%b%n---'git diff origin/<base>...HEAD(+ --stat / --name-only / --numstat)origin/<base> が存在しない(origin に無いローカル専用ブランチを --base 指定)場合のみローカル <base> にフォールバックし、その旨を明示する。
--name-only が空ならレビュー対象が無い。STEP 2 以降に進まず即終了し、次アクション(作業ブランチに切替 / --base 変更 / PR番号指定)を提示する。存在しない問題をでっち上げない。
取得した「変更ファイル × 変更/追加行の行番号範囲」を 唯一の change set として保持し、以降の全 agent と帰属ゲートに同一文面で渡す。
git rev-parse --show-toplevel でリポジトリルートを解決し、次を読む:
REVIEW.md(必須・全プロジェクト共通)。<project_root>/.claude/REVIEW.md(あれば・チーム共有)。<project_root>/.claude/REVIEW.local.md(あれば・個人/gitignore)。加えて、プロジェクト観点の「最初に読むファイル」に従い、.claude/CLAUDE.md と変更種別に応じた .claude/rules/* も Read。
優先順位: 共通がレンズの枠組みを与え、プロジェクトが補完・上書き、開発者が最優先で補完・上書きする。矛盾したら後の層を優先。
差分の複雑さ・リスクを安いモデルで分類し、レビューの深度を決める。 このステップは省略しない。 main が差分を把握済みでも、深度・レンズ選定は必ずルータの JSON 出力で決める(手動判断で代替しない)。
Task で general-purpose subagent を model: haiku で1回起動し、次を渡す:
--name-only / --numstat の結果(ここで git diff を再実行しない)--numstat 合計が 400 行を超える場合はハンク本文を渡さず、name-only + numstat + 各ファイル先頭ハンクのみにする)ルータは次の JSON だけを最終メッセージで返す:
{
"depth": "trivial | normal | high_risk",
"lenses": ["correctness", "devils-advocate", "<project-lens>", "..."],
"contract_change_c": true,
"changed_fields": ["<field>", "..."],
"risk_reason": "認可ロジックに触れているため"
}
ルータへの指示:
lenses は全層のレンズ登録の name から、各 when と差分が合致するものを選ぶ。該当差分が無いレンズは挙げない。contract_change_c が true なら changed_fields に変化したフィールド名とデータ経路を入れる(意味波及スイープのため)。ルータ結果に基づきレビューを並列実行する:
選定した全レンズ(communication + 差分レンズ群)を1メッセージ内で同時起動し、各 agentId を記録する(1本ずつ起動・待機しない)。回収は 4-C。
communication(4-A)は depth に依らず常時、差分レンズ群(4-B)は深度連動。
差分レンズの起動に気を取られて communication を飛ばさない。
handler が pr-review-toolkit:* のレンズ → その公式 Agent をそのまま subagent_type に指定してディスパッチする。独自レビュープロンプトを書かない(観点・出力は公式 Agent が持つ)。
handler が custom のレンズ → subagent_type: general-purpose に、該当 REVIEW.md の「カスタムレンズ観点」本文を注入してディスパッチする。
文章品質専用の custom レンズを常時1本ディスパッチする(subagent_type: general-purpose・model は sonnet 固定。文章レビューは opus 不要。main セッションだと差分レンズに注意が逸れ浅くなるため subagent に分離)。プロンプトに必ず含める:
communication 節/出力フォーマット節に従う(ここに再記述しない)lenses のうち communication を除く各レンズを、レンズ登録の定義に従ってディスパッチする。
深度 → モデル・検証の対応:
| depth | レンズ | 検証(STEP 5) |
|---|---|---|
trivial | correctness(公式 code-reviewer)のみ | なし |
normal | 該当レンズ数枚 | 報告対象の critical・major のみ(軽め) |
high_risk | 全該当レンズ(contract_change_c が true なら consumer-impact を追加) | 報告対象の critical・major をフル(Read・経路追跡) |
モデルはレンズの性質で決める(深度で一律 opus にしない):
code-reviewer / simplification / comments / test-coverage / type-design / silent-failure)→ 常に sonnetconsumer-impact / caller-impact / devils-advocate)→ normal は sonnet、high_risk のみ opuscommunication → 常に sonnetディスパッチ時にレンズごとの model を指定する(公式 Agent も同様に上書きする)。
差分レンズの各プロンプト(公式 Agent / custom 共通)に必ず含める:
「指摘は上記 change set に帰属するものに限る。変更行外の既存コードの品質問題は、 この変更が直接の原因で壊れる場合を除き OUT OF SCOPE。スコープ外を見つけても指摘に含めない。 各指摘には対象 file:line と『なぜ change set に帰属するか』を必ず添えること。」
contract_change_c が true のレンズには、変化したフィールド名・データ経路・旧→新の値変化file:line(head 版の実際の行番号)必須、推奨は現状→修正後の最小コード例つきTaskOutput でブロッキング同期回収・必須)全レンズ(4-A + 4-B)の agentId を記録し、各 agentId を TaskOutput(task_id, block=true, timeout) で同期回収してから STEP 5 へ。task-notification は欠落しうるため待たない。
timeout は最長レンズを賄う値(例 600000)。timeout したら「未回収」と記録し残りを続行(hang 回避)。.output は Read/tail しない(transcript 全文が返り context を壊す)。結果は TaskOutput の戻り値で取る。TaskOutput は DEPRECATED だが、idle を避け同期回収できる現状唯一の手段(通知 / .output 直読みはバグが多く不可)。前提(満たさなければ集約に進まない): STEP 3 ルータ・communication レンズ(4-A)・差分レンズ群(4-B)がすべて実行済みであること。1つでも未実行なら戻って実行する。
結果の入力: 4-C の TaskOutput が返した各レンズの最終メッセージを集約入力とする。timeout 未回収のレンズがあれば結果に明記する(黙って欠落させない)。
Collection → ★Attribution → Dedup → 刈り込み → Verification → Finalization。詳細ルール(帰属の3分類・severity 物差し・実害の段階・確信度しきい値)は共通 REVIEW.md に従う。
IN_DIFF / CHANGE_CAUSED / PRE_EXISTING に分類。PRE_EXISTING はドロップし件数のみ記録。スコープゲートは severity ゲートに優先(深刻でもスコープ外はドロップ)。IN_DIFF / CHANGE_CAUSED のみ統合。報告元レンズ一覧は残す(2+ = 確信度シグナル)。Read で重いので、捨てる指摘に Read を使わない。ただし critical は確信度が低くても即落とさず、検証で確認してから判断する(検証が確信度を上げる場合があるため)。file:line + 引用で根拠を十分示した指摘は再 Read しない。main が独立に Read するのは (a) CHANGE_CAUSED の経路追跡、(b) 引用の無い critical、(c) レンズ間で食い違う指摘、に限る。経路をたどれない CHANGE_CAUSED は PRE_EXISTING に倒す。共通 REVIEW.md「出力フォーマット」節に従ってターミナルに表示する(形式はそちらが真実源・ここに再掲しない)。
PRE_EXISTING を「ついでだから」と本文に残す(件数記録のみ)git fetch origin <base> を省く(古い base で差分が混入)task-notification で待つ(通知は欠落しうる=無限待機。4-C の TaskOutput(block=true) で同期回収する).output(subagent transcript)を Read/tail する(全文が返り context を壊す。結果は TaskOutput の戻り値で取る)