fix(components): portal hosts are hit-transparent — the constant-33 hardware bug - #213
Merged
Conversation
…ardware bug Every touch on real Vita hardware resolved to ONE node — the TextField's Portal host — killing list pans and field taps while the OSK (modally exempt) kept working. The host is an explicit full-screen absolute box in the overlay layer; #209 marked the overlay ROOT hitPass but every portal host inside it was another full-screen pure container that still claimed every bounds hit. Why no rig caught it: the pocket-youtube sim's vendored wasm was STALE (predating op 42), so its journeys silently exercised the ink-query FALLBACK, not the fact path; the Vita3K suite's only touch spec drove OSK keys — overlay content, immune. The on-device svc diagnostic (every touch-down reporting x,y,hit) showed the constant node id across the whole screen; rebuilding the vendor wasm reproduced it in the sim in one probe. - Portal host + the TextField dock wrapper: hitPass (pure plumbing never claims; a modal scrim is portal CONTENT and keeps blocking). - tests/portal-hit.test.ts: the REAL-core mount test mock hosts cannot express — a mounted empty-chrome Portal must not swallow bounds hits (fails without the fix, registered in the chain). - golden-specs: im-rowtap made permanent — app-layer tap-through-the-stack coverage on BOTH oracles (web + Vita3K), the hole this bug lived in. Validated: canonical chain 0 fail, 54 web goldens, im-rowtap + im-touch Vita3K byte-exact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The first real-hardware regression of the phase-2 touch program, found live on a Vita and diagnosed over the svc channel.
The bug
Every touch on the device resolved to one constant node id (33) — the TextField's Portal host: a full-screen absolute box in the overlay layer. #209 made the overlay ROOT
hitPass, but portal hosts inside it are full-screen pure containers too. Result: list pan dead, field tap dead, OSK alive (modally exempt).Why every rig missed it
The fix + the immune system
hitPasson Portal hosts + the TextField dock wrapper (plumbing never claims; modal scrims are portal content and keep blocking)tests/portal-hit.test.ts— REAL-core mount test: an empty-chrome Portal must not swallow bounds hits (red without the fix)im-rowtapgolden made permanent on both oracles — app-layer tap-through-the-stack coverage🤖 Generated with Claude Code