Skip to content

fix: scroll until through virtualized content - #4407

Merged
thymikee merged 4 commits into
mainfrom
fix/4216-virtualized-scroll
Nov 11, 2026
Merged

thymikee merged 4 commits into
mainfrom
fix/4216-virtualized-scroll

Conversation

@thymikee

@thymikee thymikee commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Keep scrolling through virtualized lists without assuming missing hidden-content hints prove an edge. Report a possible end after observed container movement stops; report a stall if it never moved.
  • Recognize normalized collection containers and use the visible tree to detect a stall when no container is found. Eight files changed, including help and provider coverage.

Fixes #4216

Validation

  • Base 45e1372fa6: virtualized collection and ScrollView regression tests fail at zero passes.
  • Head ea5127389a: provider integration passes (70 files, 257 tests). pnpm check:affected --run --head ea5127389ad2b15928553cb8ee5a420bff5d05cb passed: receipt run-v6ByMD, exactCommit: true.
  • The provider stall fixture returns the same hierarchy on every capture; a separate moving-content case checks the pass-limit message. Regression tests cover changing content outside the container and a container-free screen.
  • iPhone 18 Pro, iOS 27.0, worktree build at ea5127389a: pushed List reached row 60 in 7 passes and the visibility check passed. The earlier build also passed sheet List and LazyVStack checks. iOS 26.5 was unavailable.
  • CI Integration Tests passed; Coverage is running at this head.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Size Report

Metric Base Current Diff
Installed (including dependencies) 6.21 MB 6.21 MB +746 B
Package (unpacked) 6.20 MB 6.21 MB +746 B
Package (download) 1.88 MB 1.88 MB +178 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 25.3 ms 26.0 ms +0.7 ms
CLI --help 52.0 ms 51.5 ms -0.5 ms

@thymikee
thymikee marked this pull request as ready for review November 11, 2026 08:49

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 7 files

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 6 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread website/docs/docs/commands.md Resolved
@apex-sentinel-staging

apex-sentinel-staging Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Apex Sentinel

Verdict: approve

Since the last review: 1 new · 1 still open · 1 no longer raised (1 marked fixed)

2 finding(s): 2 minor.

🟡 Minor (2)

Where Finding
packages/daemon/src/execution/scroll-until.ts:76 A bouncing scroll is reported as "end of the scrollable content"
packages/daemon/src/execution/scroll-until.ts:74 🆕 Container identity via JSON.stringify compares key order, not geometry

2 findings below minor not shown (user_settings.min_severity).

Reviewed with this repository's own Sentinel configuration (eb4fede2343e).

Feedback goes in the review comment threads, as a reply under the inline comment of a finding:

Reply @apex-sentinel-staging note ... to add context, or @apex-sentinel-staging pivot ... if it is wrong — I will re-check the cited code.

Useful? Reply @apex-sentinel-staging like, or @apex-sentinel-staging dislike <why> if it is not.

Comment @apex-sentinel-staging review on this conversation to run a full review.

Earlier reviews

Review of 17d749d9 · 11.11.2026 09:05 UTC

Apex Sentinel

Verdict: approve

2 finding(s): 2 minor.

🟡 Minor (2)

Where Finding
packages/capture-kit/src/snapshot/scroll-edge-state/selection.ts:43 edgeObserved never fires: no snapshot producer emits hiddenContentBelow: false
packages/daemon/src/execution/scroll-until.ts:74 Any moving content makes a stuck container report "end of content" instead of no progress

2 findings below minor not shown (user_settings.min_severity).

Reviewed with this repository's own Sentinel configuration (eb4fede2343e).

@apex-sentinel-staging apex-sentinel-staging Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apex Sentinel: 2 new findings on 17d749d. The verdict and the full list are in the summary comment.

@apex-sentinel-staging apex-sentinel-staging Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apex Sentinel: 1 new finding on ea51273. The verdict and the full list are in the summary comment.

@thymikee

Copy link
Copy Markdown
Member Author

The code in ea51273 is ready to merge. All 19 checks pass and there are no conflicts. Not blocking, and you can take or leave these: reuse scrollNoProgressHint() in scroll-until.ts through an option for the "may have ended" lead-in, instead of an inline copy of its text; drop the value === 'collection' arm in snapshot-scroll.ts unless a producer emits that raw type (iOS emits CollectionView, which already matched); document in help and docs that --until confirms an end by gesturing until the content stops moving, because scroll-until.ts no longer reads canScroll, so a list at its edge now sends several drags that could trigger pull-to-refresh or dismiss a sheet; update the three stale doc comments near selection.ts to say only scroll top/bottom trust canScroll; file a follow-up so scroll bottom in scroll-edge-state.ts uses the same movement rule as --until; and, if you can, run scroll down --until 'id="row-999"' --max-passes 20 on the List and sheet repros at head and show scroll_until_edge_reached with fewer than 20 passes. Whether a resting SwiftUI List gives byte-identical consecutive captures is not verified, and that decides between scroll_until_edge_reached and pass_limit. The iOS 27 run at head is your claim with no transcript, the sheet and LazyVStack runs were on an earlier build, and iOS 26.5 was not run. I did not run tests locally.

Of the earlier review threads, the rubber-band edge_reached thread (#4407 (comment)) and the containerRect thread (#4407 (comment)) do not apply, because both only change the failure reason and never report success or end early. The no-container stall check (#4407 (comment)) and the pass/passes pluralization (#4407 (comment)) are fixed at head, so you can resolve all four.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Nov 11, 2026
@thymikee
thymikee merged commit dc8e320 into main Nov 11, 2026
19 checks passed
@thymikee
thymikee deleted the fix/4216-virtualized-scroll branch November 11, 2026 10:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-human Valid work that needs human implementation, judgment, or maintainer merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iOS: scroll down --until stops before the end on SwiftUI List (0 passes) and ScrollView

1 participant