Make the layout audit usable inside modals, and stop it passing what it can't measure #97
Closed
jheaps
wants to merge 1 commits from
fix/casino-holdem-audit-modal-blindspot into fix/casino-holdem-quicksplit-chop
pull from: fix/casino-holdem-audit-modal-blindspot
merge into: :fix/casino-holdem-quicksplit-chop
:master
:feature/socialism
:polish/holdem-seats-one-size
:fix/holdem-dealer-chip-eats-its-seat
:polish/holdem-game-night-ready
:polish/holdem-round-next
:polish/holdem-seat-collisions
:polish/holdem-offline-and-render
:fix/naming-a-blind-deals-the-hand
:release/casino-holdem-polish
:fix/casino-holdem-phone-look
:fix/casino-holdem-sidebar-crowding
:fix/casino-holdem-contribution-rule
:fix/casino-holdem-one-stack-rule
:fix/casino-holdem-default-stack-buyin
:feat/casino-holdem-waiting-list
:feat/casino-holdem-misdeal
:feat/casino-holdem-cash-out
:feat/casino-holdem-clock
:feat/casino-holdem-rake
:fix/casino-holdem-stadium-ring
:fix/casino-holdem-phone-felt-shape
:fix/casino-holdem-audit-runs-everything
:feat/casino-holdem-straddle
:fix/casino-holdem-landscape-ring
:feat/casino-holdem-table-file
:fix/casino-holdem-touch-targets
:fix/casino-holdem-audit-modal-blindspot
:fix/casino-holdem-quicksplit-chop
:fix/casino-holdem-buildable-bet-sizes
:fix/casino-holdem-pot-sized-raise
:fix/casino-holdem-chips-to-count-out
:fix/casino-holdem-first-buy-in
:fix/casino-holdem-seating-a-table
:fix/casino-holdem-showdown-order
:fix/casino-holdem-hand-log-filter
:fix/casino-holdem-posting-in
:fix/casino-holdem-dead-button
:fix/casino-holdem-discarded-pot
:fix/casino-holdem-honest-tank-clock
:fix/casino-holdem-export-the-notes
:fix/casino-holdem-stacks-in-chips
:fix/casino-holdem-close-audit-blind-spots
:fix/casino-holdem-readable-dim-states
:fix/casino-holdem-drop-broken-watermark
:fix/casino-holdem-two-tabs
:fix/casino-holdem-unreadable-save
:fix/casino-holdem-say-when-not-saving
:fix/casino-holdem-shortcut-discovery
:fix/casino-holdem-rulings-index-compact
:fix/casino-holdem-rulings-index
:fix/casino-holdem-payout-in-chips
:fix/casino-holdem-move-seat-on-touch
:fix/casino-holdem-amount-fields-select
:fix/casino-holdem-touch-targets-by-pointer
:fix/casino-holdem-button-box-model
:fix/casino-holdem-blind-badge-placement
:fix/casino-holdem-buyin-deals-in
:fix/casino-holdem-bet-vs-raise
:fix/casino-holdem-deal-around-broke
:fix/casino-holdem-settle-up
:fix/casino-holdem-allin-and-bar
:fix/casino-holdem-one-dealer-button
:fix/casino-holdem-manual-deal
:fix/casino-holdem-less-guessing
:feature/casino-holdem-seat-editor
:fix/casino-holdem-landscape-table
:feature/casino-holdem-acting-seat
:feature/casino-holdem-raise-guard
:feature/casino-holdem-first-run
:feature/casino-holdem-contrast-audit
:feature/casino-holdem-layout-audit
:feature/casino-holdem-blind-fairness
:feature/casino-holdem-rulings-depth
:feature/casino-holdem-bank-audit
:feature/casino-holdem-fewer-taps
:feature/casino-holdem-render-perf
:feature/casino-holdem-keyboard-focus
:feature/casino-holdem-resilience
:feature/casino-holdem-messy-tables
:feature/casino-holdem-touch-mobile
:chore/casino-holdem-tech-debt
:feature/casino-holdem-dealer-batch
:feature/casino-holdem-seat-count-safety
:feature/casino-holdem-odd-chip
:feature/casino-holdem-button-moves
:feature/casino-holdem-allin-runout
:feature/casino-holdem-heads-up
:feature/casino-holdem-contrast
:feature/casino-holdem-touch-audit
:feature/casino-holdem-wizard-polish
:feature/casino-quicksplit-side-pots
:feature/casino-holdem-rebuys
:feature/casino-holdem-rulings
:feature/casino-holdem-sidebar-polish
:feature/casino-holdem-keyboard
:feature/casino-holdem-action-undo
:feature/casino-holdem-pace
:feature/casino-holdem-side-pot-breakdown
:feature/casino-holdem-gestures
:feature/casino-holdem-card-picker
:feature/casino-holdem-live-betting
:feature/casino-holdem-bet-chips
:feature/casino-holdem-seat-legibility
:feature/casino-holdem-undo-toasts
:feature/casino-holdem-quick-split
:feature/casino-holdem-mobile-table
:feature/casino-holdem-hand-history
:feature/casino-texas-holdem
:feature/casino-holdem-dealer-mode-polish
:feature/fractional-learned-weights
:fix/stockfish-dispose-hang
:fix/blog-cache-staleness
:fix/workflows
:gitea/workflows
:echo-acoustic-ranging
:chess-ui-overhaul
:feature/customChessEngine
:feature/blog
:AddProject
:feature/generalUpdate
:tech-debt/chess-cleanup
:tests/CreatePlaywrightTests
:UpdateParticleSimulatorButton
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
This round found no user-facing bug — it fixed the instrument that was hiding whether there was one. Saying that up front because the diff is all test harness.
#96 turned up that Quick Split had never been audited. Chasing why, the dealer table's modals had never been audited either — and the reason is the harness, not neglect. It reported the pot wizard covering the seats as ten faults and the rulings sheet as seven. A modal covering the page is what a modal is for, and an instrument that calls that a fault is one nobody can use in those states.
What changed
The audit now finds whatever is open on top and scopes the reachability checks to it — the overlays, plus the phone seat sheet, which is a body class rather than an element. The seat-ownership check is skipped outright while a sheet is open: seats behind it aren't fighting each other for taps, nothing is meant to reach them at all.
Two worse faults came out of proving the fix rather than assuming it. I injected a 20×14 button into the open wizard. The contrast check caught it; the touch-target check did not:
effectiveTargetreturns null whenelementFromPointcan't find the control, and the check treated that as a pass. Silent skips are how faults hide — the same lesson as thearia-hiddenand faded-text exemptions in earlier rounds. Unmeasurable controls are now reported as warnings.A checkbox inside a label is measured by its label, since tapping the label is what activates it. Without that the dedicated-dealer toggle read as an unprobeable 24px target when it has a 335×44 label around it.
Verification
On a real touch context (
hasTouch,isMobile, 390×844) at a 44px minimum, across the table, the pot wizard, the rulings sheet and the seat editor: 0 failures and 0 warnings in all four — down from 10 and 7 in two of them. The tool is genuinely clean in those states.And the check demonstrably fires now, which is the part that matters: the injected 20×14 button is reported as
touch targets at least 44px(1): hittable 19x14 (drawn 20x14), where the old check returned nothing at all.Product test suite unchanged at 387 tests, 0 failures — no application code is touched.
Stacked on
fix/casino-holdem-quicksplit-chop.🤖 Generated with Claude Code
https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
Last round turned up that Quick Split had never been audited. Chasing that, the reason the dealer table's modals had never been audited either turns out to be the harness, not neglect: it reported the pot wizard covering the seats as ten faults and the rulings sheet as seven. A modal covering the page is what a modal is for, and an instrument that calls that a fault is one nobody can use in those states. It now finds whatever is open on top and scopes the reachability checks to it — the overlays, plus the phone seat sheet, which is a body class rather than an element. The seat-ownership check is skipped outright while a sheet is open: seats behind it aren't fighting each other for taps, nothing is meant to reach them at all. Two worse faults came out of proving the fix rather than assuming it. Injecting a 20x14 button into the open wizard, the contrast check caught it and the touch-target check did not: * effectiveTarget returns null when elementFromPoint can't find the control, and the check treated that as a pass. Silent skips are how faults hide — the same lesson as the aria-hidden and faded-text exemptions before this. Unmeasurable controls are now reported as warnings. * The probe failed on anything scrolled out of its container. That was hiding a real control: "Confirm Winner(s)", the button that pays the pot out, had gone unmeasured for thirty-six rounds. It is scrolled into view before probing, and passes. A checkbox inside a label is now measured by its label, since tapping the label is what activates it. Without that, the dedicated-dealer toggle read as an unprobeable 24px target when it has a 335x44 label around it. The tool itself came out clean: no failures and no warnings across the table, the pot wizard, the rulings sheet and the seat editor, on a real touch context at 44px. The value here is that those states can be checked at all from now on — verified by injection, which the fixed check catches and the old one did not. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgbPull request closed