fix(mobile): reobserve targets after keyboard transitions

SH
4h ago
+145-49

What and why

  • Retain keyboard state with each captured index. An unchanged rectangle skips the transition wait only when keyboard state also stayed unchanged. Tap, focus, fill, typing, character presses, Enter and dismissal share this rule; the action-kind exceptions are removed.
  • Map target_still_moving to retryable NODE_STALE only with dispatched: 'no'. Missing/unknown dispatch stays nonretryable.
  • Update regression coverage, comments, reference/skill documentation and the patch changeset.
flowchart LR
  A[Target captured] --> B{New or moved target, or keyboard changed?}
  B -->|Yes| C[Wait remaining budget and refresh]
  B -->|No| D[Act immediately]

#1253 keeps native readiness ownership for eligible opt-in Android presses; this change belongs to the adapter transition policy. #1300 handles losing the target after refresh. Merge #1300 first, then retain its stale check when rebasing this PR. A disposable combined checkout passed 367 mobile tests after resolving the binding-argument overlap.

Issue

Fixes #1296.

Verified

Ran it locally: yes. Head 530e53046a9d790f8891629443b9c383568e873f.

Public controlled fixture and capture evidence: visible software-keyboard nodes precede the button moving from y418.67 to y258.67. The original consumer raw capture was not retained; this verifies the signal in a fresh controlled reproduction.

CheckCurrent main d8c597bThis PR
Same focused regressions17 fail / 4 pass21 pass
Pre-rebase built CLI, same diagnostic binary, one worker, zero retries93f77d8: 1/1 pass, 3.71s body828b1e8: 1/1 pass, 4.24s body

Both live runs pass, so they establish compatibility, not a deterministic native failure or performance claim. The video run also passed; media remains local because upstream attachment upload requires repository write access. The diagnostic host used a local generated UIScene adaptation for iOS 27; no full unmodified benchmark or Android device pass is claimed.

Rebased onto current main d8c597b, preserving its viewport fix: all 374 mobile tests and pnpm check pass. A fresh built-CLI run with agent-device 0.21.29 also passes, one worker and zero retries. Unchanged-state fast-path tests assert no pending timer. Independent review found no remaining issues.

The reviewed runtime head 4a092a550 passed the spec, docs and mobile gates, including iOS and Android deterministic suites. The documentation-only follow-up 17b7d310 removes the one-off diagnostic README and rewrites the changeset for users; the evidence permalink above remains available at its original commit. pnpm check, all 374 mobile unit tests and an independent review pass for this follow-up. No new device run was needed for these documentation edits.