docs(handoff): record GAME caption + MOVE chip; mark Option C closed

Bookkeeping pass after 54005d5 (GAME #YYYY-DDD caption) and e080b49
(MOVE N/M chip restyle) shipped — both pieces of the Option C
banner-local enrichments arc are now done.

Changes:
- "Since the v0.20.0 cut": added per-commit narratives for 54005d5
  and e080b49 with the implementation notes worth preserving past
  the commit log (the BANNER_HEIGHT 48→60 bump rationale, the Bevy
  0.18 BorderColor::all() correction, the "marker on the leaf, not
  the wrapper" ECS-design choice).
- "Open punch list" → "Replay-overlay enrichments beyond the scrub
  bar": pivoted from "tractable banner additions still open" to
  "all banner-local pieces shipped; remaining are cross-plugin or
  multi-session". Reflects current state without erasing the
  forward-looking work.
- Resume prompt → Option C: marked closed with a forward pointer to
  the cross-plugin/multi-session items that should get their own
  decision tree next time.
- Resume prompt → test count: dropped the hardcoded "1180 tests
  pass" (already stale at 1182) for "~1180+; check with
  `cargo test --workspace`" — same dynamic-reference pattern as
  44f5972's commit-count fix, applied to the next aggregate that
  was vulnerable to it.
This commit is contained in:
funman300
2026-05-07 22:25:58 -07:00
parent e080b49914
commit ef54cdeb65
+74 -18
View File
@@ -143,6 +143,58 @@ extension is incidental. (Same shape as the "RUSTY SOLITAIRE"
wordmark deviation noted under `cacb19c` — the mockup leaked the wordmark deviation noted under `cacb19c` — the mockup leaked the
repo name; the actual product is "Solitaire Quest".) repo name; the actual product is "Solitaire Quest".)
### `54005d5` `feat(engine): add GAME #YYYY-DDD caption beneath the replay headline`
Adds the right-anchored game-identifier piece of the replay-overlay
mockup, adapted to live *under* the existing "▌ replay" headline as
a `TYPE_CAPTION` (11 px) / `TEXT_SECONDARY` subtitle. Format is
`GAME #{year}-{ordinal:03}` (e.g. `GAME #2026-122` for a replay
recorded 2026-05-02) — year + chrono ordinal gives a compact,
monotonically-increasing identifier matching the mockup's
`GAME #2024-127` motif. New `ReplayOverlayGameCaption` marker, new
pure helper `format_game_caption(state) -> Option<String>` (None
for Inactive / Completed since the replay is consumed in those
branches; spawn-time fall-through to empty string).
**Layout impact:** `BANNER_HEIGHT` bumped 48 → 60 px so the new
left column (headline + 2 px gap + caption ≈ 39 px content) fits
under the scrub bar with room to spare. +12 px banner mass is the
deliberate cost of the new content; no other plugin observes
`BANNER_HEIGHT` so the change is local.
Two new tests (1180 → 1182): `format_game_caption_covers_state_corners`
pins the three branches plus the zero-pad-to-3-digits invariant
for early-January ordinals; `overlay_game_caption_shows_replay_date`
drives `ReplayPlaybackState` end-to-end.
### `e080b49` `feat(engine): restyle replay progress text as Terminal MOVE chip`
Closes the centre-text half of the replay-overlay enrichments. The
plain "Move N of M" text becomes a 1px `ACCENT_PRIMARY`-bordered
chip containing "MOVE N/M" — uppercase + slash separator reads as
a Terminal output line and matches the floating-chip motif in
`docs/ui-mockups/replay-overlay-mobile.html`. The chip lives
in-banner rather than floating above the focused card (the
screen-takeover treatment that requires plumbing cursor → card
identity remains deferred).
**Implementation note:** `BorderColor` in Bevy 0.18 is a per-side
struct, not a tuple — `BorderColor::all(ACCENT_PRIMARY)` is the
correct constructor. Worth pinning for next time we touch a
border-painted UI surface. The `ReplayOverlayProgressText` marker
stays on the inner Text rather than the new chip Node so
`update_progress_text` keeps repainting unchanged — a deliberate
"markers belong on the entity that updates change" choice.
Test count unchanged (1182); `overlay_progress_text_reflects_cursor`
swapped its assertion from "Move 5 of 10" to "MOVE 5/10".
This pair (`54005d5` + `e080b49`) closes Option C from the
SESSION_HANDOFF Resume prompt's banner-local enrichments. Floating-
chip-above-focused-card and the full screen-takeover redesign
remain — both data-layer or cross-plugin and intentionally still
open.
## What shipped in v0.20.0 (frozen at `41a009a`) ## What shipped in v0.20.0 (frozen at `41a009a`)
### Terminal visual-identity port ### Terminal visual-identity port
@@ -253,17 +305,18 @@ reads from it, so swapping the palette is now a one-file edit:
skipped this because a per-element pulse fights the global skipped this because a per-element pulse fights the global
`SplashFadable` fade timeline. Either layer the pulse on top `SplashFadable` fade timeline. Either layer the pulse on top
of the fade (multiply alphas) or accept the static cursor. of the fade (multiply alphas) or accept the static cursor.
- **Replay-overlay enrichments beyond the scrub bar.** The scrub - **Replay-overlay enrichments beyond the scrub bar.** Banner-local
bar (`c84d9f4`) and the `▌ replay` cursor-block label pieces of the mockup (`docs/ui-mockups/replay-overlay-mobile.html`)
(`6204db8`) are the *minimum* of the mockup all shipped: scrub bar (`c84d9f4`), `▌ replay` cursor-block label
(`docs/ui-mockups/replay-overlay-mobile.html`). Tractable (`6204db8`), `GAME #YYYY-DDD` caption (`54005d5`), `MOVE N/M`
banner additions still open: a right-aligned `GAME #N · MOVES` chip restyle (`e080b49`). What's still open are the cross-plugin
caption (mirrors the `▌replay.tsx` left-aligned filename motif), / data-layer pieces: a `MOVE N/M` chip *floating above the
a `MOVE 47/87` chip floating above the focused card during focused card* during playback (would need to thread the cursor
playback (would need to thread the cursor through to the card through to the card layer — `update_progress_text` writes the
layer). The full mockup's screen-takeover treatment — mini- banner chip but the card-position lookup belongs in `card_plugin`).
tableau preview, playback controls, move-log scroll, WIN MOVE The full mockup's screen-takeover treatment — mini-tableau
marker on the scrub bar — is a multi-session redesign with preview, playback controls, move-log scroll, WIN MOVE marker on
the scrub bar — is a multi-session redesign with
data-layer impact (move-log scroller; the WIN MOVE marker data-layer impact (move-log scroller; the WIN MOVE marker
needs a `win_move_index` field on `Replay` that doesn't yet needs a `win_move_index` field on `Replay` that doesn't yet
exist). Banner-overlay behaviour is intentionally preserved exist). Banner-overlay behaviour is intentionally preserved
@@ -375,7 +428,8 @@ boot-screen port, c84d9f4 replay scrub-bar finish, 6204db8 replay
banner ▌ cursor-block label, plus any handoff edits since). banner ▌ cursor-block label, plus any handoff edits since).
State: HEAD locally — see `git rev-parse HEAD`. Working tree is State: HEAD locally — see `git rev-parse HEAD`. Working tree is
clean. 1180 tests pass, clippy clean. clean. All workspace tests pass (~1180+; check with
`cargo test --workspace`), clippy clean.
READ FIRST (in order, before doing anything): READ FIRST (in order, before doing anything):
1. SESSION_HANDOFF.md — this file 1. SESSION_HANDOFF.md — this file
@@ -402,12 +456,14 @@ DECISION TO ASK THE PLAYER FIRST:
tiled-pattern asset or shader; pulse needs to layer on top tiled-pattern asset or shader; pulse needs to layer on top
of the SplashFadable timeline). Pure polish; no behaviour of the SplashFadable timeline). Pure polish; no behaviour
change. change.
C. Replay-overlay enrichments beyond the scrub bar. Tractable C. *Closed by `54005d5` + `e080b49`.* Banner-local replay-overlay
banner additions still open: a right-aligned pieces all shipped (scrub bar, ▌ label, GAME caption, MOVE
`GAME #N · MOVES` caption, a `MOVE 47/87` chip floating chip). Remaining are cross-plugin (floating MOVE chip above
above the focused card during playback. Stops short of the the focused card — needs cursor → card-position plumbing) or
screen-takeover redesign (move-log scroll, mini tableau, multi-session (full screen-takeover redesign move-log
WIN MOVE marker — multi-session, data-layer impact). scroll, mini tableau, WIN MOVE marker, data-layer impact).
Either belongs in its own decision tree the next time replay
work surfaces.
D. Card-face artwork regeneration. Generate Terminal-aesthetic D. Card-face artwork regeneration. Generate Terminal-aesthetic
card PNGs (dark face, light suit pips), then migrate card PNGs (dark face, light suit pips), then migrate
CARD_FACE_COLOUR / RED_SUIT_COLOUR / BLACK_SUIT_COLOUR / CARD_FACE_COLOUR / RED_SUIT_COLOUR / BLACK_SUIT_COLOUR /