Repository navigation
Fill results pages that stop at the grid's loading placeholders - #19
Merged
Merged
Conversation
A page could stop at 13 or 19 of its 50 cards with the site's own placeholders still under them. Those placeholders fill only when they scroll into view, and scrolling to the bottom again moves nothing. When the grid holds still with placeholders showing, all three engines now scroll the results container back to the top and down a screen at a time, at most three times per page. The sidecar records nudges and placeholders_left for each page. The canary's three-page proxy walk passes --block-media so that full pages fit its 10 MB traffic cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CKsd7q25N19WzUZjrAdzx8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The canary's three-page walk through
VRBO_PROXYended with exit 6 on both 2026-10-20 and 2026-10-21. On 2026-10-21 the no-proxyfirst-pagejob ended the same way.paginationnext_page_throttled(the turn to page 3 got 2× HTTP 429 from/graphql)paginationcards_missing(9.6 MB of the 10 MB cap)first-pagecards_missing(no proxy)The cards missing from those pages were not throttled. Every snapshot that stopped short carries 6
data-stid="search-listing-placeholder"cards below the last real one, and no full page carries any. The site fills that lazy tail only when it scrolls into view. The scroll loop setsscrollTop = scrollHeightevery round. After the first round that value no longer changes, so nothing moves and the grid waits for good. Count and height held still for six rounds, and the loop then gave up.Measured on 2026-10-22 with a plain connection and no proxy:
/graphqlrequest is behind those cards.Two other findings from the same day:
/graphqlanswer is429 {"error":"Too Many Requests","message":"Provisioned request rate has been exceeded"}with noRetry-Afterheader, so there is no header to honour.SearchResultsAndFiltersstayed 429 when retried after 4, 8, 16 and 32 s. This PR therefore adds no request-level retry.Resulting behaviour
scrollentry in the sidecar gainsnudgesandplaceholders_left. The warning now says which case it was: placeholders left after the nudges, or a short page with no placeholders.paginationcanary passes--block-media. A full page loads about 100 images (1.8 MB measured), and three full pages with images would not fit the 10 MB cap.image_urlis not a column that job checks.Evidence
LISTING_LAZY_TAIL, cut bymake_fixtures.build_lazy_tailfrom the 2026-10-21first-pagecapture. It keeps 2 cards, the counter and the 6 placeholders. The kept rows are verified to parse identically to the untrimmed capture, and long hex runs are scrubbed.test_grid_lazy_tail:_scroll_the_gridreaches 50 withnudges: 1through its own named operations.python3 smoke_test.py) passes in a core-only venv and in one venv each for playwright, selenium and pyppeteer, with only the other engines skipped. No browser was downloaded.complete. That load did not stall, so it shows the path still works. It is not a live nudge. The stalled case is covered by the probe described above.Not changed
Retry-Afterhandling, because the site sends none. No request-level retry of the page turn, because from a datacentre address the throttle outlasted 60 s of backoff.--delay 15) and the proxy session. ThroughVRBO_PROXYthe page turns arrived in 2–3 s on both days. The short pages were the lazy tail and do not point to the exit.VRBO_PROXYsecret has no sticky-session part in its login. Whether that matters for the intermittent page-turn 429 has not been measured.🤖 Generated with Claude Code
https://claude.ai/code/session_01CKsd7q25N19WzUZjrAdzx8