fix(02-06,G2): first-run hint after Begin — close A-Dark-Room first-prompt gap

Adds a single bible-voice line ("Begin where the soil is bare.") that
surfaces immediately after BeginScreen dismisses on first run and
auto-dismisses when the player makes their first plant. Closes G2
first-impression UX gap from 2026-05-09 live UAT — the post-Begin state
no longer leaves a brand-new player staring at a 4×4 grid with no
instruction.

Implementation:
- content/seasons/01-soil/ui-strings.yaml: first_run_hint key added
  (recommended copy from plan; bible voice — warm, specific, contemplative)
- src/content/schemas/ui-strings.ts: UiStringsSchema extended with
  first_run_hint: z.string().min(1) — MANDATORY because Zod default strip
  mode silently drops unknown keys from parsed.data
- src/store/session-slice.ts: firstRunHintDismissed + dismissFirstRunHint
  added (session state ONLY — NOT persisted to V1Payload, no migrations[2])
- src/ui/first-run/FirstRunHint.tsx: subscribes to tiles slice, dismisses
  on first plant !== null transition; renders externalized line via
  uiStrings[1]?.first_run_hint
- src/ui/first-run/{index.ts}, src/ui/index.ts: barrel + re-export wired
- src/App.tsx: <FirstRunHint /> mounted between BeginScreen and SeedPicker

Vitest: 6 new behavioral cases green (hidden when Begin still up, hidden
when dismissed, renders externalized line, reads uiStrings, auto-dismisses
on first plant, stays dismissed on subsequent tile changes). 324/324
total green; npm run ci exits 0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-09 12:13:04 -04:00
parent f52de0bdbb
commit c46fc75549
8 changed files with 183 additions and 0 deletions
+7
View File
@@ -13,6 +13,13 @@ begin:
subtitle: "tend"
cta: "Begin"
# Plan 02-06 G2 — first-run instructional hint shown after BeginScreen
# dismisses on the first run of a tab. Auto-dismisses on first plant.
# Per the A Dark Room rule: one prompt at a time, minimal but always
# present until acted upon. Bible voice (warm, specific, contemplative)
# per CLAUDE.md tone constraint.
first_run_hint: "Begin where the soil is bare."
seed_picker:
title: "Sow"
cancel: "Not yet"