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
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- **RETRACTION: the Mode-5 first-pixel divergence is a 2-vs-2 reference disagreement, not a
RustySNES defect.** The entry below claims the two references agree bit-for-bit against RustySNES,
"this project's signature for a real defect". That was published from **two** references without
consulting the third, which is the exact mistake this project's own notes warn about.
Comment on lines +14 to +17

Diffing the pixels rather than the hashes: the divergence is **one column** — column 0 of the
extracted sample, the first pixel of the 512-wide picture — on all 224 rows and nothing else. 224
differing pixels of 57,344. RustySNES `0x0000`, snes9x `0x0421` (the backdrop).

ares' `sfc/ppu/dac.cpp` settles it *against* the original conclusion: `scanline()` seeds
`math.above.colorEnable = false` under the comment *"the first hires pixel of each scanline is
transparent // note: exact value initializations are not confirmed on hardware"*, and `below()`
returns `(n15)0` — black — in that state. RustySNES does the same thing. The split is **RustySNES
+ ares against snes9x + Mesen2**, on a value ares itself flags as unverified.

So there is **no defect to fix**, and `c5-mode5-hires-16px-tiles` is **not blessable** under
ADR 0013 rule 4 — it stays permanently unblessed as a variant set rather than looking like a
pending golden. `C5.15` does not become coverage this way; a hi-res scene avoiding column 0 would
make the rest of Mode 5 blessable, and that is the follow-up. The extraction infrastructure is
vindicated either way: two hosts with different geometries produced identical hashes for the other
57,120 pixels.

- **Both scene hosts silently accepted an out-of-contract frame geometry.** The width tests were
lower bounds — `w < SCENE_W` in the libretro host, `#buf < …` in the Mesen2 script — which catch a
frame that is too *narrow* and miss one that is too **wide**. Too wide is the case that actually
Expand Down
38 changes: 38 additions & 0 deletions docs/adr/0013-accuracysnes-framebuffer-oracle.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,3 +202,41 @@ The scene is left **unblessed**. Rule 4 would permit blessing at the reference v
references agree — but that turns the scene gate red on a live finding, and an unblessed scene does
not fail the gate, so the finding is preserved without taking the tree red. The investigation is
tracked separately; blessing follows the fix.

### Correction, same day — that divergence is a 2-vs-2, not a RustySNES bug

The claim above ("the two references agree bit-for-bit ... one host failing alone means a bug in
that host") is **withdrawn**. It was made from two references without consulting the third.

Diffing the pixels rather than the hashes: the divergence is **exactly one column** — column 0 of
the extracted sample, the first pixel of the 512-wide picture — on all 224 rows, and nothing else.
224 differing pixels of 57,344; RustySNES `0x0000`, snes9x `0x0421` (the backdrop).

ares' source settles it against the original conclusion. `sfc/ppu/dac.cpp::scanline()`:

```cpp
//the first hires pixel of each scanline is transparent
//note: exact value initializations are not confirmed on hardware
math.above.colorEnable = false;
```

and `below()` returns `math.above.colorEnable ? math.below.color : (n15)0` — **black** at line
start. RustySNES seeds `above_enable: false` and does the same thing. So the split is **RustySNES +
ares against snes9x + Mesen2**, and ares explicitly flags its own initialisation as *not confirmed
on hardware*.

Consequences, recorded so the scene is not mistaken for a pending fix:

- There is **no defect here to fix**. Changing column 0 to emit the backdrop would move RustySNES
off ares' behaviour to match the other two on a value ares says is unverified.
- `c5-mode5-hires-16px-tiles` is **not blessable** under rule 4 and stays permanently unblessed
unless real hardware settles it — a variant set, not a pending golden.
Comment on lines +228 to +233

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Distinguish “no defect established” from “no defect exists.”

The 2-vs-2 result supports retaining the scene as contested, but ares explicitly marks the first-pixel initialization as unconfirmed on hardware.

  • docs/adr/0013-accuracysnes-framebuffer-oracle.md#L228-L233: state that no RustySNES defect is established and no fix is justified pending hardware evidence.
  • CHANGELOG.md#L29-L30: use the same unresolved-status wording.
Proposed wording
-There is no defect here to fix.
+No RustySNES defect is established, and no code fix is justified pending hardware evidence.

As per path instructions, docs are the spec, so the status must preserve the documented uncertainty.
Based on learnings, a contested rendering is evidence to preserve, not proof of hardware truth.

📍 Affects 2 files
  • docs/adr/0013-accuracysnes-framebuffer-oracle.md#L228-L233 (this comment)
  • CHANGELOG.md#L29-L30
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/0013-accuracysnes-framebuffer-oracle.md` around lines 228 - 233, The
ADR currently overstates the evidence by saying no defect exists; update the
text around the documented consequences to state that no RustySNES defect is
established and no fix is justified pending hardware evidence, while preserving
the contested and permanently unblessed status. Apply the same unresolved-status
wording in CHANGELOG.md at lines 29-30; both sites must explicitly preserve the
uncertainty about ares’ unconfirmed first-pixel initialization.

Sources: Path instructions, Learnings

- `C5.15` does not become coverage this way. A hi-res scene that avoids column 0, or a hash that
excludes the first column, would make the rest of Mode 5 blessable; that is the follow-up.
- The extraction itself is **vindicated**: two hosts with different geometries produced identical
hashes for the other 57,120 pixels.
Comment on lines +234 to +237

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Scope the coverage statement to C5.15.

The earlier documentation keeps other Mode-5 scenes blocked because their reference renderings disagree. “The rest of Mode 5” can incorrectly imply that those scenes are now blessable.

  • docs/adr/0013-accuracysnes-framebuffer-oracle.md#L234-L237: refer to the remaining validated pixels of C5.15.
  • CHANGELOG.md#L31-L34: use the same scene-specific scope and retain the 57,120-pixel result as extraction validation.
Proposed wording
-A hi-res scene that avoids column 0, or a hash that excludes the first column, would make the rest of Mode 5 blessable;
+A hi-res scene that avoids column 0, or a hash that excludes the first column, would make the remaining pixels of C5.15 eligible for evaluation;

As per path instructions, docs are the spec, so coverage claims must stay within the documented validated scope.

📍 Affects 2 files
  • docs/adr/0013-accuracysnes-framebuffer-oracle.md#L234-L237 (this comment)
  • CHANGELOG.md#L31-L34
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/0013-accuracysnes-framebuffer-oracle.md` around lines 234 - 237,
Scope the coverage wording in docs/adr/0013-accuracysnes-framebuffer-oracle.md
lines 234-237 to the remaining validated pixels of C5.15 instead of implying the
rest of Mode 5 is blessable, while retaining the 57,120-pixel extraction
validation. Apply the same C5.15-specific scope and result to CHANGELOG.md lines
31-34; both sites require direct wording updates.

Source: Path instructions


The method note is the durable part. Two references agreeing is not "the references agree" — this
project counts ares and bsnes as **one** reference precisely because lineage matters, and here the
lineage that disagreed was the one not consulted. Read the third source *before* publishing a defect
claim, not after.
Loading