Skip scroll anchoring first. Watch content jump as above-viewport heights resolve. This is
what the browser does for you, and you have just removed it.
Implement anchoring: when a measurement above the viewport changes, correct the scroll offset.
Measurement thrash. Measure every row every frame; observe forced synchronous layout
(bi-08). Then batch reads and writes. Then move to ResizeObserver and explain why it does not
force a flush.
Overscan zero: blank rows on fast scroll — the app-level analogue of checkerboarding
(bi-10). Tune it and state the trade.
Scroll handler vs observer. Update the window from a scroll handler; measure the one-frame
lag. Replace with a sentinel/IntersectionObserver approach and prove the lag is gone.