Repository navigation
Play a tap again only after a cancelled contact, and look twice before doing it - #206
Merged
Merged
Conversation
…ed twice In #204's run 39893036064 the tap proxy re-tapped Profile's Settings row, and Settings opened twice: the second copy's back button read "Settings", so the flow's tap on "Profile" failed. The simulator had logged the first touch as late (touch down without previous range event, after the touchscreen was cancelled), but the app received it at 03:15:21.55 and acted on it. The proxy's hierarchy read at 21.62 to 22.04 still showed the Settings row unchanged, because the push had not shown yet, so it tapped again at 22.08. The proxy now compares a second hierarchy read 2 s after the first look and taps again only if both are unchanged; a cancel it re-taps costs 2 s more. The run's playback lines and the row before, just after and 2 s after the tap are a new tap proxy test.
…ouch
Both late touches on record reached the app: run 39740669724's TV shows
switch did not flip, and run 39893036064's Settings row opened Settings,
which the re-tap then opened a second time. A touch backboardd sets down
after testmanagerd cancelled the touchscreen therefore leaves the outcome
unknown, and resending on an unknown outcome is what the re-tap must never
do. The proxy now plays a tap again only when backboardd cancelled a
contact that was still down ("canceling paths ... touching"), which
delivers no press. A late touch is still recorded and still named by the
failure classifier, so a flow it breaks fails with its cause, but it no
longer reads the hierarchy or earns a second tap.
The second look stays for cancels: a cancelled contact can still change
what it touched, and the change can take over a second to show.
Pull request footprint
User-delivered artifact sizes
Most complex product function
|
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.
What happened
#204's run 39893036064 failed
ui-screenshots-ios-dark(job 120217387461) onElement not found: Text matching regex: Profile. Lane health readtap proxy checked 10 taps, matched playback for 10, saw 1 cancels, tapped again 1. It was the first time the generalized re-tap fired in CI, and it double-fired.tap at 187, 502: tapped again, … backboardd: touch down without previous range event: 2 under [... "profile-to-settings" "Settings" ...], ignoring changes to frame. testmanagerd loggedservice canceledat 21.263, and backboardd set the touch down at 21.533, 270 ms later.contact 2 presence: touchingat 21.533 andpresence: noneat 21.542.send gesture actionsat 21.557.lib/back.yaml's tap on "Profile" found nothing.switch-latefixture, logged the same lift (presence: noneat 07:48:25.184) and the same two UIEvents, and that switch did not flip.Design, replacing the one introduced in #178
The proxy plays a tap again only when the simulator log proves the tap delivered no press and nothing on screen changed. Two backboardd signatures appear in a tap's playback window:
canceling paths contacts: [… touching …]. The digitizer went away while the contact was still down, with no lift before the cancel.touch down without previous range eventafter testmanagerd'sservice canceledcancel: true, with the reasonthe touch may still have reached the app: …) and still named bymaestro-failure.mjswhen a flow fails. A late-touch flake therefore fails the lane with its cause named instead of being resent. The proxy no longer reads the hierarchy for one.The repository's docs never listed late touches as a re-tap trigger. The only description of them was the comment in
scripts/simulator-touch.mjs, which claimed the control does not act. That comment now says what the two cases show.Tests
switch-late.txt) and Profile's Settings row (settings-late.txt, this run's playback lines) return no re-tap with the late-touch reason, even with the hierarchy unchanged. The tab bar's late touch (tab-late.txt) is the same. Through the proxy, Settings' late touch passes once with no extra hierarchy read.maestro-failure.test.tsstill names a late touch.connect-cancelled.txt), Sign out, the Profile sheet's Done and an unchanged tab bar tab are re-tapped.Mutation check:
Footprint
No product code changes. CI and tooling:
scripts/simulator-touch.mjsandscripts/tap-proxy.mjs, about 40 lines added. Tests: one fixture plus the cases above.pnpm checkpasses on Node 22.23.4.