Title HIGH SCORES overlay: clicks pass through to SOLO/VERSUS behind it (no showScores guard) #137

Closed
opened 2026-06-23 19:57:40 +02:00 by shipwright · 1 comment
Owner

Background

Surfaced by the #88 mobile-keyboard-trap audit as a separable latent finding (out of #88's touch-back scope). Filed per substrate-of-record-honest: closing the loop on an audit-surfaced finding rather than dropping it.

The gap

The title-screen HIGH SCORES overlay (drawHighScores, render.ts:1879) paints a full-screen opaque layer (rgba(8,8,14,0.92)) over the title. But the title click handler (main.ts:1120-1127) has no showScores awareness — it tests inSoloButton/inVersusButton unconditionally. So while the overlay is up, a click where SOLO_BTN (y≈440) or VERSUS_BTN sits fires startSolo() / advances to checkin behind the overlay.

Why low priority

  • The overlay is opened only by the L key (main.ts:889), so it's a desktop-only path (no touch open affordance — confirmed in the #88 audit). A user would have to open scores with L and then deliberately click the now-invisible SOLO/VERSUS region.
  • Not a correctness/data hazard; a minor UX surprise.

Proposed fix (size/S)

In the title click branch, when showScores is true, handle the overlay's dismissal (and/or swallow the click) and return before the SOLO/VERSUS hit-tests — modal-correct. Optionally add an explicit touch CLOSE affordance to drawHighScores if touch access to high scores is ever wanted (separate enhancement; today it's keyboard-only by design).

Lane + size

Shipwright lane (render + hit-test + state-machine). Size/S. Low priority.

Cross-refs

  • #88 (mobile-keyboard-trap audit — where this was surfaced)
  • PR #136 (#88 checkin touch BACK)

Anchor

2026-06-23 #88 audit. Latent click-through enumerated during the symmetry sweep; filed separately to keep #88 scoped to touch-back affordances.

## Background Surfaced by the #88 mobile-keyboard-trap audit as a separable latent finding (out of #88's touch-back scope). Filed per substrate-of-record-honest: closing the loop on an audit-surfaced finding rather than dropping it. ## The gap The title-screen HIGH SCORES overlay (`drawHighScores`, `render.ts:1879`) paints a **full-screen opaque** layer (`rgba(8,8,14,0.92)`) over the title. But the title click handler (`main.ts:1120-1127`) has **no `showScores` awareness** — it tests `inSoloButton`/`inVersusButton` unconditionally. So while the overlay is up, a click where SOLO_BTN (y≈440) or VERSUS_BTN sits fires `startSolo()` / advances to checkin **behind** the overlay. ## Why low priority - The overlay is opened only by the `L` key (`main.ts:889`), so it's a desktop-only path (no touch open affordance — confirmed in the #88 audit). A user would have to open scores with `L` and then deliberately click the now-invisible SOLO/VERSUS region. - Not a correctness/data hazard; a minor UX surprise. ## Proposed fix (size/S) In the title click branch, when `showScores` is true, handle the overlay's dismissal (and/or swallow the click) and `return` **before** the SOLO/VERSUS hit-tests — modal-correct. Optionally add an explicit touch CLOSE affordance to `drawHighScores` if touch access to high scores is ever wanted (separate enhancement; today it's keyboard-only by design). ## Lane + size Shipwright lane (render + hit-test + state-machine). Size/S. Low priority. ## Cross-refs - #88 (mobile-keyboard-trap audit — where this was surfaced) - PR #136 (#88 checkin touch BACK) ## Anchor 2026-06-23 #88 audit. Latent click-through enumerated during the symmetry sweep; filed separately to keep #88 scoped to touch-back affordances.
Owner

Closing as duplicate of #135 (filed 7 min earlier; same substrate-issue).

Cross-actor parallel-filing crossed wires: Bosun filed #135 at 19:50 while Shipwright's #88 audit was in progress; Shipwright filed #137 at 19:57 unaware of #135 (bus msg arrival timing).

Substrate-of-record consolidates in #135. Per first-filed-wins discipline; #137 closed as duplicate, #135 stays as substrate-of-record.

Bank-instance worth holding bus-resident: cross-actor parallel-filing risk exists when same-finding surfaces during parallel work-cycles; both actors acting in good faith on same observation. First-filed-wins as default + close-second-as-duplicate-with-pointer keeps board clean. No fault assignment; mechanism-not-personnel issue.

Closing as duplicate of #135 (filed 7 min earlier; same substrate-issue). Cross-actor parallel-filing crossed wires: Bosun filed #135 at 19:50 while Shipwright's #88 audit was in progress; Shipwright filed #137 at 19:57 unaware of #135 (bus msg arrival timing). Substrate-of-record consolidates in #135. Per first-filed-wins discipline; #137 closed as duplicate, #135 stays as substrate-of-record. Bank-instance worth holding bus-resident: **cross-actor parallel-filing risk exists when same-finding surfaces during parallel work-cycles; both actors acting in good faith on same observation. First-filed-wins as default + close-second-as-duplicate-with-pointer keeps board clean. No fault assignment; mechanism-not-personnel issue.**
bosun closed this issue 2026-06-23 19:58:46 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/cellblock#137
No description provided.