Skip to content

docs(accuracysnes): record what each remaining v1.28.0 row actually needs - #283

Merged
doublegate merged 2 commits into
mainfrom
docs/accuracysnes-v1-28-assessment
Jul 31, 2026
Merged

docs(accuracysnes): record what each remaining v1.28.0 row actually needs#283
doublegate merged 2 commits into
mainfrom
docs/accuracysnes-v1-28-assessment

Conversation

@doublegate

Copy link
Copy Markdown
Owner

Follow-up to #282. Working the v1.28.0 rows filed as "needs no new machinery" showed that several
need rather more, and the reasons are worth recording once rather than re-deriving each time.

The binding constraint

hv_begin/hv_end cost ~189 dots against a 341-dot scanline, leaving ~152 usable before
the H counter wraps — and a wrap returns a plausible small number instead of failing. That single
number bounds every Group A/B timing row, and it is now written down with the per-body arithmetic.

Per-row verdicts

row verdict why
A5.18 parked A BRK that never returns cannot be repeated, so the span is a BRK + RTI round trip and the differential is two extra stack accesses. Measuring both and subtracting works — 8 iterations gave round-trip delta 32, RTI-alone 16, BRK's own 16, exactly as predicted. But a round trip is 39 dots, so 8 of them wrap; it passed only because both arms wrapped by the same 341. The tell: the native round trip read 170, less than the 293 of the strictly cheaper RTI-alone arm. The largest count that fits is 3 → 6 dots of signal against TOL 2, in a difference-of-differences where quantisation from four measurements accumulates against it. Not sound, so not shipped.
A6.15 needs its own design "all 256 opcodes defined" is a definedness assertion, not a timing one, and sweep.rs's own module docs list why control flow, BRK/COP, STP, WAI and memory-addressing modes are excluded from it. Citing the sweep would be coverage by restatement.
C7.05, C7.06 entangled with an open gap the over-flag dot cursor landed in #231, but RustySNES sets range_over a line late (two, batched) against MesenCE — an exact-position row would fail for a reason that is not its subject. A polling loop is also several dots per iteration, which is the F1.09 vacuity shape.
B2.07 gated on B2.02 B2.04 covers the 262-line count, not the clock total, so the frequency is not implied by it. 60.0988 Hz needs clocks-per-frame, and the frame alternates 357,368/357,364 because of the short scanline — which is B2.02, a T-06-A residual scheduled for v1.29.0.
B2.09 v1.29.0 "not CPU-observable directly; reachable through the framebuffer oracle once the dot-resolution compositor lands" — its own dossier note.

What this means for the rung

The mechanically writable Group A/B rows are largely done. Most of what remains is either gated on
the v1.29.0 dot-model work or needs an instrument cheaper than the one that exists — so the honest
shape of v1.28.0 is smaller than the row list suggested, and the plan now says so.

Docs and CHANGELOG only; no generator or ROM change, so the committed cart is untouched.

🤖 Generated with Claude Code

…eeds

Working the rows filed as "needs no new machinery" showed several need
rather more. The assessments are now in docs/accuracysnes-plan.md with
the evidence, rather than left to be re-derived.

The binding constraint across Group A/B is the measurement budget:
hv_begin/hv_end cost ~189 dots against a 341-dot scanline, leaving ~152
usable before the H counter wraps and silently returns a plausible small
number rather than failing.

- A5.18 is parked on that arithmetic. BRK cannot be measured without RTI,
  so the span is a round trip and the differential is two extra stack
  accesses; measuring both and subtracting works (8 iterations gave 32 /
  16 / 16 exactly as predicted) but a round trip is 39 dots, so 8 of them
  wrap. It passed only because both arms wrapped by the same 341 -- the
  tell being that the native round trip read 170, LESS than the 293 of
  the strictly cheaper RTI-alone arm. Three iterations fit, giving 6 dots
  of signal against TOL 2 in a difference-of-differences.
- A6.15 needs its own design: sweep.rs deliberately covers only the
  unambiguous opcode subset, so citing it would be restatement.
- C7.05/C7.06 are entangled with RustySNES setting range_over a line late
  against MesenCE, plus the F1.09 polling-vacuity shape.
- B2.07 is gated on B2.02, and B2.09 is framebuffer-oracle work by its
  own dossier note. Both are v1.29.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@doublegate, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 25 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: aa442399-0537-448a-ba05-e22ccaba53d4

📥 Commits

Reviewing files that changed from the base of the PR and between 5f9f0d8 and 3710a68.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • docs/accuracysnes-plan.md

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

Module 40 says keep deep engineering narrative out of the CHANGELOG; the
measurements belong in docs/accuracysnes-plan.md, which the entry now
points at instead of restating.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@doublegate

Copy link
Copy Markdown
Owner Author

Review adjudication

No blocking issues. One suggestion applied, one nitpick declined.

CHANGELOG carries too much engineering detail. Applied — and it is not just style, it is a
documented project rule: module 40's "keep deep engineering/lineage narrative out of the CHANGELOG".
The entry is now four lines saying what changed and pointing at
docs/accuracysnes-plan.md §v1.28.0, which is where the dot counts, the wrap arithmetic and the
per-row reasoning belong.

British spelling of "quantisation". Declined, on two grounds. The repo has no single convention
to be consistent with — it currently runs 31 "behaviour" against 44 "behavior" — so this is not a
deviation from a standard, and a one-word change would not create one.

More to the point, the sentence in question is describing the TOL constant, whose own doc comment
in gen/src/tests/cpu.rs already reads "the irreducible quantisation of a 6/8-master-clock CPU
cycle against a 4-clock dot"
. Matching the text it is explaining is the more useful consistency
here than matching a global majority; changing it would make the plan and the code disagree about
the name of the same phenomenon.

@github-actions

Copy link
Copy Markdown

Antigravity review (Gemini via Ultra)

This PR updates the AccuracySNES roadmap documentation (docs/accuracysnes-plan.md) and CHANGELOG to detail the technical blockers and measurement constraints for each remaining test row in target release v1.28.0.

Blocking issues

None found.

Suggestions

  • CHANGELOG.md:14-18: Internal planning notes and documentation assessments for unreleased test rows should generally not be logged in CHANGELOG.md, as user-facing changelogs should be reserved for functional changes, bug fixes, or public API/doc updates.

Nitpicks

  • docs/accuracysnes-plan.md:467: The why cell for A5.18 is an inline multi-sentence paragraph that harms table scannability; consider putting a concise summary in the table and expanding on the measurement details in a subsection below.

Automated first-pass review by agy on a self-hosted runner -- not a human review.

@doublegate
doublegate merged commit f004f4e into main Jul 31, 2026
13 checks passed
@doublegate
doublegate deleted the docs/accuracysnes-v1-28-assessment branch July 31, 2026 19:13
doublegate added a commit that referenced this pull request Jul 31, 2026
#284)

* docs(accuracysnes): correct the C7.05/C7.06 verdict — no eval-line gap

The assessment landed in #283 said RustySNES sets range_over a line late
against MesenCE. Re-measured on main with scripts/probes/eval-line-213e:
it first reads set at scanline 100, which is MesenCE's value.

The one-line lag belonged to the BATCH compositor, and per-dot is now the
only one -- the probe's own README already recorded both figures, so this
was a misreading rather than a measurement that changed.

What actually remains for those rows is sampling resolution, not
correctness. A polling loop is several dots per iteration and would pass
whatever the true position is (the F1.09 vacuity shape). The probe
demonstrates the technique that works -- an H-IRQ at a chosen HTIME,
latching $2137/$213F and reading $213E -- so the rows should be written
as a bracket: one sample below the expected H = OAM.INDEX*2 expecting
clear, one above expecting set, the same shape D2.01 uses.

Both of the probe's recorded traps are carried into the note: HTIME=300
pushes IRQ latency into the V-counter increment and skews every reading
by a line, and the $213F read is required to reset the OPHCT/OPVCT
second-read flip-flop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(accuracysnes): move the per-row detail out of the table cells

Raised in review: the C7.05/C7.06 cell had grown past 1,000 characters,
which is unreadable in a plain-text editor and makes every future diff
noisy. The A5.18 cell had the same problem at 744.

Both now carry a one-line verdict and point at a subsection below the
table, where the probe invocation, the two sampling traps, and the
wrap-detection tell have room to be stated properly. Also records that
probe.sfc is gitignored, so run.sh must build it first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant