fix(webdriver): avoid unused pre-tap focus geometry reads
Summary
Related to #3985/#3990; six files. Pre-tap identity only; post-tap validation, deadlines, classifications and no-resend writes unchanged. No timeout increase.
Workflow
flowchart LR
F[fill] --> I[Pre-tap identity only]
I --> T[Tap]
T --> P[Existing post-tap checks]
P --> D[Existing fill dispatch]
I -->|error| E[Refuse]
Validation
Head: 9603d5f2777a79af8b45fad700760e881bc880c2; base: eedc0df3d2168275dcd89ed21613c3362d595731.
- Same regression: base failed/head passed.
- 94 unit + 13 provider/facade passed.
- Exact-head affected gate: format/lint/types/layering/Fallow/build passed; related 979 passed/1 failed (Apple fake-record timeout), matching base 977 passed/1 failed. Gate failed.
- Cubic clean. CI, Linux, Apple passed; Android cancelled.
Combined hosted proof
Local cbb02e58a1465003f3746afa5775e180dcd4826a: #3990@13d32dac + readiness runtime@42da9495; test-only conflict resolutions. Later changes are docs-only. Not unmodified-head proof. Combined 103 unit + 18 provider passed.
Public Swag Labs 2.7.1, dummy data. iPhone17/iOS26.6 and GalaxyS25/Android15: A stayed neighbor-unchanged; B changed empty→three masked characters after old. Later fixture-local login confirmed exact secure replacement.
iOS second-field wire, UTC (IDs normalized; intervening reads omitted):
17:07:43.964 GET /element/active A
17:07:44.421 POST /actions 200
17:07:45.260 GET /element/active B
17:07:45.574 GET /element/B/rect 200
17:07:45.813 POST /element/B/clear 200
17:07:46.051 POST /element/B/value "old" 200
Full-log audit: zero pre-tap rectangles, preserved post-tap rectangles, zero session POST /keys. Sessions closed. Underlying transport latency remains unexplained.
Pending: Android CI; second-landing rebase. #3990: live rejected-clear/WebView-password unproven.