Skip to content

Fail closed for unresolved synthesized coordinate fill on iOS #1721

Description

@thymikee

Problem

The iOS coordinate fill path can use synthesized-first-responder-replacement when the requested coordinate does not resolve to a concrete text-entry element, a refresh point exists, and the XCTest channel is penalized. In that state, replacement is dispatched through the application-level first responder without concrete element identity or post-write verification.

If focus still belongs to a previous field, an unresolved coordinate fill can therefore replace text in the wrong input while returning a completed result with verified: nil. This behavior predates #1700; it is separate from the bare-type witness fix merged there. It is also distinct from #1718, which tracks parent-owned touch-point parity for direct selectors and Maestro.

Relevant seams:

  • RunnerTests+SynthesizedTextEntry.swift: shouldUseSynthesizedFirstResponderReplacement and runSynthesizedReplacementRoute
  • RunnerTests+TextEntry.swift: coordinate target resolution and refresh-point fallback
  • src/platforms/apple/interactions.ts: coordinate fill dispatches replacement mode

Closure

  • Fail closed when coordinate fill cannot bind synthesized replacement to the intended text-entry target, or introduce a concrete target/commit signal that provides equivalent safety.
  • Add a red/green iOS regression proving an unresolved coordinate fill cannot mutate a previously focused field.
  • Preserve the penalized-channel replacement path for a concretely resolved coordinate target.
  • Report a structured actionable failure instead of an unverified success when safe replacement cannot be established.
  • Update the interaction guarantee classification and contract coverage if the fix changes a declared dispatch-path guarantee.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions