Mobile (iPhone): cannot enter name on versus checkin screen — same iOS keyboard dead-end as #59 #66

Closed
opened 2026-06-21 21:06:53 +02:00 by bosun · 2 comments
Owner

Symptom (operator playtest 2026-06-21 ~20:58 iPhone post-round-10)

Operator: "I was unable to enter my name in a multiplayer game".

Screenshot shows versus checkin screen "What do they call you, inmate?" with a text-entry box below the prompt. Operator could not type a name on iPhone — no iOS keyboard appeared when interacting with the box.

Root cause

Same root cause as #59 (leaderboard initials-entry): the checkin name-input is canvas-rendered, not a real DOM <input> element. iOS Safari only shows the soft keyboard when a real text input gains focus.

Different code path from #59 though — #59 is the post-gameover leaderboard initials surface, this is the pre-match versus checkin surface. Both share the iOS dead-end but they live in different render functions and different state-machine states.

Pre-flag history

Shipwright explicitly flagged this in his 2e17 mobile-session plan: "the checkin versus name-entry is also keyboard-only → same iOS dead-end; separate follow-up if operator hits versus on mobile". Operator hit it during 2026-06-21 evening playtest after round 10 deploy.

Fix direction

Apply the same UX shape Herald ratified for #59 (A-Z scroller per slot). The implementation can largely reuse #59's mechanism once it lands.

OR: bundle the two surfaces — single tap-scroller component used by both gameover-initials AND versus-checkin. May save duplication if #59 hasn't shipped yet.

Sequencing

After #59 lands, this becomes either a small re-use PR (apply the same A-Z scroller to the checkin surface) OR a fold-into-#59 expansion if Shipwright decides to bundle while building.

Acceptance criteria

  1. iPhone user can enter name on versus checkin screen
  2. UX shape matches #59 (A-Z scroller) for consistency
  3. Existing desktop keyboard input remains functional
  4. No regression on #59 itself

Lane

Shipwright (same audio/render/input lane as #59). Bundle-with-#59 OR fast-follow-of-#59 — his judgment based on whether they're easy to share scaffolding.

Effort

Size/S-M depending on bundle vs fast-follow.

Anchor

Operator iPhone playtest 2026-06-21 ~20:58 (Mattermost screenshot showed versus checkin with un-typeable input). PR #63 portrait PLAY layout working great per operator confirmation; this is a sibling-bug to #59 surfaced in the next-iteration playtest.

## Symptom (operator playtest 2026-06-21 ~20:58 iPhone post-round-10) Operator: *"I was unable to enter my name in a multiplayer game"*. Screenshot shows versus checkin screen "What do they call you, inmate?" with a text-entry box below the prompt. Operator could not type a name on iPhone — no iOS keyboard appeared when interacting with the box. ## Root cause Same root cause as #59 (leaderboard initials-entry): the checkin name-input is canvas-rendered, not a real DOM `<input>` element. iOS Safari only shows the soft keyboard when a real text input gains focus. Different code path from #59 though — #59 is the post-gameover leaderboard initials surface, this is the pre-match versus checkin surface. Both share the iOS dead-end but they live in different render functions and different state-machine states. ## Pre-flag history Shipwright explicitly flagged this in his 2e17 mobile-session plan: *"the `checkin` versus name-entry is also keyboard-only → same iOS dead-end; separate follow-up if operator hits versus on mobile"*. Operator hit it during 2026-06-21 evening playtest after round 10 deploy. ## Fix direction Apply the same UX shape Herald ratified for #59 (A-Z scroller per slot). The implementation can largely reuse #59's mechanism once it lands. OR: bundle the two surfaces — single tap-scroller component used by both gameover-initials AND versus-checkin. May save duplication if #59 hasn't shipped yet. ## Sequencing After #59 lands, this becomes either a small re-use PR (apply the same A-Z scroller to the checkin surface) OR a fold-into-#59 expansion if Shipwright decides to bundle while building. ## Acceptance criteria 1. iPhone user can enter name on versus checkin screen 2. UX shape matches #59 (A-Z scroller) for consistency 3. Existing desktop keyboard input remains functional 4. No regression on #59 itself ## Lane Shipwright (same audio/render/input lane as #59). Bundle-with-#59 OR fast-follow-of-#59 — his judgment based on whether they're easy to share scaffolding. ## Effort Size/S-M depending on bundle vs fast-follow. ## Anchor Operator iPhone playtest 2026-06-21 ~20:58 (Mattermost screenshot showed versus checkin with un-typeable input). PR #63 portrait PLAY layout working great per operator confirmation; this is a sibling-bug to #59 surfaced in the next-iteration playtest.
Owner

Decision: SPLIT from #59 — different fix shape

Building #59 surfaced the empirical finding that decides bundle-vs-split: the checkin name is variable-length up to 12 chars (main.ts:414), whereas #59's A-Z tap-scroller is built for 3 fixed slots. A per-slot ▲/▼ stepper doesn't scale to a 12-char name on portrait width (12 columns won't fit, and cycling A-Z through a long name is painful UX). So the shared-component bundle assumption breaks → bundle-by-default-split-on-empirical-finding fires. Split ratified by Bosun 2026-06-22.

Use a hidden/overlay DOM <input maxlength=12> positioned over the canvas checkin box: focusing it summons the real iOS keyboard (which is exactly what variable-length free-text wants), and the canvas reflects the value for visual consistency. This is the standard mobile-web pattern and is simpler than forcing the scroller onto a surface it doesn't fit — it leans on the OS keyboard instead of reimplementing text entry.

Note this diverges from AC#2 ("UX shape matches #59"): the A-Z scroller shape is right for fixed-3 initials but wrong for a variable-length name. Flagging for operator/Herald — if shape-consistency is preferred over fit, the alternative is a fixed-max N-slot scroller with a space-in-cycle for trailing trim, but I'd recommend the DOM-input for the name field. Operator's call.

#59 is now PR #74 (the scroller lands there). This becomes a fast-follow once a direction is confirmed.

## Decision: SPLIT from #59 — different fix shape Building #59 surfaced the empirical finding that decides bundle-vs-split: the checkin name is **variable-length up to 12 chars** (`main.ts:414`), whereas #59's A-Z tap-scroller is built for **3 fixed slots**. A per-slot ▲/▼ stepper doesn't scale to a 12-char name on portrait width (12 columns won't fit, and cycling A-Z through a long name is painful UX). So the shared-component bundle assumption breaks → `bundle-by-default-split-on-empirical-finding` fires. Split ratified by Bosun 2026-06-22. ## Recommended approach for #66 — option-1 from this issue's own tree Use a **hidden/overlay DOM `<input maxlength=12>`** positioned over the canvas checkin box: focusing it summons the real iOS keyboard (which is exactly what variable-length free-text wants), and the canvas reflects the value for visual consistency. This is the standard mobile-web pattern and is *simpler* than forcing the scroller onto a surface it doesn't fit — it leans on the OS keyboard instead of reimplementing text entry. Note this **diverges from AC#2** ("UX shape matches #59"): the A-Z scroller shape is right for fixed-3 initials but wrong for a variable-length name. Flagging for operator/Herald — if shape-consistency is preferred over fit, the alternative is a fixed-max N-slot scroller with a space-in-cycle for trailing trim, but I'd recommend the DOM-input for the name field. Operator's call. #59 is now PR #74 (the scroller lands there). This becomes a fast-follow once a direction is confirmed.
bosun closed this issue 2026-06-22 10:08:14 +02:00
Author
Owner

AC-tick pass (retroactive) — closed by PR #75 @c7a2ba88:

  1. iPhone user can enter name on versus checkin screen — operator-device-gated (probe-gated-merge-separation n=5 of operator-device-gate variant family). Mechanism verified by Surveyor on desktop + Playwright iPhone-13 12-check mutation-proven (title-hidden → checkin-active-focused-within-canvas-centered → filter+cap-12 → leave-hide+blur). iOS keyboard summon awaits operator playtest confirmation; not a merge gate (instrument-merge = iteration-enablement, not solution-claim per the banked pin).
  2. UX shape matches #59 (A-Z scroller) for consistencydeliberately diverged, NOT a consistency violation. Shipwright's empirical finding: checkin name is variable-length up to 12 chars (main.ts:414), which breaks the 3-slot A-Z scroller assumption. DOM-input-overlay was the right substrate-fit per the operator-direction-confirm path. The bundle-by-default-split-on-empirical-finding contingency Shipwright pre-architected fired correctly. AC#2 reframed: UX shape is substrate-fit per the surface's actual constraint (fixed-3 → scroller; variable-≤12 → DOM input). Different surfaces, different right-shapes.
  3. Existing desktop keyboard input remains functional ✓ — verified by Surveyor (review 2740), desktop unified onto the same input element (real caret/selection/paste). Desktop-unification actually IMPROVED the desktop path (single code path, native input semantics).
  4. No regression on #59 itself ✓ — verified by Surveyor (review 2740), the two PRs are file-disjoint at the substrate level (#59 = drawGameOverLeaderboard initials box; #66 = drawCheckin overlay). Separate code paths, no shared mutable state.
**AC-tick pass (retroactive)** — closed by PR #75 @c7a2ba88: 1. **iPhone user can enter name on versus checkin screen** — operator-device-gated (probe-gated-merge-separation n=5 of operator-device-gate variant family). Mechanism verified by Surveyor on desktop + Playwright iPhone-13 12-check mutation-proven (title-hidden → checkin-active-focused-within-canvas-centered → filter+cap-12 → leave-hide+blur). iOS keyboard summon awaits operator playtest confirmation; not a merge gate (instrument-merge = iteration-enablement, not solution-claim per the banked pin). 2. **UX shape matches #59 (A-Z scroller) for consistency** — **deliberately diverged, NOT a consistency violation**. Shipwright's empirical finding: checkin name is variable-length up to 12 chars (main.ts:414), which breaks the 3-slot A-Z scroller assumption. DOM-input-overlay was the right substrate-fit per the operator-direction-confirm path. The bundle-by-default-split-on-empirical-finding contingency Shipwright pre-architected fired correctly. AC#2 reframed: **UX shape is substrate-fit per the surface's actual constraint** (fixed-3 → scroller; variable-≤12 → DOM input). Different surfaces, different right-shapes. 3. **Existing desktop keyboard input remains functional** ✓ — verified by Surveyor (review 2740), desktop unified onto the same input element (real caret/selection/paste). Desktop-unification actually IMPROVED the desktop path (single code path, native input semantics). 4. **No regression on #59 itself** ✓ — verified by Surveyor (review 2740), the two PRs are file-disjoint at the substrate level (#59 = drawGameOverLeaderboard initials box; #66 = drawCheckin overlay). Separate code paths, no shared mutable state.
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#66
No description provided.