Routine Labo / AIモデル検証

GPT-6.1 Terra は Sol の半額で足りる? ― 同じお題で Sol と並べて、速さ・正確さ・画面操作を比べた

2026年10月26日(米国時間)に OpenAI が出した GPT-6.1 Terra。API の値段は GPT-6.1 Sol のちょうど半分で、「画面を見てアプリを操作できる」のが売りです。では、仕事の質も半分で済むのか。どこで使えて、料金の「半額」はどう読めばいいのか。整理したうえで、Sol に作らせたのと同じお題を Terra に解かせ、重い3Dのゲーム・領収書の読み取り・画面操作の3つで並べます。

GPT-6.1 Terra 実機検証 Sol の半額で足りる?

結論:日常の仕事は半額・倍速で足りる。重い物は Sol

GPT-6.1 Terra は、GPT-6 系の中で Sol の下・Luna の上に入った「速くて効率的な」モデルです。API の単価は入力も出力も Sol のちょうど半分。

同じお題で並べると、架空の領収書6枚の読み取りは Terra も Sol も24項目すべて正解で、時間は Terra 13秒・Sol 25秒でした。一方、重い3Dのゲーム(マリオ64 風)は、Terra(xhigh)が2回とも遊べる状態にならず、Sol は1回で動きました。マリオカート風のレースは Terra が約4分の1の時間(3分33秒・Sol は14分27秒)でほぼ同じ物を作りました。

一言でいうと 日常は半額・倍速、重い物は Sol
図解:Routine Labo

GPT-6.1 Terra とは:GPT-6 系の4モデル

OpenAI の説明では、GPT-6 系は次の4つに分かれています。Terra は前の GPT-5.6 Terra の後継で、「画面の理解と操作、自然な文章」が得意とされています。公式が挙げる仕事の例は「提案書の下書き、資料の確認、元の資料を見ながらのフォーム入力」です。

モデル位置づけ(公式)入力出力
GPT-6 Astra一番賢い$10.00$50.00
GPT-6.1 SolAstra に近い性能を安く$2.00$10.00
GPT-6.1 Terra速くて効率的・画面の操作と文章$1.00$5.00
GPT-6 Luna最速最安$0.10$0.50

料金は API の標準料金(100万トークンあたり)。入力が27.2万トークンを超えると入力2倍・出力1.5倍。コンテキストは105万トークン、最大出力は12.8万トークン。
出典:OpenAI API 料金・モデルページ(2026-10-29 取得)
developers.openai.com

GPT-6 系の4モデル
図解:Routine Labo(数字は OpenAI API 料金ページ・2026-10-29 取得)

どこで使える? ChatGPT の Chat では使えない

出典:OpenAI ヘルプ「GPT-6 and other models in ChatGPT」・Codex 料金ページ・Computer Use の説明(2026-10-29 取得)
help.openai.com / developers.openai.com / learn.chatgpt.com

どこで使える?
図解:Routine Labo

料金は本当に Sol の半額?

API の単価はちょうど半額

入力 $1・キャッシュ入力 $0.05・出力 $5(100万トークンあたり)。Sol は $2・$0.10・$10 なので、すべてちょうど半分です。Astra と比べると10分の1です。

ChatGPT で使える量は Sol の約2倍

5時間あたりの目安(Plus・Standard Business)回数
GPT-6.1 Terra35〜285
GPT-6.1 Sol15〜160
GPT-6 Astra5〜45
GPT-6 Luna350〜3,000

固定の上限ではなく目安。Pro は今のところ5時間の制限なし。
出典:Codex 料金ページ(2026-10-29 取得)
developers.openai.com

半額のワナ:設定を上げるほど差が縮む

第三者の Artificial Analysis の計測では、同じ設定どうしなら1タスクの費用もほぼ半分です。ところが一番上の設定(max)では、Terra は Sol の1.5倍以上のトークンを使って考えるため、1タスクの費用は24%しか安くなりません。

設定Terra 指数Terra 費用Sol 指数Sol 費用
medium38.1$0.1746.1$0.36
high42.3$0.2650.2$0.59
xhigh45.0$0.4052.3$0.76
max51.0$0.9654.5$1.27

この表を読むと、Terra を max まで上げるくらいなら、Sol を high に下げたほうが、ほぼ同じ指数を安く出せる場面があります(Sol high 50.2・$0.59 に対して Terra max 51.0・$0.96)。Terra は medium〜high で使うのが向いています。

指数は Artificial Analysis Intelligence Index v5.0、費用は指数の1タスクあたり。10月27日に新しい版(v5.0)になり、ネットで見かける「48」は前の版の数字です。
出典:Artificial Analysis(2026-10-29 取得)
artificialanalysis.ai

半額は単価の話
図解:Routine Labo(数字は Artificial Analysis・2026-10-29 取得)

なお、こちらで同じゲームのお題を xhigh で作らせたときは、逆に Terra のほうがトークンが少なく(マリオカート風:Sol 6.3万/Terra 3.6万)、作ったコードも半分以下でした。「半額で足りるか」は、仕事の中身と設定しだいです。

ベンチマーク:どれも「Sol のちょっと下」

指標TerraSol出典
総合指数(Artificial Analysis・max)51.054.5artificialanalysis.ai
コマンド作業(Terminal-Bench 4.0・max・公式)50.3%55.9%openai.com
画面操作(OSWorld 2.1・max・公式)74.2%78.0%openai.com
Web アプリづくり(Arena WebDev)14位5位arena.ai

参考までに、Claude Opus 5.5 の総合指数は 58.4 です。前の GPT-5.6 Terra からは大きく伸びていて、OpenAI 社内の「間違いを誘う難しい質問」での誤答率は 53.6% → 16.7%(low 設定)。これは一般の間違いの率ではない、と OpenAI 自身が書いています。

ベンチは Sol のちょっと下
図解:Routine Labo(数字は Artificial Analysis・OpenAI 発表・2026-10-29 取得)

X・ネットの反応

ここは他の人の意見です(こちらの実測とは別)。

X での評価
図解:Routine Labo(X の各投稿・2026-10-27)

Sol とどう使い分ける?

タイプTerra で足りるSol(か Opus 5.5)へ
事務・営業領収書・請求書の読み取り、フォーム入力、提案書や議事録の下書き、資料の確認法務・税務の判断(第三者の評価で下位)
開発者短い実装・定型の修正・大量の繰り返し作業重い3D・長い実装・設計
クリエイター画像を見て説明を書く・下書き・アイデア出し作り込みの要る作品

乗り換える?

画面操作の注意:OpenAI のシステムカードでは、ほかのエージェントからの指示で、許可されていない操作をした率が Terra 13.75%(Sol 1.25%)。画面操作は、見ていられる範囲で任せるのが安全です。
出典:GPT-6.1 Terra System Card(2026-10-29 取得)
deploymentsafety.openai.com

Terra で足りる仕事・足りない仕事
図解:Routine Labo
乗り換える?
図解:Routine Labo

デモ① 同じお題を Sol と並べる(重い3Dのゲーム)

Sol に10月18日に作らせたのとまったく同じプロンプト(ファイルのハッシュが一致)を、同じ設定(xhigh)で Terra に1回ずつ投げました。どちらも Codex(ChatGPT のサブスク枠)で作っています。

お題モデル(設定)時間トークン動いたか
マリオカート風 3D レースSol(xhigh)14分27秒63,371動く
Terra(xhigh)3分33秒35,857動く
Terra(medium)2分14秒28,439動く
マリオ64 風 3D アクションSol(xhigh)28分35秒120,260動く
Terra(xhigh)1回目3分13秒32,670地形が描かれない
Terra(xhigh)2回目1分18秒20,815構文エラーで起動しない
Terra(medium)2分31秒33,353動く(簡素)
マリオカート風 Sol と Terra
図解:Routine Labo(同じプロンプト・xhigh・自動の起動確認の画面)
マリオ64 風 Sol と Terra
図解:Routine Labo(同じプロンプト・自動の起動確認の画面)

マリオカート風は約4分の1の時間で、コース・カート・順位表示・ミニマップまでほぼ同じ物ができました。マリオ64 風は Sol だけが城・看板・池まで作り切りました。Sol は10月18日、Terra は10月29日に作ったので、混み具合で時間は変わります。1回ずつの比較で、平均ではありません。

使ったプロンプト(マリオカート風):

【出力条件・厳守】
1. 出力は「単一のHTMLファイル」を1つだけ。file:// でダブルクリックして即動くこと。
2. コードは省略禁止。「// 以下同様」「...(省略)」は禁止。全文を書ききる。
3. Three.js を CDN(importmap) で読み込んでよい。バージョンは three@0.160.0 に固定し、importmap は
   "three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js" と
   "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/" の2行だけにする。
   addons(postprocessing の EffectComposer・RenderPass・UnrealBloomPass・OutputPass、objects/Sky、
   geometries/RoundedBoxGeometry、utils/BufferGeometryUtils、math/ImprovedNoise など)は使ってよい。
   ★物理エンジン(cannon-es/rapier/ammo/oimo 等)は禁止★(移動・ジャンプ・衝突は自前実装=手触りの数値をこの仕様で固定するため)。
   それ以外の外部アセット(画像/音声/フォント/3Dモデル/テクスチャ画像)は禁止=素材は全てコードで生成する(質感は CanvasTexture で描く)。
4. 起動時のコンソールエラーは0件であること。
5. 「仕様チェックリスト」は HTML の一番最後(</html> の直前)に HTML コメント `<!-- 仕様チェックリスト … -->` で書く。
   1項目1行・各行に ✅ / ❌ を自己申告する(嘘の✅は最も減点される)。❌ には「省いた理由(予算/優先度)」を一言添える。
   画面にパネルとして出さない(固定パネルが START ボタンを覆ってクリックを奪った事故がある)。

【この課題の性格:作り込み版(原作の再現)】
同じ題材の短いお題(マリオカート64再現)とは別に、この課題は**原作を手本に、仕様と数値を細かく固定した作り込み版**である。
- 手本の原作: 「マリオカート64」(NINTENDO64・1996年。8人・3周のグランプリ・パワースライドとミニターボ・アイテムボックス・雲の審判の信号)。原作の**遊びの手触り・画面の文法・見た目の特徴**をできるだけ忠実に再現する。
- ★画面に出す名前はオリジナル名にする(原作のタイトル・キャラ名・地名・技名などの固有名詞を文字として表示しない)。
  見た目と動きで原作だと分かればよい。曲は原作の旋律をなぞらず、雰囲気の近いオリジナル曲を合成する。
- 採点は「仕様どおりに動くか」「原作らしさ(手触りと見た目)」「予算内に書き切ったか」の3軸。
- ★出力予算: この生成の出力上限は 65,536 トークン(考える部分を出力する環境では、それも上限に含まれる)。
  HTML が途中で切れたら 0 点。**設計の検討は短く切り上げて早く HTML を書き始め、考え終えたら必ず HTML 全文を出力する**
  (考えるだけで終わり、本文が空になった事故がある)。目標は **110KB 前後・最大 140KB**。
  コメントは節の見出し1行だけ。装飾コメント・空行の連打・使わない関数は書かない。
- ★優先順位: 各節に [P0]/[P1]/[P2] を付けた。予算が足りないときは **P2 → P1 の順に省く**。P0 は省けない。
  省いた項目はチェックリストに ❌ と理由を書く(黙って省くのが最も減点)。
- ★書く順序(参照前初期化エラーの防止): ①CSS ②importmap ③定数表 ④小道具(乱数・数学・音・粒子のプール) ⑤コース ⑥カートとキャラ ⑦アイテム ⑧CPU ⑨カメラと描画 ⑩HUD・状態機械 ⑪window.__GAME ⑫起動。
  ES Module のトップレベルで const/let を定義より前に参照しない。

【起動事故を防ぐ決まり(全項目 P0)】
- 同じスコープで同じ名前を二度宣言しない(const/let/function の重複は SyntaxError になり、全体が起動しない)。
- 配列と Map は作ってから添字で参照する(まだ作っていない要素のプロパティを読まない)。
- `window.__GAME` はスクリプトの最後で1回だけ組む。値は定義済みの関数と変数を参照する(`start: startGame` の形)。
  オブジェクトリテラルの中に関数の呼び出し(`start(),`)や文を書かない。状態の値は getter で返す(`get state(){ return game.state; }`)。
- タイトル画面は Enter・Space・画面のクリック・START ボタンの**どれでも**始まる。キーは window の keydown/keyup で受ける。
  iframe の中で動くので、起動直後と画面クリックのたびに canvas へ focus する(canvas に tabindex="0")。
  矢印キーと Space の既定のスクロールは preventDefault する。
- 画面に重ねる DOM(HUD・説明・メッセージ)は `pointer-events:none`。押せるボタンだけ `pointer-events:auto`。
  タイトル画面の START ボタンの上に別の要素を重ねない。
- 入力の「押した瞬間」の判定は、更新のステップの中で前フレームとの差で取る(描画の前に消さない=タイトルで押した入力が
  描画より先に消えて進めなくなった事故がある)。
- 更新と描画を分ける: 固定ステップ dt=1/60 s・accumulator・1フレーム最大4ステップ。描画は rAF に一元化。
  乱数は seed 付き(mulberry32 等)。`reset(seed)` で同じ seed なら同じ展開になる。

【3D の約束(左右・カメラ・見た目)】
- 座標: Three.js は右手系で +Y が上。カメラの前方ベクトル f(水平成分を正規化)に対し、画面の右は r = f × (0,1,0)。
  **→ と D は画面の右へ、← と A は画面の左へ**(旋回なら → で右回り= rotation.y を減らす)。
  これが逆になる事故が多い=下の selfTest で必ず確かめる。
- カメラは壁や地形に埋まらない(注視点からカメラへの線が障害物に当たったら手前へ寄せる)。
- 見た目の下限: renderer は antialias・setPixelRatio(Math.min(devicePixelRatio, 2))・outputColorSpace = SRGBColorSpace・
  toneMapping = ACESFilmicToneMapping・影(PCFSoftShadowMap・主役の周りだけ)・Fog・空のグラデーション。
  材質は MeshStandardMaterial(頂点色か CanvasTexture)。単色の箱やカプセル1個だけのキャラは不可=
  関節の階層(頭・胴・腕・脚)で組み、待機・移動・攻撃・被弾の動きを付ける。
- 性能: 同じ形は共通のジオメトリか InstancedMesh を使い回し、毎フレーム new しない(パーティクルはプールで再利用)。
  ドローコール 200 以下を目安に、FPS 55 以上を保つ。

【採点APIと自己検証の共通の約束(P0)】
- `window.__GAME` は各課題の「採点API」節の項目に加えて、必ず `start()`・`reset(seed)`・`step(n)`・`input:{ set(keys) }`・
  `fps`・`selfTest()` を持つ。`input.set(['ArrowRight'])` で仮想入力を与え(`set([])` で離す)、`step(n)` で描画せずに
  n ステップ進める。仮想入力は実際のキー入力と同じ処理を通る。
- `selfTest()` は各課題の検査項目を実際に実行して `{ pass:[...], fail:[...] }` を返し、F1 で開くパネルにも表示する。
  例外を投げない(各項目を try/catch し、失敗は fail に入れる)。終わったら reset で遊べる状態に戻す。
- 中身のない合格(数え始めた瞬間に満たすような検査)は書かない。嘘の pass は最も減点。

【お題】Three.js で「マリオカート64」のグランプリを忠実に再現した3Dカートレースを、下の仕様どおりに作れ。

■ [P0] 画面と流れ
- TITLE(コースの上をカメラが回る・オリジナル名のロゴ・START)→ COUNTDOWN(雲に乗った審判が信号を下げる・赤→赤→青を 1 秒ずつ)→
  RACE(3 周)→ RESULT(順位表・各ラップと総合タイム・「もう一度」)。
- COUNTDOWN に入った瞬間にタイトルの DOM を消す(タイトルの文字に数字が重なった実障害)。ゴール後は自動運転で走り、全員のゴールか 20 秒で RESULT。

■ [P0] コース(原作の草原のサーキット)
- 中心線は閉じた Catmull-Rom(制御点 28 以上・1 周 約 900 m)。幅 14〜18 m・最大の高低差 12 m・ヘアピン 1・S 字 1・長い直線 2・
  トンネル 1(長さ 40 m・壁と天井)・ジャンプ台 1。
- 路面は中心線を掃引したメッシュ(コーナーで内側へ最大 6° 傾ける)。CanvasTexture でアスファルトの粒・中央の破線・赤白の縁石(2 m ごと)。
  外側に芝(2 色の緑の市松のタイル=原作の質感)とダートの帯。
- 名物: 緑の土管 ×8(高さ 3〜5 m・縁つき)・土管の上で口を開閉する花 ×4・看板 ×4・浮かぶ気球 ×3・遠くの丸い丘と山並み・雲。
  丘・木・土管はコースの縁から 6 m 以上外に置く(カメラが丘にめり込んだ実障害)。
- アイテムボックス 6 か所 ×4 個: 半透明の虹色の立方体(1 辺 1.4 m・回転・中に「?」の CanvasTexture)。取ると 2 秒で戻る。ダッシュ板 ×4(黄色の矢印が流れる)。
- 周回: 中心線を 16 のゲートに分け、順に通ってスタートラインを越えた時だけ +1。逆向きに進むと「逆走」の警告。
- 路面の判定: 中心線の最近点(前回の位置から局所探索)と横の距離で 路面 1.0/縁石 0.95/芝 0.6/ダート 0.75 の速度係数。
  縁から 8 m に見えない壁(法線へ押し戻し・速度 −40%)。落ちたら 1.5 秒で雲の救助役が直前のゲートへ降ろす。

■ [P0] カートとキャラ(8 人)
- 軽量(最高速 26 m/s・加速 14 m/s²・質量 1)= ピンクのドレスの姫・キノコ頭の小人・緑の恐竜。中量(28・12・1.3)= 赤帽子の配管工・緑の弟。
  重量(30・10・1.7)= 茶色のゴリラ・甲羅とトゲの大王・黄色の帽子と紫のオーバーオールのずんぐりした敵役。
- キャラは頭(体の 40%・帽子・髪・角などの目印)・胴・腕・脚の関節で組む。ハンドルを握る腕が切る向きへ動き、コーナーで上体が外へ傾き、被弾でカートごと回る。
- カートは低い車体(キャラの色)・大きな後輪と小さな前輪(回転)・ハンドル・背中のエンジン。全長 2.2 m。
- 操作: ↑/W アクセル・↓/S ブレーキ(止まると後退・8 m/s まで)・←→/A D ハンドル・Shift ホップとパワースライド・Space アイテム・C 後ろを見る・R やり直し。
- 旋回 2.6 rad/s を基準に低速ほど大きく、最高速で 60%。横滑りの成分を毎ステップ 12% 減らす(慣性のある曲がり)。転がり抵抗で減速。重力 −30 m/s²。
- カート同士は半径 1.1 m の円で押し合い、質量の比で押され方が変わる。

■ [P0] パワースライドとミニターボ(原作の作法)
- Shift で小さくホップ(0.25 秒)。着地でハンドルを切っていればスライド(旋回 ×1.4・外へ流れる・速度上限 95%)。
- スライド中に反対の方向キーを押して戻すたび、後輪の煙が 白 → 黄 → 橙 → 赤 と 1 段上がる(各段 0.3 秒以上あける)。赤で Shift を離すと
  ミニターボ +9 m/s を 1.0 秒(黄・橙で離しても出ない)。
- スタートダッシュ: 青の 0.4 秒前から 0 秒の間にアクセルを入れ始めると +10 m/s を 1.2 秒。1.0 秒より前から入れていると 1.0 秒エンスト。ダッシュ板は +12 m/s を 1.5 秒。

■ [P0] アイテム(取ると上中央の枠でルーレット 1.2 秒)
- バナナ(後ろに置く・踏むとスピン 0.9 秒・速度 50%)/緑こうら(前へ 40 m/s・壁で反射 5 回・10 秒)/赤こうら(前の最寄りの相手を 3 rad/s で追う)/
  キノコ(+14 m/s 1.5 秒・芝でも減速しない)/スター(8 秒無敵・最高速 +20%・虹色・ぶつかった相手は転倒)。こうらで転倒 1.2 秒。
- 出やすさ(%・バナナ/緑/赤/キノコ/スター): 1〜2 位 45/40/10/5/0・3〜5 位 20/25/30/20/5・6〜8 位 5/10/25/35/25。持っている間は次の箱を取れない。

■ [P0] CPU 7 台
- 中心線の 18 m 先を追う。曲率の大きい所でスライドし、時間で段を上げてミニターボも出す。アイテムは 1〜3 秒後に使い、赤こうらは前に相手がいる時だけ。前 20 m のバナナは 2 m よける。
- 追い上げ: プレイヤーより後ろなら最高速 ×1.08・前なら ×0.94(最後まで接戦)。キャラごとにライン取りを ±2 m ずらす。

■ [P0] カメラと見た目
- 後ろ 5.5 m・上 2.4 m・注視点は前 4 m・視野角 70°・追従 0.12。加速中は 1.5 m 引き、コーナーで外へ振る。C の間は後ろを映す。
- 明るい原色: 空 #6EC6FF→#DFF4FF・芝 #3FAE3F/#2F9A35・路面 #6B6B73。影はカメラの周り 60 m・Fog 150〜600 m。
- 粒子は丸く柔らかい点(放射グラデーションの CanvasTexture・Points・0.3〜1.0 m・寿命で薄くなる)。四角い板の煙は不可(実障害)。
  芝とダートでは土色の煙・スライドは段の色・ミニターボは後ろに炎。

■ [P0] HUD(DOM・原作に寄せた配置)
- 左上「LAP n/3」・上中央にアイテムの枠・右上に総合タイムとラップの一覧・左下に大きな順位「1st〜8th」(変わると弾む)・
  右下にミニマップ(コースの形の線と全員の点・自分は大きく)・逆走の警告・下端にキー割当(常時)。

■ [P0] 採点APIと自己検証
- `window.__GAME = { state, lap, laps, rank, speed, pos:[x,y,z], heading, item, racers:[{name,rank,lap,pos}], start(), reset(seed), step(n),
  input:{set(keys)}, fps, selfTest() }`(state は 'title'・'countdown'・'race'・'result')。
- selfTest:
  (1) reset(1); start() → 'countdown'・タイトルの DOM が非表示。step(240) → 'race'。step(600) → 全員の pos に NaN なし・路面の高さ ±1 m
  (2) ↑ で step(180) → speed ≥ 20。↑ と → で step(60) → 移動量とカメラの右ベクトルの内積 > 0・heading が減る
  (3) 同じ seed で 2 回 step(600) → 全員の pos が一致(決定性)
  (4) スライド中に反対キーを 3 回入れて Shift を離す → speed が 6 m/s 以上上がる
  (5) CPU 7 台が step(60*120) 以内に 16 のゲートを順に通って 1 周(スタート直後の 0→1 だけで合格にしない)
  (6) アイテムボックスに重ねて step(90) → item が 5 種のどれか。使うと消える
  (7) 直近 120 フレームの平均 FPS ≥ 55(起動直後は "measuring")

■ [P1] 音と演出
- WebAudio: 速さに連動するエンジン音(鋸波+ローパス)・スライドのきしみ・ミニターボ・ルーレット・こうら・信号・ゴールのファンファーレ。M でミュート。
- ゴールの紙吹雪・審判がチェッカーフラッグを振る・順位が上がった時の表示。

■ [P2] 上級
- 雷(自分以外を 4 秒縮める)・トゲのこうら・表彰台の画面。

■ パフォーマンス
- FPS55以上。レーサー 8・粒子 2000・ドローコール 150 以下。コースのメッシュは起動時に 1 回作る。

■ 仕様チェックリスト(最後の HTML コメントに書く項目)
P0 の各節・自己検証 7 項目・P1・P2・予算(HTML の KB)。

使ったプロンプト(マリオ64 風):

【出力条件・厳守】
1. 出力は「単一のHTMLファイル」を1つだけ。file:// でダブルクリックして即動くこと。
2. コードは省略禁止。「// 以下同様」「...(省略)」は禁止。全文を書ききる。
3. Three.js を CDN(importmap) で読み込んでよい。バージョンは three@0.160.0 に固定し、importmap は
   "three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js" と
   "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/" の2行だけにする。
   addons(postprocessing の EffectComposer・RenderPass・UnrealBloomPass・OutputPass、objects/Sky、
   geometries/RoundedBoxGeometry、utils/BufferGeometryUtils、math/ImprovedNoise など)は使ってよい。
   ★物理エンジン(cannon-es/rapier/ammo/oimo 等)は禁止★(移動・ジャンプ・衝突は自前実装=手触りの数値をこの仕様で固定するため)。
   それ以外の外部アセット(画像/音声/フォント/3Dモデル/テクスチャ画像)は禁止=素材は全てコードで生成する(質感は CanvasTexture で描く)。
4. 起動時のコンソールエラーは0件であること。
5. 「仕様チェックリスト」は HTML の一番最後(</html> の直前)に HTML コメント `<!-- 仕様チェックリスト … -->` で書く。
   1項目1行・各行に ✅ / ❌ を自己申告する(嘘の✅は最も減点される)。❌ には「省いた理由(予算/優先度)」を一言添える。
   画面にパネルとして出さない(固定パネルが START ボタンを覆ってクリックを奪った事故がある)。

【この課題の性格:作り込み版(原作の再現)】
同じ題材の短いお題(スーパーマリオ64再現)とは別に、この課題は**原作を手本に、仕様と数値を細かく固定した作り込み版**である。
- 手本の原作: 「スーパーマリオ64」(NINTENDO64・1996年。城の庭が拠点・額縁の絵からコースへ・3段ジャンプ/幅跳び/壁キック/ヒップドロップ・8分割のパワーメーター)。原作の**遊びの手触り・画面の文法・見た目の特徴**をできるだけ忠実に再現する。
- ★画面に出す名前はオリジナル名にする(原作のタイトル・キャラ名・地名・技名などの固有名詞を文字として表示しない)。
  見た目と動きで原作だと分かればよい。曲は原作の旋律をなぞらず、雰囲気の近いオリジナル曲を合成する。
- 採点は「仕様どおりに動くか」「原作らしさ(手触りと見た目)」「予算内に書き切ったか」の3軸。
- ★出力予算: この生成の出力上限は 65,536 トークン(考える部分を出力する環境では、それも上限に含まれる)。
  HTML が途中で切れたら 0 点。**設計の検討は短く切り上げて早く HTML を書き始め、考え終えたら必ず HTML 全文を出力する**
  (考えるだけで終わり、本文が空になった事故がある)。目標は **110KB 前後・最大 140KB**。
  コメントは節の見出し1行だけ。装飾コメント・空行の連打・使わない関数は書かない。
- ★優先順位: 各節に [P0]/[P1]/[P2] を付けた。予算が足りないときは **P2 → P1 の順に省く**。P0 は省けない。
  省いた項目はチェックリストに ❌ と理由を書く(黙って省くのが最も減点)。
- ★書く順序(参照前初期化エラーの防止): ①CSS ②importmap ③定数表 ④小道具(乱数・数学・音) ⑤地形・城・コース ⑥主人公 ⑦敵と物 ⑧カメラと描画 ⑨HUD・状態機械 ⑩window.__GAME ⑪起動。
  ES Module のトップレベルで const/let を定義より前に参照しない。

【起動事故を防ぐ決まり(全項目 P0)】
- 同じスコープで同じ名前を二度宣言しない(const/let/function の重複は SyntaxError になり、全体が起動しない)。
- 配列と Map は作ってから添字で参照する(まだ作っていない要素のプロパティを読まない)。
- `window.__GAME` はスクリプトの最後で1回だけ組む。値は定義済みの関数と変数を参照する(`start: startGame` の形)。
  オブジェクトリテラルの中に関数の呼び出し(`start(),`)や文を書かない。状態の値は getter で返す(`get state(){ return game.state; }`)。
- タイトル画面は Enter・Space・画面のクリック・START ボタンの**どれでも**始まる。キーは window の keydown/keyup で受ける。
  iframe の中で動くので、起動直後と画面クリックのたびに canvas へ focus する(canvas に tabindex="0")。
  矢印キーと Space の既定のスクロールは preventDefault する。
- 画面に重ねる DOM(HUD・説明・メッセージ)は `pointer-events:none`。押せるボタンだけ `pointer-events:auto`。
  タイトル画面の START ボタンの上に別の要素を重ねない。
- 入力の「押した瞬間」の判定は、更新のステップの中で前フレームとの差で取る(描画の前に消さない=タイトルで押した入力が
  描画より先に消えて進めなくなった事故がある)。
- 更新と描画を分ける: 固定ステップ dt=1/60 s・accumulator・1フレーム最大4ステップ。描画は rAF に一元化。
  乱数は seed 付き(mulberry32 等)。`reset(seed)` で同じ seed なら同じ展開になる。

【3D の約束(左右・カメラ・見た目)】
- 座標: Three.js は右手系で +Y が上。カメラの前方ベクトル f(水平成分を正規化)に対し、画面の右は r = f × (0,1,0)。
  **→ と D は画面の右へ、← と A は画面の左へ**(旋回なら → で右回り= rotation.y を減らす)。
  これが逆になる事故が多い=下の selfTest で必ず確かめる。
- カメラは壁や地形に埋まらない(注視点からカメラへの線が障害物に当たったら手前へ寄せる)。
- 見た目の下限: renderer は antialias・setPixelRatio(Math.min(devicePixelRatio, 2))・outputColorSpace = SRGBColorSpace・
  toneMapping = ACESFilmicToneMapping・影(PCFSoftShadowMap・主役の周りだけ)・Fog・空のグラデーション。
  材質は MeshStandardMaterial(頂点色か CanvasTexture)。単色の箱やカプセル1個だけのキャラは不可=
  関節の階層(頭・胴・腕・脚)で組み、待機・移動・攻撃・被弾の動きを付ける。
- 性能: 同じ形は共通のジオメトリか InstancedMesh を使い回し、毎フレーム new しない(パーティクルはプールで再利用)。
  ドローコール 200 以下を目安に、FPS 55 以上を保つ。

【採点APIと自己検証の共通の約束(P0)】
- `window.__GAME` は各課題の「採点API」節の項目に加えて、必ず `start()`・`reset(seed)`・`step(n)`・`input:{ set(keys) }`・
  `fps`・`selfTest()` を持つ。`input.set(['ArrowRight'])` で仮想入力を与え(`set([])` で離す)、`step(n)` で描画せずに
  n ステップ進める。仮想入力は実際のキー入力と同じ処理を通る。
- `selfTest()` は各課題の検査項目を実際に実行して `{ pass:[...], fail:[...] }` を返し、F1 で開くパネルにも表示する。
  例外を投げない(各項目を try/catch し、失敗は fail に入れる)。終わったら reset で遊べる状態に戻す。
- 中身のない合格(数え始めた瞬間に満たすような検査)は書かない。嘘の pass は最も減点。

【お題】Three.js で「スーパーマリオ64」の城の庭と最初のコースを忠実に再現した3Dアクションを、下の仕様どおりに作れ。

■ [P0] 画面と流れ
- TITLE(城を背景にオリジナル名のロゴ・START)→ HUB(城の庭)→ 城の扉から廊下の額縁の絵へ跳び込む → COURSE → 星を取ると
  STAR_GET(2.5 秒)→ HUB の扉の前。残機 0 で GAMEOVER → TITLE。開始した瞬間にタイトルの DOM を消す(状態だけ変わり画面に残った実障害)。
- 単位は m(原作の 100 単位 = 1 m)。原作は 30 fps なので、1 フレームあたりの値は ×30 で毎秒に直してある。

■ [P0] 主人公(値は原作から換算)
- 全高 1.6 m。頭(大きな鼻・口ひげ・帽子のつばと正面の白い丸)が全高の 35%。赤い帽子とシャツ #E52521・青いオーバーオール #2B50C8 と黄色のボタン・
  白い手袋・茶色の靴。頭・胴・上腕/前腕 ×2・腿/脛 ×2・靴の関節。
- 動き: 待機(呼吸)・走り(腕脚の振りは速さに比例)・切り返し(0.2 秒のブレーキ姿勢)・ジャンプ 3 段・着地のしゃがみ 0.1 秒・
  パンチ 3 連(左・右・キック)・被弾ののけぞり・ヒップドロップ(回って落ちる)・壁キック・後方宙返り。
- 走り: 上限 9.6 m/s。加速 a = 9.9 − 0.7·v(m/s²・だんだん伸びる)。離すと 0.6 秒で止まる。向きは入力の方へ毎秒 11 rad まで回る。空中は入力の 35%。
- ジャンプ(Space): 初速 1 段 12.6・2 段 15.6(どちらも +走りの速さ×0.25)・3 段 20.7 m/s。前の着地から 0.3 秒以内かつ速さ 6 m/s 以上で段が上がる(3 段目は宙返り)。
  重力 −36 m/s²・落下の上限 22.5 m/s・上昇中に離すと vy を 1/4 に。→ 止まって 1 段 約 2.2 m・3 段 約 5.9 m。
- 幅跳び: 走りながら K を押して Space → 前へ 速さ×1.5(上限 14.4 m/s)・上 9 m/s の低い弧。後方宙返り: 止まって K を押して Space → 上 18.6・後ろ 4.8 m/s。
- 壁キック: 空中で壁に触れて 0.2 秒以内に Space → 壁の法線へ 7.2・上 18.6 m/s。ヒップドロップ: 空中で K → 0.25 秒止まって回り −15 m/s で落ち、半径 2 m の敵を倒す。
- J でパンチ。爆弾の後ろから J で持ち上げ、もう一度 J で前へ 10 m/s で投げる。
- 当たり: 半径 0.37 m・高さ 1.6 m のカプセル。床は下向きのレイで吸着(40° まで登れる)・壁は水平 8 方向のレイで押し戻す。y < −20 は扉の前へ戻し残機 −1。
- 体力: 8 分割のパワーメーター。キノコ型 −1・爆発 −2・鎖の犬 −3・鉄球 −2(1 秒無敵・のけぞり)。コイン 1 枚で +1。0 で残機 −1。残機 4。

■ [P0] 拠点(城の庭)
- 城: 白い壁の本体(幅 34・高さ 16・奥行 18 m)・赤い屋根・正面の大きな木の扉・左右の円塔 2 本と中央の高い塔(赤い円錐の屋根)・
  中央の塔に丸いステンドグラス(星の模様)・窓の列。
- 城の前に堀(青い水・幅 8 m)と橋・芝の広場(2 色の緑の市松のタイル)・木 ×12・丘 2・城の横の滝(流れるテクスチャ)・池・コイン 12 枚。
- 扉の中は短い廊下(赤い絨毯)と大きな額縁の絵 1 枚(表面が波打つ)。絵に向かって跳ぶと COURSE へ。

■ [P0] コース(最初のコース=爆弾の兵隊の丘)
- 地形は高さの関数 1 つで作る 1 枚のメッシュ(240×240 m・頂点色): 奥の山(底の半径 40 m・高さ 36 m の円錐台)に幅 5 m の螺旋の山道
  (2 周で頂上・勾配 15°)・頂上の平らな台(半径 8 m)・手前の低い丘・川と池・木の橋 2・浮き島(高さ 25 m の崖の先)。平らな草原だけは不可(実障害)。
- 草は 2 色の緑の市松・山道は茶色・崖は灰色の岩(CanvasTexture)。木の柵・岩・木を散らす。
- 鉄球: 山頂の大砲から 4 秒ごとに山道を転がり下りる(直径 1.6 m)。
- 星 4 つ: ①山頂(爆弾の王を倒すと出る)②浮き島の先 ③鎖の犬の杭の奥の檻(杭をヒップドロップ 3 回で犬が離れ檻が開く)④赤コイン 8 枚を集めると出る。
  取った星は記録し、次に入ると残りだけ出る。コイン 50 枚(列・輪)。

■ [P0] 敵(見た目と挙動)
- キノコ型(茶色の傘の頭・太い眉・小さな足)×8: 歩き回り、6 m 以内で追う。踏むと潰れて消えコイン 1。
- 歩く爆弾(黒い球・背中のねじ巻き・導火線・足)×5: 近づくと導火線に火が付き 3 秒で爆発(半径 2.5 m)。後ろから持って投げられる。
- 鎖の犬(黒い球・大きな口と白い歯・目・8 節の鎖・木の杭)×1: 8 m 以内で飛びかかる(鎖 6 m で止まる)。
- 爆弾の王(山頂・王冠と白いひげの大きな爆弾): 歩いて近づき投げてくる。後ろへ回って持ち上げて投げるを 3 回で倒れる(原作の作法)。

■ [P0] カメラと見た目
- 後ろ 6 m・上 2.5 m・注視点は頭。Q/E で 45° ずつ回り込む(原作の段階回し)・マウスのドラッグでも回る。壁に当たったら手前へ寄せる。
- 明るい原色・影は主人公の周り 60 m・Fog・空のグラデーションと雲。

■ [P0] HUD(原作の配置)
- 左上に残機(顔のマーク ×n)・上中央にコイン ×n・右上に星 ×n。パワーメーター(8 分割の円)は減っている間と被弾から 3 秒だけ上中央の下に出る。
  右下にカメラの向きのマーク。場所の名前(オリジナル名)は入った時に 2 秒。下端にキー割当(WASD/矢印 移動・Space・J・K・Q/E・R・M・F1)。

■ [P0] 採点APIと自己検証
- `window.__GAME = { state, stars, coins, hp, lives, pos:[x,y,z], course, camYaw, start(), reset(seed), step(n), input:{set(keys)}, enter(name),
  fps, selfTest() }`(state は 'title'・'hub'・'course'・'star_get'・'gameover'。enter('course') で額縁を通らずに入る)。
- selfTest:
  (1) reset(1); start() → 'hub'・タイトルの DOM が非表示。↑ で step(120) → 5 m 以上進む・NaN なし
  (2) D で step(30) → 移動量とカメラの右ベクトルの内積 > 0.5 m。ArrowRight でも同じ
  (3) 止まって Space → 最高点の上昇 2.0〜2.5 m。走って着地 0.2 秒後に 2 回目 → 3.0 m 以上・3 回目 → 5.0 m 以上
  (4) enter('course') → 山頂の地形の高さ ≥ 30 m・浮き島 ≥ 20 m・敵 14 体が地形の上。step(600) で NaN なし
  (5) キノコ型に横から当てる → hp −1。上から落とす → 敵が消えて coins +1
  (6) 星②の位置に置いて step(1) → 'star_get'。step(180) → 'hub'・stars +1
  (7) 直近 120 フレームの平均 FPS ≥ 55(起動直後は "measuring")

■ [P1] 音と演出
- WebAudio: 段で音程が上がるジャンプ・コイン・踏みつけ・パンチ・被弾・星のジングル・爆発・明るいオリジナルの BGM(M でミュート)。
- 足元の土煙・着地の輪・星の光と回転・コインのきらめき・滝のしぶき(丸く柔らかい点の Points)。

■ [P2] 上級
- 額縁に跳び込む時の波紋のシェーダ・亀との駆け比べ・羽の帽子で飛ぶ。

■ パフォーマンス
- FPS55以上。地形は 1 枚の BufferGeometry・敵とコインは共通のジオメトリ・ドローコール 150 以下。

■ 仕様チェックリスト(最後の HTML コメントに書く項目)
P0 の各節・自己検証 7 項目・P1・P2・予算(HTML の KB)。
デモ① 同じお題を Sol と並べる
図解:Routine Labo

デモ② 領収書6枚を経費表にする(日常の仕事)

架空のお店の領収書・レシート6枚を、正解を先に決めて作りました。手書きの領収書、軽減税率(8%)と10%が混ざったコンビニのレシート、印字の薄い感熱紙、お預かりとお釣りが並ぶ文房具店のレシートなど、読み取りでつまずきやすいものを入れています。

架空の領収書6枚
図解:Routine Labo(架空のお店・実在しません)

同じ6枚を、同じプロンプト・同じ設定(medium)で Terra と Sol に読ませた結果です(Codex CLI で実測)。

項目GPT-6.1 TerraGPT-6.1 Sol
正解(日付・支払先・税込・消費税×6枚)24/2424/24
合計(税込 12,365円・消費税 1,117円)正解正解
時間13秒25秒
API に換算した費用約 $0.021(約3円)約 $0.041(約6円)
書き方内容欄は短い。コンビニの科目は「要確認」内容欄が細かい。コンビニを「電池は消耗品費、飲み物は要確認」と分けた

正解の数は同じで、時間と費用は Terra が約半分。丁寧さは Sol、速さと値段は Terra、という結果でした。

使ったプロンプト(6枚の写真を添付して送る):

添付した6枚の領収書・レシートの写真を読み取って、経費精算用の表を作ってください。

- 列は「No/日付(YYYY-MM-DD)/支払先/内容/税込金額(円)/うち消費税(円)/税率/勘定科目」
- 税率は「8%」「10%」「混在」のどれか。混在のときは税率ごとの対象額と消費税も書く
- 勘定科目は「会議費・旅費交通費・消耗品費・新聞図書費・福利厚生費」から選ぶ
- 写真から読み取れない・自信がないところは推測で埋めず「要確認」と書く
- 表のあとに、税込金額の合計・消費税の合計・要確認の件数を書く
- 出力は Markdown の表と合計だけ(前置きや説明は不要)

同じ6枚で試せるように、写真を置いておきます。 領収書1領収書2領収書3領収書4領収書5領収書6

ターミナルの Codex CLI でも同じことができます:codex exec -m gpt-6.1-terra -i r1.jpg -i r2.jpg -i r3.jpg -i r4.jpg -i r5.jpg -i r6.jpg < プロンプト.txt(プロンプトは標準入力で渡す。-i の後ろに書くと画像として読まれてしまう)

デモ② 領収書6枚を経費表に
図解:Routine Labo

デモ③ 画面操作でフォームに6件入力する(Computer Use)

Terra の一番の売りの画面操作を、テスト用に作った経費精算フォームで試します。ChatGPT のデスクトップアプリの Work で Computer Use を有効にし、デモ②の表の6件を入力させます。フォームは「最初の入力から最後の登録まで」の秒数と、正解の項目数を自分で表示します(入力した内容はどこにも送信しません)。

テスト用の経費精算フォーム
図解:Routine Labo(テスト用のフォーム)

テスト用フォームを保存する(保存したファイルを Chrome で開くだけで動きます)

使ったプロンプト(Terra と Sol に同じ文面):

画面に開いている Chrome の「経費精算フォーム(テスト用)」に、下の表の6件を上から順に入力してください。

- 1件ごとに、日付・支払先・内容・税込金額・うち消費税を入力し、勘定科目を選んでから「登録」を押す
- 日付は表のとおり 2026-10-20 の形で入力する
- 6件終わったら「答え合わせ」を押し、画面に出た結果(正解の項目数と所要秒数)を教えてください
- このフォーム以外のタブやアプリには触らないでください

| No | 日付 | 支払先 | 内容 | 税込金額 | うち消費税 | 勘定科目 |
|---|---|---|---|---:|---:|---|
| 1 | 2026-10-20 | 喫茶 ひだまり珈琲 | 打合せ飲食代 | 2640 | 240 | 会議費 |
| 2 | 2026-10-21 | さくら交通株式会社 | タクシー運賃・迎車料金 | 3200 | 290 | 旅費交通費 |
| 3 | 2026-10-22 | ノート堂 駅前店 | コピー用紙・ボールペン・ふせん | 1375 | 125 | 消耗品費 |
| 4 | 2026-10-23 | まちかどマート | おにぎり・緑茶・乾電池 | 830 | 70 | 要確認 |
| 5 | 2026-10-24 | 青葉書店 | 書籍 | 3520 | 320 | 新聞図書費 |
| 6 | 2026-10-25 | タイムパーク中央第2 | 駐車料金 | 800 | 72 | 旅費交通費 |
デモ③ 画面操作でフォームに6件
図解:Routine Labo

まとめ

まとめ
図解:Routine Labo

出典