docs(handoff): record double-tap, Play-by-Seed, handle_fullscreen gate; 1292 tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-08 20:32:23 -07:00
parent 45436d0eda
commit 585570559c
2 changed files with 89 additions and 36 deletions
+43 -5
View File
@@ -6,8 +6,10 @@ project follows [Semantic Versioning](https://semver.org/).
## [Unreleased] ## [Unreleased]
**`202a64d`** — Android APK launch fixes (2026-05-08). **`395a322`** — double-tap auto-move (2026-05-08).
**`16242e6`** — Ignore .idea/ IDE files (2026-05-08). **`0cb1587`** — Play-by-Seed dialog (2026-05-08).
**`2062bd0`** — 75 new challenge seeds + gen_seeds binary (2026-05-08).
**`45436d0`** — gate handle_fullscreen to non-Android (2026-05-08).
See [0.21.9] for the committed detail once cut. See [0.21.9] for the committed detail once cut.
## [0.21.9] — pending cut ## [0.21.9] — pending cut
@@ -46,8 +48,43 @@ v0.19.0.
`clippy::assertions_on_constants` (constant-fold at compile time `clippy::assertions_on_constants` (constant-fold at compile time
rather than a runtime no-op). rather than a runtime no-op).
### Added (post-cut, same pending release)
- **Double-tap auto-move on touch screens** (`395a322`).
`handle_double_tap` fires `MoveRequestEvent` (single card to
foundation/tableau, or a whole face-up stack via
`best_tableau_destination_for_stack`) when two `TouchPhase::Ended`
events on the same card arrive within `DOUBLE_TAP_WINDOW` (0.5 s,
slightly wider than the mouse `DOUBLE_CLICK_WINDOW` to account for
touch latency). If no legal destination exists, fires
`MoveRejectedEvent` (audio + visual rejection feedback). The system
is inserted into the touch drag chain immediately before
`touch_end_drag` so `DragState.active_touch_id` and `committed` are
still readable; the tap timestamp is tracked in a `Local<HashMap<u32,
f32>>` keyed by card ID.
- **Play-by-Seed dialog** (`0cb1587`).
`PlayBySeedPlugin` adds a numeric-input modal that accepts a decimal
seed, runs a solver preview in the background (debounced 500 ms via
`AsyncComputeTaskPool`), and shows a win/no-win verdict before
dealing. A new `HomeMode::PlayBySeed` card in the home overlay fires
`StartPlayBySeedRequestEvent`; the handler in `PlayBySeedPlugin`
spawns the dialog. Digit, Backspace, Enter (confirm), and Escape
(cancel) are handled via `ButtonInput<KeyCode>`. Five unit tests
cover spawn, digit append, buffer read, confirm, and cancel paths.
- **75 new challenge seeds** (`2062bd0`).
New `gen_seeds` binary in `solitaire_assetgen` brute-searches seeds
in the `0xCAFEBABE…` namespace and filters for hands solvable in
≤250 moves via the core solver. The 75 confirmed-win seeds are
appended to `CHALLENGE_SEEDS` in `solitaire_data::challenge`.
### Fixed (post-cut, same pending release) ### Fixed (post-cut, same pending release)
- **Gate `handle_fullscreen` to non-Android** (`45436d0`).
F11 fullscreen toggle makes no sense on Android (the OS owns window
sizing); the fn and its `MonitorSelection`/`WindowMode` imports are
now `#[cfg(not(target_os = "android"))]`-gated. The `add_systems`
call is extracted as a separate statement so `#[cfg]` can annotate it
(attributes cannot appear mid-chain in Rust).
- **Android APK launch: export `android_main`** (`202a64d`). - **Android APK launch: export `android_main`** (`202a64d`).
`NativeActivity` dlopen-s `libsolitaire_app.so` and calls `NativeActivity` dlopen-s `libsolitaire_app.so` and calls
`android_main` as its entry point. Without the symbol the app `android_main` as its entry point. Without the symbol the app
@@ -77,10 +114,11 @@ confirmed end-to-end device run.
### Stats ### Stats
- Tests: 1282 passing / 0 failing (unchanged) - Tests: **1292 passing** / 0 failing (+10 from double-tap + Play-by-Seed tests)
- Clippy: clean - Clippy: clean
- Crates touched: `solitaire_engine` (stats_plugin.rs, - Crates touched: `solitaire_engine` (input_plugin, events, home_plugin,
replay_overlay.rs), `solitaire_app` (lib.rs, .gitignore) play_by_seed_plugin, lib), `solitaire_app` (lib.rs), `solitaire_data`
(challenge.rs), `solitaire_assetgen` (gen_seeds binary, Cargo.toml)
## [0.21.8] — 2026-05-08 ## [0.21.8] — 2026-05-08
+46 -31
View File
@@ -1,8 +1,7 @@
# Solitaire Quest — Session Handoff # Solitaire Quest — Session Handoff
**Last updated:** 2026-05-08 — **v0.21.8 tagged at `c50eaf8`**; **Last updated:** 2026-05-08 — **v0.21.8 tagged at `c50eaf8`**;
three post-cut commits on master (`a449f60` Stats selector, seven post-cut commits on master. Push pending.
`202a64d` Android launch fixes, `16242e6` .gitignore). Pushed.
v0.21.8 closes the last optional polish items in the B-2 v0.21.8 closes the last optional polish items in the B-2
replay screen-takeover arc: **notch-label centering** (middle replay screen-takeover arc: **notch-label centering** (middle
@@ -19,27 +18,30 @@ resume.
## Status at pause ## Status at pause
- **HEAD locally:** `16242e6` (.gitignore fix). Docs ride on top; - **HEAD locally:** `45436d0` (handle_fullscreen Android gate).
push pending. Docs ride on top; push pending.
- **HEAD on origin:** `c0415eb` (handoff docs from prior session). - **HEAD on origin:** `395a322` (double-tap commit — last pushed).
`202a64d` and `16242e6` not yet pushed.
- **Working tree:** clean (docs uncommitted). No WIP outstanding. - **Working tree:** clean (docs uncommitted). 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:** **1282 passing / 0 failing** across the workspace. - **Tests:** **1292 passing / 0 failing** across the workspace.
- **Tags on origin:** `v0.9.0` through `v0.21.8`. - **Tags on origin:** `v0.9.0` through `v0.21.8`.
- **Android:** APK verified booting on Pixel_7 AVD (Android 14, - **Android:** APK verified booting on Pixel_7 AVD (Android 14,
x86_64). Three launch fixes committed. See Phase Android punch x86_64). All desktop-only systems (handle_fullscreen) now gated.
list for remaining work. See Phase Android punch list for remaining work.
## Since the v0.21.8 cut ## Since the v0.21.8 cut
Three commits since the v0.21.8 tag: Seven commits since the v0.21.8 tag:
- `a449f60` — Stats Prev/Next selector spawn site - `a449f60` — Stats Prev/Next selector spawn site
- `202a64d` — Android launch fixes (android_main, resize_constraints, - `202a64d` — Android launch fixes (android_main, resize_constraints,
apply_smart_default_window_size) — **closes APK launch verification** apply_smart_default_window_size) — **closes APK launch verification**
- `16242e6` — Ignore .idea/ IDE files - `16242e6` — Ignore .idea/ IDE files
- `395a322` — double-tap auto-move for touch input
- `0cb1587` — Play-by-Seed dialog + HomeMode card
- `2062bd0` — 75 new challenge seeds + gen_seeds binary
- `45436d0` — gate handle_fullscreen to non-Android
CHANGELOG + SESSION_HANDOFF docs ride on top; push pending. CHANGELOG + SESSION_HANDOFF docs ride on top; push pending.
@@ -47,7 +49,7 @@ Open next-step menu:
1. **Phase 8 (sync)** — the biggest open arc. Local storage 1. **Phase 8 (sync)** — the biggest open arc. Local storage
scaffolding, self-hosted Axum server, GPGS stub. scaffolding, self-hosted Axum server, GPGS stub.
2. **Android follow-ups** — JNI ClipboardManager, Android Keystore, 2. **Android follow-ups** — JNI ClipboardManager, Android Keystore,
GPGS, double-tap auto-move. Launch verification closed; these GPGS. Launch verification and double-tap both closed; these
are the remaining Phase Android items. are the remaining Phase Android items.
3. **Move Log auto-scroll** — only relevant if the panel 3. **Move Log auto-scroll** — only relevant if the panel
row count grows beyond the current 5-row fixed window. row count grows beyond the current 5-row fixed window.
@@ -65,6 +67,16 @@ Open next-step menu:
runtime without crash. B0004 ECS hierarchy warnings remain runtime without crash. B0004 ECS hierarchy warnings remain
(non-fatal; entity parent/child component mismatch); investigate (non-fatal; entity parent/child component mismatch); investigate
if they surface gameplay bugs. if they surface gameplay bugs.
- *Double-tap auto-move — closed 2026-05-08 by `395a322`.*
`handle_double_tap` fires `MoveRequestEvent` on two rapid
`TouchPhase::Ended` events within 0.5 s. Prefers foundation;
falls back to tableau stack move. Fires `MoveRejectedEvent` when
no legal destination exists. System runs before `touch_end_drag`
in the chain so drag state is readable.
- *F11 fullscreen gate — closed 2026-05-08 by `45436d0`.*
`handle_fullscreen` and its `MonitorSelection`/`WindowMode`
imports are `#[cfg(not(target_os = "android"))]`-gated. The
`add_systems` call is a separate statement (not mid-chain).
- **JNI ClipboardManager bridge.** Replaces the Android stub for - **JNI ClipboardManager bridge.** Replaces the Android stub for
the Stats "Copy share link" toast. `arboard` doesn't ship an the Stats "Copy share link" toast. `arboard` doesn't ship an
Android backend; small custom JNI call. Android backend; small custom JNI call.
@@ -152,6 +164,12 @@ palette refresh all shipped in v0.20.0 + v0.21.0. What stays open:
### Other small candidates ### Other small candidates
- *Play-by-Seed dialog — closed 2026-05-08 by `0cb1587`.*
`PlayBySeedPlugin` adds a numeric-input modal with async solver
preview (debounced 500 ms). `HomeMode::PlayBySeed` card fires
`StartPlayBySeedRequestEvent`. 5 unit tests. 75 new verified-win
seeds (`2062bd0`) expand `CHALLENGE_SEEDS` via the new
`solitaire_assetgen::gen_seeds` binary.
- *Prev/Next selector chips spawn site — closed 2026-05-08 by - *Prev/Next selector chips spawn site — closed 2026-05-08 by
`a449f60`.* `ReplayPrevButton` / `ReplayNextButton` / `a449f60`.* `ReplayPrevButton` / `ReplayNextButton` /
`ReplaySelectorCaption` / `ReplaySelectorDetail` now spawn in `ReplaySelectorCaption` / `ReplaySelectorDetail` now spawn in
@@ -243,21 +261,20 @@ 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.8 is tagged at c50eaf8 (cut 2026-05-08, Branch: master. v0.21.8 is tagged at c50eaf8 (cut 2026-05-08,
replay-overlay polish). One post-cut commit a449f60 is on master: replay-overlay polish). Seven post-cut commits are on master (see
Stats Prev/Next replay selector spawn site (closes the v0.19.0 "Since the v0.21.8 cut" above); push of the last four pending.
punch-list item). v0.21.7 stays at da3e542, v0.21.6 at f63db76, v0.21.7 stays at da3e542, v0.21.6 at f63db76, v0.21.5 at a2432df,
v0.21.5 at a2432df, v0.21.4 at 23ff62c, v0.21.3 at 3d92a91, v0.21.4 at 23ff62c, v0.21.3 at 3d92a91, v0.21.2 at f23df3b,
v0.21.2 at f23df3b, v0.21.1 at daa655a, v0.21.0 at 04f9bf9. v0.21.1 at daa655a, v0.21.0 at 04f9bf9.
Working tree: uncommitted CHANGELOG + SESSION_HANDOFF docs; push Working tree: uncommitted CHANGELOG + SESSION_HANDOFF docs; push
pending (master + v0.21.8 tag). See CHANGELOG.md § [0.21.9] for pending. See CHANGELOG.md § [0.21.9] for full detail.
full detail.
State: HEAD locally — see `git rev-parse HEAD`. Workspace State: HEAD locally — see `git rev-parse HEAD`. Workspace
tests: 1282 passing / 0 failing. Clippy clean. tests: 1292 passing / 0 failing. 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.6] section is the most recent cut 2. CHANGELOG.md — [0.21.9] section has the pending-cut items
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
@@ -272,20 +289,18 @@ READ FIRST (in order, before doing anything):
fresh machine) fresh machine)
DECISION TO ASK THE PLAYER FIRST: DECISION TO ASK THE PLAYER FIRST:
A. APK launch verification on AVD / device — `adb install` + A. Android follow-ups — JNI ClipboardManager bridge (arboard
`adb logcat` to shake out runtime bugs the build / unit has no Android backend), Android Keystore (blocked on Phase 8),
tests can't catch. Likely surfaces JNI ClipboardManager GPGS integration. Launch verification + double-tap are closed.
and Android Keystore stubs that need real bridges. Larger B. Phase 8 (sync) — local storage scaffolding, self-hosted
scope; needs an Android device or emulator running.
B. Replay-overlay arc — **fully closed** as of v0.21.8 (15
commits across v0.21.4v0.21.8). Stats Prev/Next selector
spawn site closed by `a449f60` (post-v0.21.8). No known
UI punch-list items remain open.
C. 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).
C. Play-by-Seed polish — the dialog is functional but has no
visual preview of the solver verdict in the UI yet; the
HomeMode card is wired but the dialog spawn site and verdict
display could use a second pass.
WORKFLOW NOTES: WORKFLOW NOTES:
- Use the system git config (already correct). - Use the system git config (already correct).
@@ -311,7 +326,7 @@ WORKFLOW NOTES:
OPEN AT THE START: ask which of AC. Don't pick unilaterally. OPEN AT THE START: ask which of AC. Don't pick unilaterally.
Note: every remaining option is multi-session by nature (A is Note: every remaining option is multi-session by nature (A is
gated on Android tooling, B and C are explicitly multi-session gated on Android tooling; B and C are explicitly multi-session
arcs). A fresh session is a better fit for any of them than the arcs). A fresh session is a better fit for any of them than the
tail of a long working stretch. tail of a long working stretch.
``` ```