diff --git a/CHANGELOG.md b/CHANGELOG.md index ea16b36..312b53f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,10 @@ project follows [Semantic Versioning](https://semver.org/). ## [Unreleased] -**`202a64d`** — Android APK launch fixes (2026-05-08). -**`16242e6`** — Ignore .idea/ IDE files (2026-05-08). +**`395a322`** — double-tap auto-move (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. ## [0.21.9] — pending cut @@ -46,8 +48,43 @@ v0.19.0. `clippy::assertions_on_constants` (constant-fold at compile time 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>` 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`. 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) +- **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`). `NativeActivity` dlopen-s `libsolitaire_app.so` and calls `android_main` as its entry point. Without the symbol the app @@ -77,10 +114,11 @@ confirmed end-to-end device run. ### Stats -- Tests: 1282 passing / 0 failing (unchanged) +- Tests: **1292 passing** / 0 failing (+10 from double-tap + Play-by-Seed tests) - Clippy: clean -- Crates touched: `solitaire_engine` (stats_plugin.rs, - replay_overlay.rs), `solitaire_app` (lib.rs, .gitignore) +- Crates touched: `solitaire_engine` (input_plugin, events, home_plugin, + 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 diff --git a/SESSION_HANDOFF.md b/SESSION_HANDOFF.md index be07bde..9e4df28 100644 --- a/SESSION_HANDOFF.md +++ b/SESSION_HANDOFF.md @@ -1,8 +1,7 @@ # Solitaire Quest — Session Handoff **Last updated:** 2026-05-08 — **v0.21.8 tagged at `c50eaf8`**; -three post-cut commits on master (`a449f60` Stats selector, -`202a64d` Android launch fixes, `16242e6` .gitignore). Pushed. +seven post-cut commits on master. Push pending. v0.21.8 closes the last optional polish items in the B-2 replay screen-takeover arc: **notch-label centering** (middle @@ -19,27 +18,30 @@ resume. ## Status at pause -- **HEAD locally:** `16242e6` (.gitignore fix). Docs ride on top; - push pending. -- **HEAD on origin:** `c0415eb` (handoff docs from prior session). - `202a64d` and `16242e6` not yet pushed. +- **HEAD locally:** `45436d0` (handle_fullscreen Android gate). + Docs ride on top; push pending. +- **HEAD on origin:** `395a322` (double-tap commit — last pushed). - **Working tree:** clean (docs uncommitted). No WIP outstanding. - **`artwork/` directory:** still untracked. Intentional. - **Build:** `cargo clippy --workspace --all-targets -- -D warnings` 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`. - **Android:** APK verified booting on Pixel_7 AVD (Android 14, - x86_64). Three launch fixes committed. See Phase Android punch - list for remaining work. + x86_64). All desktop-only systems (handle_fullscreen) now gated. + See Phase Android punch list for remaining work. ## 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 - `202a64d` — Android launch fixes (android_main, resize_constraints, apply_smart_default_window_size) — **closes APK launch verification** - `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. @@ -47,7 +49,7 @@ Open next-step menu: 1. **Phase 8 (sync)** — the biggest open arc. Local storage scaffolding, self-hosted Axum server, GPGS stub. 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. 3. **Move Log auto-scroll** — only relevant if the panel 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 (non-fatal; entity parent/child component mismatch); investigate 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 the Stats "Copy share link" toast. `arboard` doesn't ship an 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 +- *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 `a449f60`.* `ReplayPrevButton` / `ReplayNextButton` / `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. Working directory: . Branch: master. v0.21.8 is tagged at c50eaf8 (cut 2026-05-08, -replay-overlay polish). One post-cut commit a449f60 is on master: -Stats Prev/Next replay selector spawn site (closes the v0.19.0 -punch-list item). v0.21.7 stays at da3e542, v0.21.6 at f63db76, -v0.21.5 at a2432df, v0.21.4 at 23ff62c, v0.21.3 at 3d92a91, -v0.21.2 at f23df3b, v0.21.1 at daa655a, v0.21.0 at 04f9bf9. +replay-overlay polish). Seven post-cut commits are on master (see +"Since the v0.21.8 cut" above); push of the last four pending. +v0.21.7 stays at da3e542, v0.21.6 at f63db76, v0.21.5 at a2432df, +v0.21.4 at 23ff62c, v0.21.3 at 3d92a91, v0.21.2 at f23df3b, +v0.21.1 at daa655a, v0.21.0 at 04f9bf9. Working tree: uncommitted CHANGELOG + SESSION_HANDOFF docs; push -pending (master + v0.21.8 tag). See CHANGELOG.md § [0.21.9] for -full detail. +pending. See CHANGELOG.md § [0.21.9] for full detail. 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): 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 4. CLAUDE_SPEC.md — formal architecture spec 5. ARCHITECTURE.md — crate responsibilities + data flow @@ -272,20 +289,18 @@ READ FIRST (in order, before doing anything): fresh machine) DECISION TO ASK THE PLAYER FIRST: - A. 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; needs an Android device or emulator running. - B. Replay-overlay arc — **fully closed** as of v0.21.8 (15 - commits across v0.21.4–v0.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 + A. Android follow-ups — JNI ClipboardManager bridge (arboard + has no Android backend), Android Keystore (blocked on Phase 8), + GPGS integration. Launch verification + double-tap are closed. + B. 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). + 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: - Use the system git config (already correct). @@ -311,7 +326,7 @@ WORKFLOW NOTES: OPEN AT THE START: ask which of A–C. Don't pick unilaterally. 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 tail of a long working stretch. ```