# DESTROYULATOR — Build Plan & Lane Specs *Fable's review + plan, 2026-07-08. Three parallel lanes over one shared asset pipeline.* ## The verdict Destroyulator plugs into the **GODVERSE pipeline you already have**, it does not reinvent it: ``` meshgod ──makes──▶ 3GOD depot ──serves──▶ { Godot game, web toy } (text→GLB) (digalot.fyi/3god) (two front-ends, one universe) ``` - **Engine question, settled:** Godot stays the shippable game (native Apple Silicon, Jolt, exports Win/Mac/Linux off the M3). Three.js is NOT a port of the same game — it's a **separate, shareable web toy** built on thriftgod's live first-person interior code, wired to the same props. Different product, same universe. Both consume the same pipeline, so the expensive part (assets) is built once. - **Assets are hybrid-cloud, not free:** meshgod = OpenRouter + fal.ai (~$0.10–0.55/asset, 1–2 min). Budget per batch; don't assume infinite regeneration. ## The three lanes (fire in parallel) | Lane | Repo / dir it OWNS | Deliverable | Depends on | |---|---|---|---| | **1 — Godot: record ritual** | `game/` (this repo) | Grab→lift→slide-disc→smash mechanic + "find the misfiled disc" mode | nothing (starts now) | | **2 — Asset pipeline** | `~/Documents/meshgod` (separate repo) | Cell-fracture stage + Destroyulator prop manifest → 3GOD | nothing (starts now) | | **3 — Web smash toy** | `web/` (this repo, new dir) | thriftgod-based FP smash demo, 3GOD props, Rapier physics | 3GOD (read-only) | **Scope rule (prevents collisions):** each lane writes ONLY inside the dir it owns. Lane 2 delivers assets to 3GOD + meshgod outputs; Lane 1 *pulls approved GLBs into `game/assets/`* itself (Lane 2 never writes `game/`). Lane 3 fetches from 3GOD at runtime. ## Shared contracts (every lane obeys these) 1. **GLB convention:** glTF **Y-up, 1 unit = 1 m, origin at floor-center**, textures embedded, decimated to tri budget. (meshgod already emits this.) 2. **Fracture format:** an intact `.glb` PLUS a sibling `.fractured.glb` whose root's direct children are the chunk meshes (each a `MeshInstance`/mesh node named `chunk_00…chunk_NN`, origin at its own centroid, in the intact model's local space). Consumers instance it and turn each chunk into a rigid body. Defined by Lane 2, consumed by Lanes 1 & 3. 3. **Depot:** 3GOD at `https://digalot.fyi/3god` — `GET /api/list` returns the shelf; GLBs fetchable by slug. Web lane reads live; game lane commits offline copies. ## ⚠️ Pre-req / ops risk (owner's call — NOT auto-fixed) The review of 3GOD found the **public digalot.fyi/3god instance running in open mode (`GOD3_OPEN=1`)** — write endpoints (upload/delete/fetch) are reachable **unauthenticated**, plus an **SSRF hole in `/api/fetch`** (`server.py:173`, reads `file://` + cloud metadata). Lane 3 only *reads* the depot, so it's not blocked — but before leaning on 3GOD as public game infrastructure, close open-mode + allow-list `/api/fetch` schemes/hosts. This is a production box; flagged for you to action, not silently changed. ## Sequencing note All three start immediately. Lane 2's fracture output *upgrades* Lanes 1 & 3 (real shard-by-shard destruction) but neither is blocked waiting for it — both already work with primitive/auto-collider fallbacks. Integrate fractured assets when they land.