fix(android): keep scroll target taps outside system bars
Summary
Prevent Android scroll-target taps from entering system navigation using measured window/bar geometry across device sizes and origins. Enforce half-open tap bounds, preserve controls in mixed bar/content windows, and reject non-finite computed tap centers.
Private measured bounds protect raw refs; fully covered targets refuse before input. Raw JSON retains reported rectangles. Inferred search hints retain their existing scope. Existing geometry modules avoid new eager imports.
13 files. Scope includes shared geometry, session cloning, tests, help, and snapshot docs.
Validation
Head: fc5ca3b56c92fc90d211366c864a7eb43c50d762; original base: c2677fdd4ce37010d8d8b6664df3d4f98674ec85.
-
pnpm check:affected --run --head fc5ca3b56c92fc90d211366c864a7eb43c50d762: passed, exact clean commit, receiptrun-jDsE6z; 19,189 unit passed, 3 skipped; 369 related provider tests passed. -
Overflow regression proof: same two-file Vitest command, previous source
34854d7387plus new test inputs: 4 failed, 31 passed; fixed source: 35 passed. Selector refusal verifiestarget_bounds_invalid,dispatched:no, zero backend input. -
Exact-head rebuilt Android scroll smoke: 1/1 passed, helper
0.21.37-dev, e2e0.23.0, mobile0.12.6; item 137 tapped at y=2252 and benchmark stayed foreground. -
Earlier comparisons and transcripts retain their original SHAs. Previous independent review found no outstanding findings; latest one-line guard was self-reviewed.
-
Exact-head CI completed without failures, including Coverage and Numeric Ranges. Local skips remain skips. No merge/release performed.
Dependency
Before merge, complete #4456 slices 2 and 4: consolidate private-evidence construction/copying, migrate measured input bounds, then rebase this PR. Constructor ownership remains unimplemented; green checks do not complete this dependency. See scope decision.