Skip to content

Correct the RustyNES core license (MIT/Apache -> GPL-3.0-or-later) - #1180

Open
doublegate wants to merge 1 commit into
libretro:masterfrom
doublegate:rustynes-license-gplv3
Open

Correct the RustyNES core license (MIT/Apache -> GPL-3.0-or-later)#1180
doublegate wants to merge 1 commit into
libretro:masterfrom
doublegate:rustynes-license-gplv3

Conversation

@doublegate

Copy link
Copy Markdown
Contributor

RustyNES relicensed from MIT/Apache-2.0 to GPL-3.0-or-later in its v2.2.9 release (2026-08-04). This page predates that change and still lists the old terms.

Single-line change to the Author/License section:

 The RustyNES core is licensed under

-- MIT OR Apache-2.0
+- GPL-3.0-or-later

The matching dist/info correction is libretro-super#2069.

SPDX form used here deliberately. This page reads as prose, and the neighbouring library pages use full license names rather than the short .info tokens, so GPL-3.0-or-later fits the context. The info file uses libretro's own dialect (GPLv3+) for the same license.

I checked the rest of the page against the current core rather than only fixing the line I came for, and nothing else needs changing:

  • Extensions (.nes, .fds) match the core's retro_get_system_info declaration.
  • Databases and the disksys.rom BIOS entry (md5 ca30b50f880eb660a320674ed365ef7a) are unchanged and correct.
  • Features table is accurate as written. Worth noting Restart ✔ is newly true rather than newly documented — retro_reset was unimplemented and inherited the library's no-op default until v2.3.5, so the button did nothing before then. Core Options ✕ remains correct; core options are still unexposed.

RustyNES relicensed in its v2.2.9 release (2026-08-04). This page predates
that change and still lists the old terms.

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

Updates the RustyNES library documentation to reflect the core’s relicensing, keeping the docs aligned with current upstream licensing.

Changes:

  • Update RustyNES core license in the Author/License section from MIT OR Apache-2.0 to GPL-3.0-or-later.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

doublegate added a commit to doublegate/RustyNES that referenced this pull request Aug 17, 2026
The cut. Workspace version 2.3.5 -> 2.3.6, the CHANGELOG [2.3.6] section,
the maintainer-authored release body, STATUS.md, VERSION-PLAN.md, the
README badge, AGENTS.md and CLAUDE.local.md.

The version bump immediately tripped `libretro_info_audit`, which pins the
local `.info`'s `display_version` against the workspace manifest. That is
the guard working: it exists because v2.3.5 shipped a `.info` whose version
had drifted from the crate for eleven days, and it caught this in one run.
A gap it CANNOT close remains — RetroArch reads `libretro-super`'s copy,
which will still say v2.3.5 after this release, so an upstream PR is a
release-time step, on the same trigger the v2.2.9 licence drift set.

Two claims in AGENTS.md were true when written and are now false; both are
corrected. `libretro-super#2069` merged, so RetroArch reads `GPLv3+`, and
`RetroArch#19416` merged, so `rustynes` is in `appstore_cores` — verified
against `master` rather than the PR state. Being in the build list is not
being installable: it arrives with the next App Store RetroArch build.
Only `libretro/docs#1180` is still open.

Six standing rules are added to AGENTS.md, each earned by a defect in this
release rather than invented: a fix touching one call site of a shared path
may not fix the bug and will report that it did; a test asserting "not
empty" passes while a second defect remains; prose asserting an intent is
how a defect survives releases; `ab_check.sh` benches the reference
straight after a ~45-second fat-LTO compile, so read the order-bias control
first; "inert on almost every cycle" predicts a win only if the work is
actually executed; and the bot ceremony has a third hiding place in plain
issue comments. A seventh covers panel state outliving the `Nes` it
describes, now funnelled through one `clear_rom_bound_analysis` hook.

The CHANGELOG and release notes also record the three defects the RAM Atlas
review caught after the feature was written — the dead audio observable,
the missing locked-session gate, and the `Inert` verdict for an address
that was never perturbed.

Verified: workspace clippy, 124 test binaries, version consistent across
the manifest, the README badge and the libretro `.info`, and — though this
commit touches no core code — AccuracyCoin 141/141 on the authoritative RAM
decoder with nestest 0-diff.
doublegate added a commit to doublegate/RustyNES that referenced this pull request Aug 17, 2026
…EADME

Both files carried a "not fixed by this release" note from the v2.3.5 cut
saying RetroArch shows the wrong licence and RustyNES is absent on
iOS/iPadOS/tvOS. Both were true when written and both merged upstream on
2026-08-16 — `libretro-super#2069` and `RetroArch#19416`.

The v2.3.6 blocks at the top of each file already said so, which made the
files internally contradictory: a reader reaching the older passage would
take the stale claim as current. Caught in review, and it is the same class
as the AGENTS.md corrections in this cut — a release note is written in the
present tense and then silently becomes history.

Rewritten to say what is true now, including the distinction that matters:
being in `appstore_cores` is not being installable. It arrives with the
next App Store RetroArch build, on libretro's cadence. `libretro/docs#1180`
is the one item still open.
doublegate added a commit to doublegate/RustyNES that referenced this pull request Aug 18, 2026
* release: v2.3.6 "Sounding" — measuring, and what a measurement may claim

The cut. Workspace version 2.3.5 -> 2.3.6, the CHANGELOG [2.3.6] section,
the maintainer-authored release body, STATUS.md, VERSION-PLAN.md, the
README badge, AGENTS.md and CLAUDE.local.md.

The version bump immediately tripped `libretro_info_audit`, which pins the
local `.info`'s `display_version` against the workspace manifest. That is
the guard working: it exists because v2.3.5 shipped a `.info` whose version
had drifted from the crate for eleven days, and it caught this in one run.
A gap it CANNOT close remains — RetroArch reads `libretro-super`'s copy,
which will still say v2.3.5 after this release, so an upstream PR is a
release-time step, on the same trigger the v2.2.9 licence drift set.

Two claims in AGENTS.md were true when written and are now false; both are
corrected. `libretro-super#2069` merged, so RetroArch reads `GPLv3+`, and
`RetroArch#19416` merged, so `rustynes` is in `appstore_cores` — verified
against `master` rather than the PR state. Being in the build list is not
being installable: it arrives with the next App Store RetroArch build.
Only `libretro/docs#1180` is still open.

Six standing rules are added to AGENTS.md, each earned by a defect in this
release rather than invented: a fix touching one call site of a shared path
may not fix the bug and will report that it did; a test asserting "not
empty" passes while a second defect remains; prose asserting an intent is
how a defect survives releases; `ab_check.sh` benches the reference
straight after a ~45-second fat-LTO compile, so read the order-bias control
first; "inert on almost every cycle" predicts a win only if the work is
actually executed; and the bot ceremony has a third hiding place in plain
issue comments. A seventh covers panel state outliving the `Nes` it
describes, now funnelled through one `clear_rom_bound_analysis` hook.

The CHANGELOG and release notes also record the three defects the RAM Atlas
review caught after the feature was written — the dead audio observable,
the missing locked-session gate, and the `Inert` verdict for an address
that was never perturbed.

Verified: workspace clippy, 124 test binaries, version consistent across
the manifest, the README badge and the libretro `.info`, and — though this
commit touches no core code — AccuracyCoin 141/141 on the authoritative RAM
decoder with nestest 0-diff.

* docs: correct two stale upstream claims further down STATUS and the README

Both files carried a "not fixed by this release" note from the v2.3.5 cut
saying RetroArch shows the wrong licence and RustyNES is absent on
iOS/iPadOS/tvOS. Both were true when written and both merged upstream on
2026-08-16 — `libretro-super#2069` and `RetroArch#19416`.

The v2.3.6 blocks at the top of each file already said so, which made the
files internally contradictory: a reader reaching the older passage would
take the stale claim as current. Caught in review, and it is the same class
as the AGENTS.md corrections in this cut — a release note is written in the
present tense and then silently becomes history.

Rewritten to say what is true now, including the distinction that matters:
being in `appstore_cores` is not being installable. It arrives with the
next App Store RetroArch build, on libretro's cadence. `libretro/docs#1180`
is the one item still open.

* docs(libretro): batch upstream .info syncs to MINOR releases

Maintainer decision at the v2.3.6 cut: the next upstream sync is v2.4.0.
Recorded in three places because the alternative is that it reads as an
oversight — which is exactly what the v2.2.9 incident was.

RetroArch reads `dist/info/rustynes_libretro.info` from
`libretro/libretro-super`, a separate copy nothing syncs automatically and
nothing compares. Through the v2.3.6-v2.3.9 line it will therefore read
`display_version = "v2.3.5"`. The standing `libretro_info_audit` pins the
LOCAL file against the workspace manifest and the core's own
`retro_get_system_info`, so the sync stays a copy rather than a
re-derivation whenever it does happen; the audit cannot see upstream, so
the divergence is invisible to CI by construction and has to be a written
decision instead.

The distinction that makes deferring safe is the one UPSTREAM_SYNC.md
exists for. A stale `display_version` misreports a NUMBER. A stale
`license` misreports the terms under which the software is distributed,
which is what actually went wrong in v2.2.9 — RetroArch advertised a
GPL-3.0-or-later emulator as MIT/Apache-2.0 for eleven days. So the
existing rule stands unchanged: licence, supported extensions, and declared
capabilities sync immediately regardless of where the version line sits.
Only the version-bump-alone case is batched.
doublegate added a commit to doublegate/RustyNES that referenced this pull request Aug 18, 2026
* release: v2.3.6 "Sounding" — measuring, and what a measurement may claim

The cut. Workspace version 2.3.5 -> 2.3.6, the CHANGELOG [2.3.6] section,
the maintainer-authored release body, STATUS.md, VERSION-PLAN.md, the
README badge, AGENTS.md and CLAUDE.local.md.

The version bump immediately tripped `libretro_info_audit`, which pins the
local `.info`'s `display_version` against the workspace manifest. That is
the guard working: it exists because v2.3.5 shipped a `.info` whose version
had drifted from the crate for eleven days, and it caught this in one run.
A gap it CANNOT close remains — RetroArch reads `libretro-super`'s copy,
which will still say v2.3.5 after this release, so an upstream PR is a
release-time step, on the same trigger the v2.2.9 licence drift set.

Two claims in AGENTS.md were true when written and are now false; both are
corrected. `libretro-super#2069` merged, so RetroArch reads `GPLv3+`, and
`RetroArch#19416` merged, so `rustynes` is in `appstore_cores` — verified
against `master` rather than the PR state. Being in the build list is not
being installable: it arrives with the next App Store RetroArch build.
Only `libretro/docs#1180` is still open.

Six standing rules are added to AGENTS.md, each earned by a defect in this
release rather than invented: a fix touching one call site of a shared path
may not fix the bug and will report that it did; a test asserting "not
empty" passes while a second defect remains; prose asserting an intent is
how a defect survives releases; `ab_check.sh` benches the reference
straight after a ~45-second fat-LTO compile, so read the order-bias control
first; "inert on almost every cycle" predicts a win only if the work is
actually executed; and the bot ceremony has a third hiding place in plain
issue comments. A seventh covers panel state outliving the `Nes` it
describes, now funnelled through one `clear_rom_bound_analysis` hook.

The CHANGELOG and release notes also record the three defects the RAM Atlas
review caught after the feature was written — the dead audio observable,
the missing locked-session gate, and the `Inert` verdict for an address
that was never perturbed.

Verified: workspace clippy, 124 test binaries, version consistent across
the manifest, the README badge and the libretro `.info`, and — though this
commit touches no core code — AccuracyCoin 141/141 on the authoritative RAM
decoder with nestest 0-diff.

* docs: correct two stale upstream claims further down STATUS and the README

Both files carried a "not fixed by this release" note from the v2.3.5 cut
saying RetroArch shows the wrong licence and RustyNES is absent on
iOS/iPadOS/tvOS. Both were true when written and both merged upstream on
2026-08-16 — `libretro-super#2069` and `RetroArch#19416`.

The v2.3.6 blocks at the top of each file already said so, which made the
files internally contradictory: a reader reaching the older passage would
take the stale claim as current. Caught in review, and it is the same class
as the AGENTS.md corrections in this cut — a release note is written in the
present tense and then silently becomes history.

Rewritten to say what is true now, including the distinction that matters:
being in `appstore_cores` is not being installable. It arrives with the
next App Store RetroArch build, on libretro's cadence. `libretro/docs#1180`
is the one item still open.

* docs(libretro): batch upstream .info syncs to MINOR releases

Maintainer decision at the v2.3.6 cut: the next upstream sync is v2.4.0.
Recorded in three places because the alternative is that it reads as an
oversight — which is exactly what the v2.2.9 incident was.

RetroArch reads `dist/info/rustynes_libretro.info` from
`libretro/libretro-super`, a separate copy nothing syncs automatically and
nothing compares. Through the v2.3.6-v2.3.9 line it will therefore read
`display_version = "v2.3.5"`. The standing `libretro_info_audit` pins the
LOCAL file against the workspace manifest and the core's own
`retro_get_system_info`, so the sync stays a copy rather than a
re-derivation whenever it does happen; the audit cannot see upstream, so
the divergence is invisible to CI by construction and has to be a written
decision instead.

The distinction that makes deferring safe is the one UPSTREAM_SYNC.md
exists for. A stale `display_version` misreports a NUMBER. A stale
`license` misreports the terms under which the software is distributed,
which is what actually went wrong in v2.2.9 — RetroArch advertised a
GPL-3.0-or-later emulator as MIT/Apache-2.0 for eleven days. So the
existing rule stands unchanged: licence, supported extensions, and declared
capabilities sync immediately regardless of where the version line sits.
Only the version-bump-alone case is batched.
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