diff --git a/CHANGELOG.md b/CHANGELOG.md index b0caf0c..f09f3b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.13.0] "Vantage" - 2026-07-12 + +Ninth release of the RustyNES-parity roadmap: two accessibility theme variants, plus an honest +re-scoping of the other two originally-planned items. + ### Added -- **Two accessibility theme variants** (`v1.13.0 "Vantage"`): `AppTheme::HighContrast` (a +- **Two accessibility theme variants**: `AppTheme::HighContrast` (a near-black/near-white theme pushing every foreground/background pair past WCAG 2.1 AA, most past AAA) and `AppTheme::Colorblind` (interactive accents drawn from the Okabe-Ito palette, mutually distinguishable under the most common red-green color-vision deficiencies), both diff --git a/Cargo.lock b/Cargo.lock index 3971e1e..bfc7ed6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3551,7 +3551,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustysnes-apu" -version = "1.12.0" +version = "1.13.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "rustysnes-cart" -version = "1.12.0" +version = "1.13.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3568,7 +3568,7 @@ dependencies = [ [[package]] name = "rustysnes-cheevos" -version = "1.12.0" +version = "1.13.0" dependencies = [ "cc", "ureq", @@ -3576,7 +3576,7 @@ dependencies = [ [[package]] name = "rustysnes-core" -version = "1.12.0" +version = "1.13.0" dependencies = [ "criterion", "rustysnes-apu", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "rustysnes-cpu" -version = "1.12.0" +version = "1.13.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3599,7 +3599,7 @@ dependencies = [ [[package]] name = "rustysnes-frontend" -version = "1.12.0" +version = "1.13.0" dependencies = [ "anstyle", "bytemuck", @@ -3639,11 +3639,11 @@ dependencies = [ [[package]] name = "rustysnes-gfx-shaders" -version = "1.12.0" +version = "1.13.0" [[package]] name = "rustysnes-libretro" -version = "1.12.0" +version = "1.13.0" dependencies = [ "libc", "rust-libretro", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "rustysnes-netplay" -version = "1.12.0" +version = "1.13.0" dependencies = [ "js-sys", "rustysnes-core", @@ -3664,7 +3664,7 @@ dependencies = [ [[package]] name = "rustysnes-ppu" -version = "1.12.0" +version = "1.13.0" dependencies = [ "bitflags 2.13.0", "rustysnes-cart", @@ -3674,14 +3674,14 @@ dependencies = [ [[package]] name = "rustysnes-savestate" -version = "1.12.0" +version = "1.13.0" dependencies = [ "thiserror 2.0.18", ] [[package]] name = "rustysnes-script" -version = "1.12.0" +version = "1.13.0" dependencies = [ "mlua", "rustysnes-core", @@ -3690,7 +3690,7 @@ dependencies = [ [[package]] name = "rustysnes-test-harness" -version = "1.12.0" +version = "1.13.0" dependencies = [ "insta", "rustysnes-apu", diff --git a/Cargo.toml b/Cargo.toml index 74010d0..134e794 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ members = [ ] [workspace.package] -version = "1.12.0" +version = "1.13.0" edition = "2024" rust-version = "1.96" license = "MIT OR Apache-2.0" diff --git a/crates/rustysnes-apu/Cargo.toml b/crates/rustysnes-apu/Cargo.toml index 4184aa0..ac9dcdd 100644 --- a/crates/rustysnes-apu/Cargo.toml +++ b/crates/rustysnes-apu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-apu" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-cart/Cargo.toml b/crates/rustysnes-cart/Cargo.toml index a45bb47..1f05761 100644 --- a/crates/rustysnes-cart/Cargo.toml +++ b/crates/rustysnes-cart/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-cart" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-cheevos/Cargo.toml b/crates/rustysnes-cheevos/Cargo.toml index a9f1004..76126c5 100644 --- a/crates/rustysnes-cheevos/Cargo.toml +++ b/crates/rustysnes-cheevos/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-cheevos" description = "Native-only RetroAchievements (rcheevos) FFI wrapper for RustySNES" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-core/Cargo.toml b/crates/rustysnes-core/Cargo.toml index 1671744..f0b6a7e 100644 --- a/crates/rustysnes-core/Cargo.toml +++ b/crates/rustysnes-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-core" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-cpu/Cargo.toml b/crates/rustysnes-cpu/Cargo.toml index bb4b4d4..7fd780d 100644 --- a/crates/rustysnes-cpu/Cargo.toml +++ b/crates/rustysnes-cpu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-cpu" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-frontend/Cargo.toml b/crates/rustysnes-frontend/Cargo.toml index 3e1a792..dbcaf5a 100644 --- a/crates/rustysnes-frontend/Cargo.toml +++ b/crates/rustysnes-frontend/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-frontend" description = "RustySNES: cross-platform SNES emulator binary (winit + wgpu + cpal + egui)" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-gfx-shaders/Cargo.toml b/crates/rustysnes-gfx-shaders/Cargo.toml index 9f827c9..086bd82 100644 --- a/crates/rustysnes-gfx-shaders/Cargo.toml +++ b/crates/rustysnes-gfx-shaders/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-gfx-shaders" description = "RustySNES: shared WGSL presentation-shader sources (blit + post-filters)" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-netplay/Cargo.toml b/crates/rustysnes-netplay/Cargo.toml index 8e37f75..2736d78 100644 --- a/crates/rustysnes-netplay/Cargo.toml +++ b/crates/rustysnes-netplay/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-netplay" description = "RustySNES: GGPO-style rollback netplay (UDP native, WebRTC browser)" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-ppu/Cargo.toml b/crates/rustysnes-ppu/Cargo.toml index 6b831c6..0f944c2 100644 --- a/crates/rustysnes-ppu/Cargo.toml +++ b/crates/rustysnes-ppu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-ppu" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-savestate/Cargo.toml b/crates/rustysnes-savestate/Cargo.toml index 59b6cf7..48e6c11 100644 --- a/crates/rustysnes-savestate/Cargo.toml +++ b/crates/rustysnes-savestate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-savestate" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-script/Cargo.toml b/crates/rustysnes-script/Cargo.toml index b7edf76..6375249 100644 --- a/crates/rustysnes-script/Cargo.toml +++ b/crates/rustysnes-script/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-script" description = "RustySNES: sandboxed Lua 5.4 scripting (memory read/write + a per-frame callback)" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-test-harness/Cargo.toml b/crates/rustysnes-test-harness/Cargo.toml index 76856d5..83c8efb 100644 --- a/crates/rustysnes-test-harness/Cargo.toml +++ b/crates/rustysnes-test-harness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-test-harness" -version = "1.12.0" +version = "1.13.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/docs/STATUS.md b/docs/STATUS.md index fca6a80..3d58563 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -3,21 +3,23 @@ This file is authoritative for per-suite pass counts, the board / coprocessor matrix, and version policy. Everything else defers to it. -**Current release:** `v1.12.0 "Refraction"` (`v0.1.0 "Foundation"`, +**Current release:** `v1.13.0 "Vantage"` (`v0.1.0 "Foundation"`, `v0.2.0 "Persistence"`, `v0.3.0 "Continuum"`, `v0.4.0 "Completion"`, `v0.5.0 "Fidelity"`, `v0.6.0 "Shippable"`, `v0.7.0 "Resolution"`, `v0.8.0 "Community"`, `v0.9.0 "Threshold"`, `v1.0.0 "Zenith"`, `v1.0.1 "Aftertouch"`, `v1.1.0 "Latchkey"`, `v1.2.0 "Phosphor"`, `v1.3.0 "Palimpsest"`, and `v1.4.0 "Convergence"` precede it; see `to-dos/VERSION-PLAN.md` for the -full ladder). **`v1.5.0`-`v1.12.0`** are the opening rungs of the RustyNES-parity ladder — a CI +full ladder). **`v1.5.0`-`v1.13.0`** are the opening rungs of the RustyNES-parity ladder — a CI safety net (`v1.5.0 "Bedrock"`), a MkDocs documentation site + PWA + accuracy ledger (`v1.6.0 "Lighthouse"`), the debugger extracted into its own module plus a hex Memory panel (`v1.7.0 "Telemetry"`, `v1.7.1` patch), a Memory Compare panel + in-app Docs panel (`v1.8.0 "Tracepoint"`), widening `rustysnes-script`'s `emu.read` to the full 24-bit bus (`v1.9.0 "Marionette"`), wiring HD-pack compositing into the `emu-thread` build for the first time (`v1.10.0 "Atelier"`), fixing RetroAchievements to actually load a game for the first -time (`v1.11.0 "Podium"`), and adding a third presentation post-filter (`PostFilter::Xbrz`) plus +time (`v1.11.0 "Podium"`), adding a third presentation post-filter (`PostFilter::Xbrz`) plus extracting the WGSL shader sources into a new `rustysnes-gfx-shaders` crate for reuse by the -planned mobile bridge (`v1.12.0 "Refraction"`) — all frontend/tooling/CI work with **zero +planned mobile bridge (`v1.12.0 "Refraction"`), and adding two accessibility theme variants +(`AppTheme::HighContrast`/`Colorblind`) while honestly re-scoping the other two originally-planned +items (`v1.13.0 "Vantage"`) — all frontend/tooling/CI work with **zero change** to the accuracy dashboard, per-suite pass counts, or coprocessor tier matrix below, which stayed byte-identical throughout; see `CHANGELOG.md` for full per-release detail. `v1.0.0` closes the production-cut diff --git a/to-dos/ROADMAP.md b/to-dos/ROADMAP.md index ae69446..ba6459b 100644 --- a/to-dos/ROADMAP.md +++ b/to-dos/ROADMAP.md @@ -337,7 +337,11 @@ under `v1.0.0`) and the netplay save-state-cost pre-work. `PostFilter::Xbrz`, an xBRZ-style context-gated corner blend, and the new `rustysnes-gfx-shaders` crate housing `BLIT_WGSL`/`CRT_WGSL`/`HQX_WGSL`/`XBRZ_WGSL` for reuse by the mobile track; `.slangp`/`.cgp` import and a composite/RF post-pass remain deferred, unrevisited from `v1.2.0`'s - original scope call), accessibility/theming + save-state polish (`v1.13.0`), then a + original scope call), two accessibility theme variants (`v1.13.0 "Vantage"`, + **RELEASED 2026-07-12** — `AppTheme::HighContrast`/`Colorblind`; the plan's other two items, + a save-state migration fixture and a keyboard-nav audit, were investigated and found to already + be a verified-non-issue and a manual-walkthrough task respectively, not code fixes — both + honestly re-scoped rather than force-fit), then a full mobile track — Android + iOS apps plus dormant monetization scaffolding (`v1.14.0`-`v1.18.0`) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in lockstep against RustyNES's own continuing development via `to-dos/LOCKSTEP-CHECKLIST.md`, not a frozen diff --git a/to-dos/VERSION-PLAN.md b/to-dos/VERSION-PLAN.md index 2a1726f..94a84a7 100644 --- a/to-dos/VERSION-PLAN.md +++ b/to-dos/VERSION-PLAN.md @@ -1137,12 +1137,24 @@ multi-pass algorithm, not this release's single-pass GPU approximation) was cons deferred — the single-pass shader approximation was judged the honestly-testable, right-sized scope for a presentation-only, non-accuracy-critical feature. -### `v1.13.0 "Vantage"` — accessibility/theming + save-state polish - -`HighContrast` + Okabe-Ito colorblind-safe themes; a keyboard-only-navigation audit across every UI -surface added since `v1.7.0` (scheduled last among desktop rungs so the audit covers the final -surface); a save-state versioned-migration regression fixture (the one real save-state gap found — -the 10-slot/thumbnail UI itself is already at parity). +### `v1.13.0 "Vantage"` — accessibility/theming + save-state polish — **RELEASED 2026-07-12** + +Delivered: `AppTheme::HighContrast` (WCAG AA/AAA dark theme) + `AppTheme::Colorblind` +(Okabe-Ito-accented dark theme), both additive and regression-tested against the stock dark +theme. + +**Honestly re-scoped, not silently dropped**: the other two originally-planned items here were +investigated and neither fit a discrete code change. The "save-state versioned-migration +regression fixture... the one real save-state gap found" premise was stale — +`System::load_state` was always designed to fail loudly on an older-format blob (never to +migrate one), by deliberate choice recorded since the `FORMAT_VERSION` `2`/`3` bumps, and a +regression fixture proving exactly that has existed since `v0.7.0` +(`save_state_backward_compat.rs`). Closed as verified-non-issue; the 10-slot/thumbnail Save +States manager itself is already at full parity. The keyboard-only-navigation audit was found to +be a manual-walkthrough task, not a bug with a discrete fix (egui's own default Tab order is used +everywhere; nothing custom, nothing known-broken, but nothing walked/confirmed either) — +documented as an explicit open item in `docs/frontend.md`'s Theme section rather than converted +into a hollow "audit passed" claim. See `docs/frontend.md` for the full explanation of both. **Decision-doc rung (small, precedes the mobile track):** reverses this document's own "Post-v1.0 — Reach (deferred)" no-mobile-appetite line and `docs/frontend.md`'s no-gfx-shaders-crate