Live preview (JavaScript)
The loop is played live in your browser from the validated loop table (the same data the reference render below was made from); the badge on the player is its self-test (seam + motion probes). The pre-rendered reference follows.
COB-exact: timeline 1:1 from apart.cob (perpetual spin (Activate), disassembled with _cob_dis.py). StateChg staged-deploy family: 1 open stages, then the compiled close order — not a reversed activate. Fire/hit/death/smoke scripts are engine-driven or firing-only and not part of this loop.
Animation

PNG frames

Frame 0 / 890.00 s
COB timeline (APART.COB)
- 0.00–7.20 s — perpetual spin — sphere1 y-turn -50°/s (-1·360°/loop), sphere y-turn -50°/s (-1·360°/loop), espin y-turn 200°/s (4·360°/loop): started in Activate, the engine never stops it. The loop end is solved to an exact 360° multiple per channel (rate rounding < 0.18°). Wake/SmokeUnit/smoke-emitter pieces are engine-side and stay out of the loop. the compiled Deactivate re-targets the spin instead of stopping it — the piece never stops in game (compiled quirk), rendered perpetual; the aim/query/fire scripts carry no piece motion (pure stubs) — weapon effects are engine-side.
Every stage duration equals its COB sleep exactly; values are raw COB units (turns: BAM 65536 = 360°, moves: elmo × 163840). Renderer conversions follow the proven family conventions (_cob_anim.py).