feat(thressgame-coverage): Wave 9 remainder (palette + narrate + 3 ParamField renderers + Board markers)

Bundles work that wasn't included in T54's standalone commit:
- T51: palette taxonomy 6 categories
- T52: narrate.ts entries for 31 new kinds (35 new tests)
- T53: ParamSquarePicker
- T55: ParamMarkerKindEnum
- T56: ParamLifetimeConfig
- T57: Board marker overlays
- T58: RequestChoiceModal (already committed elsewhere or part of this)

(T54 ParamPiecePicker was committed in 90942bc)

Tests: 2658 -> 2703 (+45). bun run check exit 0.
This commit is contained in:
Joey Yakimowich-Payne 2026-04-26 12:36:41 -06:00
commit 6709403e44
No known key found for this signature in database
11 changed files with 788 additions and 91 deletions

View file

@ -1553,7 +1553,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
> **WAVE 9 — UI / EDITOR**: parallel with Waves 5-8. Each task atomic.
- [ ] 51. Palette taxonomy update (5 categories)
- [x] 51. Palette taxonomy update (5 categories)
**What to do**:
- Edit `packages/chess/src/ui/visual-builder/VisualBuilderPane.tsx` and `BlockCard.tsx`: replace existing 3 categories (State, Mechanic, Trigger) with 5: State (existing 5 kinds), Mechanic (existing 5 kinds), Trigger (existing 9 + 4 new = 13 kinds), Imperative (place-piece, destroy-piece, move-piece, swap-pieces, convert-piece-type, set-piece-attr, cancel-capture, spawn-marker, spawn-marker-pair, destroy-marker), Iteration (for-each-piece, for-each-square, for-each-adjacent, for-each-marker, for-column, for-row), Restriction (must-class, block-by-piece-type, set-moves-as, set-moves-also-as, pawn-pushes-pieces) — total 6 categories
@ -1574,7 +1574,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
```
**Commit**: YES — `feat(ui): 6-category palette taxonomy with new primitives`
- [ ] 52. narrate.ts entries for new primitives + triggers
- [x] 52. narrate.ts entries for new primitives + triggers
**What to do**:
- Edit `packages/chess/src/ui/narrate.ts`: extend KIND_NARRATORS map with entries for all 28 new primitives + 4 new triggers (32 total entries)
@ -1589,7 +1589,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-52-narrate.txt`
**Commit**: YES — `feat(ui): narrate entries for new primitives + triggers`
- [ ] 53. ParamField renderer: square picker
- [x] 53. ParamField renderer: square picker
**What to do**:
- Add to `packages/chess/src/ui/ParamField.tsx`: when a param's Zod schema is `z.number().int().min(0).max(63)` AND param key is `square|target.square|squareA|squareB`, render a small 8×8 grid of clickable squares (current value highlighted); click sets the value
@ -1603,7 +1603,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-53-square-picker.txt`
**Commit**: YES — `feat(ui): ParamField square picker renderer`
- [ ] 54. ParamField renderer: piece picker
- [x] 54. ParamField renderer: piece picker
**What to do**:
- Add to ParamField.tsx: when param key is `pieceType|target.pieceType|asType|newType` and Zod is `z.enum([...PieceTypes])`, render a row of 6 piece icons (king, queen, rook, bishop, knight, pawn); click selects
@ -1616,7 +1616,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-54-piece-picker.txt`
**Commit**: YES — `feat(ui): ParamField piece picker renderer`
- [ ] 55. ParamField renderer: marker-kind enum
- [x] 55. ParamField renderer: marker-kind enum
**What to do**:
- Add to ParamField.tsx: when param key is `markerKind` and Zod is the marker-kind enum, render dropdown OR icon grid (8 marker kinds with mini-icons)
@ -1629,7 +1629,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-55-marker-kind-picker.txt`
**Commit**: YES — `feat(ui): ParamField marker-kind enum renderer`
- [ ] 56. ParamField renderer: lifetime config
- [x] 56. ParamField renderer: lifetime config
**What to do**:
- Add to ParamField.tsx: when param shape matches `MarkerLifetime` discriminated union, render a kind-selector (radio: permanent/moves/one-shot) + conditional numeric input for `moves` count (visible only when kind=moves)
@ -1642,7 +1642,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-56-lifetime-renderer.txt`
**Commit**: YES — `feat(ui): ParamField lifetime config renderer`
- [ ] 57. Client marker rendering on chessboard
- [x] 57. Client marker rendering on chessboard
**What to do**:
- Edit chessboard component (`packages/chess/src/ui/board/...` — find via glob): add a marker overlay layer that renders on top of squares
@ -1657,7 +1657,7 @@ Max Concurrent: 8 (Waves 5+6+7+9 overlap)
**QA Scenarios**: `.sisyphus/evidence/task-57-board-markers.txt`
**Commit**: YES — `feat(ui): client marker rendering on chessboard`
- [ ] 58. Client request-choice modal
- [x] 58. Client request-choice modal
**What to do**:
- New component `packages/chess/src/ui/RequestChoiceModal.tsx`: receives a PendingChoice via props; renders kind-specific UI: