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
46 changes: 46 additions & 0 deletions .github/release-notes/v2.0.6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# RustyNES v2.0.6 — "Harbor" ("Parity")

**iOS feature-parity finalization.** The sixth release of the v2.0.x "Harbor" mobile-finalization train, and the second of the four-release **iOS finalization window (v2.0.5 → v2.0.8)**. It runs on the byte-identical **v2.0.0 "Timebase"** core — **AccuracyCoin 141/141 (100.00%)**, nestest 0-diff, the `#![no_std]` chip stack untouched — so **no accuracy, save-state, or determinism number moves**. This is a host / iOS-only cut.

No store submission happens here (that is the future v2.1.0 joint launch); v2.0.6 closes a host-authorable v1.9.9 parity gap and re-verifies the v1.9.x host features against the new core.

---

## The core is unchanged (141/141)

Nothing in the emulation core changed since v2.0.3. AccuracyCoin holds **141/141 (100.00%, RAM-authoritative)**, nestest is 0-diff, the 60-ROM commercial byte-identity oracle is unmoved.

## New: opt-in crash reporting (privacy-first)

The iOS analogue of the Android v1.8.8 `CrashReporter`, closing the v1.9.9 readiness gap that listed an "opt-in crash-reporting surface" as an iOS-applicable deferral.

- **Off by default.** Enabled from **Settings → Diagnostics**. With it off, the app collects and writes nothing — the **"Data Not Collected"** privacy nutrition label is unchanged, and `PrivacyInfo.xcprivacy` needs no edit.
- **Local-only.** When enabled, an uncaught-`NSException` handler writes a timestamped crash report (app version, device, OS, exception name / reason, call stack) to `Application Support/RustyNES/crash-logs/`, keeping the 10 most recent. **Nothing is uploaded** — the reports are for the user to read, **copy** to the clipboard, and share manually if they choose. A **Crash logs** viewer (list → per-log detail → Copy / Clear) lives in the same section. EN + ES.
- **Honest about scope.** `NSSetUncaughtExceptionHandler` catches the Objective-C / bridged `NSException` class (UIKit, KVO, bridged Foundation). Pure-Swift runtime traps (`fatalError`, force-unwrap of nil, out-of-bounds) abort via a POSIX signal an exception handler cannot see; writing files from a signal handler is async-signal-unsafe, so — exactly as the Android side documents Firebase Crashlytics as the maintainer option rather than pulling it in — Swift-trap capture is left to a real third-party reporter a maintainer can add later, gated on this same opt-in flag. The handler also re-checks the live opt-in at crash time, so opting back out stops new logs immediately.

## Feature-parity re-verification

The v1.9.x host features were re-checked against the **v2.0.0 bridge surface** (unchanged by the timebase rewrite, which touched only the scheduler internals): Game Center cloud saves / achievements, iCloud KV-store config + CloudKit `.rns` save-state sync, MFi / hardware controllers (hot-plug, P1–P4), ReplayKit capture / share + PiP, and the accessibility layer (VoiceOver, Dynamic Type, colorblind palettes). All continue to route through the same typed bridge and the re-ported save-state epoch. The audit is recorded in `docs/ios-v2.0.6-readiness.md`.

## Verification (host)

- **Core unchanged** — AccuracyCoin **141/141**, nestest 0-diff (not re-run; the chip stack is untouched).
- `cargo check --workspace` green after the version bump + `Cargo.lock` regen; `cargo fmt --all --check`, `cargo clippy --workspace --all-targets -D warnings` (no issues), `RUSTDOCFLAGS=-D warnings cargo doc`, the `no_std` cross-compile, and both wasm32 clippy gates all green.
- `Localizable.xcstrings` remains valid JSON (EN source + the added ES entries).
- markdownlint (CI-pinned) clean on the new / edited docs.
- New Swift matches the app's existing SwiftUI baseline (the crash-log views follow the same `NavigationStack` / closure-`NavigationLink` / `.topBarTrailing` patterns already in Settings, so they add no availability regression) and is auto-included by xcodegen (`sources: path: RustyNES`); the Swift compile + on-device behaviour remain the documented macOS / TestFlight carryover (no Xcode on the Linux host).

## Maintainer / on-device closeout (deferred to v2.0.9 / the TestFlight upload)

- Build the app with **Xcode 26 / the iOS 26 SDK** (the App Store submission floor — a hard gate at v2.0.7) and confirm the new Diagnostics UI + crash-log viewer render on device.
- Force a test `NSException` on device and confirm a local log is written, viewable, copyable, and pruned to 10; confirm the toggle-off path stops new logs.
- The full v1.9.9 on-device TestFlight checklist (ROM import, save / rewind, MFi controller, audio interruptions, ProMotion pacing, an accurate privacy label).

## What's next — the rest of "Harbor"

- **v2.0.7** — iOS polish + performance + the **iOS 26 SDK / Xcode 26** App Store submission-floor readiness + the privacy-manifest / required-reason-API audit.
- **v2.0.8** — the iOS release candidate (App Store Connect listing staged, TestFlight external beta, App-Review self-audit).
- **v2.0.9** — joint on-device readiness verification for both apps.
- **v2.1.0** — the **joint Google Play + Apple App Store + AltStore PAL + F-Droid launch**.

Full detail: `CHANGELOG.md` `[2.0.6]` · `docs/STATUS.md` (single source of truth) · `docs/ios-v2.0.6-readiness.md` · `to-dos/plans/v2.0.5-v2.0.8-ios-finalization-plan.md`.
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,26 @@ cycle-accurate core later replaced.

## [Unreleased]

## [2.0.6] - 2026-07-09 - "Harbor" (iOS feature parity — "Parity")

- The second iOS finalization release (the v2.0.5–v2.0.8 window), on the
byte-identical v2.0.0 "Timebase" core: **AccuracyCoin 141/141**, nestest 0-diff,
the `#![no_std]` chip stack untouched. Host / iOS-only — no accuracy / save-state /
determinism number moves.
- **New opt-in crash-reporting surface** (privacy-first, **off by default**) — the
iOS analogue of the Android v1.8.8 `CrashReporter`, closing the v1.9.9 readiness
gap. Enabled from **Settings → Diagnostics**, an uncaught-`NSException` handler
writes **local** crash logs (viewable + copyable in-app; **nothing is uploaded**,
so the "Data Not Collected" privacy label is unchanged). The handler re-checks the
live opt-in at crash time, so opting out stops new logs immediately. EN + ES.
- **Feature-parity re-verification** of the v1.9.x host features against the v2.0.0
bridge (Game Center, CloudKit save sync, MFi controllers, capture / PiP,
accessibility) — all route through the unchanged bridge surface; recorded in
`docs/ios-v2.0.6-readiness.md`.
- Version bump: workspace `2.0.5 → 2.0.6`; iOS `MARKETING_VERSION → 2.0.6`.
- TestFlight-only; the App Store + AltStore PAL launch stays deferred to v2.1.0.
On-device crash-capture verification is flagged for the v2.0.9 readiness pass.

## [2.0.5] - 2026-07-09 - "Harbor" (iOS re-port onto Timebase — "Landfall")

- Opens the iOS finalization window (v2.0.5–v2.0.8) of the v2.0.x "Harbor" train:
Expand Down
36 changes: 18 additions & 18 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ members = [
]

[workspace.package]
version = "2.0.5"
version = "2.0.6"
edition = "2024"
rust-version = "1.96"
license = "MIT OR Apache-2.0"
Expand Down
27 changes: 24 additions & 3 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,27 @@
# RustyNES — Project Status Matrix

> **Current release: v2.0.5 "Harbor"** (2026-07-09) — the fifth release of the v2.0.x
> **Current release: v2.0.6 "Harbor"** (2026-07-09) — the sixth release of the v2.0.x
> mobile-finalization train, and the **second iOS finalization release** ("Parity"),
> continuing the iOS window (v2.0.5–v2.0.8). A **host / iOS-only** cut: the
> cycle-accurate emulation core is **unchanged and byte-identical to v2.0.5** —
> AccuracyCoin still **141/141 (100.00%, RAM-authoritative)**, nestest 0-diff, the
> `#![no_std]` chip stack untouched — so no accuracy / save-state / determinism number
> moves. It adds a **new opt-in, privacy-first crash-reporting surface** (off by
> default, the iOS analogue of the Android v1.8.8 `CrashReporter`, closing the v1.9.9
> iOS-applicable deferral): **Settings → Diagnostics** installs an
> uncaught-`NSException` handler that writes **local** crash logs the user can view +
> copy in-app — **nothing is uploaded**, so the "Data Not Collected" privacy label is
> unchanged (EN + ES); the handler re-checks the live opt-in at crash time so opting
> out stops new logs immediately. It also records the **feature-parity
> re-verification** of the v1.9.x host features (Game Center, CloudKit save sync, MFi
> controllers, capture / PiP, accessibility) against the unchanged v2.0.0 bridge
> surface. Version bump (workspace `2.0.5 -> 2.0.6`; iOS `MARKETING_VERSION -> 2.0.6`).
> **TestFlight-only**; App Store + AltStore PAL deferred to v2.1.0; on-device
> crash-capture verification is a **maintainer / v2.0.9** step. See `CHANGELOG.md`
> `[2.0.6]` + `docs/ios-v2.0.6-readiness.md` +
> `to-dos/plans/v2.0.5-v2.0.8-ios-finalization-plan.md`.
>
> **The preceding release: v2.0.5 "Harbor"** (2026-07-09) — the fifth release of the v2.0.x
> mobile-finalization train, and the **first iOS finalization release** ("Landfall"),
> opening the iOS window (v2.0.5–v2.0.8) that mirrors the Android v2.0.1–v2.0.4 window.
> This is a **host / iOS-only** cut: the cycle-accurate emulation core is **unchanged and
Expand All @@ -24,7 +45,7 @@
> determinism smoke on Apple silicon. See `CHANGELOG.md` `[2.0.5]` +
> `docs/ios-v2.0.5-readiness.md` + `to-dos/plans/v2.0.5-v2.0.8-ios-finalization-plan.md`.
>
> **The preceding release: v2.0.4 "Harbor"** (2026-07-08) — the fourth release of the v2.0.x
> **The release before that: v2.0.4 "Harbor"** (2026-07-08) — the fourth release of the v2.0.x
> mobile-finalization train, and the **Android release-candidate** milestone. This is a
> **host / Android-only** cut: the cycle-accurate emulation core is **unchanged and
> byte-identical to v2.0.3** — AccuracyCoin still **141/141 (100.00%, RAM-authoritative)**,
Expand Down Expand Up @@ -52,7 +73,7 @@
> them to the monetization `feature_enabled` façade without on-device validation). See
> `CHANGELOG.md` `[2.0.4]` + `to-dos/plans/v2.0.4-android-rc-plan.md`.
>
> **The release before that: v2.0.3 "Harbor"** (2026-07-08) — the third release of the v2.0.x
> **Earlier in the train: v2.0.3 "Harbor"** (2026-07-08) — the third release of the v2.0.x
> mobile-finalization train, and the one that makes the octal-latch accuracy work
> real at the shipped default. The **2-cycle-ALE PPU fetch model is promoted from the
> experimental `mc-ppu-2cycle-ale` flag to the unconditional, only PPU fetch path**
Expand Down
Loading