シリーズ: AI とともにコードを学ぶ

GeminiがClaudeのPRをレビューした。三十六件のコメントの後、コードは良くなった。

マルチベンダーレビューが出荷前に二つのスレッドセーフティのバグを捕まえた。

モデルが違えば、盲点も違う 八つのサブシステムにまたがるクロスベンダー・レビュー Claude 執筆 Gemini レビュー 36件のコメント 2件の本物のバグを発見 スレッドセーフティ、出荷されていたはず 決めるのは人間だ — Geminiでも、Claudeでもない
Claudeが書く。Geminiがレビューする。人間がマージする。バグは負ける。

常に書き手に同意するレビュアーはレビュアーではない。あなたのAIのコードをライバルAIに通してみれば、盲点が浮かび上がる——本番に出荷されていたはずのスレッドセーフティのバグを含めて。

私が繰り返し立ち返るパターンは、Claudeがコードを書き、Geminiがそれをレビューするというものだ。異なる学習。異なる盲点。何が擁護可能なパターンで何が臭うかについての異なる意見。今週の土曜日は、このパターンが正しいと私が考える理由について最も具体的なデモンストレーションだった。

前週にわたって、Phase-2のエンドポイント拡張PRの一群がAPI面全体に着地していた。八つの独立したサブシステムそれぞれが公開面を拡張された。実装のほとんどはClaudeが書いていた。どれもマージする前に、私はそれらをGeminiに通してレビューパスを行った。Geminiはバッチ全体にわたって三十六件の具体的なコメントを返してきた。

私はそのすべてに取り組んだ。これは、Geminiが何を捕まえたか、そしてその捕まえ方がどんな種類のものだったかが何を意味するかについての投稿だ。

八つのサブシステムとは何だったか

PRは、Phase-2の拡張が必要だった八つのAPIルーターモジュールをカバーしていた:アニメーション、ネットワーク、オーディオ、AI知覚、シーンのコンストラクティブ・ソリッド・ジオメトリ、入力アクションとゲームパッドバインディング、XRアンカーポーズタイプ、スクリプティングLua VMのライフサイクル。各PRは、完全なリクエスト/レスポンス・スキーマ、ヘルパー、テストとともに、十数個から四十個のエンドポイントを追加した。

これらのPRは些細なものではなかった。それぞれが公開面の実質的な拡張だった。合わせると、数週間分の設計作業を、エージェントたちがおよそ二週末で実装したことになる。

Geminiが何を捕まえたか

カテゴリが重要なので、具体的に述べたい。

アニメーションとネットワーク:ブレンドツリー参照とヘルパー。 Geminiは、アニメーションAPIのブレンドツリー・ヘルパーとネットワークAPIのトポロジー・ヘルパーが、欠落した参照の扱い方についてわずかに異なる慣例を持っていることに気づいた。アニメーションはNone相当を返し、呼び出し側に判断を委ねていた。ネットワークは例外を発生させていた。どちらも有効なパターンだ。それらは一日以内に着地した二つのPRの間で一貫していなかった。修正はそれらを揃えることだった。明示的例外パスを選んだ。これは、欠落参照を静かなnullとして伝播させるのではなく、API境界で表面化させるからだ。

オーディオ:レスポンスモデルのデフォルトとヘルパー。 Geminiは、複数のオーディオ・レスポンスモデルがオプションフィールドについて一貫しないデフォルト値を持っていることを発見した。あるものは空文字列に、あるものはNoneに、あるものは明示的なnullにデフォルトしていた。この不整合は、クライアント・バインディング層(異なる言語がそれぞれのオプションを異なる方法でシリアライズする場所)で混乱を招く挙動を生んでいたはずだ。修正は単一の慣例(Python型ではNone、ワイヤー上ではnull)を選び、一貫して適用することだった。

AI知覚:ハンドルマップとバインディング。 Geminiは知覚サブシステムのハンドルマップにスレッドセーフティの懸念をフラグした:マップがバックグラウンドスレッドから変更される一方で、ロックなしにAPIリクエストスレッドから読み取られていた。負荷がかかると、これは診断が非常に難しい断続的なマップ破損バグを生んでいたはずだ。修正は、読み取りパスを一般的なケース(挿入よりルックアップが圧倒的に多い)に最適化した、読み書きロックだった。

シーン:ハンドルマップとCSGレスポンス。 AI知覚での発見と同じ系統のバグだ。Geminiは、シーンサブシステムのCSGハンドルマップに同じスレッドセーフティの懸念を捕まえた。修正は同じ形:読み書きロック。これは、一組の訓練された目がこのパターンを見たことがあるためにどこでもフラグする種類のバグだ。Claudeは同じパターンを二か所で書いていて、気づいていなかった。

入力:アクションとゲームパッドのバインディング。 Geminiは、アクション・バインディングAPIが無効なアクションIDにマジックナンバーの慣例(-1)を使っている一方、ゲームパッド・バインディングAPIはセンチネル構造体の値を使っていることを発見した。この不整合は、両方のAPIを横断して作業する開発者が誤って間違った無効マーカーを使ったときに、微妙なバグを生んでいたはずだ。修正は、型付きのActionId::Invalid定数を両方のAPIに導入し、すべてのマジックナンバーをそれに移行することだった。

XR:アンカーポーズタイプとハンドラの再利用。 Geminiは、XR APIが異なるエンドポイントで微妙に異なる二つのポーズタイプを公開していることを捕まえた:一つはワールド座標、もう一つはアンカーローカル座標だ。その違いは本物で消費者にとって重要だが、エンドポイントはその違いを明確に文書化していなかった。Geminiは、型システムがその区別を強制するように型を分割することを提案した。修正は、WorldPoseAnchorPoseを、暗黙の変換を持たない別個の型として導入することだった。

スクリプティング:Lua VMのライフサイクルとリーク。 Geminiは、Lua VMがリクエストごとに明確な破棄パスなしに割り当てられていることを発見した。持続的な負荷の下では、これはVM状態をアドレス空間にリークさせ、APIサーバーが倒れるまで続くはずだった。修正は、明示的な取得・解放のセマンティクスを持つサーバースレッドごとのVMプールを導入し、成功か失敗かにかかわらずリクエスト完了時に実行される破棄パスを追加することだった。

カテゴリとしての発見について気づいたこと

三つの観察がある。

発見のほとんどは一貫性の発見だった。 Geminiのコメントの三分の二は「これは、あなたが直近に着地させた別のサブシステムで使われている慣例と異なる」というものだった。これは、単一のモデルが苦手とする種類の発見だ。なぜなら各PRは単独で着地し、それを書いたモデルは他のPRをコンテキストとして持っていなかったからだ。バッチ全体で作業するレビュアーは、書き手が頭の中に持っていなかった不整合を見る。

いくつかの発見は本物のバグだった。 ハンドルマップに関するスレッドセーフティの発見は本物のバグだった。それらは出荷されていたはずだ。断続的で診断が困難だったはずだ。Geminiはバッチ内の両方のインスタンス(一つはAI知覚、一つはシーンCSG)を捕まえた。なぜなら「ロックのない共有可変マップ=スレッドセーフティの懸念」というパターン認識を持っていたからだ。異なるモデル、異なる学習、異なるフラグへのキャリブレーション。

いくつかはスタイル的なもので議論になった。 Geminiのすべてのコメントが正しかったわけではない。少数はスタイル上の好みで、私はそれを押し返すか、人間の判断を求めるかした。いくつかのコメントが却下されたという事実は、パターンを弱めない。むしろ強める。常に書き手に同意するレビュアーはレビュアーではない。

これが何をして何をしないか

これがすること:単一モデルのレビューが見逃すバグのクラスを捕まえる。具体的には、クロスPRの一貫性バグと、書き手の学習が見なかった何かを、別のデータで訓練されたレビュアーがパターンマッチで捕まえる発見だ。

これがしないこと:人間のレビューを置き換えない。Geminiのコメントは第一パスだった。私はすべてを読んだ。いくつかは却下した。ほとんどは受け入れた。最終的なマージ判断は私のものだった。パターンは「Claudeが書き、Geminiがレビューし、人間が決める」だ。「Geminiが決める」ではない。

これがAIラボに示唆すること:最適化すべき指標は「モデル自身のコードが自分自身のレビューに合格するか」ではない。「モデルのコードが別のベンダーのモデルによるレビューに合格するか」だ。クロスベンダー指標で良い成績を収めるエージェントこそ、本気の作業で私が信頼するものだ。

パートナーとビルダーがここから学ぶべきこと

エージェント駆動のワークフローを実行していて、まだ別ベンダーのモデルを通してPRレビューを行っていないなら、次のバッチで試してみてほしい。セットアップコストは小さい。バグ捕捉率は無視できない。今日のバッチは、出荷されていたはずの二つの本物のスレッドセーフティのバグを捕まえた。

AIラボで「別ベンダーのモデルに対するPRレビュー」をターゲットとしてコーディングエージェントを最適化していないなら、検討してみてほしい。この指標は誠実だ。シグナルは本物だ。それで良い成績を収めるエージェントこそ、真剣なチームが採用するものだ。

パートナーシップのためにエンジンを評価しているなら、マルチベンダー・レビューのパターンは私が尋ねるであろう規律のシグナルの一つだ。あらゆる意味のあるPRでクロスベンダー・レビューを実行するチームは、そうしないチームとは別のチームだ。コードベースがその違いを反映する。

三十六件のコメント、八つのサブシステム、一つの土曜日。バッチは今朝より良くなった。パターンは今回もまたその価値を発揮した。

構築に戻る。

AIラボがレビューし——そして構築するランタイム

RakuAIは、LLMメーカーが対抗して出荷する空間ランタイムだ。クロスベンダー・レビュー、誠実な指標、パートナー級の規律。あなたのモデルが現実世界のどこに収まるか見てほしい。

← すべての記事