21795e5cd3
preloadNextSSML() called tts.next() interleaved with await, creating async gaps where the concurrent #speak() could dispatch marks against corrupted #ranges state (replaced by next() for a different block). Since mark names restart at "0" per block, marks resolved to the wrong text position, causing accidental page turns and highlights far from the current sentence. Fix: gather all tts.next() and tts.prev() calls synchronously (no await between them) so no async code can see the intermediate #ranges state. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>