iOS: XCTest-channel penalty keeps the runner in private-AX fallback most of a long session (fixed 3 s / 120 s, no override)
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Feature
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- ios, typescript
- Bereich
- mobile, performance, testing
Rechercherichtung
Read the snapshot penalty and capture plan code under dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/, starting with RunnerTests+SnapshotTiming.swift, RunnerTests+SnapshotCapturePlan.swift, and the snapshot CLI entry point. Check the related issue #1542 and presentedSurface work in #3565 before choosing a scope. Done means the requested penalty controls and CLI backend option behave as specified, with tests covering single query timeouts and recovery probes.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
On a heavy UIKit app (iPad simulator), one slow or timed-out XCTest-channel snapshot tier puts the runner into private-AX fallback for 120 s. A timed-out 1 s recursiveTree recovery probe re-arms it; that probe runs when the private-AX capture is rejected. And once the penalty expires, the next capture's 1 s query sweep often times out and penalizes the channel again. In one long-running session log, 71 % of snapshot commands ran with the XCTest channel deferred.
In our captures, private-AX returned presented screens together with the screen underneath them. A test then can't reliably tell which screen is top-most, and an element of the covered screen looks "visible". For read-only checks this is mostly harmless. For steps that must act on the right screen (bulk select / destructive bulk actions in a list), it's unsafe, so we refuse those steps whenever a fallback happened in the last 120 s.
Version / environment
- agent-device 0.21.25 (pinned by
@e2e-dev/mobile0.12.0, used through thee2e0.20.0 runner). The penalty logic is unchanged in 0.21.28 and 0.21.29-nightly.20261020. - Xcode 27.0 (27A266a), iOS 27.0 simulator runtime, iPad Air 11-inch (M4) simulators
- UIKit app with long table views
What the source shows (0.21.25, dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/)
- An XCTest-channel tier penalizes the channel when it times out, exhausts its deadline, or takes longer than
snapshotXCTestSlowCaptureThreshold(3 s):RunnerTests+SnapshotTiming.swift:119-155, constant atRunnerTests.swift:139. Budgets: tree slice 8 s (RunnerTests.swift:143), query sweep 1.0 s (RunnerTests+Snapshot.swift:134-143), viewport read ≤ 1.0 s (RunnerTests+SnapshotAcquisition.swift:50-56). A system-modal probe timeout also penalizes (RunnerTests+Snapshot.swift:360). penalizeSnapshotXCTestChannelsetspenaltyUntil = now + 120 s(RunnerTests+SnapshotCapturePlan.swift:133-143,RunnerTests.swift:122). While it's active, the plan puts private-AX first, plusrecursiveTreewith a 1 s slice (RunnerTests+SnapshotCapturePlan.swift:110, 256-277).- Each slow or timed-out XCTest attempt during the penalty re-arms it. In practice that's the 1 s tree probe, which runs when the private-AX tier fails or is rejected (
RunnerTests+SnapshotCapturePlan.swift:272, 391-431).penaltySuppressedapplies only to the one-shot warm-up after a target PID change (:304, 373-378;RunnerTests+Lifecycle.swift:254). - It's cleared only by
targetReset/ a new target PID (RunnerTests+Lifecycle.swift:228, 252), by the 120 s expiring, or by a runner restart. - The thresholds and the duration are
letconstants. No env var, config or CLI flag changes them.preferredBackend(the SDK snapshot option; daemon flag keysnapshotPreferredBackend) does override the plan, even under penalty (RunnerTests+SnapshotCapturePlan.swift:243-255), but the CLIsnapshotcommand doesn't expose it (still true in 0.21.28).
Evidence (runner.log)
- One
SNAPSHOT_XCTEST_CHANNEL_PENALIZED … reason=queries_backend_timeoutwas followed by 70PRIVATE_AX_SNAPSHOT_USEDcaptures in the next ~2 min. - One session's runner.log, covering several days and 43 runner launches, has 273
PENALIZEDlines (196queries_backend_timeout, 72tree_backend_timeout, 5slow_tree_capture_…) against 7PENALTY_CLEARED. All 50 penalties that re-armed inside 120 s aretree_backend_timeout. Most of thequeries_backend_timeoutones come shortly after the previous penalty expired (median about 21 s). 41,053 of 57,766 snapshot commands loggedXCTEST_CHANNEL_DEFERRED. Another session's log has 115PENALIZED(60 / 51 / 4) against 1 cleared.
Related: #1542.
Requests
- Make the slow threshold and the penalty duration configurable (env or CLI / session option).
- Don't penalize the channel for a single 1 s query-sweep timeout alone, and don't let the 1 s recovery probe re-arm the penalty.
- Expose
preferredBackendon the CLIsnapshotcommand (and as a session default), so a client can forcerecursiveTreefor steps that need an accurate, top-most-screen tree. - Optionally, mark private-AX nodes that belong to a covered (non-top-most) presented screen, so clients can filter them out. (0.21.28's
presentedSurfacefact, #3565, may cover part of this; not yet tested on our side.)
Happy to provide more logs or test a nightly.
- Vorherrschende Sprache
- TypeScript
- Sterne
- 5.3k
- Forks
- 377
- Ø Merge
- 13 Std. 58 Min.
- Gemergte PRs (30 T.)
- 654
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus callstack/agent-device
-
iOS alert wait: the last poll can get ~30 ms and turns "no alert" into a failed readEvtl. vergeben @pcbeingused333 hat das vor 7 Tagen übernommen. Offenbug ready-for-agent
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 77/100
callstack/agent-device#4018 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
callstack/agent-device#1869 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
callstack/agent-device#4274 ·
Maintainer antworten meist innerhalb von 1 Tag
-
iOS simulator: in-flight `prepare ios-runner` keeps retrying the old runner port after the runner is relaunched on a new portEvtl. vergeben @twotnguyen hat das vor 1 Tag übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
callstack/agent-device#4265 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Android smoke: 'keyboard dismissal should change emulator pixels' flakes on unrelated PRsEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offenbug ready-for-agent
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
callstack/agent-device#4264 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in callstack/agent-device
Ähnliche Issues
-
twilio.webhook() rejects valid requests when the query string has an encoded `?` and a `+` spaceOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
twilio/twilio-node#1232 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
Maintainer antworten meist innerhalb von 1 Tag
-
Tiling managers are not destroyed in disable(), so window-created handlers keep running (Gio.Settings constructed without schema)Evtl. vergeben @gnacho hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
domferr/tilingshell#641 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
🐛 bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
LibreChat-AI/LibreChat#17887 ·
Maintainer antworten meist innerhalb von 1 Tag
-
`isCI` is `true` inside a running Google Cloud Run service (also Railway, Render, Deno Deploy)Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100