scripts/analysis/AudioPlayer.ts — event-contract player proof

Event-driven contract on the 15 s golden WAV. Badges assert the EVENT payloads, not internal state: (1) setLoop(10, 9999) fires loopchange with end clamped to buffer.duration exactly; (2) during looped playback 200 consecutive timeupdate values all land inside [loop.start, loop.end] — this exercises the 2026-07-02 clock repair (the wall-clock reference now tracks the actual start offset, so even first-cycle values are in bounds); (3) pause()/play() continuity — the clock resumes within 60 ms of the paused position (resume now also continues the AUDIO from the paused position instead of silently restarting the loop); (4) the state getter mirrors the last events. Clamp + state asserts spot-run headless in Node pre-ship.

press run