test(02): VERIFICATION → gaps_found after live UAT (4 first-impression UX gaps)

User dev-server walkthrough surfaced 4 functional UX gaps beneath the verifier's
24/24 structural PASS:

  G1 (blocking) — no global page CSS → white halo around #1a1a1a canvas
  G2 (blocking) — no first-run prompt after Begin → player confused
                  (A Dark Room rule needs the canonical first-prompt)
  G3 (high)     — tile outlines too dim → grid reads as 'gray check block'
  G4 (medium)   — gate visual at canvas (880, 384) reads as stray rectangle

Phase 3 watercolor deferral preserved — every fix uses Phaser primitives or
one CSS file, not painted assets. STATE.md → status: gaps_found.

Next: /gsd-plan-phase 2 --gaps

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-09 11:37:44 -04:00
parent 286b4ba446
commit 6f680f4731
2 changed files with 66 additions and 14 deletions
+9 -9
View File
@@ -2,14 +2,14 @@
gsd_state_version: 1.0
milestone: v1.0
milestone_name: milestone
status: in_progress
stopped_at: "Phase 2 Wave 2 final plan (Plan 02-05 letter-settings-e2e) executed in sequential mode. 4 atomic commits: 26eb77a (sim/offline + auto-harvest + letter Ink + letter-renderer), 5d58d6c (Letter overlay + Settings UI + boot save lifecycle + clock injection), dd48696 (Playwright e2e for PIPE-07), 31f8ede (compost beat toast — Plan 02-04 deferral). 312/312 vitest tests green (was 264; +48 new); Playwright PIPE-07 spec exits 0 in 1.5s test runtime / 4s end-to-end; npm run ci exits 0. UX-02 / UX-10 / CORE-03 / CORE-11 / PIPE-07 / GARD-02 / GARD-04 requirements satisfied. Phase 2 vertical slice closed end-to-end on real authored content + real save round-trip + real offline catchup — could plausibly ship as a free standalone Season-1 prologue. URL-flag FakeClock injection landed cleanly first-try, production-guarded by import.meta.env.PROD. Compost-beat UI wired as a thin transient CompostToast (minimum-viable; Ink runtime path remains compiled + loadable for Phase 4+ swap-in). gray-matter dep auto-removed (Rule 3 blocking issue surfaced via the e2e — Buffer not defined in browser; replaced with 15-line parseFrontmatter helper; bundle dropped 2.2MB → 1.9MB). All 24 Phase-2 REQ-IDs structurally satisfied across the 5-plan set. Phase 2 ready for /gsd-verify-work."
last_updated: "2026-05-09T15:08:00.000Z"
status: gaps_found
stopped_at: "Phase 2 executed end-to-end (5/5 plans, 312/312 vitest, Playwright PIPE-07 green, npm run ci exits 0). gsd-verifier scored 24/24 REQ-IDs structurally PASS and routed 6 tone/live-loop items to HUMAN-UAT.md. Live UAT (user dev-server walkthrough) surfaced 4 first-impression UX gaps that block phase sign-off — these are NOT Phase-3 aesthetic deferrals, they are minimum-viable functional UX gaps: G1 no global page CSS (white halo around dark canvas), G2 no first-run prompt after Begin (player confused — A Dark Room rule violated), G3 dim tile outlines (grid reads as 'gray check block'), G4 isolated gate visual (no surrounding wall context). Gaps documented in 02-VERIFICATION.md frontmatter (status: gaps_found). Phase 3 watercolor + cello deferral preserved — every G-fix uses Phaser primitives or one CSS file, no painted assets. HUMAN-UAT.md tone items (Lura voice, letter cadence) remain pending below the structural gaps and will be re-reviewed after gap closure. Next: /gsd-plan-phase 2 --gaps."
last_updated: "2026-05-09T15:55:00.000Z"
last_activity: 2026-05-09
progress:
total_phases: 8
completed_phases: 1
total_plans: 8
total_plans: 12
completed_plans: 12
percent: 22
---
@@ -21,14 +21,14 @@ progress:
See: .planning/PROJECT.md (updated 2026-05-08)
**Core value:** Every idle mechanic must function as a metaphor that the player absorbs without being told. When economy and meaning conflict, meaning wins.
**Current focus:** Phase 02 — Season 1 Vertical Slice (Soil) — ALL 5 PLANS DONE; ready for /gsd-verify-work
**Current focus:** Phase 02 — Season 1 Vertical Slice (Soil) — 5/5 plans done + verifier 24/24 PASS, but live UAT found 4 first-impression UX gaps. Awaiting `/gsd-plan-phase 2 --gaps`.
## Current Position
Phase: 02 (season-1-vertical-slice-soil) — 5/5 plans complete (all waves)
Plans: 5 of 5 created (3 waves); Wave 0 (02-01) DONE; Wave 1 (02-02 + 02-03) DONE; Wave 2 (02-04 + 02-05) DONE
Status: Plan 02-05 letter-settings-e2e executed in sequential mode — 4 atomic commits (26eb77a, 5d58d6c, dd48696, 31f8ede), 48 new tests (312/312 total vitest green), npm run ci exits 0, npx playwright test exits 0 in 1.5s. UX-02 / UX-10 / CORE-03 / CORE-11 / PIPE-07 / GARD-02 / GARD-04 satisfied end-to-end. Phase 2 vertical slice closed: a player can launch, plant, grow, harvest, meet Lura, leave the tab, return ≥5min later, see the letter from the garden in voice, dismiss to the live garden — and everything persists across reload (PIPE-07 e2e proves it). All 24 Phase-2 REQ-IDs structurally satisfied across the 5-plan set. The vertical slice could plausibly ship as a free standalone Season-1 prologue (banner concern #2's escape hatch realized).
Last activity: 2026-05-09 -- Plan 02-05 execute complete; Phase 2 ready for verification
Phase: 02 (season-1-vertical-slice-soil) — 5/5 plans executed; verifier 24/24 PASS; live UAT found 4 blocking/high gaps; status: gaps_found
Plans: 5 of 5 created (3 waves); Wave 0 (02-01) DONE; Wave 1 (02-02 + 02-03) DONE; Wave 2 (02-04 + 02-05) DONE; gap-closure plan pending
Status: All 5 Phase-2 plans executed cleanly (12 atomic feature commits + 5 doc commits). 312/312 vitest green; Playwright PIPE-07 e2e green in 1.6s; npm run ci exits 0. gsd-verifier scored 24/24 REQ-IDs structurally PASS and surfaced 6 inherently subjective tone/live-loop items in HUMAN-UAT.md. User ran the dev server (first live UAT) and reported 4 first-impression UX gaps that the test suite cannot detect: G1 white halo around dark canvas (no global page CSS), G2 no first-run prompt after Begin (A Dark Room rule violated), G3 tile outlines too dim against canvas bg, G4 gate visual stands alone with no wall context. All 4 are minimum-viable functional UX gaps — Phase 3 watercolor deferral preserved (every fix uses Phaser primitives or one CSS file). VERIFICATION.md updated to status: gaps_found with structured gap entries. The HUMAN-UAT.md tone items remain pending below the structural gaps.
Last activity: 2026-05-09 -- Phase 2 execute complete; live UAT surfaced 4 UX gaps; awaiting /gsd-plan-phase 2 --gaps
Progress: [██░░░░░░░░] 22%
@@ -2,10 +2,41 @@
phase: 02-season-1-vertical-slice-soil
verified: 2026-05-09T11:24:00Z
verifier_run_at: 2026-05-09T11:24:00Z
status: human_needed
score: 24/24 must-haves structurally verified
uat_run_at: 2026-05-09T15:50:00Z
status: gaps_found
score: 24/24 must-haves structurally verified; 4 first-impression UX gaps found in live UAT
overrides_applied: 0
re_verification: false
gaps:
- id: G1
severity: blocking
title: "No global page CSS — white halo around dark canvas"
surface: "src/main.tsx, no src/index.css exists"
evidence: "User screenshot 2026-05-09: 1024×768 dark canvas centered in a fully-white viewport. Canvas backgroundColor is #1a1a1a (game/main.ts:16); body has no styling, defaults to white. Visual tonal break is jarring on every page load."
fix_shape: "Add src/index.css imported from main.tsx. body { margin: 0; min-height: 100vh; background: #1a1a1a; color: #e8e0d0; font-family: serif; } #game-container centered. ~15 lines."
must_have_link: "ROADMAP SC1 — 'no UI clutter' implies tonal coherence between canvas and surrounding chrome, not 'untreated browser default white'."
- id: G2
severity: blocking
title: "No first-run prompt after Begin — player has no idea what to do"
surface: "src/App.tsx + the post-BeginScreen state"
evidence: "User feedback 2026-05-09: 'I am very confused.' After dismissing Begin, the only persistent UI is a settings cog at bottom-right. SeedPicker is gated behind clicking a tile; JournalIcon is invisible until first harvest. A first-time player sees an empty 4×4 grid + a stray gray gate rectangle and nothing else. The 'A Dark Room rule' the bible cites means 'one prompt at a time, minimal but always present' — not 'zero UI'."
fix_shape: "Tiny FirstRunHint component — single bible-voice line ('Click a tile to plant', or similar from ui-strings.yaml). Auto-dismisses on first plant. New `firstRunHintDismissed` flag in session-slice."
must_have_link: "ROADMAP SC1 + GARD-01 — A Dark Room rule honored requires at minimum the canonical first-prompt; player must know what to do on frame one."
- id: G3
severity: high
title: "Tile outlines too dim — 4×4 grid reads as 'gray check block'"
surface: "src/render/garden/tile-renderer.ts"
evidence: "User feedback: 'a confusing gray check block.' Tile outlines render with low contrast against the #1a1a1a canvas background; in the screenshot the 16 tiles read as faint suggestions rather than legible interactive surfaces. Hover state (if it exists) is similarly underexposed."
fix_shape: "Brighten empty-tile outline color (~#3a3a40 → ~#5a5a60); add a clearer hover state (~#7a7a82 outline + slight fill alpha bump). No visual style change beyond contrast — Phase 3 watercolor still owns the painted look."
must_have_link: "GARD-01 — 'Player can plant a seed into an unoccupied tile' presumes the player can SEE which tiles are unoccupied. Currently they cannot."
- id: G4
severity: medium
title: "Gate visual stands alone with no surrounding context"
surface: "src/render/garden/gate-renderer.ts"
evidence: "User screenshot: gate at canvas (880, 384) appears as a stray gray rectangle floating to the right of the grid, with nothing connecting it to the garden. The bible's 'walled garden' framing requires the gate to read as part of a wall, not a free-floating element. Phase 3 paints the watercolor wall — this gap asks only for a faint structural primitive so the gate has visual context in Phase 2."
fix_shape: "Add a faint vertical line/band in gate-renderer connecting top-to-bottom of the canvas at the gate's column (Phaser primitive — alpha ~0.15-0.20 against #1a1a1a). Phase 3 paints over without changing the structural intent."
must_have_link: "Bible — 'walled garden at the fraying edge of a world.' AEST-07 only requires Begin-screen restraint, not no-context gate placement."
per_req:
per_req:
CORE-02: PASS
CORE-03: PASS
@@ -56,10 +87,31 @@ human_verification:
**Phase Goal:** Player can launch the game, plant a seed, watch it grow, harvest a memory fragment authored in real Season 1 content, meet Lura at the gate, leave the tab for hours, and return to a letter-from-the-garden describing what bloomed — the entire core loop and content pipeline proven on Season 1 with no aesthetic polish required.
**Verified:** 2026-05-09T11:24:00Z
**Status:** HUMAN_NEEDED — all 24 REQ-IDs structurally PASS; tone-quality items need human eyeballs before sign-off.
**Verified:** 2026-05-09T11:24:00Z (automated) → 2026-05-09T15:50:00Z (live UAT update)
**Status:** GAPS_FOUND — all 24 REQ-IDs structurally PASS, but live UAT surfaced 4 first-impression UX gaps that block phase sign-off.
**Re-verification:** No — initial verification.
**Overall verdict:** PHASE STRUCTURALLY COMPLETE — code passes every automated gate; tone review and live-loop verification are the remaining work.
**Overall verdict:** PHASE STRUCTURALLY COMPLETE BUT NOT SHIPPABLE — code passes every automated gate, but a brand-new player launching the dev server cannot intuit the loop and the page reads as "broken UI" (white halo around dark canvas, no first-run prompt, dim tile outlines, isolated gate visual). Route through `/gsd-plan-phase 2 --gaps` to spec a small focused gap-closure plan before marking the phase complete.
---
## Gaps Found in Live UAT (2026-05-09T15:50:00Z)
The 5 plans + automated verifier all passed; human live-loop walkthrough on a fresh dev server surfaced first-impression UX gaps NOT visible in the test suite. See frontmatter `gaps:` for the structured list. Summary:
| Gap | Severity | What user sees | Fix shape (one-line) |
|-----|----------|---------------|----------------------|
| G1 | blocking | Dark canvas floats in a sea of white = visually broken on every page load | Add `src/index.css` with body bg `#1a1a1a`, import in `main.tsx` |
| G2 | blocking | After dismissing Begin, no instruction visible — player confused | Add `FirstRunHint` overlay with one bible-voice line, auto-dismiss on first plant |
| G3 | high | 4×4 grid reads as "gray check block" — outlines too dim against canvas | Brighten empty-tile outline + hover state contrast in `tile-renderer.ts` |
| G4 | medium | Gate visual at canvas (880, 384) reads as stray gray rectangle | Add faint vertical wall primitive in `gate-renderer.ts` for Phase-2 context |
**Why the automated verifier missed all 4:** the 312 vitest cases pin behavioral correctness (state transitions, schema, determinism, save round-trip); the Playwright e2e drives the loop programmatically (it doesn't *look* at the screen). First-impression "what does a new player see?" is a category the test suite cannot cover. The HUMAN-UAT.md tone items capture the next layer (Lura's voice, letter cadence) — the gaps above are a layer beneath those, structurally simpler but visually load-bearing.
**Phase 3 deferral preserved:** the watercolor + cello + painted plants the bible describes remain Phase 3 scope. These gaps are minimum-viable functional UX (page-bg coherence, first-prompt presence, grid legibility, gate context) — every fix uses Phaser primitives or a single CSS file, no painted assets.
**Next:** `/gsd-plan-phase 2 --gaps` to create the gap-closure plan.
---
---