Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/release-notes/v2.0.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ A12 / MMC3 notification stays on the **intended** (un-spliced) fetch address at

The campaign (`docs/audit/v2.0.2-octal-latch-campaign-2026-07-08.md`) corrected two premises v2.0.1 carried into ADR 0030:

1. **Mesen2 does NOT pass these two tests.** The per-cycle bus cross-diff proved the vendored Mesen2 build reads `0x0A` (corruption not reproduced) on both — so ADR 0030's prior "Option 2 = proven-correct Mesen2 recipe" premise was false. The correct definitive oracle is **TriCNES** (`ref-proj/TriCNES/Emulator.cs`, MIT, commit `9199870` — the **AccuracyCoin author's own emulator**), which models the multiplexed AD/A bus + octal latch at transistor level and does drive `$2F19` / `$0FFF`.
1. **Mesen2 does NOT pass these two tests.** The per-cycle bus cross-diff proved the vendored Mesen2 build reads `0x0A` (corruption not reproduced) on both — so ADR 0030's prior "Option 2 = proven-correct Mesen2 recipe" premise was false. The correct definitive oracle is **TriCNES** (`Emulator.cs`, MIT, commit `9199870`; at the time read from a local reference clone, since removed — the source is now vendored in-repo at `crates/rustynes-test-harness/golden/tricnes/tricnes-full-src/` — the **AccuracyCoin author's own emulator**), which models the multiplexed AD/A bus + octal latch at the pin/sub-cycle level and does drive `$2F19` / `$0FFF`. *(Corrected in v2.3.0: TriCNES is a cycle-accurate C# emulator with a detailed sub-cycle state machine, not a transistor-level one — "transistor level" properly describes die-derived simulations such as `Visual2C02` / `phantom2c02`.)*
2. **A whole-dot port suffices.** The full 2-cycle-ALE fetch refactor (v2.0.1's Option 1) was **not** required; porting TriCNES's octal latch at RustyNES's whole-dot cadence, behind the existing flag, reaches 141/141 flag-on.

## Verification — the honesty bar
Expand Down
104 changes: 22 additions & 82 deletions .github/release-notes/v2.2.5.md
Original file line number Diff line number Diff line change
@@ -1,107 +1,47 @@
# RustyNES v2.2.5 — "Colophon" (provenance, licensing, and documentation integrity)

A **provenance, licensing, and documentation-integrity** release. It was prompted
by community review (NESdev forums) of the project's licensing and AI-assisted
origins, and it corrects how RustyNES *describes its own provenance* — in source
comments, in `NOTICE`, and in the docs — so the record matches what the code
actually is.

**Zero emulation-core behavior changes.** The deterministic `#![no_std]` chip stack,
save-state / TAS / netplay formats, and every golden vector are byte-identical to
v2.2.4 by construction, so **AccuracyCoin holds 141/141 (100.00%)** and nestest is
0-diff. This was re-verified after every change (AccuracyCoin full + run-ahead,
the nestest golden log, the dual-path differential net, and the snapshot-schema
audit), and the whole tree passes `cargo fmt`, `clippy -D warnings` (workspace +
feature combos), `rustdoc -D warnings`, markdownlint, and the `no_std`
cross-compile.
> **⚠️ SUPERSEDED — this release's central provenance claim was wrong and has been withdrawn.** The statement below that *"No GPL-licensed emulator source is incorporated into RustyNES"* did not survive further review. **v2.2.9** established that RustyNES **is** a derivative work of GPL-licensed emulators — code derived from Mesen2 (GPL-3.0-or-later) and, for several mappers and the FDS drive model, from puNES, FCEUX and Nestopia UE (GPL-2.0-or-later) — and **relicensed the project from MIT/Apache-2.0 to GPL-3.0-or-later** (ADR 0036). The reviewer who pushed back was right and this note was wrong. The current record is `NOTICE` and [`docs/originality-and-provenance.md`](../../docs/originality-and-provenance.md); the v2.2.9 release notes carry the correction. This text is retained unedited below as the historical account of what was believed at the time — the remedy for a bad provenance claim is to correct it in the open, never to quietly rewrite it.

A **provenance, licensing, and documentation-integrity** release. It was prompted by community review (NESdev forums) of the project's licensing and AI-assisted origins, and it corrects how RustyNES *describes its own provenance* — in source comments, in `NOTICE`, and in the docs — so the record matches what the code actually is.

**Zero emulation-core behavior changes.** The deterministic `#![no_std]` chip stack, save-state / TAS / netplay formats, and every golden vector are byte-identical to v2.2.4 by construction, so **AccuracyCoin holds 141/141 (100.00%)** and nestest is 0-diff. This was re-verified after every change (AccuracyCoin full + run-ahead, the nestest golden log, the dual-path differential net, and the snapshot-schema audit), and the whole tree passes `cargo fmt`, `clippy -D warnings` (workspace + feature combos), `rustdoc -D warnings`, markdownlint, and the `no_std` cross-compile.

## Why this release exists

A reviewer pointed out — correctly — that a number of in-source comments described
implementations as "ports" of other emulators, including GPL-licensed ones, and
that the project's AI-assisted nature was not disclosed. Rather than argue the
point, we audited the entire tree and fixed it. The short version:
A reviewer pointed out — correctly — that a number of in-source comments described implementations as "ports" of other emulators, including GPL-licensed ones, and that the project's AI-assisted nature was not disclosed. Rather than argue the point, we audited the entire tree and fixed it. The short version:

- The chip, mapper, and peripheral **behaviors** are implemented from public
hardware documentation (the NESdev wiki, published datasheets, the documented
6502 unofficial-opcode behavior) and pinned to public test ROMs. Where a
reference emulator was consulted, it was used as a **behavioral oracle** — to
observe and cross-check documented behavior — not as a source of copied code.
- Some comments had mischaracterized that relationship as "ported from X." Those
were reworded to state what actually happened. **No GPL-licensed emulator source
is incorporated into RustyNES.**
- The chip, mapper, and peripheral **behaviors** are implemented from public hardware documentation (the NESdev wiki, published datasheets, the documented 6502 unofficial-opcode behavior) and pinned to public test ROMs. Where a reference emulator was consulted, it was used as a **behavioral oracle** — to observe and cross-check documented behavior — not as a source of copied code.
- Some comments had mischaracterized that relationship as "ported from X." Those were reworded to state what actually happened. **No GPL-licensed emulator source is incorporated into RustyNES.**
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Licensing & provenance

- **In-source "port" comments corrected** across the CPU (unstable-store opcodes),
PPU (sprite-evaluation and OAM models), APU, and numerous mapper register
decoders — reframed from "ported from Mesen2 / puNES" (GPLv3 / GPLv2) to
independent implementations of publicly-documented hardware behavior,
cross-checked against reference emulators as oracles.
- **In-source "port" comments corrected** across the CPU (unstable-store opcodes), PPU (sprite-evaluation and OAM models), APU, and numerous mapper register decoders — reframed from "ported from Mesen2 / puNES" (GPLv3 / GPLv2) to independent implementations of publicly-documented hardware behavior, cross-checked against reference emulators as oracles.
- **`NOTICE` rewritten** to:
- disclose the behavioral-oracle use of GPL-licensed emulators
(Mesen2/MesenCE, higan, **GeraNES**, ares, FCEUX, Nestopia UE, puNES) with **no
code incorporated**;
- attribute the genuinely incorporated permissive components — **emu2413**
(Mitsutaka Okazaki, MIT), **TriCNES** (Chris Siebert, MIT), and **rcheevos**
(RetroAchievements.org, MIT) — with their copyright notices and the MIT text;
- attribute the bundled fonts (**Font Awesome**; **Press Start 2P** / OFL) and
the bundled **test ROMs** (AccuracyCoin MIT, Damian Yerrick Holy Mapperel zlib,
blargg / kevtris public domain);
- credit the CRT-shader / NTSC-filter **visual influences** as independent
reimplementations.
- **GeraNES (GPL-3.0-only) disclosed** — it was cited as a reference across ~58
files but was previously absent from `NOTICE`.
- **CRT shaders and NTSC filters** (`crt_royale`, `crt_guest`, `megatron`, the
Bisqwit and EMMIR NTSC filters) were reviewed at source level. Each is a
single-pass shader built on RustyNES's own uniform/pipeline conventions and is
structurally incompatible with being a translation of the upstream *multi-pass*
shader source; copyright protects code expression, not a visual look or a
rendering technique, so these are independent reimplementations. Comments were
reworded from "port / condensation of X" accordingly, and the one comment
claiming tables were "ported verbatim from Bisqwit's C" was corrected — those
tables encode the two-level NES composite signal documented at the NESdev wiki.
- **`blip.rs`** no longer mislabels `blip_buf` as BSD/MIT (it is LGPL-2.1+); the
file is an independent band-limited-step (BLEP) implementation and now says so.
- disclose the behavioral-oracle use of GPL-licensed emulators (Mesen2/MesenCE, higan, **GeraNES**, ares, FCEUX, Nestopia UE, puNES) with **no code incorporated**;
- attribute the genuinely incorporated permissive components — **emu2413** (Mitsutaka Okazaki, MIT), **TriCNES** (Chris Siebert, MIT), and **rcheevos** (RetroAchievements.org, MIT) — with their copyright notices and the MIT text;
- attribute the bundled fonts (**Font Awesome**; **Press Start 2P** / OFL) and the bundled **test ROMs** (AccuracyCoin MIT, Damian Yerrick Holy Mapperel zlib, blargg / kevtris public domain);
- credit the CRT-shader / NTSC-filter **visual influences** as independent reimplementations.
- **GeraNES (GPL-3.0-only) disclosed** — it was cited as a reference across ~58 files but was previously absent from `NOTICE`.
- **CRT shaders and NTSC filters** (`crt_royale`, `crt_guest`, `megatron`, the Bisqwit and EMMIR NTSC filters) were reviewed at source level. Each is a single-pass shader built on RustyNES's own uniform/pipeline conventions and is structurally incompatible with being a translation of the upstream *multi-pass* shader source; copyright protects code expression, not a visual look or a rendering technique, so these are independent reimplementations. Comments were reworded from "port / condensation of X" accordingly, and the one comment claiming tables were "ported verbatim from Bisqwit's C" was corrected — those tables encode the two-level NES composite signal documented at the NESdev wiki.
- **`blip.rs`** no longer mislabels `blip_buf` as BSD/MIT (it is LGPL-2.1+); the file is an independent band-limited-step (BLEP) implementation and now says so.

## Documentation

- **New `docs/originality-and-provenance.md`** — a candid account of where RustyNES
advances, diverges from, or independently re-derives NES emulation technique
(the one-clock timebase, the transistor-literal octal-latch fetch, the
machine-checked accuracy-honesty gates, the determinism contract, measured-and-
rejected optimizations), the development timeline, an oracle-versus-port
classification of every reference, and the full license posture — written to be
honest rather than triumphal, including that the project is heavily AI-assisted.
- **README** — added an AI-assistance disclosure; removed a comparison graphic that
contained inaccurate details; corrected a mislabeled "sub-cycle accuracy in
action" screenshot caption (it was an early-development image); toned down
overstated language; and synced the Acknowledgments with `NOTICE`.
- **`tests/roms/LICENSES.md`** — fixed a false exclusion claim (four Holy Mapperel
mapper ROMs stated as excluded are in fact committed), a stale crate path, and
the AccuracyCoin sub-test count, and added blanket coverage for the committed
directories not individually tabulated (328 committed `.nes` total, none
commercial).
- **New `docs/originality-and-provenance.md`** — a candid account of where RustyNES advances, diverges from, or independently re-derives NES emulation technique (the one-clock timebase, the pin-level octal-latch fetch, the machine-checked accuracy-honesty gates, the determinism contract, measured-and- rejected optimizations), the development timeline, an oracle-versus-port classification of every reference, and the full license posture — written to be honest rather than triumphal, including that the project is heavily AI-assisted.
- **README** — added an AI-assistance disclosure; removed a comparison graphic that contained inaccurate details; corrected a mislabeled "sub-cycle accuracy in action" screenshot caption (it was an early-development image); toned down overstated language; and synced the Acknowledgments with `NOTICE`.
- **`tests/roms/LICENSES.md`** — fixed a false exclusion claim (four Holy Mapperel mapper ROMs stated as excluded are in fact committed), a stale crate path, and the AccuracyCoin sub-test count, and added blanket coverage for the committed directories not individually tabulated (328 committed `.nes` total, none commercial).

## Assets

- **Press Start 2P OFL text** added to the Android app assets. The font shipped in
the Android app without the SIL Open Font License text that OFL 1.1 requires
travel with the font; the desktop and iOS builds already carried it.
- **Press Start 2P OFL text** added to the Android app assets. The font shipped in the Android app without the SIL Open Font License text that OFL 1.1 requires travel with the font; the desktop and iOS builds already carried it.

## Compatibility

No format, save-state, or behavior changes. `.rns` save-states, `.rnm` movies, and
netplay replays are byte-identical to v2.2.4. The libretro core's
`display_version` advances to `v2.2.5`; there are no other functional changes to
the RetroArch integration.
No format, save-state, or behavior changes. `.rns` save-states, `.rnm` movies, and netplay replays are byte-identical to v2.2.4. The libretro core's `display_version` advances to `v2.2.5`; there are no other functional changes to the RetroArch integration.

## Verification

- **AccuracyCoin: 141/141 (100.00%)** — full suite and through run-ahead.
- **nestest: 0-diff** against the Nintendulator golden log.
- **Dual-path differential net** and **snapshot-schema audit** green.
- `cargo fmt --check`, `cargo clippy --workspace --all-targets -- -D warnings`
(plus the `retroachievements` / `scripting` / `hd-pack` feature combos),
`RUSTDOCFLAGS="-D warnings" cargo doc`, markdownlint, and the `no_std`
`thumbv7em-none-eabihf` cross-compile all pass.
- `cargo fmt --check`, `cargo clippy --workspace --all-targets -- -D warnings` (plus the `retroachievements` / `scripting` / `hd-pack` feature combos), `RUSTDOCFLAGS="-D warnings" cargo doc`, markdownlint, and the `no_std` `thumbv7em-none-eabihf` cross-compile all pass.
Loading