release: cut v2.2.0 "Capstone" (milestone — netplay lobby + FDS medium model + peripherals + quality/security)#297
Conversation
…ripherals + quality/security) The milestone cut that closes the v2.1.5 -> v2.2.0 "deepen the existing project" run, landing its two remaining marquees plus a peripherals and quality/security pass. Every change already merged (PRs #290, #291) is additive or default-off; the deterministic core is untouched, so this cut itself moves only version strings + release docs and no framebuffer/audio byte. Marquees (already on main via #290/#291): - Netplay matchmaking + lobby (B5) — a browse-and-join room directory (`ListRooms`/`RoomList`) and server-side quick-play (`QuickMatch`/`Matched`) over the existing room-code / TURN transport, delayed-stream spectators (`SpectatorConfig.delay_frames`, reveal-horizon gated), a graded hysteresis desync verdict (`DesyncStatus`, threshold 3 ~= 1.5 s), and graded multi-second peer-liveness RTT timeouts (`PeerLink` + `DisconnectReason::PeerTimeout`). Signaling and telemetry only — the rollback/determinism contract is untouched. - FDS medium model completion (F4.3) — per-block CRC-16/KERMIT re-emitted on every BIOS write (`resynth_block_crc`) over a synthesized gap/mark wire image, an opt-in default-OFF continuous analog head-seek / velocity model (`Fds::set_analog_head_seek`) replacing the flat `HEAD_RESEEK_CYCLES` window, and a BIOS-free synthetic write-verify oracle (`Fds::medium_write_verify`) as the CI-verifiable half (the real-BIOS write-CRC path stays gitignored/local — copyright disksys.rom). Additive v4 FDS save-state tail; with the model off a non-writing `.fds` run is byte-identical to prior releases. Peripherals (#291): the Famicom `$4016`-bit-2 microphone (`Nes::set_microphone`, `$4016`-only, never `$4017`) and a 3x3-aperture Zapper light-timing model (`ZAPPER_APERTURE_*`), both additive/default-off. Quality/security (#290): cargo-fuzz targets grown 3 -> 8 (`ppu_reg_io`, `apu_reg_io`, the high-value `netplay_message`, `save_state`, `movie`), which surfaced and fixed two real OOM-DoS paths in `Movie::deserialize` (untrusted `frame_count` -> unbounded `Vec::with_capacity`, and a zero-`bytes_per_frame` infinite push loop) byte-identically for valid input; a read-only Tools -> ROM Info browser (dump-identity CRC32 keys + SHA-256 + per-game DB entry + decoded header, `&Nes`, never mutates); and four new MkDocs handbook pages. Cut mechanics: `[workspace.package] version` 2.1.10 -> 2.2.0 (Cargo.lock refreshed across all 18 workspace crates), CHANGELOG `[Unreleased]` renamed to `[2.2.0]` with a fresh empty `[Unreleased]`, `.github/release-notes/ v2.2.0.md` authored, and README badge / BibTeX / current-release paragraph updated. `release-auto.yml` tags + publishes on main going green. Sacred gate (verified on the merged #290+#291 tree): AccuracyCoin 141/141 (100.00%), nestest 0-diff, `pal_apu_tests` 10/10, `visual_regression` byte-identical, netplay rollback-determinism + snapshot-restore-replay + FDS synthetic write-verify green, `no_std` thumbv7em cross-compile, full host fmt/clippy/rustdoc/markdownlint, version consistency. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Cuts the v2.2.0 “Capstone” release by updating the workspace version and release documentation (README, changelog, and GitHub release notes) without introducing new functional code changes.
Changes:
- Bump workspace/package version to 2.2.0 and refresh workspace crate versions in
Cargo.lock. - Add the v2.2.0 changelog section and reset the
[Unreleased]header. - Update release-facing docs: README version badge + “Current Release” narrative + BibTeX version, and add
.github/release-notes/v2.2.0.md.
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates version badge, current release narrative, and BibTeX version to v2.2.0. |
| CHANGELOG.md | Adds the v2.2.0 entry (dated 2026-07-12) and rolls forward from Unreleased. |
| Cargo.toml | Bumps [workspace.package] version to 2.2.0. |
| Cargo.lock | Updates workspace crate versions to 2.2.0. |
| .github/release-notes/v2.2.0.md | Adds the release-auto body override notes for the v2.2.0 release. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Code Review
This pull request prepares the repository for the v2.2.0 'Capstone' release. It updates the version numbers across Cargo.toml, Cargo.lock, and README.md, adds a comprehensive release notes document under .github/release-notes/v2.2.0.md, and updates the CHANGELOG.md with the details of the new release. There are no review comments provided, so I have no feedback to address.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Milestone cut closing the v2.1.5 → v2.2.0 "deepen the existing project" run. Version bump + release docs only — all code already merged via #290 (netplay lobby / spectators / desync-liveness hardening + fuzz 3→8 + ROM Info browser + handbook) and #291 (FDS medium model + Famicom mic + Zapper aperture).
Cut mechanics
[workspace.package] version2.1.10 → 2.2.0 (Cargo.lock refreshed across all 18 workspace crates)[Unreleased]→[2.2.0]header + fresh[Unreleased].github/release-notes/v2.2.0.mdauthored (release-auto body override)Sacred gate (verified on the merged #290+#291 tree)
pal_apu_tests10/10,visual_regressionbyte-identicalno_stdthumbv7em cross-compile · full host fmt/clippy/rustdoc/markdownlint · version consistencyNo default-build behavior change (netplay = signaling/telemetry; FDS head-seek + both peripherals default-off; ROM Info read-only). On merge,
release-auto.ymltags + publishes v2.2.0 + binaries.🤖 Generated with Claude Code