Repository navigation
Conversation
On iOS the screen sometimes does not change for longer than the 2.5 s
window after the app has run a command. In run 39878809507 the show detail
push recorded a single frame, and show detail only slid in 1.5 s into the
next segment's recording, which inflated that segment's time. In run
39857698481 the tab bar moved to Library but the content stayed on Up Next
for the whole window. The probe decided that nothing had happened by
looking for a change anywhere on screen. A frozen screen has none, and the
tab bar change was too small to count, so both runs failed.
The probe now takes a screenshot just before each command. If the content
has not changed by the end of the window, it polls screenshots until the
content differs from that one, for up to 15 s, before the next
interaction. A change that arrives late is recorded as censored (">2500"),
as a late change already was, and can no longer land in the next window.
Content that never changes still fails the run.
Each segment is now analysed before the next starts, since the decision to
wait depends on it. The whole-screen scene pass is gone.
The Android probe in run 39886057572 stopped when the change app's fifth launch never reported ready within 120 s. Logcat shows the app starting and its JavaScript running, then no requests to the fake Trakt server or the probe channel. Nothing showed what was on screen. The probe now saves launch-timeout.png before it stops.
…e-change # Conflicts: # scripts/perf-probe.mjs
This was referenced Oct 23, 2026
…e-change # Conflicts: # scripts/perf-probe.mjs
Pull request footprint
User-delivered artifact sizes
Most complex product function
|
Owner
Author
|
Superseded by #212, which removes the perf probe from CI along with the rest of the custom device-lane machinery. |
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.
Why
The iOS perf probe failed its own runs with "no responseMs, doneMs": in run 39878809507 (pass 1, the change app's show detail push), in 39867496265 (pass 2, show detail push), and twice on the first tab switch (39857698481, 39737186653).
I went through the raw videos and the fake Trakt log. In each case the app had acknowledged the command, but the screen did not change within the 2.5 s window.
simctl recordVideowrites a frame only when the screen changes;The probe decided whether anything had happened by looking for a scene change anywhere on screen. A frozen screen has none, and the tab bar's change is below the threshold, so both runs failed as "the probe missed it" instead of being recorded as a late change.
What changes
>2500), as a late change already was.launch-timeout.png, so a stopped run shows what was on screen.The screenshot digest covers only the content region's pixels, so the status bar clock does not count as a change.
Tests
afterWindowcensors content that changed only after the window, keeps it empty when it never changed, and leaves measured times alone without waiting.waitForChangeresolves once the content differs, and gives up at the limit.Four mutations each fail a test: always censoring, ignoring measured times, an inverted comparison, and reporting a change on timeout. The screenshots, recordings and the wiring in
measure()run only against a device, so they are checked by probe runs rather than unit tests.Verification