4b1d3afe7b
Operator: audio turned off sometimes after landing on a new altitude. Root cause: fadeVolume started a setInterval ramp that was never cancelled. When restAudio faded the idle element to 0 and — within FADE_MS — that same element became the newly-landed ACTIVE scale (assignElements reuses an element per soundtrack url), the stale fade-to-0 kept running and dragged the now-active element back to silence. Fix: cancelFade() supersedes any in-flight fade when a new fade starts (fadeVolume) or a direct volume is set (ensurePlaying). E2E proves a new fade supersedes a stale one (fails without the fix). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>