Claude Code が書いたコードを Codex に敵対レビューさせる — 同じ家系の検証は「相関する目」ではないか


Claude Code が書いた差分を、別の家系のモデルである Codex に敵対レビューさせる関所を、実弾で自動発注する bot の工程に置くと決めた。「大きな編集や転記のあとは、別セッションのサブエージェントに独立検証させる」という一条を長く守ってきたが、書く側も疑う側も、同じ訓練から来た同じ家系のモデルで回っていた。関所の話と、その後に分かった検証役の故障の話を一続きで書く。

文脈を分けても、目は独立にならない

書き手と採点者を「別に置く」を、自分は文脈の分離だけで満たしていた。同じモデルを二つのセッションで走らせても、両方が同じ学習の偏りを抱えていて、片方が見落とす種類の誤りはもう片方も同じ理由で見落としやすい。

疑っている誤りを一つ名指ししておく。config に書いた上限額が読み込み時の検証を通ると、上限は効いたものと見なして発注関数の中では再検証しない、という書き方だ。書く側は「設定した」と「実効する」の間を自然に埋め、読む側も、読み込み時の検証を見つけた時点で発注時の不在を読み飛ばす。同じ訓練を通った目なら、この省略は同じ場所で起きるのではないか。

群衆の知恵が専門家に勝つには、判断が互いに独立していることが要る。相関した二つの目は、目の数ほどには誤りを捕まえない。銘柄を変えても家系が同じなら、「自分が書いて、自分が承認する」構図はほとんど崩れていないのではないか。

冗長化が効くのは、誤りが独立なときだけ

冗長化は、故障が独立であることを前提にしている。電源を二重化しても、二つが同じ配電盤にぶら下がっていれば、配電盤が落ちた日に両方が同時に死ぬ。信頼性工学でいう共通原因故障 (common-cause failure) だ。Claude と Codex の共通の配電盤の第一候補は、両社とも学習データの構成を公開していないので確かめようがないが、公開コードのコーパスだろう。名指しした書き方がそのイディオム由来なら、家系を変えても相関は剥がれない。

自分にも覚えがある。ある集計で対象範囲の取り方を間違えたまま転記検証のサブエージェントを通し、転記は一致していたので合格が返った。ずれは、あとから抽出条件を読み直して初めて分かった。範囲の前提は、自分と検証役が共有していた。独立性は、手順や家系という構造の違いで作るしかない。

実弾発注コードに置く関所

bot の戦略検証そのものは別の記事に書いた。

リスク上限や発注実行のパスに触れた差分を Claude 側が編集した直後を、必須の関所にする。別の家系のモデルへ「この上限が発注時に実際に効くことを示せ。config で上限を設定しても enforcement されない経路を一つ挙げよ」と観点まで指定してレビューを回し、抜け道が一つでも挙がればその日は通さない。「一つ挙げよ」と命じられたモデルは実在しない経路も挙げる方に傾くだろうから、挙がった経路は実行して再現するまで抜け道と数えない。

関所は 7 月に設計したが、2 か月のあいだに関所を通した差分の記録が手元に一つも無く、同家系のレビューが見逃して Codex が拾った例を出せず、相関の差はまだ観測できていない。関所の起動は 7 月のメモにしか無く、bot の側で差分を見に行くのは commit 前の秘密走査と同じ家系の reviewer エージェントで、別の家系を呼ぶ結線は無い。呼ぶはずの codex-plugin-cc 自体、この時点で手元に入れていない。config に上限を書いたことを「効いた」と読む穴を名指ししながら、関所を設計したことを「効いている」と、自分は 2 か月読んでいた。表題を言い切りにしなかったのはそのためだ。

道具は OpenAI 公式の codex-plugin-cc で、Claude Code の中から Codex を呼べる。レビュー系のコマンドは二つあり、README では /codex:review は “It is not steerable and does not take custom focus text”、/codex:adversarial-review は “Unlike /codex:review, it can take extra focus text after the flags” とある。関所では /codex:adversarial-review --base main に、先に挙げた焦点の二文を続けた一行を回す。

7 月のメモには /codex:adversarial-review が出てこず、/codex:review と /codex:transfer で穴の形を手渡す運用だと思い込んでいた。定義ファイルは初回コミット(2026-03-30 UTC)の一本しかなく、README の当該二文も初回コミットから変わっておらず、焦点テキストは公開当初から引数に取れた。読み落としていたのは自分だ。

設計に自分で開けていた穴もある。仕様も、Claude への指示も、Codex に渡す焦点テキストも、書いたのは自分だ。穴の形を指定した時点でその形は三つの目に共有され、自分が思いつかない形の穴は家系を変えても探されない。焦点を書く人間が、三者の上流の共通原因になる。

その共通原因の実物が、手元のテストにある。上限の検査のテストは二本あり、一本は検査役が例外を投げれば発注関数が HTTP 送信前に止まることをモックの検査役と送信回数 0 で確かめ、もう一本は上限超過の状態で実物の検査役を通して実際の発注関数を呼び、例外で止まることを確かめる。後者は関所を設計した頃には既にあり、Claude Code が書いて自分が通していたが、例外が出たことを見るだけで、送信されなかったことは数えていない。例外が送信の後ろ、応答の解析やログの書き込みで出ていても、外側で握って再送されていても、同じ「例外が出た」で通る。「例外が出た」から「送信されなかった」を読み取る、名指しした穴と同じ形だ。書いたのは Claude Code、通したのは自分の目で、公開コードのイディオム由来か人間の型由来かは切り分けられないが、家系の中だけに閉じた穴ではない。

デザイン変更後に消えた、ナビゲーションのアクティブ表示

金額が動くコードだけの話でもない。このサイトのデザインを変えたあと、独立のサブエージェントにレビューを走らせたら、ナビゲーションのアクティブ表示が消える退行を拾ってきた。自分は変えた場所ばかり見ていた。退行は「何かが起きなくなる」ことで、書いた本人がいちばん見えにくい種類の誤りだ。

検証役は書き手と同じ家系の別セッションで、それでも拾えた。直しは一行で、同じレビューをもう一度通してから出した。

検証役そのものが壊れていたとき

Claude Code の CHANGELOG の 2.1.199 に “Fixed subagents reporting API errors (e.g. usage limit reached) as successful results — the error is now reported to the parent agent” とある。npm registry の公開時刻は 2026-07-02T17:33 UTC、JST では 7 月 3 日 02:33 で、手元は 2.1.267 だ。この論理を自分に向ければ、2.1.199 に上げるより前に別セッションのサブエージェントに任せた検証の合格印は、疑いの対象に入る。公開の時刻は分かっても、自分がいつ上げたかは記録していないので、境界の日付は確定できない。転記検証は親が検証役の本文を読んでから「不一致なし」と書くので、上限のエラー文が本文に返っていたなら目に入る。区別がつかないのは、親が本文を読まず、合否と指摘の数だけで先へ進む自動の経路のほうだ。引き直してはいない。どの合格印がどの版で押されたかを残しておらず、引き直す範囲が切れない。転記検証も、修正前の版で本文に何が返り得たかを確かめておらず、範囲の外とは言い切れない。

本体の不具合は直せば今日から直るが、検証役の不具合は、直った瞬間に過去へ向き直る。その経路の実物が、自分の日次パイプラインにある。四つの観点を並列に走らせ、親が受け取るのは合否と指摘の配列だけで、返ってこなかった検証は配列から外れ、残った指摘が 0 件なら合格として次へ進む。上限で落ちた観点は指摘を持たずに返るか返らずに外れるかで、どちらでも指摘の数は増えず、四つ全部が落ちた日も 0 件になる。「問題がなかった」と「誰も見ていない」を隔てるのは配列に何本残ったかだけなのに、数えていたのは指摘の数だった。

独立性は構造で作る

失敗は全部同じ形だ。読み込み時の検証を通った上限は「効いた」と読まれ、例外が出たテストは「送信されなかった」と読まれ、返ってこなかった観点は「指摘 0 件」と印字され、転記が一致した集計は範囲の誤りごと通る。何かが無いことが、何かが有ることと同じ印字になる fail-open だ。

相関には二種類ある。一つは意図バイアスで、書いた本人が意図どおりに読む相関だ。判定者を分ければ剥がれ、ナビゲーションの退行を拾ったのは同じ家系の別セッションだった。もう一つは前提の共有で、範囲の定義や焦点テキストのように、判定に使う入力に埋め込まれた相関だ。判定者を何人並べても剥がれず、範囲を取り違えた集計は検証役と前提を共有したまま通った。訓練の偏りはこの二つにまたがり、家系ごとに違う偏りは家系を変えれば剥がれ、公開コードのコーパスのような共有の偏りは前提の共有として残る。LLM のレビューは何重にしても「読んで推測する」一つの手順で、前提の外から新しい情報を持ち込めるのは、実行の結果と差分の外の一次情報だけだ。だから軸の順位は、構造の上でも自分の記録の根拠の順でも、手順、人間の焦点、家系だ。

運用は fail-closed に絞る。挙がった経路は、上限超過の状態で発注関数を呼び、HTTP に出た回数が 0 だと送信側で数えるまでを一本で通すテストに落とす。指摘 0 件の隣には走らせた本数と返った本数を 指摘 0 件 / 返答 3 本 / 4 本中 の形で並べ、返答が満たない日は合格印を出さず未検証として止める。根拠のある修正はここまでで、関所を毎回の工程に乗せるのは、いちばん根拠の薄い家系の軸を数えるためだ。まず codex-plugin-cc を入れる。通った差分には、どの家系の目が見たか、検証役の版(Claude Code・プラグイン・モデル ID)、親が本文を読んだか合否と本数だけ見たか、どの穴の形を渡したか、何本返ったか、挙がった経路を実行で潰したか、の六つを一行残す。版と経路の二つは、2.1.199 のときに引き直す範囲を切れなくした欠けそのものだ。

時間を、ゆっくりに。 — longdrift

関連書籍 (Amazon)

  • 「みんなの意見」は案外正しい(The Wisdom of Crowds / ジェームズ・スロウィッキー、小高尚子 訳)— 集団が専門家より正しく判断できる条件の一つとして「独立性」を挙げている本。同じ家系の二つの目が目の数ほど誤りを捕まえない理由の土台。https://www.amazon.co.jp/dp/4042977014?tag=swipegadgetjp-22
  • レッドチーム思考 組織の中に「最後の反対者」を飼う(Red Team / ミカ・ゼンコ、関美和 訳)— 組織にわざと反対役を常駐させ、自分の前提を潰させる発想。「レビューして」でなく「穴を一つ挙げよ」と観点を渡す敵対レビューの人間版。https://www.amazon.co.jp/dp/4163904778?tag=swipegadgetjp-22
  • 組織事故: 起こるべくして起こる事故からの脱出(Managing the Risks of Organizational Accidents / ジェームズ・リーズン、塩見弘 監訳、高野研一・佐相邦英 訳)— 防御は複数の穴がたまたま揃ったとき破れるというスイスチーズの比喩と、共通の原因で穴が同じ場所に開く話。https://www.amazon.co.jp/dp/481719099X?tag=swipegadgetjp-22
  • オブザーバビリティ・エンジニアリング(Observability Engineering / Charity Majors, Liz Fong-Jones, George Miranda、大谷和紀・山口能迪 訳)— 「起きると分かっている異常」を監視する発想の限界。指摘 0 件の隣に「何本返ってきたか」を印字しておく動機がここにある。https://www.amazon.co.jp/dp/4814400128?tag=swipegadgetjp-22

一次資料

  • codex-plugin-cc(OpenAI 公式リポジトリ。2026-09-14 に README を参照。本文の英文引用はすべてこの README の原文。/codex:adversarial-review は初回コミット(2026-03-30 UTC)の README に既にある。README.md 自体には 4 コミットの履歴があるが(2026-06-23 UTC の /codex:transfer 節の追加等)、引用した二文は初回コミットから変更なし): https://github.com/openai/codex-plugin-cc
  • codex-plugin-cc の /codex:adversarial-review の履歴(GitHub API の commits?path=plugins/codex/commands/adversarial-review.md を 2026-09-14 に実行。返ったコミットは初回コミット c69527eb(2026-03-30 UTC)の 1 本のみ。焦点テキストを引数に取る書式はこの版からある)
  • Claude Code CHANGELOG(commit c3d2e35e554060b5a20ee6b28140fbdbd4eb0048 に固定した版。2.1.199 の引用はこの版の原文ママ。CHANGELOG 本文にリリース日は無い): https://github.com/anthropics/claude-code/blob/c3d2e35e554060b5a20ee6b28140fbdbd4eb0048/CHANGELOG.md
  • リリース日の出典: npm registry の time フィールド(npm view @anthropic-ai/claude-code time を 2026-09-14 に実行)。2.1.199 = 2026-07-02T17:33:48.451Z、2.1.267 = 2026-09-09T18:25:42.820Z
  • 本文中の「実弾発注コードの関所」「発注前のリスク検査と発注関数のテスト(非公開)」「対象範囲を取り違えた集計」「デザイン変更後の退行検出とその修正」「日次パイプラインの四観点並列と集計」「7 月に書き留めたメモ(2026-07-03)」「関所が工程に乗っていなかった理由(bot 側の hook 設定、プラグインの導入状態、2026-07-03 以降の commit 履歴)」は自分の手元の運用と記録(設定と記録は非公開)

提携表記

longdriftはAmazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。