Scroll positions and events are separate observations

The tested elements exposed scrollTop, but not scrollTo, scrollBy or scrollIntoView. Programmatic positions supported fractions. An oversized assignment could read back unchanged before later clamping, while immediate rectangles still described the previous layout.

Clamp requests to the known range and use settled geometry when revealing a row. Compare the actual current position before assigning it. A scroll event did not reliably mean the position changed, and some programmatic changes and content-shrink clamps produced no event in the recorded sequence. Explicitly reconcile owned dependent state when required. Preserve selection by record key across row rebuilds rather than retaining a generated row node.

Those checks covered programmatic movement, not native wheel input, smooth scrolling or every nested/scaled pane. Virtual pagination is a separate responsibility from the viewport's scroll state.

ResizeObserver sizes are not transformed bounds

In #977, content and border-box observation reported size changes, but moving or transforming a target did not notify. Reported box sizes stayed unscaled while CSS scale enlarged the visual rectangle. Use settled getBoundingClientRect() for displayed bounds; neither measurement replaces the Wulf surface size.

Re-observation near a size change could deliver more than one entry for the same target in one callback. Process or copy every relevant entry, then reconcile the latest owned state. Disconnect observers and cancel dependent frames at disposal.

For transformed anchors, a rectangle is axis-aligned and its left/top is not necessarily the transformed local origin. Keep the feature's numeric transform inputs when precision matters; the tested serialized transform strings rounded coefficients. Do not combine document coordinates with Wulf/screen coordinates without the explicit origin and scale conversion.