Skip to content

chore(release): v2.2.2 "Conduit"#323

Merged
doublegate merged 2 commits into
mainfrom
release/v2.2.2
Jul 21, 2026
Merged

chore(release): v2.2.2 "Conduit"#323
doublegate merged 2 commits into
mainfrom
release/v2.2.2

Conversation

@doublegate

@doublegate doublegate commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Cuts v2.2.2 "Conduit" — a build, distribution, and CI-integrity patch.

What ships

  • Libretro buildbot: all ten platform jobs building (from 1/10), across three rounds of diagnosis against a third-party pipeline we can neither push to nor re-run. The last step before RustyNES appears in RetroArch's built-in core downloader.
  • CI supply-chain hardeningpersist-credentials: false on all 19 checkouts, a fail-closed release-tag check via git/matching-refs, dtolnay/rust-toolchain SHA-pinned off @master.
  • One toolchain everywhererust-setup resolves [toolchain].channel from rust-toolchain.toml; zero toolchain version literals under .github/, and no nightly on any build path.
  • Dependency consolidation (Dependabot chore(ci): bump actions/setup-python from 6 to 7 #313chore(deps)(deps): bump lz4_flex from 0.13.1 to 0.14.0 #315), which surfaced a real lz4_flex 0.14 alloc-feature break only the standalone no_std cross-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_tests 10/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 the panic = "unwind" its former -Zbuild-std path forced. (aarch64-apple-tvos is no longer tier 3 — rustup ships a prebuilt std including panic_abort — so the upstream template's +nightly -Zbuild-std override is obsolete, and dropping it dissolved three stacked workarounds instead of adding a fourth.)

Version + metadata

Workspace 2.2.1 → 2.2.2. Cargo.lock diff is exactly 18 insertions / 18 deletions, all workspace-member version lines, no dependency drift. README badge + Current Release, docs/STATUS.md, and AGENTS.md current-release blocks updated. The RetroAchievements User-Agent needs no edit — it derives from CARGO_PKG_VERSION.

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 store launch remains v2.3.0.

.gitignore gains *.dSYM/ and *.dSYM.zip — the Apple libretro jobs and the iOS xcframework build emit debug-symbol bundles beside the library, which *.dylib did not match.

.github/release-notes/v2.2.2.md is the maintainer-authored override release-auto.yml prefers over the CHANGELOG section.

Verification

Gate Result
cargo test --workspace 1905 passed, 0 failed, 13 ignored (exit 0)
cargo fmt --all --check clean
clippy --workspace --all-targets -D warnings clean
cargo doc under RUSTDOCFLAGS=-D warnings clean
no_std thumbv7em cross-compile builds
cargo deny check advisories · bans · licenses · sources ok
pre-commit (markdownlint incl.) clean on every touched file

Not 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

    • Released v2.2.2 “Conduit”, expanding libretro build coverage to all ten supported platform jobs.
    • Updated tvOS libretro behavior to use unrecoverable (abort-style) panic handling instead of unwind.
  • Bug Fixes

    • Fixed CI/build issues for missing cross targets and improved MinGW compatibility, including tvOS build reliability.
  • Security

    • Hardened release validation with fail-closed release-tag checks, tightened checkout credential handling, and verified toolchain integrity via SHA pinning.
  • Documentation

    • Refreshed README and status/release notes to reflect v2.2.2 and unchanged emulation-core accuracy results.

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.
Copilot AI review requested due to automatic review settings July 21, 2026 06:59
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This release updates RustyNES to v2.2.2 “Conduit,” documenting libretro buildbot coverage, CI supply-chain hardening, pinned toolchain resolution, tvOS panic = "abort" output, Apple artifact ignores, and synchronized release metadata. No emulation-core changes are recorded.

Changes

Release documentation

Layer / File(s) Summary
Buildbot and artifact records
.github/release-notes/v2.2.2.md, .gitignore
Documents all ten libretro buildbot jobs, platform-specific build fixes, tvOS panic behavior, CI gate status, and ignored Apple debug-symbol artifacts.
CI integrity and toolchain policy
.github/release-notes/v2.2.2.md, .github/workflows/release-auto.yml, AGENTS.md, CHANGELOG.md
Records checkout credential suppression, fail-closed release-tag checks, SHA-pinned toolchain actions, and strict extraction of the channel from rust-toolchain.toml.
Version and release metadata
Cargo.toml, CHANGELOG.md, README.md, docs/STATUS.md, AGENTS.md
Bumps the workspace version to 2.2.2 and synchronizes release descriptions, badges, status text, and release-lineage guidance.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 8 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Changelog Entry For User-Visible Changes ⚠️ Warning CHANGELOG.md leaves [Unreleased] empty; the new v2.2.2 notes were added as a versioned section instead, even though tvOS behavior changed. Populate the existing [Unreleased] section with the user-visible tvOS/CI changes, or move that content there before finalizing the release entry.
✅ Passed checks (8 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the release version and codename for this changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Docs-As-Spec Sync ✅ Passed No files under rustynes-{cpu,ppu,apu,mappers} changed, and the PR body explicitly states that, so no subsystem docs update was required.
No Unwrap/Expect/Panic On Untrusted Input ✅ Passed PASS: The PR only changes docs and a bash/jq release workflow; no new Rust unwrap/expect/panic on external input appears in the diff.
Safety Comment On New Unsafe Blocks ✅ Passed PR changes only docs/workflow files; diff adds no new Rust unsafe blocks or unsafe fns.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/v2.2.2

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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, and AGENTS.md) to describe v2.2.2.
  • Extend .gitignore to 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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 777ec45 and 1a0794c.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock, !Cargo.lock
📒 Files selected for processing (7)
  • .github/release-notes/v2.2.2.md
  • .gitignore
  • AGENTS.md
  • CHANGELOG.md
  • Cargo.toml
  • README.md
  • docs/STATUS.md

Comment thread .github/release-notes/v2.2.2.md Outdated
Comment thread AGENTS.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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Scope the repository-wide “no nightly” claim consistently.

Both documents exclude nightly from “any build path” while explicitly retaining nightly for cargo fuzz and 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

📥 Commits

Reviewing files that changed from the base of the PR and between 1a0794c and 67df1e9.

📒 Files selected for processing (4)
  • .github/release-notes/v2.2.2.md
  • .github/workflows/release-auto.yml
  • AGENTS.md
  • CHANGELOG.md

@doublegate
doublegate merged commit 5814141 into main Jul 21, 2026
28 checks passed
@doublegate
doublegate deleted the release/v2.2.2 branch July 21, 2026 08:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants