mcpField
A
adversarial-review

adversarial-review

github.com/basicmachines-coテスト・品質4.4k160 回インストール1 日前に更新
リポジトリ

adversarial-review について

Claude Code または Codex 向けのコードレビュー用スキルです。Claude と GPT/Codex が独立してレビューし、指摘を相互に検証したうえで人の判断に委ねます。

主な機能

  1. 01Claude と GPT/Codex による独立レビュー
  2. 02指摘の相互反証
  3. 03決定的な lint・型チェック
  4. 04確信度に基づく結果の統合
  5. 05コードの自動修正なし

活用シーン

  1. 01マージ前のブランチ差分レビュー
  2. 02指定範囲の変更ファイルの確認
  3. 03規則違反とモデル指摘の切り分け

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/basicmachines-co/basic-memory --skill adversarial-review

インストール後、Claude Code で/adversarial-reviewを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

prompts/
refute.md
review.md
schemas/
findings.schema.json
verdicts.schema.json

詳細

敵対的コードレビュー

異なるモデルファミリーの 2 人のレビュアー、Claude と Codex/GPT が、同じ差分を個別にレビューし、次にそれぞれが相手の指摘を反証しようとします。指摘の信頼度は、この反対尋問を乗り越えられるかどうかで決まります。これにより、単独の LLM レビューで起きる 2 つの失敗モード、すなわち自己正当化(モデルは自分の成果を批判しない)と、自信に満ちた誤検出を防ぎます。

あなたはオーケストレーターであり、2 人のレビュアーのうちの 1 人です

このスキルは Claude Code または Codex のどちらからでも実行できます。まず、自分がどのモデルファミリーなのか(Claude または Codex/GPT)を特定します。次に:

  • あなたはレビュアー #1 です。このセッションで、自身のツールを使ってネイティブにレビューします。
  • もう一方のファミリーはレビュアー #2 です。独立したレビューのために、サブプロセス CLI として呼び出します。新しいプロセスで、コンテキストは共有されません。この独立性が重要です。

「もう一方のモデル」の CLI:

あなたが…もう一方を次の方法で呼び出す…
Claudecodex exec(GPT)
Codexclaude -p(Claude)

それ以外の手順はすべて対称です。以下の prompts/ と schemas/ のパスは、このスキル自身のディレクトリ(この SKILL.md がある場所)を基準に解決してください。

入力

独立した、任意指定の入力が 2 つあります:

  • BASE — 差分を取る対象の ref。デフォルトは main です。
  • SCOPE — レビュー範囲を絞る pathspec(例:src/basic_memory)。デフォルトでは指定なし(差分全体)です。

これらは別々のものです。ref と pathspec は相互に置き換えられません。事前確認で正規の diff コマンドを一度だけ組み立て、以下のすべての箇所で再利用してください。diff コマンドをインラインで書き直してはいけません(表記が散在して一貫しなくなったことが、以前の問題の原因でした)。$SCOPE に空白や glob 文字が含まれていてもそのまま扱えるよう、文字列ではなく argv 配列として組み立ててください:

BASE="${BASE:-main}"
DIFF=(git diff "$BASE...HEAD")          # argv array — never a scalar string
[ -n "$SCOPE" ] && DIFF+=(-- "$SCOPE")  # pathspec stays one argument even with spaces
DIFF_STR=$(printf '%q ' "${DIFF[@]}")   # shell-quoted rendering, for embedding in a prompt

実行する場合は "${DIFF[@]}" を使用します(引用符で囲み、単語分割しません)。サブプロセスのプロンプト内にテキストとして埋め込む場合は $DIFF_STR を使用します。

事前確認

  1. この SKILL.md があるディレクトリを SKILL_DIR に設定します。正規の場所は .agents/skills/adversarial-review(共有エージェントスキルストア)です。Claude Code からは .claude/skills/adversarial-review のシンボリックリンク経由で、Codex からは独自のスキルパス経由でアクセスします。いずれの場合も、prompts/ と schemas/ のサブディレクトリはこのファイルと同じ階層にあります。
  2. もう一方のモデルの CLI が PATH 上にあることを確認します(自分が Claude なら codex、Codex なら claude)。見つからない場合は、パネルが単一モデルにフォールバックすること(ベンダーをまたぐメリットが失われること)をユーザーに伝え、続行するか中止するかを確認します。
  3. "${DIFF[@]}" を実行します。何も出力されない場合は、「$BASE と比較してレビュー対象はありません」と報告します($SCOPE が設定されている場合は、それにも言及します)。その後、停止します。
  4. RUN=$(mktemp -d) — もう一方のモデルの出力用の一時ディレクトリです。一時的なもので、コミットしてはいけません。永続化される成果物も、状態ファイルもありません。

フェーズ 0 — 決定論的ゲート(モデルに渡す前)

モデルは否定表現(「X を決して行わない」)を統計的に見落としやすいため、プロンプトではなくツールを使って機械的にコーディング規則を適用し、検出結果は高信頼度の事実として扱います(モデルの指摘とは分けて報告します)。

  • 差分が src/ に触れている場合は、just lint と just typecheck を実行します。
  • 差分を grep し、検出可能なコーディング規則違反を探します:デフォルト値を指定する getattr(.*,.*,、裸の except:/except Exception: pass、関数スコープでの import。

フェーズ 1 — 個別レビュー(あなたともう一方のモデルが並行して実施)

両方のレビュアーに同じブリーフを渡します。prompts/review.md とリポジトリの CLAUDE.md のルールに従い、"${DIFF[@]}" の差分をレビューします。どちらも schemas/findings.schema.json に一致する指摘を出力します。

あなた自身のレビュー: prompts/review.md に従ってレビューします。指摘は その JSON 形式で保持してください。

もう一方のモデルのレビュー — リポジトリのルートから、あなたに該当する行を実行します。

codex の標準入力は必ず /dev/null からリダイレクトしてください。標準入力がパイプの場合(呼び出しがバックグラウンドで実行される場合など)、codex exec は「標準入力から追加の入力を読み取り中...」の状態でブロックし、失敗します。

# You are Claude → run Codex:
codex exec -s read-only \
  --output-schema "$SKILL_DIR/schemas/findings.schema.json" \
  -o "$RUN/other_findings.json" \
  "$(cat "$SKILL_DIR/prompts/review.md")

Review the diff: $DIFF_STR" </dev/null

# You are Codex → run Claude (read-only via plan mode; parse the JSON block it returns):
claude -p --permission-mode plan --output-format json \
  "$(cat "$SKILL_DIR/prompts/review.md")

Review the diff: $DIFF_STR
Return ONLY a JSON object matching this schema:
$(cat "$SKILL_DIR/schemas/findings.schema.json")" </dev/null > "$RUN/other_raw.json"
# claude --output-format json output shape varies by CLI version: it may be a JSON ARRAY
# of event objects, OR a single result object. Normalize before reading: if it's an array,
# take the element with type=='result'; otherwise use the object as-is. Then read its
# .result string, strip the ```json fence if present, and parse that.
# (Verified empirically: the CLI in this environment emits the array form.)

Codex のオーケストレーションに関する実行時の注意:claude -p にはネットワークアクセスが必要ですが、Codex のデフォルトのサンドボックスではブロックされます。ネットワークアクセスが許可された、プロジェクトを信頼済みとする Codex セッションから実行してください(または、プロンプトが表示されたら claude の呼び出しを承認してください)。Codex 自身のサンドボックスは有効のままにしてください。ネットワークに接続するためだけに、サンドボックスを回避してはいけません。

各指摘に、その起点(claude / codex)を付けてください。

フェーズ 2 — 相互反論

各モデルは、prompts/refute.md に従って、もう一方のモデルの指摘に反論します(判定は schemas/verdicts.schema.json に一致させます)。

  • あなたは、もう一方のモデルの指摘に自分で反論します。
  • もう一方のモデルは、あなたの指摘に反論します。同じ方法でもう一度呼び出し (prompts/review.md を prompts/refute.md に置き換え、あなたの指摘 JSON と $DIFF_STR を追加して、適切なベースとスコープに照らして判断させます。Codex の場合は --output-schema "$SKILL_DIR/schemas/verdicts.schema.json" を使います)。

指摘との対応付けには id を使ってください。

フェーズ 3 — 統合して報告(自動修正はしない)

指摘を統合し、重複を除き(同じファイルで、行が重なり、根本原因が同じものは 1 件にまとめます)、出所に基づいて信頼度を割り当てます。

  • 高 — 両方のモデルがそれぞれ独立して指摘した、または一方が指摘し、もう一方が支持した。
  • 中 — 一方が指摘し、もう一方は反論できなかったが、独立しては発見しなかった。
  • 低/論争あり — 一方が指摘し、もう一方が反論した。両方の見解を示して残し、人間の判断に委ねます。論争のある指摘を黙って削除してはいけません。
  • 決定論的なゲートで検出されたものは、モデルの判定とは分けて、事実として報告します。

severity × confidence の順で並べます。簡潔な表を提示します。列は severity | confidence | file:line | claim | found-by / upheld-or-refuted-by です。信頼度の高い指摘については、why と 修正案があれば、それを詳しく説明します。

最後に、修正する指摘があるかどうかを尋ねます。ユーザーが選ぶまでコードを編集してはいけません。 モデル間で一致しても、それが正しいとは限りません。あなたの役割は、ブランチに問題がないと断言することではなく、順位付けされ、相互検証された指摘の一覧を提示することです。

意図的に実施しないこと

  • 両方が一致するまでループすること(モデルは正しいからではなく、何も言わなくなることで収束します)。
  • 成果物やステートマシンを永続化すること(作業用ディレクトリは破棄されます)。
  • 修正を自動適用すること。

コメント