From 74686e248f8a3d3c691b50fca33d4cfe12cce968 Mon Sep 17 00:00:00 2001 From: DoubleGate Date: Tue, 14 Jul 2026 19:16:40 -0400 Subject: [PATCH] chore(release): v1.18.0 "Dormant" Bumps workspace + all individually-versioned crates to 1.18.0, renames CHANGELOG's [Unreleased] section to the dated v1.18.0 entry, and updates STATUS.md/ROADMAP.md/VERSION-PLAN.md's RELEASED markers for Mobile Phase 5's monetization scaffolding. --- CHANGELOG.md | 4 +++ Cargo.lock | 34 ++++++++++++------------ Cargo.toml | 2 +- crates/rustysnes-android/Cargo.toml | 2 +- crates/rustysnes-apu/Cargo.toml | 2 +- crates/rustysnes-cart/Cargo.toml | 2 +- crates/rustysnes-cheevos/Cargo.toml | 2 +- crates/rustysnes-core/Cargo.toml | 2 +- crates/rustysnes-cpu/Cargo.toml | 2 +- crates/rustysnes-frontend/Cargo.toml | 2 +- crates/rustysnes-gfx-shaders/Cargo.toml | 2 +- crates/rustysnes-ios/Cargo.toml | 2 +- crates/rustysnes-mobile/Cargo.toml | 2 +- crates/rustysnes-monetization/Cargo.toml | 2 +- crates/rustysnes-netplay/Cargo.toml | 2 +- crates/rustysnes-ppu/Cargo.toml | 2 +- crates/rustysnes-savestate/Cargo.toml | 2 +- crates/rustysnes-script/Cargo.toml | 2 +- crates/rustysnes-test-harness/Cargo.toml | 2 +- docs/STATUS.md | 12 ++++++--- to-dos/ROADMAP.md | 9 +++++-- to-dos/VERSION-PLAN.md | 27 ++++++++++++++----- 22 files changed, 74 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07732f5e..f7558988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.18.0] "Dormant" - 2026-07-14 + +Fourteenth release of the RustyNES-parity roadmap: Mobile Phase 5, monetization scaffolding. + ### Added - **`rustysnes-monetization`** (Mobile Phase 5): a new, standalone UniFFI crate providing a diff --git a/Cargo.lock b/Cargo.lock index e2c0ece4..0b07c1ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3703,7 +3703,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustysnes-android" -version = "1.17.0" +version = "1.18.0" dependencies = [ "android_logger", "bytemuck", @@ -3719,7 +3719,7 @@ dependencies = [ [[package]] name = "rustysnes-apu" -version = "1.17.0" +version = "1.18.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3727,7 +3727,7 @@ dependencies = [ [[package]] name = "rustysnes-cart" -version = "1.17.0" +version = "1.18.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3736,7 +3736,7 @@ dependencies = [ [[package]] name = "rustysnes-cheevos" -version = "1.17.0" +version = "1.18.0" dependencies = [ "cc", "ureq", @@ -3744,7 +3744,7 @@ dependencies = [ [[package]] name = "rustysnes-core" -version = "1.17.0" +version = "1.18.0" dependencies = [ "criterion", "rustysnes-apu", @@ -3759,7 +3759,7 @@ dependencies = [ [[package]] name = "rustysnes-cpu" -version = "1.17.0" +version = "1.18.0" dependencies = [ "bitflags 2.13.0", "rustysnes-savestate", @@ -3767,7 +3767,7 @@ dependencies = [ [[package]] name = "rustysnes-frontend" -version = "1.17.0" +version = "1.18.0" dependencies = [ "anstyle", "bytemuck", @@ -3807,11 +3807,11 @@ dependencies = [ [[package]] name = "rustysnes-gfx-shaders" -version = "1.17.0" +version = "1.18.0" [[package]] name = "rustysnes-ios" -version = "1.17.0" +version = "1.18.0" dependencies = [ "bytemuck", "log", @@ -3824,7 +3824,7 @@ dependencies = [ [[package]] name = "rustysnes-libretro" -version = "1.17.0" +version = "1.18.0" dependencies = [ "libc", "rust-libretro", @@ -3833,7 +3833,7 @@ dependencies = [ [[package]] name = "rustysnes-mobile" -version = "1.17.0" +version = "1.18.0" dependencies = [ "rustysnes-cart", "rustysnes-core", @@ -3843,14 +3843,14 @@ dependencies = [ [[package]] name = "rustysnes-monetization" -version = "1.17.0" +version = "1.18.0" dependencies = [ "uniffi", ] [[package]] name = "rustysnes-netplay" -version = "1.17.0" +version = "1.18.0" dependencies = [ "js-sys", "rustysnes-core", @@ -3862,7 +3862,7 @@ dependencies = [ [[package]] name = "rustysnes-ppu" -version = "1.17.0" +version = "1.18.0" dependencies = [ "bitflags 2.13.0", "rustysnes-cart", @@ -3872,14 +3872,14 @@ dependencies = [ [[package]] name = "rustysnes-savestate" -version = "1.17.0" +version = "1.18.0" dependencies = [ "thiserror 2.0.18", ] [[package]] name = "rustysnes-script" -version = "1.17.0" +version = "1.18.0" dependencies = [ "mlua", "rustysnes-core", @@ -3888,7 +3888,7 @@ dependencies = [ [[package]] name = "rustysnes-test-harness" -version = "1.17.0" +version = "1.18.0" dependencies = [ "insta", "rustysnes-apu", diff --git a/Cargo.toml b/Cargo.toml index e0f0ab1f..642f6c13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ members = [ ] [workspace.package] -version = "1.17.0" +version = "1.18.0" edition = "2024" rust-version = "1.96" license = "MIT OR Apache-2.0" diff --git a/crates/rustysnes-android/Cargo.toml b/crates/rustysnes-android/Cargo.toml index 473f6d70..a734f113 100644 --- a/crates/rustysnes-android/Cargo.toml +++ b/crates/rustysnes-android/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-android" description = "RustySNES: Android JNI presentation host (wgpu-on-Surface, no emulation logic)" -version = "1.17.0" +version = "1.18.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-apu/Cargo.toml b/crates/rustysnes-apu/Cargo.toml index c7f19503..0d80bbad 100644 --- a/crates/rustysnes-apu/Cargo.toml +++ b/crates/rustysnes-apu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-apu" -version = "1.17.0" +version = "1.18.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 4b3c5be3..ea2aed1b 100644 --- a/crates/rustysnes-cart/Cargo.toml +++ b/crates/rustysnes-cart/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-cart" -version = "1.17.0" +version = "1.18.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 5ee91343..a7e8b031 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.17.0" +version = "1.18.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 f80721ee..e7685159 100644 --- a/crates/rustysnes-core/Cargo.toml +++ b/crates/rustysnes-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-core" -version = "1.17.0" +version = "1.18.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 f540fef8..2d578477 100644 --- a/crates/rustysnes-cpu/Cargo.toml +++ b/crates/rustysnes-cpu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-cpu" -version = "1.17.0" +version = "1.18.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 3bd683b9..81dda14c 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.17.0" +version = "1.18.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 85dfc802..bc4d1bb3 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.17.0" +version = "1.18.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-ios/Cargo.toml b/crates/rustysnes-ios/Cargo.toml index 5adf3f71..53cb75c8 100644 --- a/crates/rustysnes-ios/Cargo.toml +++ b/crates/rustysnes-ios/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-ios" description = "RustySNES: iOS Metal presentation host (wgpu-on-CAMetalLayer, no emulation logic)" -version = "1.17.0" +version = "1.18.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-mobile/Cargo.toml b/crates/rustysnes-mobile/Cargo.toml index f9bd7d56..db4d316f 100644 --- a/crates/rustysnes-mobile/Cargo.toml +++ b/crates/rustysnes-mobile/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-mobile" description = "RustySNES: UniFFI mobile bridge (Kotlin/Swift bindings over the emulation core)" -version = "1.17.0" +version = "1.18.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/rustysnes-monetization/Cargo.toml b/crates/rustysnes-monetization/Cargo.toml index 690f19f4..a9dd5bc9 100644 --- a/crates/rustysnes-monetization/Cargo.toml +++ b/crates/rustysnes-monetization/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rustysnes-monetization" description = "RustySNES: dormant entitlement/ad-pacing policy scaffold (mobile-only, never a dependency of the deterministic core)" -version = "1.17.0" +version = "1.18.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 1f4a8609..366a29e5 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.17.0" +version = "1.18.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 aceb5131..72d29da7 100644 --- a/crates/rustysnes-ppu/Cargo.toml +++ b/crates/rustysnes-ppu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-ppu" -version = "1.17.0" +version = "1.18.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 a2d0af32..e3e5940f 100644 --- a/crates/rustysnes-savestate/Cargo.toml +++ b/crates/rustysnes-savestate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustysnes-savestate" -version = "1.17.0" +version = "1.18.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 9d7ced7c..21fee15e 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.17.0" +version = "1.18.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 ce47d8c9..55c761ee 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.17.0" +version = "1.18.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/docs/STATUS.md b/docs/STATUS.md index 5fd1623d..3c33abb3 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -3,12 +3,12 @@ This file is authoritative for per-suite pass counts, the board / coprocessor matrix, and version policy. Everything else defers to it. -**Current release:** `v1.17.0 "Parity"` (`v0.1.0 "Foundation"`, +**Current release:** `v1.18.0 "Dormant"` (`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.17.0`** are the opening rungs of the RustyNES-parity ladder — a CI +full ladder). **`v1.5.0`-`v1.18.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 @@ -38,7 +38,13 @@ the Android AVD, found and fixed a real, pre-existing, already-shipped native cr since `v1.15.0` (per-frame allocation churn in the audio path disrupting `AudioTrack`'s native buffer timing after ~10+ seconds of continuous run — never caught before because no prior verification pass ran that long), with RetroAchievements wiring, an `mlua` migration, and -netplay honestly re-scoped to a later rung (`v1.17.0 "Parity"`) — all frontend/tooling/CI work +netplay honestly re-scoped to a later rung (`v1.17.0 "Parity"`), and dormant monetization +scaffolding — a new, standalone `rustysnes-monetization` `UniFFI` crate (never a dependency of +the deterministic core, every pricing/pacing figure an explicit placeholder pending the +standing "Mobile Phase 6" store-launch gate) wired into both mobile shells as an inert, +log-only startup call, real-verified on the Android AVD via `logcat` and compile-verified for +iOS via a real macOS CI build after fixing a genuine `xcodebuild` xcframework-modulemap +collision found on that same CI run (`v1.18.0 "Dormant"`) — 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` diff --git a/to-dos/ROADMAP.md b/to-dos/ROADMAP.md index ba3ada60..ca09512b 100644 --- a/to-dos/ROADMAP.md +++ b/to-dos/ROADMAP.md @@ -359,8 +359,13 @@ under `v1.0.0`) and the netplay save-state-cost pre-work. simulator run yet, only a build), then a hardening rung (`v1.17.0 "Parity"`, **RELEASED 2026-07-12** — Save State/Load State on both mobile shells, plus a real, pre-existing, already-shipped Android `AudioTrack` crash found and fixed while re-verifying it - on-device; RetroAchievements/`mlua`/netplay honestly re-scoped to a later rung) — with dormant - monetization scaffolding (`v1.18.0`) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in + on-device; RetroAchievements/`mlua`/netplay honestly re-scoped to a later rung), then dormant + monetization scaffolding (`v1.18.0 "Dormant"`, **RELEASED 2026-07-14** — new, standalone + `rustysnes-monetization` UniFFI crate, never a dependency of the deterministic core, every + pricing/pacing figure an explicit placeholder; wired into both mobile shells as an inert, + log-only startup call, verified for real on the Android AVD via `logcat` and compile-verified + for iOS via a real macOS CI build, which caught and fixed a genuine `xcodebuild` + xcframework-modulemap collision) — 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 snapshot target. Full detail in `to-dos/VERSION-PLAN.md`'s "RustyNES-parity ladder" section. diff --git a/to-dos/VERSION-PLAN.md b/to-dos/VERSION-PLAN.md index a4a157a5..0c746bfc 100644 --- a/to-dos/VERSION-PLAN.md +++ b/to-dos/VERSION-PLAN.md @@ -1263,13 +1263,26 @@ migration, and direct-IP/LAN netplay were all investigated and found not to fit honestly-verifiable change at this rung (see `CHANGELOG.md`'s `v1.17.0` entry for the full reasoning per item); all three remain on the roadmap for a later mobile-track rung. -### `v1.18.0 "Dormant"` — the rest of the mobile track - -`rustysnes-monetization` (dormant RevenueCat/AppLovin-style scaffold, never a dependency of the -deterministic core, policy shape only — no committed pricing). A store-launch decision (Play + -App Store submission, monetization activation) is an explicit maintainer go/no-go against -`docs/mobile-readiness.md`, not a numbered rung — mirroring RustyNES's own still-pending, -twice-deferred launch. +### `v1.18.0 "Dormant"` — Mobile Phase 5: monetization scaffolding — **RELEASED 2026-07-14** + +Delivered: a new, standalone `rustysnes-monetization` UniFFI crate — dormant entitlement/ +ad-pacing policy scaffold (`check_entitlement`, `default_ad_pacing_policy`, `should_show_ad`), +never a dependency of the deterministic core, every concrete pricing/pacing number an explicit +placeholder (unlike RustyNES's own already-committed figure). Wired into both mobile shells as +an inert dependency — compiled in, called once at startup, logged only, no real store SDK, no +UI. Verified for real on Android: rebuilt via a real Gradle build, installed on the real AVD, +launched, and confirmed via `logcat` that the dormant scaffold logs correctly with no crash. +iOS: the Rust `staticlib`/`rlib` outputs cross-compile for real in this development environment; +the `cdylib`/xcframework packaging pipeline needs a real Apple toolchain, so it's +compile-verified via `ios.yml`'s real macOS CI build only — which caught a genuine +`xcodebuild` "Multiple commands produce" failure from two per-crate xcframeworks each +contributing a same-named `module.modulemap` to a shared build-products directory, fixed by +merging `rustysnes-mobile` and `rustysnes-monetization` into one combined +`RustysnesFFI.xcframework`. + +A store-launch decision (Play + App Store submission, monetization activation) remains an +explicit maintainer go/no-go against `docs/mobile-readiness.md`, not a numbered rung — +mirroring RustyNES's own still-pending, twice-deferred launch. ### `v1.19.0 "Afterburner"` — PGO/BOLT pipeline