Observe scroll sentinels by id, never by index
An IntersectionObserver target selected as querySelectorAll(sel)[n] breaks silently the moment the DOM is restructured: merging one section away repointed index 2 at a display:none element, which generates no box and therefore never intersects, so a scroll-triggered reveal simply stopped firing with no error at any viewport. Select the sentinel by id so layout refactors cannot repoint it. Two related silent failures in the same feature: a dwell gate written as sentinel-visible AND time-on-page never fires on short content, because the sentinel already intersects at first paint and the observer only re-arms on exit, so the floor must defer with max(minDwell, target - elapsed) rather than cancel; and an element with display:contents also generates no box, so observing a grid row wrapper is a permanent no-op.