From 3a1b011dbcdbac2745182dc988fb0dbd792e76c0 Mon Sep 17 00:00:00 2001 From: matt Date: Thu, 2 Oct 2025 17:22:58 -0700 Subject: [PATCH] chore: prepare release v2.4.0 --- .env.example | 2 +- CHANGELOG.md | 4 ++++ RELEASE_NOTES_TEMPLATE.md | 33 ++++++--------------------------- docker-compose.yml | 2 +- dockerhub-docker-compose.yml | 2 +- docs/releases/v2.4.0.md | 34 ++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- 7 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 docs/releases/v2.4.0.md diff --git a/.env.example b/.env.example index 42191e6..9e4be9e 100644 --- a/.env.example +++ b/.env.example @@ -13,7 +13,7 @@ # HOST=0.0.0.0 # Uvicorn bind host (only when APP_MODE=web). # PORT=8080 # Uvicorn port. # WORKERS=1 # Uvicorn worker count. -APP_VERSION=v2.3.2 # Matches dockerhub compose. +APP_VERSION=v2.4.0 # Matches dockerhub compose. ############################ # Theming diff --git a/CHANGELOG.md b/CHANGELOG.md index 292d482..b0a94c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ This format follows Keep a Changelog principles and aims for Semantic Versioning ## [Unreleased] ### Summary +- _No unreleased changes yet._ + +## [2.4.0] - 2025-10-02 +### Summary - Wrapped the Multi-Faced Card Handling roadmap (tag merge, commander eligibility, land accounting) so double-faced cards now share tags, respect primary-face commander legality, and surface accurate land/MDFC diagnostics across web, CLI, and exports. - Closed out MDFC follow-ups: deck summary now highlights double-faced lands with badges, per-face mana metadata flows through reporting, exports include annotations, and diagnostics can emit per-face snapshots for catalog QA. - Surfaced commander exclusion warnings and automatic corrections in the builder so players are guided toward the legal front face whenever only a secondary face meets commander rules. diff --git a/RELEASE_NOTES_TEMPLATE.md b/RELEASE_NOTES_TEMPLATE.md index b2f2062..32e1bd5 100644 --- a/RELEASE_NOTES_TEMPLATE.md +++ b/RELEASE_NOTES_TEMPLATE.md @@ -1,34 +1,13 @@ # MTG Python Deckbuilder ${VERSION} ## Summary -- Completed the Multi-Faced Card Handling roadmap: multi-face records share merged tags, commander eligibility now checks only primary faces, and land diagnostics stay consistent across web, CLI, and exports. -- Deck summary highlights modal double-faced lands with inline badges, and exports append MDFC annotations so offline reviews match the web experience. -- Deck summary now surfaces MDFC land contributions with "Lands: X (Y with DFC)" copy and an expandable breakdown for modal double-faced cards. -- CLI deck output mirrors the web summary so diagnostics stay in sync across interfaces. -- Web builder commander search now flags secondary-face-only commanders, auto-corrects to the legal face, and shows inline guidance sourced from `.commander_exclusions.json`. -- Diagnostics dashboard now surfaces the multi-face merge snapshot and MDFC telemetry, combining the persisted `logs/dfc_merge_summary.json` artifact with live deck summary counters. -- New Deck modal now mirrors Step 4 preferences with inline toggles for owned-only, prefer-owned, and MDFC basic swap so players can lock in their plan before starting a build. -- Restored setup filtering to exclude Acorn and Heart promotional security stamps so Commander card pools stay format-legal. -- Added a dedicated commander catalog refresh helper (`python -m code.scripts.refresh_commander_catalog`) that outputs both merged MDFC-aware data and an unmerged compatibility snapshot, with updated documentation guiding downstream migrations. -- Documented the staging rollout completion: Docker/README guidance now notes the MDFC merge is always on and explains how to emit optional compatibility snapshots (`DFC_COMPAT_SNAPSHOT=1`) for downstream QA. +- _TBD_ ## Added -- Regression test coverage for MDFC export annotations and documentation outlining how to add new double-faced cards to the CSV authoring workflow. -- Optional MDFC per-face diagnostics snapshot controlled through `DFC_PER_FACE_SNAPSHOT` (with `DFC_PER_FACE_SNAPSHOT_PATH` override) for catalog QA. -- Structured DFC merge logging captured in `logs/dfc_merge_summary.json` for observability. -- Land accounting regression coverage via `test_land_summary_totals.py`, including an HTMX smoke test for the deck summary partial. -- Roadmap updates capturing remaining DFC observability, rollout, and export follow-ups with next-step notes. -- Regression test `test_commander_exclusion_warnings.py` ensuring builder guidance for secondary-face commanders stays in place. -- Regression test covering security-stamp filtering during setup to guard against future case-sensitivity regressions. -- Diagnostics panel for multi-face merges, backed by the new `summary_telemetry.py` land summary hook, plus telemetry snapshot endpoint for MDFC land contributions. -- Commander wizard checkbox to swap matching basics whenever modal double-faced lands are added, with dedicated regression coverage. -- New Deck modal exposes owned-only, prefer-owned, and MDFC swap toggles with session-backed defaults so preferences stick across runs. -- Commander catalog automation script (`python -m code.scripts.refresh_commander_catalog`) regenerates commander data, always applies the MDFC merge, and can optionally write compat-face snapshots; README and commander docs now include post-guard migration guidance. -- Docker and README documentation now outline the always-on MDFC merge and the optional `DFC_COMPAT_SNAPSHOT=1` workflow plus compatibility snapshot checkpoints for downstream consumers. -- QA documentation: added `docs/qa/mdfc_staging_checklist.md` outlining the staging validation pass required before removing the MDFC compatibility guard. +- _TBD_ + +## Changed +- _TBD_ ## Fixed -- Documented friendly handling for missing `commander_cards.csv` data during manual QA drills to prevent white-screen failures. -- Headless runner commander validation now accepts fuzzy commander prefixes so automated builds using short commander names keep working. -- Setup filtering now applies security-stamp exclusions case-insensitively, preventing Acorn/Heart promo cards from entering Commander pools. -- Commander browser thumbnails restore the double-faced flip control so MDFC commanders expose both faces directly in the catalog. +- _TBD_ diff --git a/docker-compose.yml b/docker-compose.yml index e087bb9..e40ef32 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -88,7 +88,7 @@ services: # WEB_THEME_FILTER_PREWARM: "0" WEB_AUTO_ENFORCE: "0" # 1=auto-run compliance export after builds WEB_CUSTOM_EXPORT_BASE: "" # Optional: custom base dir for deck export artifacts - APP_VERSION: "2.3.2" # Displayed version label (set per release/tag) + APP_VERSION: "2.4.0" # Displayed version label (set per release/tag) # ------------------------------------------------------------------ # Misc / Land Selection (Step 7) Environment Tuning diff --git a/dockerhub-docker-compose.yml b/dockerhub-docker-compose.yml index a8870d8..15f49a1 100644 --- a/dockerhub-docker-compose.yml +++ b/dockerhub-docker-compose.yml @@ -90,7 +90,7 @@ services: # WEB_THEME_FILTER_PREWARM: "0" WEB_AUTO_ENFORCE: "0" # 1=auto-run compliance export after builds WEB_CUSTOM_EXPORT_BASE: "" # Optional: custom base dir for deck export artifacts - APP_VERSION: "2.3.2" # Displayed version label (set per release/tag) + APP_VERSION: "2.4.0" # Displayed version label (set per release/tag) # ------------------------------------------------------------------ # Misc / Land Selection (Step 7) Environment Tuning diff --git a/docs/releases/v2.4.0.md b/docs/releases/v2.4.0.md new file mode 100644 index 0000000..15a775f --- /dev/null +++ b/docs/releases/v2.4.0.md @@ -0,0 +1,34 @@ +# MTG Python Deckbuilder v2.4.0 + +## Summary +- Completed the Multi-Faced Card Handling roadmap: multi-face records share merged tags, commander eligibility now checks only primary faces, and land diagnostics stay consistent across web, CLI, and exports. +- Deck summary highlights modal double-faced lands with inline badges, and exports append MDFC annotations so offline reviews match the web experience. +- Deck summary now surfaces MDFC land contributions with "Lands: X (Y with DFC)" copy and an expandable breakdown for modal double-faced cards. +- CLI deck output mirrors the web summary so diagnostics stay in sync across interfaces. +- Web builder commander search now flags secondary-face-only commanders, auto-corrects to the legal face, and shows inline guidance sourced from `.commander_exclusions.json`. +- Diagnostics dashboard now surfaces the multi-face merge snapshot and MDFC telemetry, combining the persisted `logs/dfc_merge_summary.json` artifact with live deck summary counters. +- New Deck modal now mirrors Step 4 preferences with inline toggles for owned-only, prefer-owned, and MDFC basic swap so players can lock in their plan before starting a build. +- Restored setup filtering to exclude Acorn and Heart promotional security stamps so Commander card pools stay format-legal. +- Added a dedicated commander catalog refresh helper (`python -m code.scripts.refresh_commander_catalog`) that outputs both merged MDFC-aware data and an unmerged compatibility snapshot, with updated documentation guiding downstream migrations. +- Documented the staging rollout completion: Docker/README guidance now notes the MDFC merge is always on and explains how to emit optional compatibility snapshots (`DFC_COMPAT_SNAPSHOT=1`) for downstream QA. + +## Added +- Regression test coverage for MDFC export annotations and documentation outlining how to add new double-faced cards to the CSV authoring workflow. +- Optional MDFC per-face diagnostics snapshot controlled through `DFC_PER_FACE_SNAPSHOT` (with `DFC_PER_FACE_SNAPSHOT_PATH` override) for catalog QA. +- Structured DFC merge logging captured in `logs/dfc_merge_summary.json` for observability. +- Land accounting regression coverage via `test_land_summary_totals.py`, including an HTMX smoke test for the deck summary partial. +- Roadmap updates capturing remaining DFC observability, rollout, and export follow-ups with next-step notes. +- Regression test `test_commander_exclusion_warnings.py` ensuring builder guidance for secondary-face commanders stays in place. +- Regression test covering security-stamp filtering during setup to guard against future case-sensitivity regressions. +- Diagnostics panel for multi-face merges, backed by the new `summary_telemetry.py` land summary hook, plus telemetry snapshot endpoint for MDFC land contributions. +- Commander wizard checkbox to swap matching basics whenever modal double-faced lands are added, with dedicated regression coverage. +- New Deck modal exposes owned-only, prefer-owned, and MDFC swap toggles with session-backed defaults so preferences stick across runs. +- Commander catalog automation script (`python -m code.scripts.refresh_commander_catalog`) regenerates commander data, always applies the MDFC merge, and can optionally write compat-face snapshots; README and commander docs now include post-guard migration guidance. +- Docker and README documentation now outline the always-on MDFC merge and the optional `DFC_COMPAT_SNAPSHOT=1` workflow plus compatibility snapshot checkpoints for downstream consumers. +- QA documentation: added `docs/qa/mdfc_staging_checklist.md` outlining the staging validation pass required before removing the MDFC compatibility guard. + +## Fixed +- Documented friendly handling for missing `commander_cards.csv` data during manual QA drills to prevent white-screen failures. +- Headless runner commander validation now accepts fuzzy commander prefixes so automated builds using short commander names keep working. +- Setup filtering now applies security-stamp exclusions case-insensitively, preventing Acorn/Heart promo cards from entering Commander pools. +- Commander browser thumbnails restore the double-faced flip control so MDFC commanders expose both faces directly in the catalog. diff --git a/pyproject.toml b/pyproject.toml index 5d9c0d3..a349abb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "mtg-deckbuilder" -version = "2.3.2" +version = "2.4.0" description = "A command-line tool for building and analyzing Magic: The Gathering decks" readme = "README.md" license = {file = "LICENSE"}