Skip to content

feat: v1.5.0 Workstream C — TASVideos pass + replay/TAS polish + NSF waveform scope - #103

Merged
doublegate merged 3 commits into
mainfrom
feat/v1.5.0-workstream-c
Jun 17, 2026
Merged

feat: v1.5.0 Workstream C — TASVideos pass + replay/TAS polish + NSF waveform scope#103
doublegate merged 3 commits into
mainfrom
feat/v1.5.0-workstream-c

Conversation

@doublegate

Copy link
Copy Markdown
Owner

v1.5.0 "Lens" — Workstream C: creator / TAS / speedrun tooling (beta.2)

All additive / off-by-default. Replay stays bit-identical, AccuracyCoin 100% (139/139) holds, and the shipped / native / no_std / wasm builds are byte-identical to beta.1 for non-test paths.

C1 — TASVideos / extended emulator-test pass

Audited RustyNES against the Nesdev "Emulator tests" + "Tricky-to-emulate games" indices and the christopherpow/nes-test-roms aggregator for committable tests beyond the 139 AccuracyCoin battery.

  • mmc3_test v1 (6 sub-ROMs, blargg/kevtris PD) wired into tests/mmc3.rs (distinct ROMs from the already-wired mmc3_test_2, same $6000 protocol):
  • dpcmletterbox (Damian Yerrick, royalty-free) added as a deterministic framebuffer-hash visual smoke (tests/tasvideos_extended.rs) — a DMC-IRQ-as-scanline-timer raster split with no mapper IRQ, so a sensitive DMC-IRQ + sprite-0 + NMI/DMC-phase sentinel.
  • Not committed (licensing unclear): scanline-a1, tvpassfail, etc. — stay in the gitignored local corpus.
  • tests/roms/LICENSES.md + docs/testing-strategy.md updated.

C2 — Replay / TAS window polish

Tools → Replay / TAS — a dedicated control + read-out surface (per GeraNES ReplayWindowUI):

  • device-topology read-out (per-port controller/peripheral + Four Score),
  • timebase read-out (region + whole-Hz estimate + elapsed/total wall-clock),
  • Record / Play / Branch / Stop controls (mirror F6/F7/F8) + deterministic seek-to-frame (slider + Start / −10 / +1 / +10).

Frontend-only over the existing MovieUi / rustynes_core::Movie machinery. The app pushes a read-only ReplayInfo snapshot each frame and drains a ReplayRequest after the egui pass. Seek re-derives state (MovieUi::seek_playback = seek_to_start + replay recorded inputs) — proven bit-identical to linear playback by seek_is_bit_identical_to_linear_playback. No new determinism surface.

C3 — NSF waveform visualizer

A per-channel oscilloscope (pulse 1/2, triangle, noise, DMC) in the NSF Player window, fed from the read-only apu_snapshot() DAC levels; surfaces the expansion-audio chip name (VRC6/VRC7/FME-7/N163/MMC5/FDS) when present. Output-only eye-candy — samples a copy for display, no synthesis change.

Gates (all green)

  • cargo test --workspace --features test-roms — AccuracyCoin 139/139 (RAM 100.00%) + mapper honesty gate + the new C1 suites + all determinism-sensitive suites.
  • cargo clippy --workspace --all-targets -- -D warnings + --features scripting,hd-pack + --features retroachievements + both wasm flavours.
  • cargo fmt --all --check · RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps · no_std thumbv7em · markdownlint v0.39.0.
  • Frontend lib tests (incl. new C2 seek + C3 scope + replay-panel tests) pass.

Do not merge — for maintainer review.

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings June 17, 2026 03:20

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request implements the v1.5.0 'Lens' Workstream C, introducing creator, TAS, and speedrun tooling. Key additions include a dedicated Replay / TAS window with device topology, timebase, and deterministic seek-to-frame controls, alongside a per-channel oscilloscope waveform visualizer in the NSF Player window. The test suite is also expanded with the older mmc3_test v1 suite and the dpcmletterbox visual regression test. Feedback on these changes identifies a bug where the seek slider fails to track the live cursor during playback, and a performance regression in the NSF panel where a closure unnecessarily allocates strings on every frame.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread crates/rustynes-frontend/src/debugger/replay_panel.rs
Comment thread crates/rustynes-frontend/src/debugger/nsf_panel.rs Outdated
doublegate and others added 2 commits June 16, 2026 23:42
Audit RustyNES against the Nesdev "Emulator tests" + "Tricky-to-emulate
games" indices and the christopherpow/nes-test-roms aggregator for
committable tests beyond the 139 AccuracyCoin battery.

- Wire the older `mmc3_test` v1 suite (6 sub-ROMs, blargg/kevtris PD,
  distinct from the already-wired mmc3_test_2): 1/2/3 strict-PASS; 4/5/6
  pinned as documented expected-fail probes. They converge on the SAME
  ADR-0002 fractional-master-clock scanline-IRQ-cadence residual as
  mmc3_test_2/4 #3 — no new bug (sub-scanline IRQ cadence, deferred to
  v2.0). Probes assert the failure shape so a future fix flips them.
- Add dpcmletterbox (Damian Yerrick, royalty-free) as a deterministic
  framebuffer-hash visual smoke — a DMC-IRQ-as-scanline-timer raster
  split with no mapper IRQ, so a sensitive DMC-IRQ + sprite-0 + NMI/DMC
  phase sentinel.
- LICENSES.md + docs/testing-strategy.md + CHANGELOG [Unreleased] updated.

No core change; AccuracyCoin 100% (139/139) and determinism hold.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
C2 — Replay / TAS window (Tools -> Replay / TAS), modelled on GeraNES's
ReplayWindowUI:
- device-topology read-out (per-port controller/peripheral + Four Score),
- timebase read-out (region + whole-Hz + elapsed/total wall-clock),
- Record/Play/Branch/Stop controls (mirror F6/F7/F8) + deterministic
  seek-to-frame (slider + Start/-10/+1/+10).
The app pushes a read-only ReplayInfo snapshot each frame and drains a
ReplayRequest after the egui pass. Seek re-derives state via
MovieUi::seek_playback (seek_to_start + replay recorded inputs), proven
bit-identical to linear playback by a new round-trip test — no new
determinism surface.

C3 — NSF waveform visualizer: a per-channel oscilloscope (pulse1/2,
triangle, noise, DMC) in the NSF Player window, fed from the read-only
apu_snapshot() DAC levels; surfaces the expansion-audio chip name when
present. Output-only eye-candy; no synthesis change.

Frontend-only, additive/off-by-default. All clippy flavors (default +
scripting,hd-pack + retroachievements + both wasm) + fmt + rustdoc +
no_std clean; AccuracyCoin 100% (139/139) and determinism hold.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@doublegate
doublegate force-pushed the feat/v1.5.0-workstream-c branch from 3722e03 to 5168765 Compare June 17, 2026 03:44
…no-alloc

- replay_panel.rs: the seek slider now tracks the live playback cursor (it was
  static — `seek_target` only updated when it exceeded `last`, which never
  happens since the slider clamps to `0..=last`). Added a `seek_dragging` flag
  so live tracking pauses only while the user drags, then resumes after the seek.
- nsf_panel.rs: `show_or_dash` is now a `fn` returning a borrowed `&str` (no
  per-frame `String` alloc for Title/Artist/Copyright). A `fn` (not a closure) so
  the return lifetime elides to the input — the closure form Gemini suggested
  fails borrowck (closures don't elide the return lifetime).

Frontend-only, determinism-neutral. clippy (default + scripting,hd-pack +
retroachievements + wasm) + fmt + AccuracyCoin 139/139 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@doublegate
doublegate merged commit b1559a6 into main Jun 17, 2026
18 checks passed
@doublegate
doublegate deleted the feat/v1.5.0-workstream-c branch June 17, 2026 04:07
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