docs: add v0.41.1 changelog section and refresh session handoff #132
@@ -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
|
||||
|
||||
+76
-29
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user