fix: prevent iOS text entry runner wedge - #1604
Conversation
|
Size Report
Startup median (7 runs, lower is better):
Top changed chunks: no changes in the largest emitted chunks. |
|
[P1] Preserve bare On iOS Please retain a safe proof for the hardware-keyboard case, and add a regression that focuses a real input with the software keyboard hidden, then proves bare |
|
[P2] Run the no-focus wedge regression in the authoritative iOS lane The hardware-keyboard fix now follows the production runner route and its new regression is selected by exact-head iOS CI. However, |
6cd3ffd to
a1e299c
Compare
a1e299c to
9afcc11
Compare
|
Not ready: the hidden-keyboard text-entry witness is not actually scoped to the immediately following Please bind the witness to the active bundle/PID, clear it on every target-identity change, consume it after the one allowed bare |
|
Reviewed against the bsky-18 restart-cascade evidence. The core move is exactly right: fail closed with a typed P2 — mid-typing target loss now yields a silent zero-character success on bare P3 — witness re-resolution can cross screens. Minor: confirm 🤖 Addressed by Claude Code |
|
Addressed the mid-command false-success finding at exact head The regression uses a real iOS fixture that removes the text field after the first editing event. Red-before, the command returned success after dispatching only the first character; restored, the delayed-loss test and hidden-keyboard success test both pass (2 tests, 0 failures), the runner records no XCTest failure, the iOS XCTest build succeeds, and The same-identifier cross-screen query re-resolution observation remains a narrow residual: the witness is one-shot and bundle/PID bound, but XCTest does not expose a stable element-incarnation identity that would let us reject that case without also rejecting valid layout changes. I am not claiming that residual is eliminated by this head. Exact-head CI is running. |
|
Follow-up exact head |
|
Re-reviewed exact head |
Summary
Prevent the iOS XCTest runner from being torn down—or falsely reporting success—when bare text input loses its target.
The old bare
typepath could reach XCTest without a resolved target. XCTest then recorded a failure, invalidated the long-lived runner, and made later requests pay restart/recovery costs. This matches the archived bsky-18 restart cascade. The archived bsky-16 timeout itself ended in a model/snapshot loop, so that behavior remains a separate limitation.This change:
TEXT_INPUT_NOT_FOCUSEDwith actionable recovery before entering the unsafe XCTest path;typewhen the software keyboard is hidden;XCUIElementsame-identifier rebinding residual rather than adding an unreliable frame heuristic.Validation
e6afc3fb71d6eb21recordedxctest_recorded_failureduring text entry, reported no focused input, and tore down the runner at about 89.9s.TEXT_INPUT_NOT_FOCUSED, recorded XCTest assertions, and inserted no text.pnpm build:xcuitest:iossucceeded.pnpm check:affected --rungate passed before push atc1bb9ee79.Remaining limitations: the full paid-model benchmark cell was not rerun, and XCTest exposes query-backed elements rather than stable node-incarnation identities. The witness is therefore one-shot and guarded at every observable identity boundary, but an app-side same-identifier replacement between tap and immediate type cannot be distinguished reliably from a legitimate layout change.