Night has taken the mountain shrine and every brazier is cold. A small fox courier carries the last ember up the ledges — relight all three before the path runs out, stomping ash-sprites and cinder crates on the way. A complete precision platformer authored end-to-end by AI agents in Phaser 3, built feel-first: every movement constant was tuned and measured on gray boxes before a single sprite existed.
Arrows / A·D + Space, hold to jump higher · touch pads on phones · ~3.2 MB · M sound · P pause
The piece was concepted first — a fox courier with an ember lantern, an ash-sprite enemy, a props sheet and a twilight-shrine mood board set the palette: russet against indigo night, ember orange as the only warm light. Every named element in those sheets was then authored as a real asset, and every audit round compared the build against them.


The whole game ran and was beaten as gray boxes before any art existed. The movement layer is the lab's product: asymmetric gravity with an apex hang, coyote time, jump buffering, a facing-lookahead camera with a grounded vertical anchor — each constant recorded in FEEL_NOTES.md with the reason it holds its value and what the rejected values measured. An automated player beats every build end to end on each audit round.

The fox is a voxel-fused Blender build — audited over five rounds against its concept with render-sampled palette checks — rigged and driven by retargeted CMU motion capture (run clip 09_02, jump 16_01 with poses picked by measured hip velocity), rendered to sprite rows. The ash-sprite, braziers, crates, embers, shrine gate, tiles and all three parallax mountain layers are kit-built Blender renders. Audio is the platform's sampled-instrument engine: a celesta pitch ladder for ember streaks, harp-and-horn swells for braziers, footstep and impact families for the body, procedural night wind underneath.
The blockout ships its own benchmark harness (Playwright, canvas renderer,
raw performance.now() frame deltas — this lab's audit host has no GPU, and headless
frame throttling plus engine delta smoothing otherwise fake a clean 60). Numbers below are from
quiet-load windows on that shared host; sim-space distances are load-robust.
| Metric | Measured | Conditions |
|---|---|---|
| Input → jump velocity | 11–32 ms (≤2 frames) | DOM keydown timestamp → velocity applied |
| Coyote window | honored at 50 ms · refused at 160 ms | scripted ledge walk-off, 90 ms + 1 frame window |
| Jump buffer | fires 43 ms after landing-frame press | pressed 90 ms before touchdown |
| Run-up / stop | 95% max speed in 135 ms · stop in 17 px | full-hold from standstill / release at max |
| Jump arc | full 122 px in 345 ms up, 299 ms down · tap 39 px | hold vs 70 ms tap; 48 px tiles |
| Event feedback | ≤42 ms, every interactive event | budget 100 ms; same-tick visual response |
| Automated playthrough | 3/3 braziers, win in 18 s, zero errors | reactive input bot, desktop; repeated as confirming audit |
| Frame cost (this audit host) | best 21.1 ms avg · 32.7 ms p95 | software canvas, no GPU, shared box under residual load — real hardware runs the WebGL renderer at 60 |
| Payload | 3.2 MB · 66 files | engine 1.2 MB + art 0.7 MB + sampled audio 1.2 MB |
World gravity zero; the body's gravity is chosen per frame — rise, apex hang, fall — with a terminal clamp.
Exponential smoothing, facing lookahead re-aimed slower than position, grounded vertical anchor with asymmetric windows, decaying translation-only shake.
Each platform's tile grid baked once into a RenderTexture — one draw per platform per frame on the software-canvas floor.
Mocap frame rows; run rate tied to ground speed; jump pose picked by vertical velocity; interrupt-safe squash tweens.
Run-skid dust, crate shards under gravity, ash pops, ember sparkles, per-brazier flame loops — five tuned emitters.
The platform Web Audio engine: enveloped sampled voices, variation jitter, FX sends, first-gesture unlock, procedural wind ambience.