28d5e51c92
A spanning block stalled ~2.1s before it began playing: activate ran prepareRevealBlock with forceRebuild, synchronously redrawing the start spread (and preloading the continuation spread) on the main thread, because the lookahead plan had been built with right-only timing before pagination committed the overflow. Build the start-spread plan spanning-aware during lookahead instead: when the preview layout shows the block overflows, derive its timing across both preview spreads (via the revealSpreadSourceOverride) and cache it. activate then reuses that plan — the same fast cached-plan path non-spanning blocks already use — with no synchronous redraw. forceRebuild is kept only as a fallback when a block spans but was not prepared spanning-aware (e.g. an immediate prepare with no preview layout), and an evicted plan still rebuilds correctly because pagination is committed by then. Verified live: the spanning block's pre-playback gap dropped from ~2088ms to 139ms (equal to non-spanning blocks), while the right line still reveals over its area share (~3.3s), the continuation still animates from the start, and there are no fast-forwards or problems. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>