00abfcf4db
The IntersectionObserver fires as soon as it's created (sentinel immediately intersecting after page 1 renders), while the removed backup check also fires in the same tick — two concurrent fetchItems(page 2) calls produced duplicate cards. With sentinel now properly inside the scrolling root, the observer alone handles progressive loading. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>