Preview playback still not fluid enough after the release-build fix: frames are rendered strictly on demand (one HTTP request per displayed frame, rendered under the model lock, no cache). Requested: pre-render N frames ahead of the playhead into a bounded cache; on any modification (generation bump) discard and re-prime the window. Design frozen: Arc-snapshot of scenario+tasks so rendering leaves the model lock entirely; cache keyed (generation, side, frame) bounded ~120 entries with distance+generation eviction; background prefetcher keeps [cur..cur+30] warm while playing, [cur-5..cur+30] while paused, nearest-first.
Preview playback still not fluid enough after the release-build fix: frames are rendered strictly on demand (one HTTP request per displayed frame, rendered under the model lock, no cache). Requested: pre-render N frames ahead of the playhead into a bounded cache; on any modification (generation bump) discard and re-prime the window. Design frozen: Arc-snapshot of scenario+tasks so rendering leaves the model lock entirely; cache keyed (generation, side, frame) bounded ~120 entries with distance+generation eviction; background prefetcher keeps [cur..cur+30] warm while playing, [cur-5..cur+30] while paused, nearest-first.