同じ「ブラウザで動く塊魂風3Dゲームを作って公開する」ブリーフを受けた2つのセッション。 どれだけテストし、どんな不具合を見つけられたのか──実際のセッション生ログとゲーム画面を並べて解剖する。
左: Sonnet 5(プレイ動画 playdemo.mov 11分から抽出)。右: Fable 5(本日ヘッドレスブラウザで実プレイして撮影)。
ユーザーの一番の関心「どれくらいテストしたのか」。両者はテストの量だけでなく資産の形が根本的に違う。
アサートスイートは書かず、本物の毎フレーム更新関数を実ブラウザ内で大量駆動して観測する方式。まず「動かない」の切り分けから始まった。
// キー入力を送ってもボールが動かない。コードを疑う前に環境を観測: javascript_exec → JSON.stringify({ hidden: document.hidden, visibilityState: document.visibilityState, hasFocus: document.hasFocus() }) // 結果: hidden=true — 自動化タブは非フォアグラウンドなので // Chrome が requestAnimationFrame を丸ごとサスペンドしていた。 → ゲームのバグではない(ブラウザの正常動作)と確定
// rAFが止まる環境でも同一コードパスをテストできるようフックを追加: ;(window as unknown as { ... }).__manualStep = ( dtMs, input, ) => step(dtMs / 1000, input ?? readMoveInput()) // import.meta.env.DEV でガード → 本番では undefined を確認済み
for (let i = 0; i < 300; i++) __manualStep(16, { forward: 1, turn: 0 }); for (let i = 0; i < 3000; i++) __manualStep(16, { forward: 1, turn: 0.15 }); for (let i = 0; i < 20000; i++) { // スパイラル走行 const turn = Math.sin(i / 40) * 0.8; __manualStep(16, { forward: 1, turn }); } const t0 = performance.now(); for (let i = 0; i < 40000; i++) { ... } // 実時間も計測 JSON.stringify({ debug: __debug(), realMs: t1 - t0, stats: document.querySelector('.hud-stats').textContent })
弱点: 再実行可能な回帰テストスイートは残らない(ハーネスは dev ビルド限定のフックのみ)。
仕様を機械検証可能な形に固定するアサート駆動。5バージョンの積み上げ開発を回帰から守るインフラとして機能した(数値は記事記載・累計)。
うち v4 の OpenStreetMap 実データ検証だけで 2,376件。地図データの座標変換・建物数・タイル整合を機械検証。
agent-browser による実機検証を毎版実施。終端速度キャップ不達(ACCEL_K=22)のような実測でしか出ない数値バグはここで捕捉された。
KeyR リスケール処理の数値誤差を浮動小数点の最小単位レベルで確認。検証の「深さ」の証拠。
批評エージェントが Overpass API を自分で叩いて OSM 建物数の設計見積もりを検算し、1.5倍のズレを発見。検証がコードの外の事実にまで届いている。
「どんな不具合を見つけられたのか」。深刻なものから順に、実際に見つかったバグを並べる。
コードベースに .dispose() が1箇所もなく、「Roll again」のたびに旧ジオメトリ/マテリアル+約58個の InstancedMesh バッファを恒久リーク。正確性・性能の2次元が互いを知らずに同一指摘した。
// 指摘を鵜呑みにせず three.js の実物ソースまで遡って確認: "Verified end-to-end against the actual source and the actual three.js version in node_modules. 1. Reachability confirmed: src/ui/HUD.ts:59 wires the 'Roll again' ..." → verdict: CONFIRMED
プレイテスト後に入れたチャンク数上限(12個)の修正に対し、検証エージェントが「最大半径で頭打ちになると埋没間引き条件 currentRadius > attachRadius × 1.25 が二度と真にならない」ことを発見。勝利画面はオーバーレイでプレイは止まらないため、勝利後も吸収を続けると同じ12チャンクのジオメトリが無限肥大する。エッジケース×仕様の穴の組み合わせ推論で、このセッション最高のデバッグ成果。
stats() {
// 検証のために観測メトリクスを新設 →
const maxChunkParts = this.chunkPartCounts.length > 0
? Math.max(...this.chunkPartCounts) : 0
return { liveCount, mergedChunks, maxChunkParts }
}
// 半径299へテレポート → 60,000+フレーム連続吸収 →
→ maxChunkParts が上限400に張り付いたまま動かないことを確認長時間走行で統計オーバーレイの shell chunks が220超まで増加。「プレイ時間に関わらず描画コール有界」の設計目標に直接違反。上限12+ラウンドロビン再マージで修正し、70,000+フレームで検証。
再スタート後もカメラは半径300m用の位置のまま、新しい15cmのボールは視錐台の外→画面はグラデ背景だけ。「動いてそう」の先まで押し込む長時間プレイテストで捕捉。
SpatialGrid の全リバケットが吸収済みを蘇らせ約12Hzのホットパスを浪費。grow() の位置未同期で最大50msの「沈んでポン」グリッチ。
clamp の4重実装、成長式の重複、書かれなかった関数を参照するコメント、29エントリに配線された未使用フィールドなど。すべて削除・共通化済み。
設計上の最高速度に実プレイで到達できない。ACCEL_K=22 への調整で解決。アサートでは出ない「実測系」バグを25パスの実機検証網が捕捉した好例。
スカイツリー等の見せ場ランドマークが、成長帯の谷間で描画対象から漏れて見えなくなる。DYNAMIC RE-BANDING(動的帯再割当)で修正。
OSM実データ導入後、JR総武線の高架がスポーン地点の真上にあり開幕の視界を天井のように塞ぐ。約3,000アサートも実機25パスも通過し、人間の実プレイで初めて発見された。記事はこれを「AIゲートでは代替不可の人間検証が必須」の根拠に挙げる。
批評エージェントが Overpass API で自律検算して発見。コードではなく設計数値のバグを捕まえた点で検証範囲の広さを示す。
スポーン順序の誤りという指摘が出たが、独立懐疑エージェントの反証で偽陽性として棄却。v1では計9件(36%)がこのふるいで落とされ、無駄な修正による回帰を防いだ。
両者とも「指摘 → 独立した懐疑エージェントが反証を試みる」敵対的検証を採用。結果の形が正反対に出た。
4次元(正確性/性能・メモリ/セキュリティ/簡素化)× 16エージェント、実行時間 12.5分。 検証は素通しではない: three.js のソースまで遡り、検証中に二次バグを新規発見し、セキュリティ次元は静的サイトとして正しい「0件」を返した。 確度の高い指摘だけを出す発見側の precision が高かった、と読むのが妥当。ただし網を広げたら何件出たかは未知(recall 未証明)。
4次元検証+敵対検証で 36エージェント・54分。広い網を張り、懐疑段階でふるい落とす設計。 棄却率36%という数字自体が「検証段階が機能している」証拠として残るのが recall 型の強み。確定21件のうち16件を修正。
| 観点 | SONNET 5 | FABLE 5 | 根拠 |
|---|---|---|---|
| 根本原因分析 | ★★★★★ | ★★★★★ | S: rAFスロットリングの完全な切り分け、three.jsソース追跡 / F: 実測バグの原因特定、外部API検算 |
| テスト量(対規模比) | ★★★★☆ | ★★★★★ | S: 10万+フレーム観測・5種ストレス、ただし回帰資産なし / F: 3,000アサート+実機25パスの再実行可能インフラ |
| バグ発見の質 | ★★★★★ | ★★★★★ | S: GPU全リーク・境界条件の二次バグ / F: 実測系・実データ系・人間発見バグまで到達 |
| 検証の独立性 | ★★★★☆ | ★★★★★ | S: 敵対検証が機能(二次バグ発見)だが棄却実績なし / F: 棄却率36%が網の広さとふるいの実効性を証明 |
| 検証の網羅性 | ★★★☆☆ | ★★★★★ | S: コードとブラウザ内観測に閉じる / F: 実測値・外部データ・人間プレイまで検証チャネルを拡張 |
| コスト効率 | ★★★★★ | ★★★☆☆ | S: 約1/19のトークン・71分で公開品質+14件修正 / F: 品質は圧倒的だが1,816万トークン・17時間超 |