bfcd05fbb5
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>
180 lines
9.2 KiB
Markdown
180 lines
9.2 KiB
Markdown
# 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 warnings`
|
||
clean (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-frame `app.update()` test that depends on `time.delta_secs()`
|
||
on an otherwise-fresh `App`. 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.0` through `v0.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 via `arboard`, in-memory `LastSharedReplayUrl`).
|
||
|
||
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-`AsyncComputeTaskPool` for the H-key hint** —
|
||
remaining synchronous solver hot path. The seed-selection port
|
||
in `d489e7a` is the template: `PendingHintTask` resource, polling
|
||
system running `.before(GameMutation)`, cancel-on-replace, fall
|
||
back to the heuristic on inconclusive. Diff should stay scoped
|
||
to `input_plugin.rs` plus a small `pending_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.** `LastSharedReplayUrl` is 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 `Text` node for an `Image` node
|
||
— 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.md` in 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
|
||
`PendingNewGameSeed` work 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.
|
||
```
|