Skip to content

Commit 065ab69

Browse files
doublegateclaude
andcommitted
chore(release): v0.9.0 "Threshold"
Version bump 0.8.0 -> 0.9.0 across the workspace (root + 11 crates, including internal path-dependency version pins) and Cargo.lock regeneration. Converts CHANGELOG.md's [Unreleased] section to [0.9.0] "Threshold" - 2026-07-10, and corrects a batch of version labels across doc comments and planning docs (docs/STATUS.md, docs/frontend.md, docs/adr/0006, to-dos/ROADMAP.md, to-dos/VERSION-PLAN.md, to-dos/phase-7-breadth/, to-dos/phase-8-reach/) that had prematurely attributed this release's work (the niche peripherals, T-81-001 PR B, and the SPC7110 ROM-identity finding) to the already-tagged v0.8.0 -- mirroring the same v0.9.0-labeling lesson from the prior release, this time caught before tagging rather than after. Adds a new v0.9.0 "Threshold" rung to to-dos/VERSION-PLAN.md's ladder (not originally planned -- it closes out Phase 7/8's last residuals before the v1.0.0 production cut) and a matching CHANGELOG entry. Full pre-release gate re-verified on this exact tree: fmt clean, clippy clean (workspace + every feature combination), full workspace test suite (423 tests) green, the 17-suite --features test-roms ROM-oracle gate green, no_std build clean, RUSTDOCFLAGS="-D warnings" doc build clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 19bede8 commit 065ab69

32 files changed

Lines changed: 187 additions & 131 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
> **RustySNES integrates a cycle-accurate emulation engine.** Modeled after its predecessor `RustyNES`, this emulator is built on a master-clock-precise, lockstep-scheduled core targeting the Mesen2/ares accuracy bar. The entries below document the engine-internal milestones as this core is built and hardened.
99
10-
## [Unreleased]
10+
## [0.9.0] "Threshold" - 2026-07-10
11+
12+
Closes out Phase 7's last open exit criterion (niche peripherals) and Phase 8's one remaining
13+
ticket half (T-81-001 PR B), and resolves the previously carried-forward SPC7110 boot
14+
investigation — the last loose ends before the `v1.0.0` production push
15+
(`to-dos/VERSION-PLAN.md`'s `v1.0.0` gate is next: `Board: Send` + desktop UX shell maturity are
16+
what remain there). `v0.9.0` had never been used before this — earlier drafts once mislabeled a
17+
different rung with it before it was corrected to `v0.8.0` — so this genuinely picks up right
18+
after `v0.8.0 "Community"`.
19+
20+
**Oracle/golden suites: all held, no regressions.** The full workspace test suite (including
21+
`--features test-roms`, 17 suites) is green; no golden hash changed.
1122

1223
### Added
1324

‎Cargo.lock‎

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ members = [
1515
]
1616

1717
[workspace.package]
18-
version = "0.8.0"
18+
version = "0.9.0"
1919
edition = "2024"
2020
rust-version = "1.96"
2121
license = "MIT OR Apache-2.0"

‎crates/rustysnes-apu/Cargo.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rustysnes-apu"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
edition.workspace = true
55
rust-version.workspace = true
66
license.workspace = true
@@ -12,7 +12,7 @@ std = []
1212

1313
[dependencies]
1414
bitflags = "2"
15-
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.8.0" }
15+
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.9.0" }
1616

1717
[lints]
1818
workspace = true

‎crates/rustysnes-cart/Cargo.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rustysnes-cart"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
edition.workspace = true
55
rust-version.workspace = true
66
license.workspace = true
@@ -13,7 +13,7 @@ std = []
1313
[dependencies]
1414
bitflags = "2"
1515
thiserror = { version = "2", default-features = false }
16-
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.8.0" }
16+
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.9.0" }
1717

1818
[lints]
1919
workspace = true

‎crates/rustysnes-cheevos/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "rustysnes-cheevos"
33
description = "Native-only RetroAchievements (rcheevos) FFI wrapper for RustySNES"
4-
version = "0.8.0"
4+
version = "0.9.0"
55
edition.workspace = true
66
rust-version.workspace = true
77
license.workspace = true

‎crates/rustysnes-core/Cargo.toml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rustysnes-core"
3-
version = "0.8.0"
3+
version = "0.9.0"
44
edition.workspace = true
55
rust-version.workspace = true
66
license.workspace = true
@@ -15,11 +15,11 @@ std = []
1515
debug-hooks = []
1616

1717
[dependencies]
18-
rustysnes-cpu = { path = "../rustysnes-cpu", version = "0.8.0", default-features = false }
19-
rustysnes-ppu = { path = "../rustysnes-ppu", version = "0.8.0", default-features = false }
20-
rustysnes-apu = { path = "../rustysnes-apu", version = "0.8.0", default-features = false }
21-
rustysnes-cart = { path = "../rustysnes-cart", version = "0.8.0", default-features = false }
22-
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.8.0" }
18+
rustysnes-cpu = { path = "../rustysnes-cpu", version = "0.9.0", default-features = false }
19+
rustysnes-ppu = { path = "../rustysnes-ppu", version = "0.9.0", default-features = false }
20+
rustysnes-apu = { path = "../rustysnes-apu", version = "0.9.0", default-features = false }
21+
rustysnes-cart = { path = "../rustysnes-cart", version = "0.9.0", default-features = false }
22+
rustysnes-savestate = { path = "../rustysnes-savestate", version = "0.9.0" }
2323
thiserror = { version = "2", default-features = false }
2424
# ROM-identity hashing for TAS movies (`movie.rs`) — already resolved transitively (via `zip` in
2525
# the frontend), so this promotes an existing dependency to direct rather than adding a new one

‎crates/rustysnes-core/src/bus.rs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ pub struct Bus {
203203
/// Controller shift latches (`$4016/$4017`) + the auto-read result (`$4218-$421F`).
204204
joypad: [u16; 2],
205205
joypad_strobe: bool,
206-
/// Per-port peripheral state (`v0.8.0`, Phase 7 niche peripherals) — Mouse/Super Scope/Super
206+
/// Per-port peripheral state (`v0.9.0`, Phase 7 niche peripherals) — Mouse/Super Scope/Super
207207
/// Multitap. Idle (and touching nothing on `$4016`/`$4017`'s `data1` bit) unless a port's
208208
/// [`crate::controller::PortDevice`] is explicitly switched away from the default `Gamepad`
209209
/// via [`Self::set_port_device`], in which case `joypad[port]`'s own bit is bypassed instead
@@ -339,7 +339,7 @@ impl Bus {
339339
}
340340

341341
/// The peripheral currently connected to controller port `port` — for the debugger overlay
342-
/// and the frontend's own input-routing (`v0.8.0`).
342+
/// and the frontend's own input-routing (`v0.9.0`).
343343
#[must_use]
344344
pub fn port_device(&self, port: usize) -> PortDevice {
345345
self.ports
@@ -423,7 +423,7 @@ impl Bus {
423423
}
424424

425425
/// Non-intrusive read of an arbitrary 24-bit CPU address, for the debugger overlay's
426-
/// disassembly view (`v0.8.0`, T-81-001 PR B). Unlike [`CpuBus::read24`], this does NOT touch
426+
/// disassembly view (`v0.9.0`, T-81-001 PR B). Unlike [`CpuBus::read24`], this does NOT touch
427427
/// the open-bus latch, does NOT check watchpoints, and does NOT trigger any I/O register's own
428428
/// read side effect (VRAM/CGRAM auto-increment, NMI-flag-clear-on-read, the H/V-counter
429429
/// latch, …) — genuinely just peeking. Real 65C816 code only ever executes from WRAM or cart
@@ -551,7 +551,7 @@ impl Bus {
551551
}
552552
}
553553
}
554-
// Super Scope beam-position auto-latch (`v0.8.0`) — gated to the one sub-tick that
554+
// Super Scope beam-position auto-latch (`v0.9.0`) — gated to the one sub-tick that
555555
// actually advanced the dot, same granularity `dot_ticked` already gives the HDMA
556556
// check above; a no-op unless port 2 has a Super Scope attached (`Self`'s own doc).
557557
if dot_ticked {
@@ -778,7 +778,7 @@ impl Bus {
778778
self.pio = val;
779779
}
780780

781-
/// Per-master-clock Super Scope beam-detection check (`v0.8.0`) — a no-op, one cheap branch,
781+
/// Per-master-clock Super Scope beam-detection check (`v0.9.0`) — a no-op, one cheap branch,
782782
/// unless port 2 actually has a Super Scope attached (real hardware: only port 2's IOBIT pin
783783
/// reaches the PPU latch, `Self::set_pio`). Mirrors ares' `SuperScope::main()`: strobe the
784784
/// IOBIT pin low-then-high the instant the beam crosses the target dot on the target

‎crates/rustysnes-core/src/controller.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! SNES controller-port peripherals beyond the standard gamepad: Mouse, Super Scope, and Super
2-
//! Multitap (`v0.8.0`, Phase 7's "niche peripherals" exit criterion).
2+
//! Multitap (`v0.9.0`, Phase 7's "niche peripherals" exit criterion).
33
//!
44
//! Ported from ares' `sfc/controller/{mouse,super-scope,super-multitap}` — real hardware's
55
//! 2-bit-per-clock (`data1`/`data2`) serial-shift-register protocol per controller port, selected

‎crates/rustysnes-core/src/scheduler.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::sa1_bus::Sa1Bus;
3434
/// savestate-v1-gilyon.bin` fixture), not silent misinterpretation. See
3535
/// `docs/adr/0006-save-state-format.md`'s bump log for the full record.
3636
///
37-
/// `3` (`v0.8.0`, Phase 7 niche peripherals): `crate::bus`'s `BUS0` section grew — a new WRIO
37+
/// `3` (`v0.9.0`, Phase 7 niche peripherals): `crate::bus`'s `BUS0` section grew — a new WRIO
3838
/// (`$4201`/`$4213`) `pio` byte plus each controller port's [`crate::controller::PortState`]
3939
/// (device selection + Mouse/Super Scope/Super Multitap runtime state). Same guarantee as the `2`
4040
/// bump above: a `FORMAT_VERSION < 3` blob fails loudly (a `BUS0` section-length mismatch), not

0 commit comments

Comments
 (0)