From beddbcf94d4c44306eb1529448da6bca4d420ccb Mon Sep 17 00:00:00 2001 From: funman300 Date: Mon, 6 Jul 2026 15:19:35 -0700 Subject: [PATCH] docs: add v0.41.1 changelog section and refresh session handoff CHANGELOG gains the missing [0.41.1] section (pile-marker child-resize fix + Android relayout diagnostics). SESSION_HANDOFF is brought forward from the stale v0.40.0 state to today's: v0.41.x releases, the July 6 review arc (PRs #121-#131), Fold 7 on-device verification results, the remaining device-checklist items, and new architectural notes (plugin submodule pattern, marker child-resize rule, Fold 7 inset quirks). Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 18 ++++++++ SESSION_HANDOFF.md | 105 ++++++++++++++++++++++++++++++++------------- 2 files changed, 94 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35aa75b..d5c6015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,24 @@ project follows [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [0.41.1] — 2026-07-06 + +### Fixed + +- **Oversized pile-marker frames after fold/unfold.** `on_window_resized` + resized the marker fill sprite but never its children, so the outline frame + and the "A"/"K" watermark kept their spawn-time size after any resize — + rendering as oversized grey slabs over empty foundation slots on foldables + (found during Galaxy Fold 7 on-device verification of v0.41.0, fixed and + re-verified on the same device). Both children are now re-derived from the + new layout on every relayout. + +### Added + +- **Android relayout diagnostics.** Every layout recompute on Android now + logs its window dimensions and insets (`layout: resize to WxH …`) — the + evidence channel for foldable layout reports (#130). + ## [0.41.0] — 2026-07-06 > Consolidates everything shipped since v0.39.0, including the v0.40.0–v0.40.3 diff --git a/SESSION_HANDOFF.md b/SESSION_HANDOFF.md index 9e01bcf..6b19795 100644 --- a/SESSION_HANDOFF.md +++ b/SESSION_HANDOFF.md @@ -1,16 +1,57 @@ # Ferrous Solitaire — Session Handoff -**Last updated:** 2026-06-25 — v0.40.0 released (Android APK published); physical-device gate remains. +**Last updated:** 2026-07-06 — v0.41.0 + v0.41.1 released and verified on a +physical Galaxy Fold 7; issue tracker empty except low-priority #130. --- ## Current state -- **Branch state:** `master` pushed to origin; latest commits are the Draw-Three waste fan fix, its regression tests, and the NDK doc update (PRs #105–#108). -- **Latest tag:** `v0.40.0` (released — signed arm64-v8a APK published to the Gitea release for Obtainium/sideload). `v0.39.1` was the prior published release. -- **Working tree:** clean. Local `scripts/` helpers (incl. `scripts/watch_deploy.sh`) are intentionally not committed. -- **Latest verification this session:** `cargo clippy --workspace --all-targets -- -D warnings`; `cargo test --workspace`; `cargo build -p solitaire_app`; Android cross-compile + clippy for `aarch64-linux-android` (clean); full local signed arm64-v8a APK via `scripts/build_android_apk.sh`; CI `android-release` for `v0.40.0` completed/success with APK download HTTP 200. -- **Full previous gate:** card_game work pushed to origin with `cargo test` / `clippy` gates passing. +- **Branch state:** `master` pushed to origin; latest work is the 2026-07-06 + arc (PRs #121–#131): scripted repo review, five issues filed and fixed, + plugin module splits, two releases. +- **Latest tags:** `v0.41.1` (pile-marker child-resize fix + Android relayout + logging) on top of `v0.41.0` (consolidated release for everything since + v0.39.0). Both released via tag push → CI signed APK; both verified + installed on hardware (`versionCode 4101`). +- **Working tree:** clean. Local `scripts/*.go` helpers are intentionally + gitignored (`.gitignore:43`); `scripts/watch_deploy.sh` is now committed. +- **Latest verification:** workspace clippy `--all-targets -D warnings`, + full test suite, `cargo ndk` clippy for `aarch64-linux-android`, CI release + builds green, and an on-device pass on the Fold 7 (fold/unfold layout, + safe-area resume, marker fix). +- **Issue tracker:** #116/#117/#118/#119/#120 all closed 2026-07-06. #130 + (transient tableau clip after fold) open at low priority — did not + reproduce in repeat testing; v0.41.1's relayout logging is the evidence + channel if it recurs. + +--- + +## 2026-07-06 session summary (v0.40.3 → v0.41.1) + +- **Scripted repo review** (cratemap/todoctx/cargoclip/testfail): clippy + clean, tests green, error/SQL policies compliant. Five issues filed and + all resolved same-day. +- **#116 safe-area re-poll after resume** (PR #121): `refresh_insets` now + gates on the poll counter, settles per cycle, and rewrites insets only on + change. Verified on Fold 7 — note both Fold screens report identical + insets (top=110 bottom=0), so the re-poll path is a no-op on this device. +- **#117 Draw-1 recycle** (PR #122): unlimited recycling documented as an + intentional rules decision (ARCHITECTURE.md "Rules decisions" + + `draw_one_recycling_is_unlimited_by_design` lock-in test). A hard limit + would invalidate the difficulty seed catalog and the winnable-deal solver. +- **#118 module splits** (PRs #124/#125/#127/#128/#129): card, hud, + settings, game, and input plugins are now module directories; tests in + sibling `tests.rs`, runtime code split along system boundaries + (`pub(super)` items, mod.rs glob-imports children). Largest runtime file + is now `card_plugin/sync.rs` at 748 lines (was `card_plugin.rs` at 4,129). +- **v0.41.1 pile-marker fix** (PR #131): marker outline + "A"/"K" watermark + children are re-derived from the layout on every resize — previously + spawn-time-sized, rendering as oversized grey slabs on empty foundations + after fold/unfold. Found via photo evidence, fixed, re-verified on device. +- **Obtainium note:** reported "no suitable release" for v0.41.0 even though + the anonymous releases API, `releases/latest`, and the APK download were + all verified fine — client-side issue; sideload via adb was used instead. --- @@ -127,32 +168,20 @@ Three bugs fixed: ## Open punch list -### 1. Physical-device smoke test — THE ONLY REMAINING v0.40.0 ITEM +### 1. Physical-device smoke test — PARTIALLY DONE (2026-07-06, Galaxy Fold 7) -This is the **single outstanding task** for the v0.40.0 Android release. Everything -else is done and verified: workspace gates, `aarch64-linux-android` cross-compile + -clippy, release manifest sanity, a full local signed APK, the published release, and -Obtainium-facing delivery (public releases API, latest non-draft release, APK -downloadable anonymously). The only thing that cannot be done without hardware is -running the app on a real phone. +v0.41.1 was installed and launched on a physical Fold 7 via adb. Verified: +fold/unfold layout on both screens (incl. the #116 resume path and the +pile-marker fix), safe-area inset resolution, and app launch/restore basics. -Install the published APK on a real Android device (not AVD) and run the checklist -in `docs/ANDROID.md §4`. This has never been gated in CI — AVD `adb shell input tap` -doesn't deliver real touch events, so physical-device smoke testing is the only gate. +**Still unexercised** from the device checklist: Draw-Three waste fan tap +accuracy (the #106 fix — switch to Draw-Three, drag the visible top waste +card ~10×, confirm it plays *that* card), modal centring on both screens, +drag-and-drop across all pile types, kill-and-restore, and the sync token +flow. AVD is not a substitute — `adb shell input tap` doesn't deliver real +touch events. -The signed release APK is published (grab it from the release page, or use the local -`target/debug/apk/ferrous-solitaire.apk`). When testing, specifically exercise the -Draw-Three waste fan fixed in #106: switch to Draw-Three, draw several cards, and -confirm dragging the visible top waste card plays *that* card, not the one beneath it. - -Latest AVD smoke (2026-06-08 local / 2026-06-09 UTC): built -`target/debug/apk/ferrous-solitaire.apk` for `x86_64-linux-android`, installed -it on AVD `Pixel_7`, launched `android.app.NativeActivity`, confirmed Bevy -rendered the board, safe-area insets resolved as `top=136 bottom=63 left=0 -right=0` after 2 frames, onboarding could be dismissed via AVD input, and -filtered logcat showed no Ferrous panic/fatal/ANR. - -### 2. Matomo analytics live validation (independent — NOT a v0.40.0 release blocker) +### 2. Matomo analytics live validation (independent — NOT a release blocker) Separate, ongoing task unrelated to the Android release. `Settings` has `analytics_enabled`, `matomo_url`, and `matomo_site_id`; the engine consumes them via @@ -164,6 +193,24 @@ validation checklist and the current web/WASM decision notes. ## Architectural notes for next session +- **Plugin submodule pattern (2026-07-06 splits):** big plugins are module + directories: `mod.rs` holds types/markers/plugin-build and glob-imports the + children (`use input::*;`); children hold `pub(super)` systems and start + with `use super::*;` plus their own external imports. Tests (`tests.rs`) + may need explicit imports for names no longer used by `mod.rs` itself. + +- **Marker child-resize rule:** anything spawned as a *child* of a + layout-sized entity (outline frames, watermark text) must be re-derived in + `on_window_resized` too — resizing only the parent sprite leaves children + at spawn-time size (the v0.41.1 foldable bug). + +- **Fold 7 quirks:** both screens report identical safe-area insets + (top=110, bottom=0), so inset-driven relayout never fires on fold; layout + correctness across folds rides entirely on `WindowResized`. winit 0.30 + logs `TODO: find a way to notify application of content rect change` on + resume — see #130 if a stale-width layout ever reproduces; v0.41.1 logs + every Android relayout (`layout: resize to WxH`) for exactly this. + - **Reduce-motion pattern:** always gate in the `start_*` / `detect_*` system (the trigger), not the `tick_*` system. If the component is never inserted, the tick path never runs. See `hud_plugin.rs::detect_score_change` and -- 2.47.3