Problem
At the bottom of a list on an iOS Simulator, a directional scroll down answers movement: moved when the content did not move, so at-edge is never reported. Seen on 2026-09-24 on the fixture Automation lab list, iPhone 17 Pro / iOS 26.2, with the AX bridge serving captures. The earlier scroll that ran into the bottom edge was followed by one whose post-gesture capture logged post_gesture_snapshot_stale_accept with matchedPreGestureBaseline: true, meaning the surface was identical to the pre-gesture baseline. The response still said moved.
The movement field comes from the recent scroll-observation work (#2770, #2771, #2776, #2772), which states that a directional scroll answers with the movement it observed. An agent that scrolls until at-edge never stops on iOS.
Required behavior
When the post-gesture observation proves the surface did not change (the stale-accept or no-effect path), a directional scroll reports that it reached the edge, or does not claim moved. Key this on the typed stabilization outcome, not on message text.
Evidence
Found while fixing the longpress flake (#2883): session events.ndjson plus --debug request logs from repeated assertAutomationInput runs.
Problem
At the bottom of a list on an iOS Simulator, a directional
scroll downanswersmovement: movedwhen the content did not move, soat-edgeis never reported. Seen on 2026-09-24 on the fixture Automation lab list, iPhone 17 Pro / iOS 26.2, with the AX bridge serving captures. The earlier scroll that ran into the bottom edge was followed by one whose post-gesture capture loggedpost_gesture_snapshot_stale_acceptwithmatchedPreGestureBaseline: true, meaning the surface was identical to the pre-gesture baseline. The response still saidmoved.The movement field comes from the recent scroll-observation work (#2770, #2771, #2776, #2772), which states that a directional scroll answers with the movement it observed. An agent that scrolls until
at-edgenever stops on iOS.Required behavior
When the post-gesture observation proves the surface did not change (the stale-accept or no-effect path), a directional scroll reports that it reached the edge, or does not claim
moved. Key this on the typed stabilization outcome, not on message text.Evidence
Found while fixing the longpress flake (#2883): session
events.ndjsonplus--debugrequest logs from repeatedassertAutomationInputruns.