docs(handoff): refresh post-v0.21.1 — anchor to new tag, renumber Resume menu

Mirrors the post-v0.20.0 → v0.21.0 → v0.21.1 cut-then-refresh
pattern. Cut commit (daa655a) edited only CHANGELOG; this
follow-up resets the handoff so a fresh session picks up cleanly
post-v0.21.1.

Updated:
- Last-updated header points to v0.21.1 at daa655a; opening
  paragraph summarizes the patch's three threads (icon,
  accessibility, card-visual iteration with two bug fixes).
- Status at pause: tests bumped to 1192 (net +8 from
  v0.21.0's 1184); tags list extended through v0.21.1.
- "Since the v0.21.0 cut" → "Since the v0.21.1 cut" with the
  closure narratives dropped (now in CHANGELOG.md § [0.21.1]).
  Section reset to "no threads in flight" placeholder so
  future post-cut work has a clean starting point.
- Resume prompt menu trimmed: A and F closure entries dropped
  (preserved in CHANGELOG); remaining options renumbered A-E
  with the v0.21.1 closure callouts inline. New option E
  added: "extend HC through chrome borders + reduce-motion to
  splash/warning-chip" — both small finite items that v0.21.1
  flagged as future scope.
- Workflow notes gain the doc-vs-implementation-drift pattern
  observation from the pile-marker fix: when a module's
  top-level doc comment claims "X happens" but no code enforces
  it, the gap is invisible until a player notices the missing
  behaviour. Worth checking such claims and adding tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-08 12:59:24 -07:00
parent daa655a0af
commit 279a834f9d
+53 -81
View File
@@ -1,75 +1,46 @@
# Solitaire Quest — Session Handoff # Solitaire Quest — Session Handoff
**Last updated:** 2026-05-08 — **v0.21.0 cut and tagged at `04f9bf9`**, **Last updated:** 2026-05-08 — **v0.21.1 cut and tagged at `daa655a`**,
working tree clean, all post-tag work pushed to origin. working tree clean, all post-tag work pushed to origin.
v0.21.0 closes the visual-identity arc opened in v0.20.0. Three v0.21.1 is a patch release for the post-v0.21.0 work: closes
through-lines landed in this cycle: the **card-face / suit / Resume-prompt Options A (app icon — runtime `Window::icon` plus
card-back artwork migration** that v0.20.0 deliberately deferred the 9-size PNG hierarchy) and F (high-contrast + reduce-motion
(both rendering paths in lockstep — `assets/cards/*.png` fallback accessibility modes — Settings flags wired through engine and
plus the bundled-default theme SVGs at UI). Plus a card-visual iteration cycle that moved through three
`solitaire_engine/assets/themes/default/*.svg` that states (v0.21.0 Terminal pink/gray → brief 4-colour-deck
`include_bytes!()`-embed into the binary), the **splash boot- experiment → traditional 2-colour Microsoft-Solitaire-on-dark-mode
screen + replay-overlay polish** that closed Resume-prompt red/near-white) and two visible-bug fixes (suit-coloured border
Options B and C, and a late-cycle **`ACCENT_PRIMARY` palette anti-aliasing artifact at rounded corners, pile-marker
swap** from cyan `#6fc2ef` to brick red `#a54242` after a quick bleed-through producing "gray L" shapes at occupied piles —
stakeholder review of the shipped art. the latter implemented the previously-documented-but-not-enforced
"markers visible only at empty piles" invariant).
Full v0.21.0 detail lives in `CHANGELOG.md` § [0.21.0]. This Full v0.21.1 detail lives in `CHANGELOG.md` § [0.21.1]. This
file from here on focuses on what's *open* post-cut and how to file from here on focuses on what's *open* post-cut and how to
resume. resume.
## Status at pause ## Status at pause
- **HEAD locally:** see `git rev-parse HEAD`. The cut commit is - **HEAD locally:** see `git rev-parse HEAD`. The cut commit is
`04f9bf9`; any post-cut docs edits ride on top of that. `daa655a`; any post-cut docs edits ride on top of that.
- **HEAD on origin:** matches local. v0.21.0 is fully on origin. - **HEAD on origin:** matches local. v0.21.1 is fully on origin.
- **Working tree:** clean. No WIP outstanding. - **Working tree:** clean. No WIP outstanding.
- **`artwork/` directory:** still untracked. Intentional. - **`artwork/` directory:** still untracked. Intentional.
- **Build:** `cargo clippy --workspace --all-targets -- -D warnings` - **Build:** `cargo clippy --workspace --all-targets -- -D warnings`
clean. clean.
- **Tests:** **1184 passing / 0 failing** across the workspace - **Tests:** **1192 passing / 0 failing** across the workspace
(net +8 from v0.20.0's 1176 baseline). Detail in (net +8 from v0.21.0's 1184 baseline). Detail in
`CHANGELOG.md` § [0.21.0] § Stats. `CHANGELOG.md` § [0.21.1] § Stats.
- **Tags on origin:** `v0.9.0` through `v0.21.0`. v0.21.0 is on - **Tags on origin:** `v0.9.0` through `v0.21.1`. v0.21.1 is on
`04f9bf9`; v0.20.0 stays on `41a009a`. `daa655a`; v0.21.0 stays on `04f9bf9`; v0.20.0 stays on
`41a009a`.
## Since the v0.21.0 cut ## Since the v0.21.1 cut
Two Resume-prompt options closed post-tag (2026-05-08): No threads in flight. Working tree clean as of 2026-05-08. New
work since the cut would land here as commit narratives; for
- **Option A — App icon round** (`3eb3a26` + `716a025`). 9-size the v0.21.1 contents themselves, see `CHANGELOG.md` § [0.21.1].
PNG hierarchy in `assets/icon/` (16/24/32/48/64/128/256/512/
1024 px), generated by a new `icon_generator` example from a
shared `icon_svg` builder (Terminal `▌RS` mark on dark
`#151515` with brick-red accent). Runtime `Window::icon`
wired via `WinitWindows` on desktop only (Android draws its
launcher icon from the APK manifest). The follow-up fix
`716a025` wraps `NonSend<WinitWindows>` in `Option<...>`
to satisfy Bevy 0.18's stricter system-param validation —
the resource doesn't exist on the first few frames before
winit's `Resumed` event fires. New deps (target-gated
non-Android): direct `winit = "0.30"` for `Icon`
construction, direct `tiny-skia` for PNG → RGBA decode.
Pin test `icon_svg_pin` guards future rasteriser drift.
- **Option F — Accessibility modes** (`c5787c6` + `07e0357`).
High-contrast and reduce-motion settings flags wired through
the engine and surfaced as Settings panel toggles. HC boosts
`RED_SUIT_COLOUR` to `#ff8aa0` and `BLACK_SUIT_COLOUR` to
`#f5f5f5` for card text rendering; reduce-motion forces
`effective_slide_secs` to 0 regardless of `AnimSpeed`. CBM
and HC compose: lime CBM wins on red when both are on; HC
still applies to black suits when both are on. Six new
tests pin the truth tables. UI toggles sit alongside the
Color-blind row in Settings → Cosmetic; tab-walk visits
all three accessibility flags in one vertical run.
Three Resume-prompt options remain live: B (APK launch
verification), C (replay-overlay extensions), D (Toast
Warning/Error wiring), E (Phase 8 sync). The visible-payoff
pieces of the post-v0.21.0 menu have shipped; what's left is
Android runtime work, replay-overlay polish, sync infrastructure,
and toast-event sourcing.
## Open punch list ## Open punch list
@@ -232,20 +203,19 @@ into a v0.21.1 / v0.22.0 cut.
``` ```
You are a senior Rust + Bevy developer working on Solitaire Quest. You are a senior Rust + Bevy developer working on Solitaire Quest.
Working directory: <Rusty_Solitaire clone path on this machine>. Working directory: <Rusty_Solitaire clone path on this machine>.
Branch: master. v0.21.0 is tagged at 04f9bf9 (cut 2026-05-08). Branch: master. v0.21.1 is tagged at daa655a (cut 2026-05-08, a
Working tree clean. v0.21.0 closed the visual-identity arc that patch release rolling up app-icon, accessibility modes, and the
v0.20.0 deferred — full Terminal cards on both rendering paths card-visual iteration cycle that closed Resume-prompt Options A
(asset PNGs + bundled-default theme SVGs), splash boot screen, and F). v0.21.0 stays at 04f9bf9. Working tree clean. See
replay-overlay banner enrichments, and a project-wide ACCENT_PRIMARY CHANGELOG.md § [0.21.1] for full detail of what shipped in the
swap from cyan to brick red `#a54242`. See CHANGELOG.md § [0.21.0] patch release.
for full detail.
State: HEAD locally — see `git rev-parse HEAD`. All workspace tests State: HEAD locally — see `git rev-parse HEAD`. All workspace tests
pass (1184+; check with `cargo test --workspace`), clippy clean. pass (1192+; 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
2. CHANGELOG.md — [0.21.0] section is the most recent cut 2. CHANGELOG.md — [0.21.1] section is the most recent cut
3. CLAUDE.md — unified-3.0 rule set 3. CLAUDE.md — unified-3.0 rule set
4. CLAUDE_SPEC.md — formal architecture spec 4. CLAUDE_SPEC.md — formal architecture spec
5. ARCHITECTURE.md — crate responsibilities + data flow 5. ARCHITECTURE.md — crate responsibilities + data flow
@@ -260,38 +230,34 @@ READ FIRST (in order, before doing anything):
fresh machine) fresh machine)
DECISION TO ASK THE PLAYER FIRST: DECISION TO ASK THE PLAYER FIRST:
A. *Closed 2026-05-08 by `3eb3a26` + `716a025`.* App icon A. APK launch verification on AVD / device — `adb install` +
round — runtime `Window::icon` wired plus a 9-size PNG
hierarchy at `assets/icon/`. `.ico` / `.icns` bundle
formats stay open if the project later ships as a
packaged macOS / Windows app.
B. APK launch verification on AVD / device — `adb install` +
`adb logcat` to shake out runtime bugs the build / unit `adb logcat` to shake out runtime bugs the build / unit
tests can't catch. Likely surfaces JNI ClipboardManager tests can't catch. Likely surfaces JNI ClipboardManager
and Android Keystore stubs that need real bridges. Larger and Android Keystore stubs that need real bridges. Larger
scope; needs an Android device or emulator running. scope; needs an Android device or emulator running.
C. Replay-overlay extensions — either the floating `MOVE N/M` (Was Resume-prompt B before the post-v0.21.1 menu trim.)
B. Replay-overlay extensions — either the floating `MOVE N/M`
chip above the focused card (smaller, cross-plugin; needs chip above the focused card (smaller, cross-plugin; needs
cursor → card-position plumbing in `card_plugin`) or the cursor → card-position plumbing in `card_plugin`) or the
full screen-takeover redesign (multi-session: move-log full screen-takeover redesign (multi-session: move-log
scroll, mini tableau preview, WIN MOVE marker, data-layer scroll, mini tableau preview, WIN MOVE marker, data-layer
impact for `Replay::win_move_index`). impact for `Replay::win_move_index`).
D. Toast Warning / Error variant wiring. UI infrastructure C. Toast Warning / Error variant wiring. UI infrastructure
exists in `ToastVariant`; no in-engine event uses Warning exists in `ToastVariant`; no in-engine event uses Warning
(gold) or Error (pink) yet. Wire when a real warning- or (gold) or Error (pink) yet. Wire when a real warning- or
error-flavoured event materialises. error-flavoured event materialises.
E. Phase 8 (sync) — local storage scaffolding, self-hosted D. Phase 8 (sync) — local storage scaffolding, self-hosted
Axum server, `SolitaireServerClient` impl, GPGS stub Axum server, `SolitaireServerClient` impl, GPGS stub
wired into Settings. The biggest open arc by scope; rolls wired into Settings. The biggest open arc by scope; rolls
up several Phase Android dependencies (Keystore, up several Phase Android dependencies (Keystore,
ClipboardManager). ClipboardManager).
F. *Closed 2026-05-08 by `c5787c6` + `07e0357`.* High-contrast E. Extend high-contrast through chrome — `BORDER_SUBTLE_HC`
and reduced-motion accessibility modes — Settings flags was defined in v0.21.1 but isn't yet consumed; popover
+ UI toggles + engine wiring. Card text rendering uses edges, button borders, focus rings still use the default
HC variants when on; card slide_secs forces to 0 when non-HC tokens. Plus reduce-motion still doesn't gate
reduce-motion is on. Future scope: extend HC through splash scanline / cursor pulse / warning-chip pulse —
chrome borders, buttons; gate splash + warning-chip v0.21.1 only gated card slide_secs. Both are small,
animations on reduce-motion. finite, half-day scope.
WORKFLOW NOTES: WORKFLOW NOTES:
- Use the system git config (already correct). - Use the system git config (already correct).
@@ -308,6 +274,12 @@ WORKFLOW NOTES:
migration walked past this" follow-ups that all matched migration walked past this" follow-ups that all matched
this shape — codified here so future similar work can this shape — codified here so future similar work can
pattern-match instead of rediscovering. pattern-match instead of rediscovering.
- Doc-vs-implementation drift pattern: v0.21.1's pile-marker
visibility fix (`4d48cad`) implemented an invariant that
had been declared in a module doc comment but was never
enforced in code. When future work touches a module with
a "this does X" doc comment, verify the code actually does
X and add a test if not. Two layers, two checks.
OPEN AT THE START: ask which of AF. Don't pick unilaterally. OPEN AT THE START: ask which of AE. Don't pick unilaterally.
``` ```