Repository navigation
test(replay): verify Settings queries and bound scrolling - #3560
Conversation
Size Report
Startup median (7 runs, lower is better):
|
There was a problem hiding this comment.
All reported issues were addressed across 3 files
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
|
The scroll fixture in 03-scroll-discovery.ad can pass without any scroll, so this is not ready to merge at 30942ef. CI is green (19 checks, 0 not passing), but the fixtures are manual-selected test material and not a CI route, so green CI does not show that the replays run. No conflicts. Here is the problem. In 03-scroll-discovery.ad line 5, The open inline thread on 03-scroll-discovery.ad still stands: zero-gesture scroll. Not blocking: the trailing |
30942ef to
78213e2
Compare
|
The scroll fixture at 78213e2 now fixes the problem from the earlier review (#3560 (comment)): |
78213e2 to
964e0a0
Compare
|
Thanks for the update. The cubic-dev-ai thread about a no-op scroll is fixed at 964e0a0: 03-scroll-discovery.ad now asserts Those absent checks depend on how Settings lays out after relaunch and on one The cubic-dev-ai thread on the no-op scroll (#3560 (comment)) is fixed in the code, so you can resolve it. Its remaining on-device assumption is the evidence item above. Smoke (iOS) failed in |
964e0a0 to
169cee2
Compare
|
The earlier concern about The pass or fail of this fixture depends on the Settings layout after relaunch. Please run On CI, the Smoke Tests job 115251404043 failed at I did not run any simulator or emulator replay, and I could not check the Settings layout after relaunch or the Android |
dc4d7ee to
ce26013
Compare
169cee2 to
1ea2ab0
Compare
|
Thanks for the update. The latest change (1ea2ab0) switches the four selectors to The fixture at 03-scroll-discovery.ad:5 depends on two device facts that no unit test or CI lane checks. First, The two 04-text-input-keyboard fixtures have not been shown running either. On Android, The zero-gesture scroll concern in this thread is now fixed in the code, since both I did not run a simulator, emulator or replay. I could also not read the earlier live run that hit AMBIGUOUS_MATCH on General, so the claim that |
|
The earlier findings on 1ea2ab0 are mostly addressed at 746edc7, and one gap remains: there is still no live proof for the changed iOS fixture. The absent checks before each scroll in The Not blocking: once both Smoke Tests jobs finish, the log should show the synthesis assertion ( |
|
Posting the retained device evidence requested above for published head iOS job: iPhone 17 Pro, iOS 26.2, runtime For ordinary iOS03, {"version":1,"ts":"2026-10-13T14:11:11.672Z","session":"cwd:a87d3c22dc05c4d7:default:test:9e53321dd1ad888d:5-03-scroll-discovery:attempt-1","kind":"action.recorded","requestId":"9e53321dd1ad888d:test:5:03-scroll-discovery.ad:attempt:1","command":"scroll","summary":"Scrolled down by 568px","details":{"command":"scroll","positionals":["<arg>"],"flags":{"platform":"ios"},"direction":"down","passes":1,"amount":0.65,"pixels":568,"durationMs":400,"x1":201,"y1":721,"x2":201,"y2":153}}
{"version":1,"ts":"2026-10-13T14:11:15.139Z","session":"cwd:a87d3c22dc05c4d7:default:test:9e53321dd1ad888d:5-03-scroll-discovery:attempt-1","kind":"action.recorded","requestId":"9e53321dd1ad888d:test:5:03-scroll-discovery.ad:attempt:1","command":"scroll","summary":"Scrolled up by 568px","details":{"command":"scroll","positionals":["<arg>"],"flags":{"platform":"ios"},"direction":"up","passes":1,"amount":0.65,"pixels":568,"durationMs":400,"x1":201,"y1":153,"x2":201,"y2":721}}Matching ordinary iOS03 predicate dispatch records (L5 General visible; L6 Apps absent; L8 Apps visible; L10 General absent; L12 General visible): {"type":"replay_action_stop","ts":"2026-10-13T14:11:07.985Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/03-scroll-discovery.ad","line":5,"step":2,"command":"is","ok":true,"durationMs":2020}
{"type":"replay_action_stop","ts":"2026-10-13T14:11:08.991Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/03-scroll-discovery.ad","line":6,"step":3,"command":"is","ok":true,"durationMs":1002}
{"type":"replay_action_stop","ts":"2026-10-13T14:11:12.845Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/03-scroll-discovery.ad","line":8,"step":5,"command":"is","ok":true,"durationMs":1171}
{"type":"replay_action_stop","ts":"2026-10-13T14:11:13.298Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/03-scroll-discovery.ad","line":10,"step":6,"command":"is","ok":true,"durationMs":452}
{"type":"replay_action_stop","ts":"2026-10-13T14:11:16.270Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/03-scroll-discovery.ad","line":12,"step":8,"command":"is","ok":true,"durationMs":1128}The additional public-CLI Settings probe retains the actual predicate response bodies. Below are compact JSON renderings of those retained stdout files, in execution order: {"success":true,"data":{"predicate":"visible","pass":true,"selector":"role=button label=General"}}
{"success":true,"data":{"predicate":"absent","pass":true,"selector":"role=button label=Apps","matches":0}}
{"success":true,"data":{"predicate":"visible","pass":true,"selector":"role=button label=Apps"}}
{"success":true,"data":{"predicate":"absent","pass":true,"selector":"role=button label=General","matches":0}}
{"success":true,"data":{"predicate":"visible","pass":true,"selector":"role=button label=General"}}iOS04 focus/value assertions in the retained executed Matching literal {"type":"replay_action_stop","ts":"2026-10-13T14:10:03.315Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/04-text-input-keyboard.ad","line":6,"step":3,"command":"wait","ok":true,"durationMs":8559}
{"type":"replay_action_stop","ts":"2026-10-13T14:10:03.348Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/04-text-input-keyboard.ad","line":7,"step":4,"command":"is","ok":true,"durationMs":18}
{"type":"replay_action_stop","ts":"2026-10-13T14:10:11.373Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/04-text-input-keyboard.ad","line":10,"step":6,"command":"wait","ok":true,"durationMs":5293}
{"type":"replay_action_stop","ts":"2026-10-13T14:10:11.619Z","replayPath":"/Users/runner/work/agent-device/agent-device/test/integration/replays/ios/simulator/04-text-input-keyboard.ad","line":11,"step":7,"command":"is","ok":true,"durationMs":235}Result output (session/path omitted): Android job: Pixel 7 emulator, Android API 36, x86_64 Android04 focus/value assertions in the retained executed Matching literal {"type":"replay_action_stop","ts":"2026-10-13T12:37:59.456Z","replayPath":"/home/runner/work/agent-device/agent-device/test/integration/replays/android/emulator/04-text-input-keyboard.ad","line":8,"step":4,"command":"wait","ok":true,"durationMs":983}
{"type":"replay_action_stop","ts":"2026-10-13T12:37:59.461Z","replayPath":"/home/runner/work/agent-device/agent-device/test/integration/replays/android/emulator/04-text-input-keyboard.ad","line":9,"step":5,"command":"is","ok":true,"durationMs":4}
{"type":"replay_action_stop","ts":"2026-10-13T12:38:02.018Z","replayPath":"/home/runner/work/agent-device/agent-device/test/integration/replays/android/emulator/04-text-input-keyboard.ad","line":16,"step":10,"command":"wait","ok":true,"durationMs":666}
{"type":"replay_action_stop","ts":"2026-10-13T12:38:02.021Z","replayPath":"/home/runner/work/agent-device/agent-device/test/integration/replays/android/emulator/04-text-input-keyboard.ad","line":17,"step":11,"command":"is","ok":true,"durationMs":3}Result output (session/path omitted): Successful ordinary wire response bodies were not separately retained; the pasted dispatch records and executed scripts establish that both focused/value waits and both The iOS full fixture additionally passed the keyboard-visible precondition, native synthesized first-responder assertion, and Original artifacts: iOS, Android. Their downloaded archives match GitHub SHA-256 digests ( |
|
Thanks for the device run. This PR is ready at 746edc7. The iOS job (https://github.com/callstack/agent-device/actions/runs/38405441715/job/115323744179) ran |
b98bfd2 to
cbae29e
Compare
b69a342 to
22dc288
Compare
cbae29e to
36aae30
Compare
|
The earlier review of cbae29e was clean, and I found no code problems at 36aae30 either. The scroll discovery script now asserts 'is visible General' and 'is absent Apps' before 'scroll down --until', and 'is absent General' before 'scroll up --until', so the no-op scroll concern is fixed. The earlier iOS evidence still applies because the replay script blobs match the run you cited (job 115323744179 at 746edc7), but I did not re-run it or read its logs. I also did not run the Android 04 fixture changes on a device, and I could not confirm that the live-runner.ts keyboard wait was exercised in a live run. The cubic-dev-ai thread about the no-op scroll is resolved and outdated, so you can close it: #3560 (comment) Coverage fails on three unhandled vitest teardown errors that start in src/daemon/tests/request-router-open-claim.test.ts, while all 1758 test files pass. This PR touches no unit-test, platform-apple or daemon code, so I read the failure as unrelated. I did not check whether it also fails on main. Smoke Tests is still running. Please re-run Coverage and let Smoke Tests finish before merge. I know of no conflicts. |
|
* origin/main: (83 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ...
* origin/main: (83 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ... # Conflicts: # packages/daemon/src/server/http/daemon-runtime-lease-expiry.test.ts # packages/daemon/src/server/http/daemon-runtime.ts # packages/daemon/src/sessions/__tests__/lease-lifecycle.test.ts # packages/daemon/src/sessions/lease-lifecycle.ts
* origin/main: (79 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ...
* origin/main: (79 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ...
* origin/main: (24 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ... # Conflicts: # src/remote/daemon-artifacts.ts
* origin/main: (83 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ...
* origin/main: (83 commits) feat(ios): interpret React Native accessibility value semantics (#3589) fix(android): reinstall and reselect the test IME helper after it disappears (#3606) feat(snapshot): carry provider keyboard observations through acquisition (#3593) chore(web): bump managed agent-browser backend to 0.39.0 (#3591) fix(fold): report a dispatched pose as unverified when devicectl has no hinge-angle stream (#3587) feat(android): expose system-bar membership on snapshot nodes (#3585) fix(android): align ADB and Appium field values (#3584) test(closure): read committed JSON modules on the merge-base side (#3602) fix(ci): preserve manual Android suite timing (#3554) refactor(daemon): make the layer folders the declaration (PR 10) (#3520) refactor(move): extract the daemon server into @agent-device/daemon (11b) (#3546) refactor(daemon): package-local runtime fakes for the remaining daemon ports [11a-4] (#3544) refactor(daemon): cut daemon test edges into root data fixtures and fakes [11a-3] (#3517) refactor(11a-2): package-local fakes at the daemon ports; root-own command-surface composition tests (#3519) test(replay): verify Settings queries and bound scrolling (#3560) feat(snapshot): measure Android Appium viewport (#3586) fix(ios): verify a fill whose unidentified field moved while it kept focus (#3596) refactor(coverage): one fallow config with per-function CRAP ceilings (#3588) test: bound CLI promotion cases and align provider budget (#3590) fix(metro): report what the dev-server stop proved instead of assuming success (#3575) ...
Summary
Settings query fixtures prove native editor focus and exact values. iOS discovery requires General visible and Apps absent before scrolling reveals Apps; General must then be absent before upward scrolling reveals it.
Selectors target observed buttons: General also labels structural nodes; Apps labels a button beneath an unlabeled cell. The previous cell inference failed visibly and is removed.
The typing smoke waits for a visible software keyboard after coordinate focus before asserting AX-independent synthesis. This is a deliberate test precondition; no production routing or budget changes.
Four test files (+21/-11). Related to #3077.
Validation
Head
36aae30baon main295ccce70: the four commits rebased unchanged; every touched file is blob-identical to the previous headcbae29ea9and to evidence head746edc7.pnpm check:affected --base origin/main --run: format, lint, typecheck, fallow and vitest-related pass. Replay suites are GitHub-authoritative; new-head CI pending.Live review evidence, recorded for head
746edc7on iPhone 17 Pro / iOS 26.2: ordinary iOS03 records one down and one up gesture plus all five assertions; iOS04 and Android04 focus/value assertions pass first attempt with zero healing. The iOS absent pre-checks assume that viewport size. The later iOS full-fixture app-switcher assertion fails separately and is not claimed green.Fresh review: one medium (keyboard wait masks a product race) and three low/nit findings declined to keep this test-only scope and the evidence blobs; simulator model now named.
🤖 Generated with Claude Code