マルチモデルレビュー(Codex + Claude)
独立したレビュアーが、同じコミットで同一のプロンプトを読み取ります。このセッションのみが修正者です。Opus 5.5のhigh effortセッションから実行してください。
オプション: $ARGUMENTS
設定
- ラウンド上限: Code 20~50(デフォルト20、ピッカーのStandard、Long、Maxはそれぞれ20、35、50)、Docs 2、Final 2、エビデンスラウンド用の予備ラウンド2~6(デフォルト2)。ハードストップ: これらの合計でデフォルト26。各フェーズは最初のクリーンラウンドで終了するため、上限は天井値です。古い実行は独自の上限と制限を保持します。
- レビュアー: デフォルトはTerra(gpt-6.1-terra)とOpus(Opus 5.5)。オプション: Fable(Fable 5.2)、Astra(gpt-6-astra)、Sol(gpt-6.1-sol)、Sonnet(Sonnet 5.5)、Haiku(Haiku 5.5)、Luna(gpt-6-luna)。この変更前に開始された実行のOpusレビュアーは
claudeと呼ばれます。 - 労力レベルはレビュアーごとに、実行ごとに設定: low、medium、high、xhigh、max。デフォルト: Codexはmax、Claudeモデルはxhigh。
- デフォルトパネル:
terra:max:fast opus:xhigh code:20 spare:2。 - Codex fastモード(優先ティア)はCodexレビュアーごとに、実行ごとに設定されます。Claudeモデルには適用されません。
- 各Codex実行は10分間の沈黙または合計60分で停止します。クラッシュや空の回答は1回再実行されます。回答がフォーマットのために再実行されることはありません。
以下のヘルパーはこれらの制限を強制し、すべての状態を~/.claude/multimodel-review/(すべてのリポジトリの外部)に保持します。長時間の実行は圧縮される可能性があり、レポートをメモリから再構築できないためです。毎回完全なパスを書き出し、シェルがリポジトリ内にない場合はサブコマンドの前に--repo <path>を追加してください:
python3 ~/.claude/skills/multimodel-review/scripts/mmr.py status
以下、mmr <command>はその完全な呼び出しの短縮形です。
開始または再開
mmr statusを実行します。未完了の実行が存在する場合は、それが表示する内容とリストするレビュアーで続行します。「Old location」と表示された場合は、すべてのレビュアーが終了したらmmr migrateを1回実行し、その後新しいパスのみを使用します。- 他のどのステップよりも先にオプションを選択します。これにより、オーナーがすぐにオプションを確認できます:
- 上記のOptions行が
pick(またはpicker)のみの場合: ピッカーを表示します(次の2つの箇条書き)。 - それ以外の場合、空であるかどうかに関わらず:
mmr options "<options>"を実行し、ピッカーは表示しません。空の場合はデフォルトのterra:max:fast opus:xhigh code:20 spare:2を意味します。失敗した場合は、1行のエラーをオーナーに表示して停止します。各レビュアーはname[:effort][:fast]の形式です: 労力のデフォルトはCodexがmax、Claudeモデルがxhigh、Codexモデルは:fastが指定されない限り標準速度で実行されます。code:<20-50>とspare:<2-6>はオプションです(デフォルトは20と2)。 - ピッカー(
show_widgetが利用可能な場合): モジュール["interactive"]を指定してread_meを1回呼び出します。次にmmr pickerを実行し、そのWidget code:行以降のすべてをそのままwidget_codeとして、タイトルmultimodel_review_optionsで渡します。ターンを終了して待機します。そのボタンは「Start the review with .」を送信します。例: "terra:max:fast opus:xhigh code:20 spare:2"。それらに対してmmr options "<options>"を実行します。オーナーのメッセージがピッカーが読み込まれなかったことを示す場合、mmr picker --offlineを実行し、代わりにそれを表示します。 - ターミナルでのピッカー(
show_widgetなし): 4つの質問を含む1回のAskUserQuestion呼び出し: レビュアー(複数選択: Terra、Opus、Fable、Astra; Sol、Sonnet、Haiku、Lunaは「その他」経由)、fastモードのCodexモデル(複数選択: Terra、Astra、Sol、None; Lunaは「その他」経由)、労力(Codex maxとClaude xhigh、すべてhigh、すべてmedium)、レビュー長(Standardcode:20、Longcode:35、Maxcode:50)。選択されたレビュアーでないfastピックは無視します。回答を型付きフォームに書き込み、mmr options "<options>"を実行します。
- 上記のOptions行が
- Writeツールを使用して、3~5行の意図をスクラッチパッドファイルに書き込みます: 変更内容とその対象。リクエスト、この会話、PRテキスト、コミット、または未コミットの差分から取得します。レビュアーは「間違った動作」を判断できません。不明な場合は、ボタン付きの1つの質問をオーナーにします。
git status --shortを読み取ります。無視されていないものはすべてスナップショットにコミットされるため、この変更に関係のないもの(無関係なフォルダ、メモ)を選別し、--leave-out <path>として渡します。判断できない場合は、ボタンで質問します。mmr optionsが出力したInit:行のオプションをそのまま使用し、mmr init --intent-file <file> --trailer "<attribution line>" --spec "<options>"を実行します。オーナーがベースを指定した場合のみ--base <base>を追加し、必要に応じて--leave-out <path>を追加します。ベースのデフォルトはリモートのデフォルトブランチで、レビューはマージベースから開始されます。このスキルを呼び出すことは、initが以下の操作を行うことに対するオーナーの同意です:- ベースブランチまたはdetached HEAD上で、最初に
multimodel-review/<time>を作成するため、WIPコミットがベースに到達することはありません。 - 未コミットの作業は1つのWIPスナップショットコミットになるため、すべてのレビュアーが同じコミットを読み取ります。プッシュは行われません。
- 終了コード5は、一部のファイルがシークレットに見えるか、20 MBを超えるか、埋め込みリポジトリであることを意味します。まだ何も変更されていません。ボタンでオーナーに質問します: それらを除外する(
--leave-out)か含める(--allow-flagged)か。 - 「Nothing to review」は、コミットも未コミットの作業もないことを意味します。オーナーにレビューするコミットを尋ね、
--base <commit>を渡します。
- ベースブランチまたはdetached HEAD上で、最初に
- initがブランチを作成したかスナップショットを作成したかを1行でオーナーに伝えます。
1ラウンド
mmr next --phase <code|docs|final|evidence>を実行します。これによりプロンプトファイルが作成され、そのパス、実行の設定、各ClaudeレビュアーのClaude Agent行(モデル、労力、回答ファイル付き)が出力されます。終了コード3は上限に達したことを意味します: Doneに進みます。mmr statusがリストするすべてのレビュアーを1つのメッセージで開始します:- 各Codexレビュアー(terra、astra、sol、luna): Bashと
run_in_backgroundを使用:mmr codex --reviewer <name>。ヘルパーはCodexを-s read-only、アプリ、プラグイン、サブエージェント無効、Web検索有効、独自のログ、時間制限で実行します。workspace-write、--dangerously-bypass-approvals-and-sandbox、コンパニオンスクリプト、レスキューサブエージェントは決して使用しないでください。 - Codexレビュアーごとに1つのMonitor:
mmr monitor --reviewer <name>、timeout_ms: 1800000付き。60秒ごとにチェックし、PIDの終了から「終了」を判断します。出力テキストからは判断しません。 - 各Claudeレビュアー(opus、fable、sonnet、haiku; 古い実行では
claude): 新しいAgent。subagent_type: "multimodel-reviewer"、modelとeffortはClaude Agent行から取得し、プロンプトは「Review round file: 」。そのエージェントは読み取りツールとWebツールを持ちますが、シェルや編集ツールは持ちません。タイプが利用できない場合は、同じモデルと労力でPlanを使用し、Read、Grep、Web検索のみを使用するように指示します。
- 各Codexレビュアー(terra、astra、sol、luna): Bashと
- Monitorイベントを処理:
FINISHED: 何もしません。FAILED: ステップ5のように再実行し、再実行も失敗した場合のみ1行でオーナーに伝えます。QUIET: 失敗ではありません。high effortは数分間黙って考えることができるためです。アクションは不要です。ヘルパーは10分間の沈黙でレビュアーを停止します。RE-ARM: そのモニターを再び開始します。
- Claude Agentが戻ってきたら、その最終メッセージを変更せずにステップ1の回答ファイルに書き込み、次に
mmr claude-result --reviewer <name> --seconds <duration_ms / 1000>を実行します。 mmr barrierを実行します。これが通過するまで何も編集しません。結果が空または欠落している場合は、そのレビュアーのみを同じコミットで再実行します。ラウンドは再度カウントされません。Claudeレビュアーの場合は、新しいAgentを生成してステップ4を繰り返します。ヘルパーは3回目の試行と、ストールまたはタイムアウト後の再実行を拒否します: その場合はmmr stop --reason "<why>"を実行し、Doneに進みます。例外: フォーマットルールが廃止される前の実行では、実際の回答に対してmalformedが表示される場合があります。mmr reread --reviewer <who>を実行します。これにより、新しいレビュアー実行なしで保存された回答が再度読み取られます。- トリアージ(Fixerルールを参照)、Writeツールを使用してラウンドフォルダに
triage.tsvを書き込みます。 - 受け入れられたフィンディングを修正し、影響を受けるテストを実行し、1つのWIPコミットを行います。テストの失敗はラウンドをブロックするため、悪い修正が次の差分に到達することはありません。
mmr close --tests "<exact test command>"を実行します。または--tests "none: docs only"。受け入れられたフィンディングがない場合は、--testsを省略します。それが出力するNext:行に従います。
triage.tsvはタブ区切りで、マージされたフィンディングごとに1行です。すべてのレビュアーが「NO BLOCKING ISSUES.」と回答した場合のみ省略できます:
reviewers sev loc status summary note
terra,opus P1 src/a.py:42 accepted Retry drops the last item src/a.py: Keep the last item on retry
terra P1 src/b.py:9 rejected Null token crashes Token is non-null: src/auth.py:30 returns early
statusはaccepted、rejected、またはopenです。openは最後の許可されたラウンドでのみ使用され、修正がレビューされないままになります。noteは、何が変更されたか(accepted)、コード引用による理由(rejected)、またはなぜ残されているか(open)です。acceptedおよびrejectedのノートは、次のプロンプトの修正リストと元帳に供給されます。- フェーズ外のフィンディングは「Out of phase」としてrejectします。
- レビュアーは任意の形式で回答できるため、各回答を自分で読み取ってください。フィンディング数は最良の推定です。P0/P1/P2タグのない回答は1つのフィンディングとしてカウントされます: それが提起する内容の行を追加するか、何も提起しない場合は1つの
rejected行を追加します。
WIPコミット: メッセージWIP multimodel-review round <N>、ファイルに書き込まれ、git commit -Fで渡されます。さらにセッションのattribution行が含まれます。プッシュは絶対に行わないでください。
フェーズ
- Code: ラウンド1-2はベースとの完全な差分をレビューします。ラウンド3からは、差分と修正リストのみをレビューします。レビュアーはコンテキストのために任意のファイルを開くことができます。差分外ではP0のみを報告します。ただし、差分が失敗を引き起こす場合は除きます: その場合、フィンディングは実際の重大度で差分行にアンカーされます。
- Cleanup(fixerのみ): Docsの前に実行され、ここで書かれたテキストがP2レビューを受けるようにします。
- ドキュメント: この変更によって古くなったドキュメントのみを更新します。拡張せず、削減します。
- テスト: デバッグ用またはスキャフォールディング用のテスト、および削除されたコードのテストのみを削除します。回帰テストは維持します。
- 完全なテストスイートを実行します。失敗した場合は修正します。小さな修正で修正できない場合は、停止して報告します。
- コミットし、次に実行フォルダに
cleanup.mdを書き込みます: 各削除とその理由、正確なテストコマンドと結果を含めます。next --phase docsはこれなしでは拒否されます。
- Docs: P2での1回の全差分ラウンド、修正、次に1回の差分ラウンド。その後フェーズは終了します。残ったものはopenとして記録されます。
- Final: すべてのレビュアーによる1回の全差分ラウンド、P0/P1のみ。フィンディングが受け入れられた場合は修正し、1回の差分ラウンドを実行します。それでも失敗する場合は、openとしてマークします。ヘルパーは実行を停止します。
収束
- ラウンドは、fixerがフェーズの重大度でフィンディングを受け入れない場合にクリーンです。コード引用された理由でrejectされたフィンディングはブロックしません。
- フェーズは最初のクリーンラウンドで収束します。
- Code収束後の新しいエビデンス(デバイスまたはエミュレーター実行): 影響を受けるコードまたはテキストを1回更新してコミットし、
mmr next --phase evidence --note "<実行で示された内容と変更内容>"を実行し、P0/P1/P2での1回の差分ラウンドを行います。P0/P1が受け入れられた場合のみCodeが再開され、closeはそのように通知します。 - フェーズ上限またはハードストップで: 停止し、残ったものを報告します。
Fixerルール
- フィンディングをマージして重複排除し、フィンディングを提起したすべてのレビュアーを保持します。これにより統計が正確に保たれます。各フィンディングをコードに対して検証します。検証できないものは、1行の理由とともにrejectします。
- 誰が提起したかにかかわらず、コードのみでフィンディングを判断します。あなたもClaudeモデルであるため、Claudeレビュアーのフィンディングも同じ基準で評価します。2人以上のレビュアーが提起したフィンディング、または任意のP0をrejectするには、特定のコード引用が必要です。レポートはこれらをオーナー用に「論争中」としてリストします。
- 最小限の修正。リファクタリングや新機能はありません。実際のP0/P1バグに対してのみ回帰テストを追加します。
- 散文を減らす: 間違った文を追加するよりも、削除または狭めることを優先します。新しいコメントは最大1行です。レビュー中に新しいドキュメントセクションを追加しないでください。
- フックがパスを拒否した場合は、停止してオーナーに報告します。シェルコピーやその他の方法で回避しないでください。
- シェルコマンドをdcgセーフに保つ: ファイルはWriteツールで書き込み、コマンドに変数、グロブ、可変パスへのリダイレクトを入れないでください。
完了
収束時および任意の停止時にこれを実行します。
mmr archiveを実行して、すべてのCodexチャット(再実行を含む)をアーカイブします。mmr reportを実行します。これはフェーズごとのラウンド数、レビュアーテーブル、未処理項目、論争中のフィンディング、テストコマンド、スカッシュコマンドを出力し、report.mdを保存します。- オーナーに短く、回答を先に報告します: フェーズごとのラウンド数、未処理項目、正確な検証コマンドと結果。
- レビュアーごとに、インラインでシンプルなビジュアルを表示します: 提起されたフィンディング数、受け入れられた数、rejectされた数、ユニーク数、P0-P1対P2、クリーンラウンド数、ラウンドあたりの平均分数。1行で勝者を指名します。デフォルトルールは最も多くのユニークなP0/P1を受け入れたレビュアーです。自分自身のモデルも判断しているため、それを上書きする場合はその理由を述べてください。
- WIPコミットはそのまま残します。エビデンスラウンドで差分範囲が必要なためです。今スカッシュするかどうかをボタンで尋ね、レポートからのスカッシュは「はい」の場合のみ実行します。
このスキルの変更
このフォルダは公開リポジトリ github.com/dknchris/multimodel-review です。各変更をコミットし、オーナーが指示した場合のみプッシュします。ピッカーのコードはassets/picker.jsです:mmr pickerは、その最新のコミットがプッシュされた後にのみCDNから読み込み、それまではインラインで送信します(これは低速です)。すべての変更後にpython3 tests/test_mmr.pyを実行します。