chore(release): v2.2.2 "Conduit"#323
Conversation
Cuts v2.2.2, a build, distribution, and CI-integrity patch. It carries RustyNES
onto RetroArch's own buildbot -- the recipe now builds all ten platform jobs --
hardens the GitHub Actions supply chain, and collapses the toolchain to a single
pinned source of truth with no `nightly` on any build path.
Zero emulation-core changes
---------------------------
No file under `crates/rustynes-{cpu,ppu,apu,mappers,core}` is touched, so the
deterministic `#![no_std]` chip stack, save-state / TAS / netplay-replay
formats, and every golden vector are untouched BY CONSTRUCTION rather than by
re-measurement: AccuracyCoin holds 141/141 (100.00%), nestest stays 0-diff, and
`blargg_apu_2005` / `pal_apu_tests` (10/10) / `visual_regression` / the 60-ROM
commercial oracle are unchanged from v2.2.1.
One behavioural improvement reaches a shipped artifact: the libretro tvOS core
is now built with `panic = "abort"` like every other platform, rather than the
`panic = "unwind"` its former `-Zbuild-std` path forced.
Scope (all landed since v2.2.1)
-------------------------------
* Libretro buildbot recipe (issue #311) + core feature completion: memory maps
for rcheevos, an FDS load-path fix plus disk control, native Game Genie
cheats, fast-forward audio gating.
* Buildbot taken from 1/10 to 10/10 across three diagnosis rounds against a
third-party pipeline we can neither push to nor re-run: missing cross targets
(8 jobs), an upstream `rust-libretro` MinGW enum-signedness bug, tvOS MSRV +
`panic_abort`, and `-C ar` removed in Rust 1.97.
* tvOS moved onto the pinned stable toolchain: `aarch64-apple-tvos` is no
longer tier 3, so the template's `+nightly -Zbuild-std` override is obsolete.
Dropping it dissolved three stacked workarounds instead of adding a fourth.
* CI supply-chain hardening: `persist-credentials: false` on all 19 checkouts,
a fail-closed release-tag check via `git/matching-refs`, and
`dtolnay/rust-toolchain` SHA-pinned off `@master`.
* One toolchain everywhere: `rust-setup` resolves `[toolchain].channel` from
`rust-toolchain.toml`, leaving zero toolchain version literals under
`.github/`. Nightly survives only in `cargo fuzz` and the dormant
`rustynes-monetization` bindgen, neither of which is a gate.
* Dependency consolidation (Dependabot #313-#315), which surfaced a real
lz4_flex 0.14 `alloc`-feature break that only the standalone `no_std`
cross-compile can catch.
Version and metadata
--------------------
Workspace 2.2.1 -> 2.2.2; `Cargo.lock` diff is exactly 18 insertions and 18
deletions, all workspace-member version lines, with no dependency drift. No
mobile app version change -- Android `versionCode`/`versionName` and iOS
`MARKETING_VERSION` stay frozen at their v2.0.x host-only release points; the
joint mobile store launch remains v2.3.0. README badge, README Current Release,
`docs/STATUS.md`, and AGENTS.md current-release blocks all updated. The
RetroAchievements User-Agent needs no edit: it derives from `CARGO_PKG_VERSION`.
`.gitignore` gains `*.dSYM/` and `*.dSYM.zip`. The Apple libretro jobs and the
iOS xcframework build emit debug-symbol bundles beside the library; `*.dylib`
matched the library but neither the bundle directory nor the archive, so a local
Apple libretro build left both in the working tree.
Release notes
-------------
`.github/release-notes/v2.2.2.md` is the maintainer-authored override that
`release-auto.yml` prefers over the CHANGELOG section.
Verification
------------
cargo test --workspace: 1905 passed, 0 failed, 13 ignored (exit 0).
fmt clean; clippy --workspace --all-targets -D warnings clean; rustdoc clean
under RUSTDOCFLAGS=-D warnings; `no_std` thumbv7em cross-compile builds;
`cargo deny check` ok on advisories, bans, licenses and sources; pre-commit
(markdownlint included) clean on every touched file.
Not verifiable on this host: the tvOS link step. There is no tvOS SDK or linker
here and we cannot run a pipeline on git.libretro.com, so the compile path is
verified and the link step is not. Issue #311 stays open until libretro
confirms a clean pipeline.
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
📝 WalkthroughWalkthroughThis release updates RustyNES to v2.2.2 “Conduit,” documenting libretro buildbot coverage, CI supply-chain hardening, pinned toolchain resolution, tvOS ChangesRelease documentation
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 8 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (8 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Pull request overview
Cuts the v2.2.2 “Conduit” release by bumping the workspace version and updating the repo’s user-facing release documentation to match the new release (with no emulation-core code changes in this PR’s diff set).
Changes:
- Bump workspace/package version 2.2.1 → 2.2.2 and update workspace-member entries in
Cargo.lock. - Update release-facing documentation (README “Current Release”,
docs/STATUS.md,CHANGELOG.md, andAGENTS.md) to describe v2.2.2. - Extend
.gitignoreto ignore Apple debug symbol bundles (*.dSYM/) and their zipped artifacts (*.dSYM.zip).
Reviewed changes
Copilot reviewed 6 out of 8 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates the version badge and “Current Release” section to v2.2.2 details. |
| docs/STATUS.md | Updates the status matrix header block to reflect v2.2.2 as current release. |
| CHANGELOG.md | Adds the v2.2.2 changelog entry. |
| Cargo.toml | Bumps [workspace.package] version to 2.2.2. |
| Cargo.lock | Updates workspace-member package versions to 2.2.2 (no dependency drift shown in diff). |
| AGENTS.md | Updates the “Current release” block to v2.2.2 and shifts v2.2.1 to “prior release”. |
| .gitignore | Ignores .dSYM bundles and .dSYM.zip artifacts produced by Apple builds. |
| .github/release-notes/v2.2.2.md | Adds maintainer-authored v2.2.2 release notes override for release automation. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/release-notes/v2.2.2.md:
- Around line 61-62: Update the tag lookup logic in release-auto.yml to
explicitly require that the gh api JSON response has type "array" before
filtering exact refs; ensure non-array responses fail closed and cannot proceed
to the release path. If that validation is not implemented, remove the release
note’s claim that non-array bodies abort the job.
In `@AGENTS.md`:
- Around line 29-31: Update the stale v2.2.1 references in AGENTS.md so v2.2.2
is the sole current release and v2.2.1 is consistently described only as the
prior release. Align the release descriptions around the v2.2.2 entry and remove
any wording that still identifies v2.2.1 as “this” or “the current” release.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: cbc0bdc4-8b13-4cf9-89cd-41746aaf3890
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock,!Cargo.lock
📒 Files selected for processing (7)
.github/release-notes/v2.2.2.md.gitignoreAGENTS.mdCHANGELOG.mdCargo.tomlREADME.mddocs/STATUS.md
Adopts both review findings on the v2.2.2 cut.
1. (Major, real fail-OPEN) The tag-existence check's jq filter,
`[.[] | select(.ref == $r)] | length`, returns 0 for a body of `{}`:
`.[]` iterates an object's VALUES, of which `{}` has none, so the filter
yields an empty list. Zero is exactly the "tag absent" answer, so a
malformed body took the RELEASE path -- on the single decision this step
exists to get right. Verified against every shape:
{} -> exit 0, count 0 <-- the hole
{"message":"Not Found"} -> exit 5
"astring" -> exit 5
null -> exit 5
[] -> exit 0, count 0 (correct: absent)
Every other malformed shape aborts unaided because `.[]` or `.ref` errors,
which is precisely what made `{}` easy to miss and why relying on jq to
error on its own was not enough. An explicit `type != "array"` guard now
fails closed; re-verified that `[]` still resolves to 0, an exact match to
1, and a prefix-only match (`v2.2.20` against `v2.2.2`) still to 0, so the
exact-ref comparison is unaffected.
The claim in the release notes and CHANGELOG that "a non-array body aborts
the job" was therefore true only for some shapes when written. Both are
corrected to describe what the code now actually does.
2. (Minor) Two stale current-release references in AGENTS.md. The version
bump updated the operating-note occurrence but missed the narrative
paragraph, which still read "-> v2.2.1 this housekeeping patch (this
release)", and the platform-additions paragraph, which still called v2.2.1
"the current release". Docs are the spec here, so an internally
contradictory AGENTS.md is a defect in its own right.
No version change; v2.2.2 is unchanged as the release being cut.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/release-notes/v2.2.2.md (1)
3-3: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winScope the repository-wide “no nightly” claim consistently.
Both documents exclude nightly from “any build path” while explicitly retaining nightly for
cargo fuzzand standalone monetization tooling. Limit the claim to release/CI build gates or explicitly state those exceptions.
.github/release-notes/v2.2.2.md#L3-L3: qualify the release-note claim.AGENTS.md#L29-L29: apply the same scope to current-release guidance.As per path instructions, documentation is the repository specification and must not contradict its documented exceptions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/release-notes/v2.2.2.md at line 3, Qualify the “no nightly” claim in .github/release-notes/v2.2.2.md at lines 3-3 to apply only to release and CI build paths, while explicitly preserving the cargo fuzz and standalone monetization-tooling exceptions; make the same scope correction in AGENTS.md at lines 29-29 so both documents consistently describe the documented exceptions.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In @.github/release-notes/v2.2.2.md:
- Line 3: Qualify the “no nightly” claim in .github/release-notes/v2.2.2.md at
lines 3-3 to apply only to release and CI build paths, while explicitly
preserving the cargo fuzz and standalone monetization-tooling exceptions; make
the same scope correction in AGENTS.md at lines 29-29 so both documents
consistently describe the documented exceptions.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 8c9b6cc1-8245-42af-b649-fce7470901db
📒 Files selected for processing (4)
.github/release-notes/v2.2.2.md.github/workflows/release-auto.ymlAGENTS.mdCHANGELOG.md
Cuts v2.2.2 "Conduit" — a build, distribution, and CI-integrity patch.
What ships
persist-credentials: falseon all 19 checkouts, a fail-closed release-tag check viagit/matching-refs,dtolnay/rust-toolchainSHA-pinned off@master.rust-setupresolves[toolchain].channelfromrust-toolchain.toml; zero toolchain version literals under.github/, and nonightlyon any build path.alloc-feature break only the standaloneno_stdcross-compile catches.Zero emulation-core changes
Nothing under
crates/rustynes-{cpu,ppu,apu,mappers,core}is touched, so the deterministic#![no_std]chip stack, save-state / TAS / netplay-replay formats, and every golden vector are untouched by construction rather than by re-measurement: AccuracyCoin holds 141/141 (100.00%), nestest 0-diff,pal_apu_tests10/10 — all unchanged from v2.2.1.One behavioural improvement reaches a shipped artifact: the libretro tvOS core is now built with
panic = "abort"like every other platform, rather than thepanic = "unwind"its former-Zbuild-stdpath forced. (aarch64-apple-tvosis no longer tier 3 — rustup ships a prebuilt std includingpanic_abort— so the upstream template's+nightly -Zbuild-stdoverride is obsolete, and dropping it dissolved three stacked workarounds instead of adding a fourth.)Version + metadata
Workspace
2.2.1 → 2.2.2.Cargo.lockdiff is exactly 18 insertions / 18 deletions, all workspace-member version lines, no dependency drift. README badge + Current Release,docs/STATUS.md, andAGENTS.mdcurrent-release blocks updated. The RetroAchievements User-Agent needs no edit — it derives fromCARGO_PKG_VERSION.No mobile app version change: Android
versionCode/versionNameand iOSMARKETING_VERSIONstay frozen at their v2.0.x host-only release points; the joint store launch remains v2.3.0..gitignoregains*.dSYM/and*.dSYM.zip— the Apple libretro jobs and the iOS xcframework build emit debug-symbol bundles beside the library, which*.dylibdid not match..github/release-notes/v2.2.2.mdis the maintainer-authored overriderelease-auto.ymlprefers over the CHANGELOG section.Verification
cargo test --workspacecargo fmt --all --checkclippy --workspace --all-targets -D warningscargo docunderRUSTDOCFLAGS=-D warningsno_stdthumbv7em cross-compilecargo deny checkNot verifiable on this host: the tvOS link step — no tvOS SDK or linker here, and we cannot run a pipeline on
git.libretro.com. The compile path is verified; the link step is not. Issue #311 stays open until libretro confirms a clean pipeline.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes
Security
Documentation