CHANGELOG.md gains a [0.18.0] section synthesising the 24 commits since v0.17.0: the Restore prompt + auto-show Home picker launch flow, MSSC-style picker (header chips, draw-mode chips, picture tiles with FiraMono-covered glyphs, Today's Event callout), the last solver hot path moving onto AsyncComputeTaskPool with cancel-on-replace, "Won before" HUD chip, "Copy share link" Stats button via arboard, the N-key flow finally routing through the real Confirm/Cancel modal, Esc-on-modal layering fixes, and the unified-3.0 Claude rule set adoption. SESSION_HANDOFF.md (root) refreshed to reflect HEAD at v0.17.0-24-gc497c31, the carryover punch list trimmed (items B and C shipped, A partially shipped, D unchanged), and a new Process notes section describing the test-discipline prune and the smaller-port template the async hint work should follow. Build: cargo clippy --workspace --all-targets -- -D warnings clean. Tests: 1166 passing / 0 failing (one flake on auto_save_writes_after_30_seconds reproduced clean on re-run; passes in isolation). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
9.2 KiB
Solitaire Quest — Session Handoff
Last updated: 2026-05-06 (post-v0.18.0 draft) — 24 commits since
the v0.17.0 tag bundle the launch-experience round (Restore prompt +
auto-show Home / mode picker), the MSSC-style Home picker rework
(header chips, draw-mode chips, picture-tile mode cards, Today's
Event callout, glyph fixes), the last solver hot path moving onto
AsyncComputeTaskPool, "Won before" HUD chip, "Copy share link"
Stats button, the N keybinding finally routing through the real
Confirm/Cancel modal, Esc-on-modal layering fixes, and the
unified-3.0 Claude rule set (CLAUDE.md / CLAUDE_SPEC.md /
CLAUDE_WORKFLOW.md / CLAUDE_PROMPT_PACK.md). Test-discipline prune
removed 43 low-value tests in the same window.
Status at pause
- HEAD on origin:
v0.17.0-24-gc497c31(24 ahead of v0.17.0, not yet tagged). - Working tree: clean.
- Build:
cargo clippy --workspace --all-targets -- -D warningsclean (verified this session). - Tests: 1166 passing / 0 failing across the workspace
(verified this session). The first run flaked once on
solitaire_engine::game_plugin::tests::auto_save_writes_after_30_seconds— a one-frameapp.update()test that depends ontime.delta_secs()on an otherwise-freshApp. Reproduced clean on the second run; passes in isolation. Worth tightening if it flakes again, but not blocking the v0.18.0 cut. - Tags on origin:
v0.9.0throughv0.17.0. - CHANGELOG: v0.18.0 entry drafted in
[Unreleased]'s slot — ready for tag once build + tests are reverified.
Where we are
v0.17.0's punch list had four candidates (A–D); two of the three non-packaging items shipped in this round:
- B — "Won previously" HUD indicator: shipped in
bdac754. - C — Replay sharing: shipped in
540869c("Copy share link" Stats button + clipboard viaarboard, in-memoryLastSharedReplayUrl).
Item A (solver-on-AsyncComputeTaskPool) shipped partially in
d489e7a — the winnable-only seed-selection path is now async with
cancel-on-replace. The hint path (H key,
try_solve_with_first_move / try_solve_from_state) is still
synchronous. The proven PendingNewGameSeed template is the
template for the hint port.
Item D (desktop packaging) is unchanged — still gated on artwork + signing certs from the player.
The launch experience is also substantially different from v0.17.0: on first launch with a saved game the player now sees the Restore prompt; on every launch (after splash + restore resolution) they see the auto-show Home / mode picker.
Design direction (unchanged)
- Tone: Balatro — chunky readable type, theatrical hierarchy, satisfying micro-interactions.
- Palette: Midnight Purple base + Balatro yellow primary + warm magenta secondary.
- See
~/.claude/projects/-home-manage-Rusty-Solitare/memory/project_ux_overhaul_2026-04.md(machine-local).
Canonical remote
github.com/funman300/Rusty_Solitaire is the canonical repo.
Always push there.
v0.18.0 (drafted 2026-05-06, not yet tagged)
| Area | Commit | What landed |
|---|---|---|
| Restore prompt | 3c7a0eb + f863d85 |
Welcome-back modal on launch when an in-progress save exists; save preserved across exits while the prompt is unanswered. |
| Async winnable-only seeds | d489e7a |
PendingNewGameSeed resource + poll_pending_new_game_seed running .before(GameMutation). Fixes the worst-case 6 s UI stall on a New Game click. Cancel-on-replace contract covered by tests. |
| Won-before HUD chip | bdac754 |
Reads ReplayHistoryResource; lights ✓ Won before on tier-2 row when current (seed, draw_mode, mode) is in history. |
| Copy share link | 540869c |
arboard clipboard + new Stats button + SyncProvider::push_replay returning the share URL. In-memory only; per-session sharing. |
| MSSC Home picker | ae40a1d, b73d246, 9fe650f, 40d6e0a, c30b04e, d065d49 |
Header stats strip (clickable → Profile), draw-mode chips, per-mode score/streak chips, Today's Event callout on Daily, picture-tile 2-up grid with FiraMono-covered glyphs (♣ ◆ ○ ▲ →). |
| Auto-show Home | dd63261, b7c3a49, c497c31 |
Auto-shows after splash; gated on Restore prompt; freezes timers (elapsed + Time Attack) while up. |
N opens real modal |
93660c2 |
Removes the "Press N again" double-tap; routes through ConfirmNewGameScreen. Shift+N retains the bypass. |
| Win Summary keyboard | 17e0737 |
Enter dismisses + starts a fresh deal. |
| Esc-on-modal fixes | 08b006f, d48b948, 9aa0dd2 |
Esc no longer opens Pause underneath the modal it just closed; Home maps Esc to Cancel; Restore maps Esc to Continue; topmost-modal-wins when Profile stacks on Home. |
| Layout fixes | a4bc063, cc63532 |
Settings rows full-width with label-spacer-cluster; popover rows excluded from action-bar auto-fade. |
| Empty-state copy | 56e2e6f |
Leaderboard / Achievements onboarding hints; volume hotkeys emit toast feedback. |
| Test prune | a49a340 |
−43 low-value tests; future briefs request behaviour contracts only. |
| Docs unified-3.0 | f2f30c8 |
Adopts CLAUDE.md / CLAUDE_SPEC.md / CLAUDE_WORKFLOW.md / CLAUDE_PROMPT_PACK.md; trims duplicated rule passages. |
Open punch list
Carried forward from v0.17.0
- Solver-on-
AsyncComputeTaskPoolfor the H-key hint — remaining synchronous solver hot path. The seed-selection port ind489e7ais the template:PendingHintTaskresource, polling system running.before(GameMutation), cancel-on-replace, fall back to the heuristic on inconclusive. Diff should stay scoped toinput_plugin.rsplus a smallpending_hint.rs. - Desktop packaging per
ARCHITECTURE.md §17. Arch PKGBUILD exists in/home/manage/solitaire-quest-pkgbuild/(separate repo). Pending: app icon, macOS.icns+ notarisation cert, Windows.ico+ Authenticode cert, AppImage recipe.
New this round
- Persistent share link.
LastSharedReplayUrlis in-memory only — the player must share within the session of the win. If cross-session sharing turns into a real ask, persist alongside the rolling replay history. - Per-mode artwork. Picture tiles use Unicode glyphs as
placeholders chosen from FiraMono's actual coverage. When real
artwork lands, swap each tile's
Textnode for anImagenode — tile layout, focus order, click handling, and chip rendering are unchanged.
Process notes (from this round)
- Test inflation pattern (resolved this round): older agent
briefs reflexively asked for ≥3 tests per feature, producing 43
low-value coverage entries on stdlib/serde-derive mechanics. Going
forward, ask for tests that pin behaviour contracts or
regressions on real bugs only. See
feedback_test_discipline.mdin auto-memory. - Solver async refactor sequencing (worked this round): rather
than porting the whole solver-on-main-thread surface in one PR
(the rollback case from before v0.17.0), the
PendingNewGameSeedwork shipped one well-bounded path with two tests covering the happy path and cancel-on-replace. The hint port should follow the same shape.
Resume prompt
You are a senior Rust + Bevy developer working on Solitaire Quest.
Working directory: <Rusty_Solitaire clone path on this machine>.
Branch: master. Direction is OPEN — v0.18.0 has been drafted but
not tagged: 24 commits past v0.17.0 cover the launch-experience
round, MSSC Home picker, async winnable-only seeds, Won-before
HUD, Copy share link, N-key flow rework, Esc-layering fixes, and
the unified-3.0 Claude rule set.
State: HEAD at v0.17.0-24-gc497c31. Working tree clean.
CHANGELOG.md has the v0.18.0 entry slotted under [Unreleased].
READ FIRST (in order, before doing anything):
1. SESSION_HANDOFF.md — this file
2. CHANGELOG.md — v0.18.0 draft entry
3. CLAUDE.md — unified-3.0 rule set
4. CLAUDE_SPEC.md — formal architecture spec
5. ARCHITECTURE.md — crate responsibilities + data flow
6. ~/.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. Tag v0.18.0 — promote `[Unreleased]` to `[0.18.0]` (already
done in this session's draft), reverify build + clippy +
tests, tag, push. Mechanical close-out.
B. Solver-on-AsyncComputeTaskPool for the H-key hint, using the
`d489e7a` seed-selection port as template. Last synchronous
solver hot path. Smallest delta on the open punch list.
C. Desktop packaging — needs artwork + signing certs from the
player; can't be driven by the agent alone.
D. Persistent share link — store the URL alongside replay
history so cross-session sharing works.
WORKFLOW NOTES:
- Commits use:
git -c user.name=funman300 -c user.email=root@vscode.infinity \
commit -m "..."
- 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) — that is the canonical remote.
OPEN AT THE START: ask which of A–D. Don't pick unilaterally.