Mirrors the v0.20.0 → post-cut refresh pattern (commita65e5b8): the cut commit (04f9bf9) only edits CHANGELOG.md; this follow-up resets the handoff so it serves a fresh session cleanly rather than carrying forward the v0.20.0-era narrative as cruft. Removed (now redundant with CHANGELOG.md § [0.21.0]): - The full "Since the v0.20.0 cut (un-pushed)" section — ~300 lines of per-commit narratives for the post-tag work. - The "What shipped in v0.20.0 (frozen at41a009a)" section — v0.20.0 detail lives in CHANGELOG.md § [0.20.0]. Replaced with: - Short header pointing to CHANGELOG.md § [0.21.0] for cycle detail. - "Since the v0.21.0 cut" placeholder ("No threads in flight"). Refreshed: - Status at pause: HEAD on origin matches local; latest tag v0.21.0 at 04f9bf9; tests 1184; references to v0.20.0 baseline preserved as audit trail. - Visual-identity follow-ups: dropped the closed entries (card-face arc, splash polish, replay banner pieces). Added what's still open: replay screen-takeover redesign, floating MOVE chip above focused card, toast Warning/Error wiring, high-contrast accessibility, reduced-motion accessibility. - Canonical remote: dropped the "unpushed commits" warning since origin is caught up. - Design direction palette: brick-red primary instead of cyan, red→lime CBM swap instead of red→cyan, glyph orientation upright. v0.21.0 source commits cited. - Resume prompt: rebased to v0.21.0 anchor. Decision options rewritten — closed B/C/D dropped; live A/E/F renumbered into fresh A/B/C plus three new candidates (Toast variants, Phase 8 sync, accessibility modes). Workflow notes gain the token-port-pattern lesson from v0.21.0's three "fallback path the migration walked past" follow-ups. Net diff: −513 / +117 lines; file shrinks from 668 to 272. v0.20.0 historical context preserved in CHANGELOG.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
13 KiB
Solitaire Quest — Session Handoff
Last updated: 2026-05-08 — v0.21.0 cut and tagged at 04f9bf9,
working tree clean, all post-tag work pushed to origin.
v0.21.0 closes the visual-identity arc opened in v0.20.0. Three
through-lines landed in this cycle: the card-face / suit /
card-back artwork migration that v0.20.0 deliberately deferred
(both rendering paths in lockstep — assets/cards/*.png fallback
plus the bundled-default theme SVGs at
solitaire_engine/assets/themes/default/*.svg that
include_bytes!()-embed into the binary), the splash boot-
screen + replay-overlay polish that closed Resume-prompt
Options B and C, and a late-cycle ACCENT_PRIMARY palette
swap from cyan #6fc2ef to brick red #a54242 after a quick
stakeholder review of the shipped art.
Full v0.21.0 detail lives in CHANGELOG.md § [0.21.0]. This
file from here on focuses on what's open post-cut and how to
resume.
Status at pause
- HEAD locally: see
git rev-parse HEAD. The cut commit is04f9bf9; any post-cut docs edits ride on top of that. - HEAD on origin: matches local. v0.21.0 is fully on origin.
- Working tree: clean. No WIP outstanding.
artwork/directory: still untracked. Intentional.- Build:
cargo clippy --workspace --all-targets -- -D warningsclean. - Tests: 1184 passing / 0 failing across the workspace
(net +8 from v0.20.0's 1176 baseline). Detail in
CHANGELOG.md§ [0.21.0] § Stats. - Tags on origin:
v0.9.0throughv0.21.0. v0.21.0 is on04f9bf9; v0.20.0 stays on41a009a.
Since the v0.21.0 cut
No threads in flight. Working tree clean as of 2026-05-08. New
work since the cut would land here as commit narratives; for the
v0.21.0 contents themselves, see CHANGELOG.md § [0.21.0].
Open punch list
Phase Android (build + persistence shipped; runtime gaps remain)
- APK launch verification on AVD / device.
adb installthenadb logcatagainst thebevy_testAVD or an x86_64 device. The build works and persistence is wired, but no end-to-end device run has been logged. Shakes out runtime bugs the build + unit tests can't catch. - JNI ClipboardManager bridge. Replaces the Android stub for
the Stats "Copy share link" toast.
arboarddoesn't ship an Android backend; small custom JNI call. - Android Keystore for credentials.
keyringis target-gated to a stub returningKeychainUnavailable; replace with Android Keystore via JNI when sync auth ships on mobile. - Google Play Games (gpgs) integration. Listed as a Phase-Android target since Phase 1; now unblocked by the build target.
- Cosmetic
cargo apk build --libworkaround. Post-sign panic doesn't affect the APK on disk but produces noisy stderr. Either upstream a cargo-apk fix or document--libas canonical in the runbook.
Visual-identity follow-ups (post-v0.21.0)
The visual-identity arc is effectively complete: token system,
chrome migration, splash boot screen, replay-overlay banner,
card-face artwork (both rendering paths), and the ACCENT_PRIMARY
palette refresh all shipped in v0.20.0 + v0.21.0. What stays open:
- Replay-overlay screen-takeover redesign. The full mockup
(
docs/ui-mockups/replay-overlay-mobile.html) calls for a mini-tableau preview, playback controls, move-log scroll, and a WIN MOVE marker on the scrub bar. Banner-local pieces all shipped in v0.21.0 (c84d9f4+6204db8+54005d5+e080b49); the screen-takeover is a multi-session redesign with data-layer impact (move-log scroller; WIN MOVE needs awin_move_indexfield onReplaythat doesn't yet exist). - Floating
MOVE N/Mchip above the focused card during playback. Cross-plugin work —update_progress_textwrites the banner chip but the card-position lookup belongs incard_plugin. Smaller scope than the screen-takeover. - Toast Warning / Error variants.
ToastVarianthas slots forWarning(gold) andError(pink) but no in-engine event uses them yet. Wire when a warning- or error-flavoured toast event materialises. - High-contrast accessibility mode.
design-system.mdline 274 mentions it (boost foreground from#d0d0d0to#f5f5f5, suit-red from#fb9fb1to#ff8aa0). Not implemented; no Settings toggle. - Reduced-motion mode for card lift / drop transitions.
design-system.mdaccessibility item, separate from artwork. Not implemented.
Carried forward from v0.19.0
- App icon round.
Window::iconnot yet wired; no.icns/.ico/ Linux hicolor PNG hierarchy. The 11-size icon export the v0.19 handoff referenced is not currently inartwork/(currentartwork/holds the reverted Rusty Pixel card PNGs and is intentionally untracked); icon-export needs to be re-run before this item can be picked up. Half-day task once the PNGs are back in place. No cert dependency.
Other small candidates
- Prev/Next selector chips spawn site. v0.19.0's
9b065e5noted Prev/Next markers exist instats_pluginbut no spawn site renders them today — the Shareable badge therefore lands on the single-replay caption. If/when Prev/Next is plumbed, the badge will need to follow. - Toast queue / immediate unification. The two toast paths
(
spawn_queued_toastforInfoToastEventqueue;spawn_toastfor fire-and-forget) now share visual treatment but remain separate functions because they serve different temporal needs (sequential vs. parallel). If overlap becomes a UX issue, merge into one queue with priority lanes.
Process notes
- The desktop-adaptation spec is the canonical reference for
geometry decisions when porting any future plugin. Read
docs/ui-mockups/desktop-adaptation.mdfirst; apply the universal rules to every surface; consult the per-screen table for the priority surfaces. The 9 missing-plugin screens (splash now ported; eight remaining) inherit the universal rules without dedicated guidance. - Stitch
generate_variantsis unreliable for layout-only adaptation prompts as of 2026-05-07. The first call timed out and no variant ever landed inlist_screens. If a future session wants visual desktop mockups, prefergenerate_screen_from_textwith a fresh narrow prompt per screen rather thangenerate_variantsagainst existing mobile screens. - Token-port pattern. v0.20.0's chrome-migration commits
set a reusable shape for "centralised design system applied
across N plugins":
- Constants module (
ui_theme.rs) is the source of truth. - Const sites that can't call
Alpha::with_alpha(not yetconston stable) use a literal RGB matching the token, with a unit test pinning the RGB to the token (e.g.MARKER_VALID,HINT_PILE_HIGHLIGHT_COLOUR,RIGHT_CLICK_HIGHLIGHT_COLOUR). - Cross-plugin duplication (e.g.
MARKER_DEFAULT↔PILE_MARKER_DEFAULT_COLOUR) collapses to a single promoted const re-exported from one plugin and imported by the other — replaces "kept in sync" doc comments with a compile-time invariant. - Domain colours (suit pips, card faces, lerp helpers) stay as literals with a comment naming the rationale; only UI chrome routes through tokens.
- Constants module (
SplashFadablescaffolding pattern (introduced incacb19c). Any future overlay that needs to fadeN >> 3elements together should follow the same shape: one tiny marker carrying the full-alpha base colour, one global query that lerps every marker's alpha each frame, no per-element query plumbing. Cleanly outscales theWithout<X>, Without<Y>query exclusion pattern that the old splash was hitting at three siblings.
Canonical remote
github.com/funman300/Rusty_Solitaire is the canonical repo.
Always push there. As of v0.21.0 origin matches local; the next
push happens when post-cut work accumulates and is ready to roll
into a v0.21.1 / v0.22.0 cut.
Design direction (Terminal — base16-eighties)
- Tone: retro-terminal / synthwave — flat depth (no box-shadows), monospaced-forward typography (JetBrains Mono / FiraMono), tight 16 px edge margins, 8 px card radius.
- Palette: near-black surface ramp (
#151515/#202020/#2a2a2a/#353535), brick-red primary CTA (#a54242— swapped from cyan#6fc2efin v0.21.0 commita292a7e), lime success (#acc267), gold warning (#ddb26f), pink error / suit-red (#fb9fb1), lavender celebration (#e1a3ee), teal info (#12cfc0). - Two-color suits. Red =
#fb9fb1, black =#d0d0d0. Outlined glyphs for diamonds & clubs are always on; the Settings "color-blind mode" toggle swaps red → lime#acc267(was red → cyan pre-v0.21.0; lime is the next-best non-red base16-eighties accent now that the primary itself is red). - Card glyphs render upright in both corners — no 180°
inverted-corner-indicator rotation. Single-orientation
digital play doesn't benefit from the traditional flip-
readback convention.
design-system.md§ Game Cards documents this deliberate deviation.
Resume prompt
You are a senior Rust + Bevy developer working on Solitaire Quest.
Working directory: <Rusty_Solitaire clone path on this machine>.
Branch: master. v0.21.0 is tagged at 04f9bf9 (cut 2026-05-08).
Working tree clean. v0.21.0 closed the visual-identity arc that
v0.20.0 deferred — full Terminal cards on both rendering paths
(asset PNGs + bundled-default theme SVGs), splash boot screen,
replay-overlay banner enrichments, and a project-wide ACCENT_PRIMARY
swap from cyan to brick red `#a54242`. See CHANGELOG.md § [0.21.0]
for full detail.
State: HEAD locally — see `git rev-parse HEAD`. All workspace tests
pass (1184+; check with `cargo test --workspace`), clippy clean.
READ FIRST (in order, before doing anything):
1. SESSION_HANDOFF.md — this file
2. CHANGELOG.md — [0.21.0] section is the most recent cut
3. CLAUDE.md — unified-3.0 rule set
4. CLAUDE_SPEC.md — formal architecture spec
5. ARCHITECTURE.md — crate responsibilities + data flow
6. docs/ui-mockups/ — design system + 24-mockup library +
desktop-adaptation.md (the rules-based
companion to the mockups; read this
before any plugin port)
7. docs/android/* — Android setup + build runbook
8. ~/.claude/projects/<this-project>/memory/MEMORY.md
— saved feedback / project context
(machine-local; may be missing on a
fresh machine)
DECISION TO ASK THE PLAYER FIRST:
A. App icon round — re-run artwork/Icon Export.html (the
export PNGs are not currently in `artwork/`), then wire
Window::icon + generate .icns / .ico / Linux hicolor PNG
hierarchy. Half-day task. No cert dependency. Pure
desktop work.
B. APK launch verification on AVD / device — `adb install` +
`adb logcat` to shake out runtime bugs the build / unit
tests can't catch. Likely surfaces JNI ClipboardManager
and Android Keystore stubs that need real bridges. Larger
scope than A; needs an Android device or emulator running.
C. Replay-overlay extensions — either the floating `MOVE N/M`
chip above the focused card (smaller, cross-plugin; needs
cursor → card-position plumbing in `card_plugin`) or the
full screen-takeover redesign (multi-session: move-log
scroll, mini tableau preview, WIN MOVE marker, data-layer
impact for `Replay::win_move_index`).
D. Toast Warning / Error variant wiring. UI infrastructure
exists in `ToastVariant`; no in-engine event uses Warning
(gold) or Error (pink) yet. Wire when a real warning- or
error-flavoured event materialises.
E. Phase 8 (sync) — local storage scaffolding, self-hosted
Axum server, `SolitaireServerClient` impl, GPGS stub
wired into Settings. The biggest open arc by scope; rolls
up several Phase Android dependencies (Keystore,
ClipboardManager).
F. High-contrast and reduced-motion accessibility modes.
Both flagged in design-system.md but unimplemented; needs
Settings toggles + token alternates.
WORKFLOW NOTES:
- Use the system git config (already correct).
- When attributing playtester feedback in commits/docs, use
"Quat" not "Rhys" (saved feedback memory).
- Sub-agents stage + verify only; orchestrator commits.
- Every commit must pass build / clippy / test before pushing.
- Push to GitHub (origin) — gh auth setup-git wired on
primary dev box; verify on laptop before first push.
- Token-port pattern: when migrating tokens, walk every
concrete artifact downstream of the token (PNG textures,
embedded SVGs, hardcoded literals, comment color names),
not just the token name. v0.21.0 surfaced three "the
migration walked past this" follow-ups that all matched
this shape — codified here so future similar work can
pattern-match instead of rediscovering.
OPEN AT THE START: ask which of A–F. Don't pick unilaterally.