- ?move=<ref> boot parameter (?policy= alias, ?session=&round= sugar)
- session:<id>[:<round>] refs fetch same-origin /api/play/* endpoints
- episodic manifests mount in the roll slot as a one-shot on R
- perpetual slot sitstand swaps the sit policy; walk unchanged
- script manifests load move_script.json and drive the 13-D command
vector on the walker (linear keyframes, loop), toggled by R
- HUD chip: PLAYING <prompt or name> by <author>
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve an org/repo Hub id (or a direct .onnx URL) into a validated
onnxruntime session and swap it into the walk slot only, keeping
recovery/sitstand/kicks/roulade on the official set:
- custom-policy.js: manifest schema-2 checks (reject only
present-and-wrong claims, walk-slot compatible kinds only), publish
smoke run mirror (1 input / 1 output, zeros + 2 noisy inferences,
[1,14] finite non-constant output), honors manifest action_scale
- game.js: name-agnostic inference (session inputNames/outputNames
instead of hardcoded obs/actions), per-session action scale,
Number.isFinite guard before writing ctrl, watchdog that auto-reverts
to the official walker on 3 abnormal endings (recovery entries +
solver explosions) in a rolling 20 s window or any non-finite action
- ?policy=<ref> URL param (parsed in App.jsx, loaded after boot, never
blocking it; failures surface in the HUD on the official walker)
- HUD: active-policy chip with unload X, LOADING POLICY OSD line,
toas…
chore: disable sound until the sound design is finished
Display keyboard tutorial labels for the active layout while keeping the existing physical bindings. Fall back to QWERTY/AZERTY labels when layout data is unavailable.
Tested with `npm test` and `npm run build`.
- Title menu: split layout with live 3D duck (vitrine-style materialize
shader), variant-tinted accents, unified boot spinner (assets + font +
game core), duck hidden on narrow touch screens
- Audio: new WebAudio sound system (sweeps synced to the tron shader,
per-prop pitch scaling) - shipped disabled via SOUND_DISABLED until the
sound design is finished; HUD mute toggle commented out accordingly
- Supply chain: MuJoCo, onnxruntime-web and trystero vendored from npm
instead of jsDelivr/esm.run CDNs (wasm assets bundled locally)
- Ghosts: explicit healthy Nostr relay list; the appId-seeded default
subset had rotted (dead/blocking/rate-limiting relays), silently
breaking peer discovery in prod
Co-authored-by: Cursor <cursoragent@cursor.com>
- HUD chrome reworked as comic panels: cream keyline frames with 1px ink
inset, caption cartouches (NAV / SHOP / COLOR / MODE), inner glass
padding and square gapped colour swatches
- drop the T relief toggle and B ball-respawn keyboard bindings; gamepad
Y becomes HEAD mode, A ground pick, LT rides the looping wheee
- decor props row + CRT distortion pass, per-duck wheee voice sets,
ground-pick and stand policies, updated robot meshes, title menu
refresh; README controls updated
Co-authored-by: Cursor <cursoragent@cursor.com>
feat: Vite+React+MUI+R3F app shell in app/ (framework-agnostic game core, zustand bridge)