Implemented in frontend/game/physics.ts. NaN detection resets to last good state, dt clamped to 0.1s.
InsolePanel component detects disconnect and falls back to keyboard via inputState.source.
frontend/lib/worldlabs.ts wraps all API calls in try/catch. Scene select UI has "Skip" option for procedural-only.
Removed dead submodule and .gitmodules file.
frontend/components/DebugOverlay.tsx toggled with backtick key. Shows FPS, position, velocity, input state.
frontend/game/state.ts has canTransition(), transitionPhase() with valid transition map. Prevents invalid state changes.
frontend/renderer/scene.ts listens for webglcontextlost, shows reload overlay.
frontend/input/insole-adapter.ts wraps setSensorConfiguration() in try/catch.
- Speed lines at high speed —
frontend/renderer/speed-lines.ts - Wind + carving sound effects —
frontend/renderer/sound.ts(Web Audio, procedural noise) - Game state machine —
frontend/game/state.ts - All fallback modes verified: no insoles, no headset, no World Labs, WebGL lost
- Keep Next.js 16 — existing project has working BrilliantSole integration
- Raw Three.js — not R3F. React handles UI only
- WebSpatial dropped — incompatible with Three.js canvas
- Procedural terrain for physics — World Labs splats are visual backdrop only
- 100k splats default — for PICO mobile GPU with stereo WebXR rendering
- SparkJS (
@sparkjsdev/spark) — World Labs' official Three.js splat renderer - Shared mutable ref for input bridge — React hooks write, game loop reads
- Game code in
frontend/game/andfrontend/renderer/ - Vercel deployment — stable HTTPS URL for PICO browser
- API key in client JS — accepted risk for hackathon
- Inter + JetBrains Mono fonts — white/black/red Aspen-style theme