Repository navigation
fix(runner): refuse an iOS coordinate fill whose point names no text input - #3718
Conversation
There was a problem hiding this comment.
All reported issues were addressed across 9 files
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
|
Size Report
Startup median (7 runs, lower is better):
|
|
I reviewed 5b02140 and found one problem to fix before merge. The guard is good for Not blocking: the new guard sits beside the predicate it qualifies, so in the Could The cubic-dev-ai threads on the failed-lookup mapping and the missing tap-count assertion still apply, and so does the one lower-priority thread on the malformed comment. The first one is the same split as above. CI is pending. Only the two Smoke Tests jobs have not passed, and they are queued, not failed. I do not expect them to hit the penalized XCTest channel, so I see nothing to attribute yet. There are no conflicts. I did not run the XCTest red/green or the live simulator run, so those rest on the PR body. I also did not trace the daemon fill handler line by line to confirm that every ref and selector fill reaches the x/y backend. I inferred that from the interactor signature and Before merge, please fix the hint and docs with the CHANGELOG line, and split probe-unavailable from no-input, then let the queued Smoke Tests finish. |
There was a problem hiding this comment.
All reported issues were addressed across 6 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
|
Pushed Split probe-unavailable from no-input. Routes and hint. Agreed on the reach: Non-blocking predicate idea — took the probe split, left the predicate. Live evidence at the new head: same forced-penalty scratch recipe — |
…input On the penalized coordinate route the replacement has no element, so its clear and its typed text reach the app-level first responder. Aimed at empty space while an earlier field still holds focus, that rewrote the earlier field. The runner now answers NO_TEXT_INPUT_AT_POINT before the focus tap, and the host publishes details.reason no_text_input_at_point with dispatched: no. Fixes #1721
…s tap The refusal's dispatched: no claim needs device-side evidence: the fill aimed at a button that counts presses, so a refusal that tapped first moves the counter even when the field comes through unchanged. Also say that the runner identified no input at the point, since a lookup that cannot answer reports the same code as an empty point. Fixes #1721
The pre-tap lookup returned nil for both, so one refusal carried two claims. coordinateTapTextInputIdentityAt now answers input, absent, or unavailable; absent refuses with NO_TEXT_INPUT_AT_POINT and unavailable refuses with TEXT_INPUT_PROBE_UNAVAILABLE, both before the focus tap. The hint and docs name every route that reaches the guard, including ref, selector and replay fills, whose aim point is the centre of the rect they resolved. Fixes #1721
81601c1 to
28c6cf1
Compare
|
Thanks for the update. I reviewed 28c6cf1 and the code looks good. The two blocking asks from the earlier review (#3718 (comment)) are fixed. The blind lookup now has its own response, All four earlier cubic-dev-ai threads are fixed at this commit, so please resolve them: #3718 (comment) (probe-unavailable split), #3718 (comment) (tap witness test), #3718 (comment) (comment rewrite) and #3718 (comment) (docs and CHANGELOG route coverage). I did not run the XCTest red/green or the live forced-penalty simulator run. Both rest on the PR body. The author captured the live run before the rebase and reports the route code is identical at this commit. I could not run the TEXT_INPUT_PROBE_UNAVAILABLE path live, so only the injected-issue XCTest covers it. The unbound-replacement window in the |
Summary
On the iOS degraded-XCTest-channel
fillroute — which ref, selector, and replay fills all reach as a point — the synthesized first-responder replacement has no element: with no text input under the point it still dispatched its focus tap and ran clear+type through the app-level first responder, so a fill aimed at empty space rewrote whichever field an earlier focus left active (#1721). The runner now refuses before the focus tap:NO_TEXT_INPUT_AT_POINTwhen the point identified no input,TEXT_INPUT_PROBE_UNAVAILABLEwhen the pre-tap lookup could not answer (a blind point is not an empty one). Each publishes its ownerror.details.reasonwithdispatched: no; nothing runs and no field changes. Eleven files, one command family, three commits (fix/test/fix); no declared guarantee ininteraction-guarantees.tschanges.Validation
Base
5007540a9, head28c6cf1a6(rebased; the red was captured pre-rebase at the same content). Same XCTest on an iPhone 17 Pro simulator:testPenalizedCoordinateFillAtAPointWithNoTextInputRefusesBeforeItsTapAndKeepsTheFocusedFieldred —TEXT_INPUT_CLEAR_NOT_OBSERVEDinstead of the refusal, and the focused field's seeded"stale"was destroyed.TEXT_INPUT_PROBE_UNAVAILABLE) and the 55-test fill/coordinate/synthesized-entry family green. The regression asserts the fixture's tap witness stays atpresses=0; moving the guard after the focus tap turns it red withpresses=1, so the pre-tap claim is pinned.Live on a self-created simulator (production daemon + runner; the channel penalty forced by a local-only scratch build, reverted before commit; captured at
81601c1c8, identical route code at head): the empty-spacefillrefused withNO_TEXT_INPUT_AT_POINT/no_text_input_at_point/dispatched: no, the field held"stale", the witness heldpresses=0, andfill 201 496on the real input still landed.pnpm check:affected --run --head 28c6cf1a6: passed (exactCommit=true; format, lint, typecheck, layering, fallow, build, vitest-related, command-docs, docs-links, docs-prose, xctest-selection, packaged-runner-swift). CI obligations: ios.yml targeted runner lane selects the new tests at head. Resolved risks: the non-penalized route keeps its pre-existing untyped refusal (out of scope); the.xctestFallbackunbound window predates this PR (see review reply); the live penalty was forced because a healthy simulator cannot degrade the XCTest channel on demand.Fixes #1721
🤖 Generated with Claude Code