Tone.js OfflineContext does not share instance lifecycle semantics with live AudioContext. Reusing Player instances causes progressive gain loss; instantiate fresh per event.
Across three sessions building a SvelteKit audio-visual export tool backed by Tone.js OfflineContext, a consistent pattern appeared: code that looked correct under static analysis produced significant audio failures at runtime.
Instance lifecycle mismatch in OfflineContext: Exported video audio decayed from -20 dB to near-silence over approximately 35 seconds. The stop()/start() call pattern appeared correct — it works without issue in live AudioContext playback — so the degradation was not caught by type checks or linting. Root cause: a single Tone.Player instance reused across audio events. Tone.js's OfflineContext does not share the same instance lifecycle semantics as the live AudioContext; internal state accumulated across repeated invocations causes progressive gain loss. Fix: instantiate a fresh Player per event — a pattern already present in other audio classes in the same codebase, making the reuse an unintentional inconsistency.
Perceptual timing constants require empirical iteration: Even after the degradation fix, multiple timing parameters (blip playback threshold, intro dead-air offset, race outro duration) required three rounds of adjustment across two sessions before exports felt perceptually correct. None of these values were derivable from source asset metadata or code structure — they can only be validated against rendered output.