TL;DR: Scrolling a virtualized files list fires a request per viewport, so fast blind scrolling outruns the page and Playwright's default timeout gives up. Slow down: scroll one viewport at a time, wait for the row count to settle after each scroll, raise timeouts only for the scroll step, and stop scrolling once a full pass adds no new rows. If scrolling still will not finish, take the file list from the paginated files API instead.

```text
playwright timeout on GitHub's PR files page while the review agent scrolled
```

1. Confirm where the timeout hits. Check whether it fires on the initial page load, on a scroll action, or on a wait after scrolling.
   Expected: you know which step needs the fix instead of raising every timeout blindly.
2. Wait for network calm before the first scroll. Use a wait for network idle (or for the first file row) with an explicit timeout before scrolling starts.
   Expected: scrolling begins from a hydrated list, not an empty container.
3. Scroll incrementally. Move the list container one viewport at a time, then wait briefly for new rows to mount before the next scroll.
   Expected: each scroll's data fetch completes before the next one starts, so requests stop piling up.
4. Stop on stabilization. After each pass, count collected rows; when a full scroll pass adds no new rows, stop - do not scroll a fixed number of times.
   Expected: scrolling terminates on its own, even on lists that keep growing slowly.
5. Scope the timeout raise narrowly. Increase the timeout only for the scroll-and-settle step, not globally, so real hangs elsewhere still fail fast.
   Expected: the scroll step gets room while the rest of the run keeps tight timeouts.
6. Add the API escape hatch. If scrolling still times out, abandon the browser for the file list, fetch the paginated files API, and log the fallback.
   Expected: the run completes with a full file list even when the page will not scroll cleanly.

## Use this when
- Playwright times out while scrolling the PR files page
- Scroll passes never finish on large files lists
- The scraper stalls partway through row hydration
- You need reliable row collection from a virtualized list

## Not for this skill when
- The timeout is on initial page load with no scrolling involved (page-load hang, different fix)
- The scrape returns empty without any timeout (selector/virtualization problem)
- GitHub serves a rate-limit interstitial (rate-limit problem, not a scroll problem)
- You only need the file list (use the files API directly and skip the browser)

## Variant phrasings
- "playwright scroll timeout on GitHub files changed"
- "browser automation stalls scrolling PR file list"
- "virtualized list scroll keeps timing out"
- "increase timeout for scrolling files page"

## Why it happens
Each scroll increment triggers async fetches for the newly visible rows. Scrolling faster than the page can fetch means pending requests queue up, the DOM never settles, and Playwright's action timeout expires while the page is still legitimately working. It looks like a hang, but it is usually just an overloaded page.

## Edge cases
- Network-idle waits can themselves time out on pages with polling or analytics. Prefer waiting for the row-count to stabilize over strict network idle.
- Very large PRs (thousands of files) may never scroll cleanly in a reasonable time. Set a scroll budget (time or passes) and fall back to the API when it is spent.
- Headless browsers scroll and render slower. Tune the per-scroll pause for the CI environment, not your dev machine.
- Rows can re-mount during scrolling, so dedupe collected rows by file path before counting stabilization.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Tosct4LPlHdpKzKgwZjYBQ
