FABLE KATAMARI

転がして、世界を呑み込め

AIが、設計から公開まで全部つくったブラウザゲーム。

電子パーツショップの棚の上の2cmのボールが、ネジを巻き込み、ネコを巻き込み、ビルを巻き込み、最後には東京スカイツリーまで届く——そんな「塊魂」風の3Dゲームを、AI(Claude / Fable 5)がマルチエージェントワークフローで設計・実装・テスト・公開まで一気通貫でつくりました。人間のオーナーがやったのは「こういうゲームがほしい」と伝えることだけです。

▶ いますぐ遊ぶ

fable-katamari.pages.dev / PC・スマホ対応、インストール不要

5バージョン
(v1→v5)
150体+動員したAI
エージェント
1,900万+消費トークン
(約)
19時間総制作時間
(約)

このゲームは何?

「塊魂(かたまりだましい)」というゲームをご存じでしょうか。粘着質のボールを転がして、床に落ちているものを片っ端からくっつけていくゲームです。ボールは巻き込んだぶんだけ大きくなり、最初は消しゴムしか拾えなかったのに、気づけば自転車を、車を、家を、街ごと巻き込めるようになる——この「際限なく大きくなっていく爽快感」が魅力です。

Fable Katamari はその遊び心地をブラウザで再現したオマージュ作品です。ルールはたった3つ。

  1. ボールを転がす(キーボード or スマホの指1本)
  2. 自分の65%以下の大きさのものは巻き込める。大きすぎるものにはぶつかって跳ね返される
  3. 巻き込むほど大きくなる。さっきまで「壁」だったものが「エサ」に変わる

最新版(v3)では、秋葉原の電子パーツショップの棚の上からスタートして、ネジ → フィギュア → 自転車 → 通行人 → ビル → 雷門 → 東京タワー……と巻き込みながら東京の箱庭を転がり、最後に高さ634mの東京スカイツリーに到達するとフィナーレです。相棒のアヒル「ドナック」が実況してくれます。

このゲームの技術的な見どころは「2cmから600m超まで、画面の切り替えなしでシームレスに成長する」ことです。普通のゲームなら「ステージ1クリア→ロード→ステージ2」と区切るところを、Fable Katamari は一度もロードを挟みません。しかも巻き込んだものが何千個になっても処理が重くならない設計です。これがオーナーの最初の注文であり、AIが最も頭を使ったポイントでした。

はじめて遊ぶ人へ

AIはどうやって作ったのか

このプロジェクトでは「ultracode」と呼ばれるマルチエージェントワークフローを使いました。1体のAIが全部やるのではなく、たくさんのAIエージェントがそれぞれ役割を持ち、チームとして働くやり方です。

各バージョンの制作は、毎回この4つのフェーズで進みました。

  1. 設計 — 複数の案を競わせ、審査して1つの設計図に統合する
  2. 実装 — 設計図と「契約」を凍結し、5チームが並列で作り、棟梁が結合する
  3. 検査 — 多角的にレビューし、指摘を別のエージェントが反証し、本物だけ直し、最後に実機プレイで確認する
  4. 公開 — Cloudflare Pages にデプロイし、本番URLでもう一度実機検証する

そして全フェーズを通じて、すべての思考・意思決定・採点理由・棄却理由がログに記録されています(オーナーの最初の指示のひとつでした)。いまあなたが読んでいるこのページ自体が、そのログから書き起こされたものです。やっていることは、実は人間の建設プロジェクトとよく似ています。3つの比喩で説明します。

その1設計コンペ — 複数の設計士が独立に提案し、審査員が統合する

最初に、3体の設計エージェントにお互いの存在を知らせないまま、同じ要件で設計案を出させました。1体目は「性能最優先」、2体目は「遊び心地最優先」、3体目は「シンプルさ最優先」という、わざと違うこだわりを持たせています。そして4体目の審査エージェントが3案を採点し、最も優れた案を土台に、他の案の長所を移植して1つの設計図に統合しました。

1人の設計士に任せると、その人の思い込みがそのまま製品の欠陥になります。独立した3案を競わせると、「性能案の数学的な堅牢さ」と「体験案の気持ちよさへのこだわり」と「シンプル案の鋭い割り切り」が全部手に入る——v1の心臓部である「リスケール方式」は性能案から、「気持ちよさの法則」は体験案から、「埋没カリング」はシンプル案から採用されました。

3体の設計エージェントが、互いの案を見ずに独立提案 設計士A 性能 最優先 9.0 設計士B 遊び心地 最優先 8.5 設計士C シンプルさ 最優先 7.5 審査エージェント 3案を採点し、統合方針を決定 統合設計図(DESIGN.md) リスケール方式 — A案(性能)から採用 気持ちよさの法則 — B案(体験)から採用 埋没カリング — C案(シンプル)から採用 最優秀案を土台に、3案の「良いとこ取り」で1枚に統合
図1: 設計コンペ — 独立した3案を審査員が採点し、長所を移植して統合する

その2分担工事 — 設計図と「契約」を凍結し、5チームが同時に施工する

実装フェーズでは、まずリードエージェントが全モジュールの境界線(インターフェース=契約)を先に確定して凍結します。家を建てる前に「配管はここを通る」「コンセントの規格はこれ」と決めてしまうイメージです。

契約が凍結されると、5体の開発エージェントが互いのファイルに一切触れない分担で同時に作業を始めます。物理担当、ワールド生成担当、描画担当、操作と演出の担当、コンテンツとUI担当。お互いの進捗を待つ必要がないので、本来なら直列で何時間もかかる作業が並列で進みます。

最後に統合エージェント(棟梁)が5チームの成果物を1つに配線します。ここで面白いのは、棟梁が7件の食い違いを発見して修正したことです。たとえば「カメラの向きの定義が2チームでちょうど180度ずれていた」など、独立作業ならではのズレを、統合時に1か所ずつ突き合わせて解消しました。

❄ 凍結された設計図と契約 型・イベント名・全定数・ファイル分担を先に確定し、以後変更禁止 5体が同時に実装 — 互いのファイルには一切触れない A 物理 転がり・吸収 B ワールド生成 街・スポーン C 描画 3D表示・カメラ D 操作・演出 入力・フィナーレ E コンテンツ・UI HUD・音 統合エージェント(棟梁) 5チームの成果を配線 — 7件の食い違いを発見・修正 ビルド → 実機テストへ
図2: 分担工事 — 契約凍結 → 5ストリーム並列 → 棟梁による統合

その3検査 — 指摘を「別の検査官」が疑い、本物だけを直す

できあがったゲームは、複数の観点(正しさ・性能・遊び心地・契約整合)からレビューエージェント群が一斉に検査します。ここまでは普通の品質チェックですが、ultracodeには特徴的な仕掛けがあります。指摘1件ごとに、独立した「懐疑エージェント」がつき、その指摘が本当かどうか反証を試みるのです。

AIのレビューは(人間と同じく)「もっともらしいが実は問題ない指摘」を出すことがあります。指摘を鵜呑みにして全部直すと、直すこと自体が新しいバグを生みます。そこで敵対的検証を挟むと、v1ではレビュー指摘の約3割が「偽陽性」として棄却されました。残った本物の指摘だけを修正エージェントが直し、最後に別のバリデータが実際にゲームをプレイして確認する——この二段構えが、品質と安全性の両方を支えました。

レビュー指摘 正しさ / 性能 / 遊び心地 / 契約整合 v1では 30件 懐疑エージェント 指摘1件ごとに独立に 「本当か?」を反証する 敵対的検証 本物 確定 21件 反証に耐えた指摘 修正エージェント 実機プレイ検証 別のバリデータが遊んで確認 偽陽性 棄却箱 9件(30%) 「もっともらしいが実害なし」 鵜呑みにして直していたら、修正自体が新しいバグを生んでいた
図3: 敵対的レビュー — 指摘→反証→確定/棄却→修正→実機検証の二段構え

なぜ1体のAIではなく「チーム」なのか

3つの比喩に共通するのは、役割ごとに別の目を入れることです。設計を提案した本人は自分の案の弱点に気づきにくい。実装した本人は自分のコードのバグを見逃しやすい。指摘した本人は自分の指摘を疑わない。だから提案と審査、実装と統合、指摘と反証、修正と検証を、毎回別のエージェントに分ける——人間の組織が長い時間をかけてたどり着いた「相互チェック」の知恵を、AIチームはそのまま高速で回しています。

もうひとつの理由は並列性です。5チームの分担工事や、指摘1件ごとの反証は、お互いを待つ必要がないので同時に走らせられます。126体・約12時間という数字は、直列なら何倍もかかった作業を圧縮した結果です。

敵対的検証の実例 — 棄却された「もっともらしい指摘」

v1レビューで「勝利画面のカメラが世界の原点を映していて、長いプレイ後は霧しか映らない」という指摘が出ました。コードを読む限り完全に正しい指摘です。カメラは確かに原点を周回し、ボールは最大1,500シミュレーション単位も離れている可能性があります。

しかし懐疑エージェントが反証した結果——勝利画面のオーバーレイは完全に不透明なDOMレイヤーで、カメラが何を映していようとプレイヤーには1ピクセルも見えないことが判明。「指摘されたカメラの問題は実在するが、観測不可能であり欠陥ではない」として棄却されました。

同様に「ノックオフで体積が返却されず成長が二重計上される」という指摘は、引用していた定数値(GROWTH_K=10)が実際の値(0.45)と異なる「数値の捏造」を含むことまで突き止めて棄却。逆に「成長ペースが目標の20〜30倍遅い」という指摘は反証に耐えてcritical確定となり、ゲームの根本的なチューニング修正につながりました。指摘を疑う工程があるからこそ、確定した指摘には全力で対処できます。

検査の検査 — バリデータが「修正による回帰」を見つけた話

修正エージェントがレビュー指摘を直したあと、最終バリデータが実際にブラウザでプレイテストをします。v1ではここで本物の回帰(修正が引き起こした新しい問題)が2件見つかりました。

ひとつは加速度の定数の問題。ACCEL_K=22 では摩擦と釣り合う「終端速度」が速度上限の約半分にしかならず、設計上の最高速度が数学的に到達不可能になっていました。バリデータは式 終端速度 = ACCEL_K × dt × f ÷ (1 − f) を立てて原因を特定し、45に修正。もうひとつは修正後も吸収ペースが目標未達で、実測(約20秒間プレイして吸収数をカウント)に基づいて「拾いやすさ補正」を広げました。最終計測では18.5秒で22個吸収、雪だるま式の成長カーブが正しく出ることを確認しています。

「直した人とは別の人が、実際に動かして確かめる」——人間の現場の鉄則を、AIチームもそのまま実践しています。

v1 → v2 → v3 → v4 → v5 進化の物語

5つのバージョンは、毎回オーナーの新しい注文から始まりました。まずは全体図です。

テーマオーナーの注文(ひとこと)ゴール所要
v1技術の証明「シームレスに成長する塊魂を、重くならないように」500m到達約2.5時間
v2演出とバズ「ゴールは月に変更。クオリティアップ。バズ狙い」月と融合約3時間
v3作品化「箱庭の東京。スマホ対応。アヒルの実況つき」東京スカイツリー約6.8時間
v4リアル東京「地図データで本物の街並みを。ボクセル風でいい」実在の東京14,563棟約5時間
v5実プレイの声「最初のステージが何にも見えない」+ 要望5点地球が見える宇宙へ約2時間
v1

「シームレスに大きくなる塊魂」を一晩で所要 約2.5時間

オーナーの指示(要旨)

ブラウザで動く3Dゲームを作ってほしい。塊魂みたいにオブジェクトを取り込んで成長する。成長したら一段階大きい視界へシームレスに移行する仕組みにすること。取り込みスケールが大きくなっても重くならないこと。ultracode(マルチエージェント)で実行し、全作業の思考・意思決定をログに残し、Cloudflare Pages に公開すること。

空っぽのフォルダから始めて約2.5時間。設計コンペ → 分担工事 → 検査 → デプロイの4フェーズを48体のエージェントで駆け抜け、「机 → 部屋 → 通り → 街 → 都市 → スカイライン」の6ティアを5cmから500mまでシームレスに成長するゲームが公開されました。外部素材ゼロ(3Dモデルも効果音も全部コードから生成)、バンドルはgzip後わずか154KBです。

最大の発明は「世界のほうを縮める」リスケール方式でした。ボールを無限に大きくしていくとコンピュータの数値計算が精度切れを起こすので、ボールが一定サイズに達した瞬間、世界全体を1/5に縮めてボールを元のサイズ帯に戻す。カメラも霧も全部が同じ比率で縮むため、縮めた前後の画面はピクセル単位で同一——プレイヤーには絶対に気づけません。

リスケール直前 ボール半径 2.5(上限)に到達 r = 2.5 ×0.2 1フレーム で適用 世界全体を 1/5 に縮小 ボールは半径 0.5 に戻る r = 0.5 カメラ・霧・速度も同じ比率で縮む カメラから見た画面は… = 縮小前のフレーム 縮小後のフレーム ピクセル単位で同一 — プレイヤーには絶対に気づけない
図4: 「世界のほうを縮める」リスケール — 相似変換のビフォーアフター

制作中の見どころエピソード

  • 48種類のオブジェクトを全部コードで造形: 消しゴム、マグカップ、ネコ、消火栓、観覧車、クルーズ船……すべて箱や円柱の組み合わせ+頂点カラーで実行時に生成。ビルの窓は「乱数で一部の窓だけ明かりが点いている」演出までコードで焼き込まれています。最大の観覧車でも268ポリゴン、外部の3Dモデルはひとつも使っていません。
  • 「拾えない塊魂」事件: 統合直後のスモークテストで、まっすぐ転がしても10秒間なにも拾えない問題が発覚。正直な球同士の接触判定は、見た目より当たり幅がずっと狭かったのです。レビューフェーズで「自分よりじゅうぶん小さい物には当たり判定を甘くする(大きい物への判定は正直なまま)」という連続的な救済ルールが入り、塊魂らしいバクバク食べる感触になりました。
  • スマホで遊べない疑惑: レビューが「タッチ用ジョイスティックが存在するのに見えない、タイトル画面の説明もキーボード前提」と指摘。指の位置にリングとスティックが表示されるようになり、タッチデバイスでは説明文も差し替わるようになりました。
v1 タイトル画面
v1 タイトル画面(本番URL)
v1 プレイ画面
v1 プレイ中 — 机の上の世界
相似変換リスケールの数学

シミュレーションは常にボール半径 0.5〜2.5(シミュレーション単位)の狭い数値帯で行います。半径が2.5に達したフレームで、全座標・全速度・全半径に一様な相似変換 S = 0.2 を1フレーム内に適用し、ボールを0.5に戻します。「実際の大きさ」は倍精度の worldScale 変数で別管理し(リスケールごとに5倍)、HUD表示にだけ使います。

なぜ画面が一切変わらないのか: カメラ距離・フォグ距離・速度上限がすべて「半径の純関数」(例: カメラ距離 = 6.5 × r)だからです。rが0.2倍になればカメラ距離も0.2倍になり、相似な世界を相似な距離から見るので投影結果は同一。32bit浮動小数点の精度は常にフルに保たれ、理論上は成長の上限がありません。検証用に「強制リスケールキー + 前後スクリーンショットのピクセル差分」というテストまで設計に組み込まれており、v3最終検証では「差分は画面上部のタイマー数字のみ、ワールド描画はバイト単位で同一」が実測確認されています。

シームレス法則 — 「ティアは見た目だけを変える」

設計コンペで「遊び心地最優先」案から移植された、このゲームの憲法です。

ティア番号(机/部屋/通り…の段階)が変えてよいのは見た目だけ——出現する物のラインナップ、色のパレット、BGMのレイヤー、お祝い演出。一方、吸収判定・カメラ距離・フォグ・速度・消滅判定はすべて半径の連続関数でなければなりません。

こうすると「境界をまたいだ瞬間にゲームの挙動が変わる」ことが構造的に不可能になります。シームレスさを「頑張って違和感を消す」のではなく「違和感が発生し得ない構造にする」——閾値でゲームプレイが分岐しない限り、カクつきもワープも原理的に起きないのです。

物理エンジンを自作した理由

3つの設計案が全員一致で下した唯一の判断が「物理エンジンライブラリを使わない」でした。

このゲームで動く物体は実質ボール1個だけ。相手は全部、地面に置かれた静的な球(当たり判定用の近似)です。汎用物理エンジンの rapier(WASM 1.7MB、リスケールのたびに全ボディをテレポートさせると壊れる)や cannon-es(JSソルバが遅く、アーケード的な操作感の調整と喧嘩する)は「このゲームには存在しない問題」を解くための重装備でした。

自作したアーケード物理は約400行。固定60Hzの決定的なステップで動き、「ぶつかったら巻き込んだ物が1〜3個剥がれ落ちる」という塊魂の名物挙動もほぼタダで実装できました。何を使わないかの判断が、154KBという小ささと安定性を支えています。

v2

「ゴールは月。バズ狙いで」所要 約3時間

オーナーの指示・第1弾(要旨)

背景・陸地・段差を追加。民家の中から始めて街の銅像をゴールにするデモ構成に。BGM/SE、ダッシュ、タイムアタック、レアアイテム、スコアとランク、Xポスト機能。

設計チームはこの「銅像ゴール案」を一度きちんと設計しきりました。ところが敵対的批評エージェントが15件の重大問題を検出します。「家の中ではカメラが壁にめり込んで破綻する(ブロッカー)」「物をひとつ巻き込んだだけでドアを通れなくなり詰む(ブロッカー)」……。屋内ステージは想像以上にリスクの塊だったのです。

そしてオーナーが実際にv1をプレイした上で、方針を転換します。

オーナーの指示・第2弾(要旨)

ゴールは月に変更。家の中案は取り下げ。BGM・背景・巻き込めない大物オブジェクトでクオリティアップ。Xポストは維持。バズ狙い

最もリスクが高かった地形・壁システムはまるごとキャンセル。ただし旧設計のうちゴールに依存しない部分(ダッシュ、タイマー、スコア、レア、ランク、Xポスト、BGMの設計)は「サルベージファイル」として抽出し、新しい設計ワークフローの入力素材に再利用しました。ボツ案も無駄にしないのがエージェントワークフローの面白いところです。

v2の設計は、v1の「3案コンペ」とは違う形をとりました。既存のコードベースという制約が強く効くため、複数案を競わせるより「1つの案を敵対的批評で徹底的に叩いて改訂する」3段パイプライン(設計→批評→改訂)のほうが向いている——という手法の使い分けも、ログに理由つきで記録されています。

銅像案を沈めた批評、月案を鍛えた批評

敵対的批評エージェントは、ボツになった銅像案だけでなく、採用された月案にも15件の問題を突きつけました。いくつか抜粋すると——

  • 「設計書は『ball.jsは変更不要』と主張しているが、コードを実際に確認したら8列構造の前提がハードコードされていて偽」(批評エージェントはソースの行番号まで挙げて反証しました)
  • 「空のシェーダの月と3Dメッシュの月の引き継ぎに、見かけの大きさを一致させる仕様がない——クロスフェードで月がポンと跳ねて見えるはず
  • 「月が着地したのに、プレイヤーがダッシュで反対方向へ走り去ったら誰も月へ導いてくれない」→ 画面端の矢印と「月へ向かえ!」トースト、月方向への弱い引力が追加
  • 「タブを切り替えて戻ると、止まっていたはずのBGMが溜まっていた音符を一気に鳴らす」→ 専用のオーディオ時計の再設計につながった

改訂エージェントは15件すべてに「採用した修正」または「採用しなかった理由」を文書で残しています。設計を破壊するためではなく、実装が始まる前に壊れる場所を全部見つけておくための批評です。

完成したv2では、序盤から空に見えていた月が、最終ティアで本当に降りてくる。接触するとカメラを奪うシネマティック演出が始まり、ボールは月と融合して夜空へ昇っていきます。WebAudioでゼロから合成したボサノヴァ風BGMがティアに合わせてレイヤーを重ね、クリア後はタイムとランクをXにシェアできます。

v2 タイトル画面
v2 タイトル — 「ROLL UP THE MOON」

制作中の見どころエピソード

  • 「月が暗い」問題: 統合チームが「上昇シーンの月が、設計の言う『光り輝く THE 月』というより細い三日月で渋い」と申し送り。レビューで材質を自己発光に切り替え、輝く満月+ハロー+星空のエンディングになりました(スクリーンショットで確認済み)。
  • 11秒の足止め: クリア演出+リザルトのアニメーションが毎回11秒スキップ不能で、しかもボタンが「見えないのに押せる」2.2秒間があるという指摘が確定。タップでシネマティックを早送りでき、リザルトも一気に表示できるようになりました(接触→操作可能まで3.2秒に短縮)。
  • Xポストの落とし穴: ブラウザ実機検証が、シェアボタンの宛先が旧式のURLだったことを発見してその場で修正。アプリ内ブラウザ(LINEなど)でポップアップが開けない場合のフォールバックまで含めて検証されました。
  • 開発モードだけ壊れていた日: レビュー中の偶然の発見として、開発用の厳格チェックが「色のパターンは4〜6種であること」という自前ルールに2つのオブジェクトが違反していて、開発モードでだけ起動が完全に死んでいたことが判明(本番ビルドはチェックが外れるため無事)。色を1つずつ足して解決。
v2 プレイ画面
v2 プレイ中 — 空に月が見えている
v2 エンディング
月と融合するエンディング
v2 リザルト画面
タイム・スコア・ランクのリザルト
「空の月」から「本物の月」への手品

序盤に見える月は、実は空のシェーダに描かれたただの円です。フィナーレで降りてくる月は約1,300ポリゴンの3Dメッシュ。このすり替えがバレると興醒めなので、批評エージェントが「クロスフェードで月がポンと跳ねて見える」と指摘し、改訂版では降下開始位置を「カメラから見た月の見かけの大きさと方向が、シェーダの円と数学的に一致する距離」から逆算する式が採用されました: 開始位置 = カメラ位置 + 月の方向 × (月の半径 ÷ tan(見かけの角直径))。プレイヤーには「ずっとそこにあった月が近づいてきた」ようにしか見えません。

ペーシング実測の方法 — ランク基準を5分の2にした夜

v2のランク基準(Sランク=300秒以内など)は、当初v1の体感から推定した値でした。レビューフェーズで実測チームがボットにゲームを3回通しプレイさせ、HUDのタイマーと大きさを2秒ごとに記録したところ、最適プレイは約95〜105秒——推定の3分の1だったことが判明します。

実測値を基準に「S = 最適の約1.2倍、A = 1.8倍、B = まともな初回プレイ(2.8倍)、C = 4倍」というモデルを立て、S/A/B/C = 120/180/280/420秒に全面改訂。スコアも「絶対サイズ依存(終盤の1個が序盤の100万倍)」から「ボールとの相対サイズ依存」に変えて、序盤の「+1」だらけの寂しい画面と終盤のインフレを同時に解消しました。数字は推測でなく計測で決める——v3でも同じ実測(最適243秒 → S=290秒)が繰り返されています。

v3

「箱庭東京、スマホ対応、相棒はアヒル」所要 約6.8時間

オーナーの指示(要旨)

スマホ表示の最適化(UIの被りを解消)。箱庭の東京マップ——秋葉原のパーツショップから始まり、街へ出て、ランドマークを巻き込み、スカイツリーがゴール。巻き込んだ物の名前を表示。レアはコレクションにしてリザルトで一覧、Xで自慢できるように。ドナック(アヒルのキャラ)が吹き出しで実況。Xポストの不具合修正。

v3は最大のアップデートでした。手続き生成の無限平面から、手作業で411個の配置を作り込んだ実在感のある東京へ。雷門、渋谷のスクランブル交差点、ハチ公、東京ドーム、東京駅、国会議事堂、レインボーブリッジ、東京タワー……11のランドマークが「巻き込める順番のはしご」として配置され、12種類のコレクションアイテム(金の招き猫、特上大トロ、だるま……)が各地に隠されています。オブジェクトの種類は94種に拡大。相棒のドナックは公式キャラ設定を調査した上で、44本の日本語セリフと表情4種を持つ実況システムとして実装されました。

ゲームの流れはこうです。秋葉原のパーツショップの中(2cm、ネジやコンデンサの世界)→ 店の正面が開いて中央通りへ(道ばたの空き缶、自転車、通行人)→ 街区へ(屋台、ネコ、車、雑居ビル)→ 各地のランドマーク巡り → 東京タワーを巻き込むと一気に400m級へ → スカイツリーに接触してフィナーレ。最初の1フレームから空にスカイツリーのシルエットが見えていて、それが「あそこまで行くんだ」という道しるべになっています。

ちなみにオーナーの指示には「スカイツリーがゴール」と「東京タワーを巻き込むまで」が両方含まれていて矛盾していたのですが、設計エージェントは「東京タワー(333m)は終盤の最高のランドマーク、スカイツリー(634m)が最終ゴール」という両立する解釈を採用し、その判断理由をログに明記しました。曖昧な指示を勝手に丸めず、解釈を記録して進むのもチームの流儀です。

制作中のドラマも v3 が一番でした。

  • 「最初の1フレームからスカイツリーが見える」は物理的に不可能: 設計の目玉だった「ゲーム開始直後から空にゴールが見える」は、批評エージェントの計算で「ボールが2cmの時点ではカメラの描画距離は実寸約160m。634m先のタワーは描画できない」と判明(ブロッカー判定)。改訂版は、v2で月のために作った「空のシェーダのシルエット → 近づいたら3Dメッシュに引き継ぐ」手品を再利用して解決しました。同じ批評は「ボールが東京タワーの脚をゲーム序盤からずっとすり抜けられる」ことも見抜き、ゴールモニュメント専用の当たり判定が追加されています。
  • 成長暴走の発見: 統合テスト中、秋葉原の通りでWキーを押しっぱなしにしたら3秒でボールが4mから117mに膨張する暴走が見つかりました。巻き込み成長率と密度の組み合わせが連鎖反応を起こしていたのです。レビューフェーズで「物の実サイズに応じて成長係数を絞る」修正が入り、実測で最適クリア4分03秒・通常7分17秒という設計目標どおりのカーブに収まりました。
  • トークン上限との戦い: v3レビューは29体・約356万トークンの大工程で、途中でセッションのトークン上限に到達して停止。オーナーに報告し、トークン回復後にワークフローの再開機能(resumeFromRunId)でレビュー結果のキャッシュを温存したまま、止まった工程(修正と最終検証)だけを再実行しました。
  • スマホUIの総当たり検証: オーナーの第一の注文だった「UIの被り解消」は、5種類の画面サイズで「トースト+コレクション通知+ドナックの吹き出しを同時に強制表示して座標の重なりをミリ単位で計測する」方法で検証。最終検証では250ミリ秒間隔の重なり監視を60秒以上回し続け、重なりゼロを確認しました。
  • 最後の門番: 最終バリデータは「デバッグ用URLで0秒クリアの自己ベストが記録できてしまう」という公開前の穴まで発見。デプロイ直前に記録ガードが追加されました。
v3 タイトル画面(スマホ)
v3 タイトル(スマホ)
v3 プレイ画面(スマホ)
箱庭東京を転がる
ドナックの実況吹き出し
ドナックの実況
v3 リザルト画面とコレクション図鑑
v3 リザルト — コレクション図鑑12種とランク
成長暴走の発見と修正 — 4m→117m/3秒 をどう止めたか

暴走の正体は数学的に明快でした。巻き込み成長係数 K=10 のとき、ギリギリ巻き込める相手(自分の65%サイズ)を食べると半径は一気に1.55倍になります。さらに移動速度も巻き込み幅も半径に比例するので、捕獲レートは半径の2乗で伸びる——条件が揃うと超指数関数的な連鎖が起きます。

修正は2段構えです。(1) growthKForObjR: 実サイズ0.1m以下の小物はK=10のまま(ショップ内の気持ちよさは死守)、それより大きい物はべき乗則でK=2まで漸減。(2) ランドマークとコレクションだけは例外的にK=10を維持——「東京タワーを食べたら一気に406mへジャンプしてフィナーレ突入」という演出としての暴走は設計仕様だからです。さらにランドマークのはしごも再調整され、「東京ドームからランドマークだけを連鎖して中盤を全部スキップできる」抜け道は、閾値の隙間をわずか3%まで詰めて封じられました。

BatchedMesh採用理由 — 統合担当が見つけた設計の穴

v3の設計書には「ランドマークやコレクション用に4本の共有インスタンスプールを使う」とありました。ところが統合エージェントが配線中に気づきます——インスタンス描画(InstancedMesh)は1メッシュにつき1種類の形状しか持てない。雷門とハチ公と招き猫を同じプールに入れることは原理的に不可能でした。

統合担当は Three.js の比較的新しい BatchedMesh(1回の描画命令で複数形状を描ける仕組み)を採用し、既存のプールとまったく同じ操作面を持つアダプタ BatchedExtraPool を書いて解決。呼び出し側の変更は alloc()alloc(code) にする1引数だけで、描画回数の予算(+4回)も設計どおりに守られました。設計の理想と実装の現実がぶつかったとき、契約(インターフェース)を守ったまま中身を差し替えるのが統合エージェントの腕の見せどころです。

ドナックの実装 — setTimeout を1個も使わない実況キャラ

ドナックは緑の帽子に白い羽毛のピクセルアートのアヒル。公式リポジトリからキャラ設定(表情4種、明るく簡潔な相棒口調)を調査した上で実装されました。アセットは表情ごとに2フレーム、計8枚のWebP画像、合計たった20KBです。

中身は優先度つきのセリフエンジンです。44本のセリフがそれぞれ優先度・表情・「1回きりか」・出現フェーズを持ち、キューは1件のみ(同格以下は捨てる)、吹き出しの最低間隔はクールダウンで管理。まばたき用の4fpsタイマーが表示時間のカウンタを兼ねるので setTimeout はゼロ。ハチ公のように「ランドマーク」と「コレクション」を兼ねる対象には専用の合成セリフが用意されています。リリース前には120秒間イベントを浴びせ続けるストームテスト(217項目)で、スパムしないこと・シネマティック中に喋らないこと・リセットで黙ることを検証。さらに実プレイ計測で「平均12秒間隔はうるさい」と判定され、間隔が約32秒に再調整されました。

トークン上限からの再開 — resumeFromRunId の仕組み

v3のレビュー工程は29体のエージェントが動く約356万トークンの大仕事で、修正エージェントの実行中にセッションのトークン上限へ到達して停止しました。

ここで効いたのがワークフローのチェックポイント設計です。各フェーズの成果(レビュー指摘、敵対的検証の判定)は実行IDに紐づけてキャッシュされているため、トークン回復後に resumeFromRunId で再開すると、完了済みフェーズは再実行せず、止まった修正・検証だけが走ります。27体分の検証結果が無駄にならず、中断コストは最小で済みました。

副作用もひとつありました。再開後の敵対的検証は「レビュー時点のスナップショット」ではなく「最新のコード」に対して反証したため、初回実行中に並行して直っていた指摘を「すでに修正済み」として大量に棄却することになり、v3の棄却16件の多くはこの「陳腐化棄却」です。中断・再開すら品質ゲートが正しく機能した記録になっています。

v4

「本物の地図データで、リアル東京を」所要 約5時間

オーナーの指示(要旨)

GoogleMapのデータを使って街並みをゲームに反映してほしい。テクスチャは重いので、プリミティブなボクセル風でいい。あわせてキャラクターデータの品質も上げること。

v3の東京は「それっぽく手作業で作った箱庭」でした。v4はそれを本物の地図データから生成した、実在の東京に置き換えます。ただし最初の関門は技術ではなく法律でした。Google Mapsの地図データは、利用規約で「加工して別のデータセットを作って配ること」が禁止されています。そこでAIチームが選んだのが OpenStreetMap(OSM)——世界中の有志が育てている「みんなでつくる地図」です。出典を表示するなどのルール(ODbLライセンス)を守れば、合法に使えます。

こうして秋葉原を中心とした実寸半径2.5kmのエリア(+渋谷・浅草)から、実在の建物14,563棟が実際の位置・実際の高さでボクセルのビルになり、全部巻き込めるようになりました。神田川も隅田川も皇居のお濠も上野公園も、本物の形のまま地面に描かれます。驚くべきはデータの軽さで、東京1区分の建物・道路・川・公園を全部詰めてたった285KB(圧縮後)——スマホ写真1枚の10分の1ほどです。建物を「位置・サイズ・向き・色」のわずか10〜12バイトの数値に圧縮する自前バイナリ形式を設計したからです。

制作中の見どころエピソード

  • 批評AIが自分で地図APIに問い合わせた: 設計案には「対象エリアの建物は約4万棟」という見積もりが書かれていました。敵対的批評エージェントはこの数字を信用せず、自分でOpenStreetMapの集計APIにカウントクエリを投げて実測。結果は58,155棟——設計見積もりの約1.5倍で、データ容量からメモリ予算まで下流の計算が全部狂っていることを暴きました。改訂版は実測値を正とし、「数字は散文に書かず、ビルド時に毎回API実測と突き合わせて±20%を超えたら出荷を止める」検証ゲートまで組み込みました。
  • 3回の中断を挟んで完走: v4実装は大工程で、セッション切れ・利用上限到達で3回も止まりました(うち1回は約10時間の停止)。それでも各フェーズの成果がチェックポイントとして保存されているため、再開のたびに完了済みの作業はキャッシュから即時返却され、二重実行はゼロ。深夜に止まって翌日再開しても、何ひとつやり直しになりませんでした。
  • 道が狭すぎて遊べない問題: 実在の東京の路地は、1/5スケールにするとボールより狭い場所だらけ。そのままでは「本物だけど詰むマップ」になります。ビルド時に道路沿いの建物を自動で少し後退させる「クリアランス焼き込み」を行い、さらにボールが実際に通れる範囲をシミュレーションして「95%以上の場所に到達可能」を出荷条件にしました。
v4 丸の内 — 実在のビル群を転がる
丸の内 — 東京駅周辺の実在ビル群
v4 上野 — 実データの街並み
上野 — 不忍池も公園も本物の形
OSMパイプライン — 地図データが285KBのゲームデータになるまで

ビルド時の3段パイプライン(scripts/osm/)が、生の地図データを出荷バイナリへ変換します。

  1. 取得osm:fetch): Overpass API へ約115リクエスト(1km四方42セル、再開可能・レート制限対応)。取得した生データ7.3MB/124ファイルはリポジトリにコミットされます。
  2. 変換osm:build): 重複除去 → 飛び地ポリゴンの輪っか組み立て → 座標投影(水平1:5・高さ1:2.5)→ 建物の外接矩形化 → ボクセル量子化(位置5cm・サイズ25cm刻み)→ 長屋の結合(14,546件)→ 道路クリアランス焼き込み → 帯域別間引き → 1棟10〜12バイトの自前バイナリ「FKT4」へ。決定論的で、再実行するとバイト単位で同一の出力になります。
  3. 検証osm:verify): 容量予算・建物数のAPI実測±20%・重複ゼロ・到達可能性95%以上・ランドマーク間の実距離照合——全部に合格しないとデプロイできません(predeployゲート)。

出荷データは建物14,563棟+道路12,980本+水面/公園1,478面で合計約285KB gz(ハード上限1,536KBの2割以下)。実行時は型付き配列に一発デコードし、1棟あたりのJSオブジェクトは作りません(ゼロアロケーション法の継続)。

ODbLライセンス対応 — 「出典表示」だけでは足りない

OpenStreetMapのライセンス(ODbL 1.0)は出典表示だけでなく、加工したデータベースを作ったらそれも公開する義務(derivative database条項)があります。v4ではこれをリリースゲート(全項目必須のチェックリスト)にしました。

  • ゲーム内のタイトル画面とリザルト画面に「© OpenStreetMap contributors」のリンクを常時表示(スクリーンショットを撮っても必ず写る位置)
  • マニフェストにライセンスリンクと抽出日時(2026-06-11)を記録
  • 公開リポジトリの data/osm-raw/(生データ)と scripts/osm/(再現可能な変換パイプライン)を、ODbL 4.4(b) の派生データベース提供として明示的に指定

そもそもGoogle Mapsではなく OSM を選んだ理由がここにあります。Google Maps Platform の規約は地図データの派生データセット化・再配布を禁止しており、「地図から生成したゲームデータを静的サイトとして配る」こと自体ができません。データソースの選定は法務判断から——設計ログの冒頭に明記されています。

BatchedMeshプール — 14,563棟を数回の描画命令で

建物が1万棟を超えても、描画命令(ドローコール)の上限72回は据え置きです。v3でランドマーク用に導入した BatchedMesh(異種形状を1回の描画命令でまとめて描く仕組み)のアダプタを拡張し、OSM建物用に詳細プール2,048スロット+大型プール1,024スロットのわずか2バッチを追加。16種のボクセル建物アーキタイプ(民家・雑居ビル・オフィスタワー・寺社…)がここに同居します。

面白いのは安全設計です。帯域ごとの生存上限の合計がプール容量を超えないことを起動時にアサートし(数学的に枯渇不可能)、さらに実行時には「ストア全体の生存数が予算に近づいたらOSM建物の出現を一時停止する」入場制限(admission control)を入れました。混雑時には遠景の建物から自然に間引かれる——「境界では OSM が先に薄くなる」が仕様として文書化されています。地面の道路・川・公園レイヤも頂点カラーの BatchedMesh 1枚+川メッシュ1枚で、増えたドローコールは合計でも数回。実測は最悪地点(丸の内・半径40m時)でも60/72でした。

v5

スマホ実プレイから生まれた磨き込み所要 約2時間

オーナーの指示(スマホで遊んだ感想)

最初のステージが何にも見えない、カメラ位置おかしくない?」——そして追加要望:「謎の溝が見える」「最初どこへ行けばいいか誘導がほしい」「スタックチャンを出して」「秋葉原らしい建物がほしい」「開始地点は千石電商っぽく」「最後は地球が見えるエンディングに」

v4公開後、オーナーが自分のスマホで遊んでみたら——開始直後の画面に何も見えない。AIチームの全自動検証はすり抜けたのに、人間が遊んだら一発で見つかるバグでした。調べてみると原因は笑ってしまうほど「リアル東京」ならではのもの。ゲームの開始地点(秋葉原の電子パーツ店)の真上を、実在のJR総武線の高架がちょうど通っていたのです。v4で取り込んだ本物の線路データが実座標に忠実に引かれた結果、2cmのボールから見れば線路のリボンが「天井」になり、空も街も覆い隠していました。建物は開始地点周辺から除外する仕組みがあったのに、道路・線路のリボンだけが素通りしていた——本物の地理データを使ったからこそ起きた、世界でいちばん律儀なバグです。

修正とあわせて、オーナーの要望を6体のエージェント・約100分で全部実装しました。

  • 謎の溝の解消: 開始時に見えていた灰色の帯の正体も、実は本物の道路・線路レイヤでした。ボールが小さいうちは地面レイヤをフェードで消し、大きくなるにつれて街路が浮かび上がる「半径連続フェード」に。
  • 最初の誘導: 開始30秒間だけ、いちばん近いパーツの方向を🔩矢印で案内。1個でも巻き込んだら黙って退場します。
  • スタックチャン: 手のひらサイズの実在コミュニケーションロボットが、13個目のコレクションとして棚の上に。
  • アキバらしい建物: ゲームセンター・家電量販店・メイドカフェ・PCパーツビルの4種6棟を秋葉原エリアに追加。
  • センゴク電子: 開始地点の店名を千石電商風に改名。検証してみると、現実の千石電商の位置はゲーム内の店からわずか36mで、改名するだけで地理的にほぼ正直と判明(アンカー座標は動かさずに済みました)。
  • 地球エンディング: スカイツリーに到達した後の昇天シーンで、空が宇宙の黒へ溶け、眼下に夜の地球——日本列島の街明かりと星空が広がるようになりました。ドナックの台詞も「うわぁ…地球が見えるよ…!東京の光、きれいだね」に。
v5 開幕 — センゴク電子の棚の上、視界クリア
修正後の開幕 — 視界クリア、🔩誘導つき
v5 秋葉原 — ゲームセンターやメイドカフェ
アキバらしい建物が並ぶ電気街
v5 地球エンディング — 夜の地球と星空
新エンディング — 夜の地球と星空
半径連続フェードの仕組み — 「消す」のではなく「半径の関数にする」

開幕不可視バグの原因は3つ重なっていました。(1) 地面レイヤの浮かせ量が霧距離の下限に引きずられ、開始時はボール半径の90%もの高さに浮いていた。(2) 道路の重なり順を解決するためのYオフセット(0.06ゲームm)が、2cmボールにとっては半径の3倍の壁だった。(3) 総武線高架のリボンがスポーン直上を通過していた。

v5の修正は、このサイトで何度も登場したシームレス法則そのままです。浮かせ量とオフセットは「ボール半径の10%」を上限にクランプし(半径の連続関数)、地面レイヤ全体には実寸半径0.6m→3.0mで滑らかに現れるsmoothstepフェードをシェーダに注入。フェードの入力は simRadius × worldScale(実寸半径)なので、リスケールをまたいでも値が変わらず、強制リスケール前後のピクセル一致検証も1ulp(浮動小数点の最小刻み)以内で保たれました。閾値でパッと消すのではなく連続関数にする——v1から続く憲法が、v5のバグ修正でも効いています。

リボン除外クリップ+検証ゲート — 同じバグを二度と起こさないために

総武線リボン問題の本修正は、実行時の小細工ではなくデータパイプライン側に入れました。建物にだけ適用されていた「ショップ・開始街路の除外矩形」を道路・鉄道リボンにも適用し、変換時に除外ゾーンと交差するリボンをクリップします。

そして v4 で作った検証スクリプト osm:verify に「除外ゾーン内にリボンの頂点が1つでもあれば出荷失敗」という再発ゲートを追加。デプロイ前に必ず走る自動チェックなので、今後データを再取得・再生成しても、開始地点に何かが覆いかぶさった状態では二度と本番に出られません。バグ修正を「直す」で終わらせず「再発を構造的に不可能にする」——v4の±20%カウントゲートと同じ思想です。

コレクション13個目の互換性 — 昔のセーブデータを壊さない

スタックチャンは13個目のコレクションですが、既存プレイヤーのブラウザには「12個中どれを見つけたか」を12ビットの整数で記録したセーブデータが残っています。v5ではコレクションIDをappend-only(末尾追記のみ、再利用・並べ替え禁止)の契約どおりID 12として追加し、オブジェクトコード表も94種→110種→115種と末尾にだけ伸ばしました。古いセーブはそのまま「12/13発見済み」として読み込まれ、スタックチャンを取ると13ビット目だけが立ちます(未知の上位ビットも保存する前方互換つき)。

このとき敵対的チェックが、実装前に本物の地雷を見つけています。リザルト画面のコードに「ID+70」という古い式がハードコードされており、そのままならID 12のスタックチャンを取った瞬間、図鑑に西郷さん像が表示されるところでした。ID→コード変換を単一の関数に集約し、起動時に全IDを検証するアサートも追加。さらに統合検証では「13個目のセルが図鑑グリッド(4×3)からはみ出す」CSS問題と、リザルトの「コレクション 13/12」という表示バグも捕まえて修正しています。

数字で見る制作

約1,900万トークンという数字は、おおざっぱに言えば文庫本140冊分を超える文章量の読み書きに相当します。延べ150体を超えるエージェントが、それだけの量の設計書・コード・レビュー・反証・検証レポートを約19時間で書き、読み、突き合わせた——その全記録が作業ログとして残っています。

フェーズ別の実行統計

バージョンフェーズエージェント数トークン所要時間
v1設計(3案コンペ+審査)4約18.4万約10分
実装(契約凍結+5並列+統合)7約103.0万約65分
レビュー(4次元→敵対的検証→修正→実機検証)36約255.3万約54分
デプロイ+本番検証1約5分
v1 小計48約377万約2.5時間
v2設計(銅像案+月案の2回)6約86.4万約61分
実装7約119.6万約52分
レビュー+実測ペーシング調整24約175.8万約62分
デプロイ+本番検証1約5分
v2 小計38約382万約3時間
v3設計(設計→批評→改訂)3約46.0万約37分
実装7約204.2万約125分
レビュー(中断→再開を含む)29約356.3万約235分
デプロイ+本番検証1約10分
v3 小計40約607万約6.8時間
v4設計(設計→批評→改訂、批評がOverpass実測)3約40万約38分
実装(契約+パイプライン+3並列+統合、中断3回を再開)延べ18枠約312万約4時間
デプロイ+本番検証1約10分
v4 小計約22約352万約5時間
v5開幕バグ修正+ポリッシュ(計画→敵対的チェック→3並列→統合検証)6約98万約100分
v5 小計6約98万約2時間
付随作業(作業ログ・Issue・本サイトの生成)約80万
総計150体+約1,900万約19時間

品質ゲートの実績 — 「疑う工程」は何を弾いたか

バージョンレビュー指摘反証に耐えて確定偽陽性として棄却
v130件21件9件(30%)
v219件13件6件(32%)
v322件6件16件(73%※)

※ v3の棄却率が高いのは、中断→再開の経緯により「初回実行中にすでに修正済みだった指摘」が陳腐化棄却された分を含むためです。それを除いても、全バージョンを通じてレビュー指摘の約3割は「もっともらしいが実害のない指摘」であり、敵対的検証なしに全部直していたら相応の回帰リスクを抱え込んでいたことになります。

実測プレイデータ — ボットによる計測プレイの記録

チューニングの基準値は推測ではなく、ボットに実際にプレイさせた計測から決められています。

計測結果
v1 最終検証(修正後)18.5シミュレーション秒で22個吸収、5cm→13.4cm(雪だるま式カーブを確認)
v2 通しプレイ(seed 777)最適プレイ 約95〜105秒 → ランクS基準を300秒から120秒へ全面改訂
v3 最適プレイ(貪欲ルート)ショップ→秋葉原→東京駅→国会議事堂→東京タワー→スカイツリー 4分02秒9
v3 標準プレイ(初見想定)7分17秒5(設計目標「初回クリア5〜8分」の範囲内)
v3 暴走再テスト修正前: 4m→117m/3秒 → 修正後: 著者意図のジャンプ以外の最大成長 1.41倍/秒
リスケールのピクセル一致検証強制リスケール前後の画面差分: ワールド描画はバイト単位で同一(差分はHUDのタイマー数字のみ)
ドナックの実況間隔初期値: 平均12秒(スパム判定)→ 調整後: 平均32秒

作品そのものの数字

v1v2v3v4v5
ゴール500m到達月と融合東京スカイツリー(634m)同左同左+地球の見える宇宙へ
オブジェクトの種類486094110115
手作業配置0(全自動生成)0411箇所449箇所 + 実在ビル14,563棟520箇所 + 実在ビル14,563棟
バンドルサイズ(gzip)154KB173KB205KB219KB + 東京データ285KB224KB + 東京データ285KB
描画命令の上限55回60回72回72回(実測最悪60)72回
外部アセットゼロゼロドナックWebP 8枚(20KB)のみ+ OSM地図データ(ODbL)同左

3Dモデル・効果音・BGM・背景は、v3のドナック画像とv4のOpenStreetMap由来データを除き、すべてコードから実行時に生成されています。