Skip to content

docs(ledger): characterise the silent cohort — they halt, each differently - #195

Merged
doublegate merged 2 commits into
mainfrom
docs/silent-cohort
Jul 29, 2026
Merged

docs(ledger): characterise the silent cohort — they halt, each differently#195
doublegate merged 2 commits into
mainfrom
docs/silent-cohort

Conversation

@doublegate

Copy link
Copy Markdown
Owner

Docs-only. Characterises the titles issuing zero RDP commands, and refutes a lead by measurement.

They are not stalled — they have stopped

Dumping what actually reaches WB at one-cycle granularity:

Title Retiring instruction Status Reading
Banjo-Tooie B -1 @ 0x800136A0 IE=1, IM=0xFF, IP=0 self-loop, interrupts enabled, nothing pending — nothing can release it
Donkey Kong 64 BNE r3,r2,-1 @ 0x80000A04 IE=0 spin-poll with interrupts disabled, delay slot is a NOP so neither register is reloaded — unexitable by construction
Jet Force Gemini B -1 @ 0x8003F5D8 IE=0, IP=0x04 halted with an RCP interrupt pending but masked; still servicing the odd exception (SD t0,88(k0) retires)

This is the same shape Super Mario 64 had before the PIF fix — a game that hit an assert and gave up. DK64 is the most distinctive and the best next target: a loop that cannot exit on its own terms.

osMemSize refuted as a lead

RI_SELECT was seeded to 0x14 — the documented IPL3 configuration (TSEL = 0b0001, RSEL = 0b0100, N64brew RDRAM Interface §RI_SELECT) — so IPL3 would take the RDRAM-already-up branch.

Nothing changed. osMemSize stayed 0, the silent titles stayed silent, SM64 was unaffected. Combined with SM64 rendering its title screen with osMemSize == 0, the lead is now doubly weakened. Refuted by measurement rather than left standing as a plausible story that later work would build on.

What this means for the plan

The remaining silent titles are not one shared fix. Each reached its halt for its own reason, exactly as SM64 reached its assert because osContInit miscounted controllers. The method that worked there is the one to repeat: find the branch into the halt, read what it tested, trace that value back.

Gates

cargo fmt --all --check · cargo test --workspace · markdownlint — green. Docs only, no behaviour change.

…rently

Dumping what reaches WB at one-cycle granularity shows the titles issuing zero
RDP commands are not stalled mid-work; they have deliberately stopped, the same
shape Super Mario 64 had before the PIF fix.

Banjo-Tooie: B -1 at 0x800136A0, IE=1, IM=0xFF, Cause.IP=0 -- a self-loop with
interrupts enabled and nothing pending, so nothing can release it.

Donkey Kong 64: BNE r3,r2,-1 at 0x80000A04 with IE=0 -- a spin-poll comparing
two registers with interrupts disabled, and the delay slot is a NOP, so neither
register is reloaded inside the loop. Unexitable by construction. The most
distinctive of the three and the best next target.

Jet Force Gemini: B -1 at 0x8003F5D8 with IE=0 and IP2 pending but masked,
while still servicing the occasional exception (its preamble SD t0,88(k0)
retires) -- halted rather than frozen.

osMemSize is doubly weakened as a lead. Seeding RI_SELECT = 0x14 -- the
documented IPL3 configuration, TSEL=0b0001 RSEL=0b0100 from N64brew RDRAM
Interface -- so IPL3 takes the RDRAM-already-up branch changed nothing:
osMemSize stayed 0, the silent titles stayed silent, SM64 was unaffected.
Refuted by measurement rather than left as a plausible story.

So the remaining work is per-title root-causing, not one shared fix. Each
reached a halt for its own reason, exactly as SM64 reached its assert because
osContInit miscounted controllers, and the method that worked there is the one
to repeat: find the branch into the halt, read what it tested, trace it back.

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

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

💤 Files selected but had no reviewable changes (1)
  • docs/accuracy-ledger.md
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 78ee71f3-f090-4ec9-9e4a-bfc306b012dc

📥 Commits

Reviewing files that changed from the base of the PR and between fb81c26 and 0615d75.

📒 Files selected for processing (1)
  • docs/accuracy-ledger.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

Antigravity, correctly: the rest of this row names registers by ABI (t0, k0,
s3) while the DK64 snippet used the raw r3/r2 my probe's disassembler emitted.

Naming them properly is not only consistency -- r3/r2 are v1/v0, the
return-value pair, so the loop is comparing two returned values and tracing
what last wrote them is the way into the root cause. The raw encoding is kept
alongside so the disassembly can still be matched.

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

Copy link
Copy Markdown
Owner Author

Adjudication — Antigravity review

No blocking issues.

Register naming — adopted, and it improved the finding

Correct: the rest of the row names registers by ABI (t0, k0, s3) while the DK64 snippet used the raw r3/r2 my probe's disassembler emitted.

Fixing it turned out to be more than consistency. r3/r2 are v1/v0 — the return-value pair, so the loop is comparing two returned values, which points straight at the way in: trace what last wrote them. The ledger now reads:

Donkey Kong 64: BNE v1, v0, -1 at 0x8000_0A04 with IE = 0 (registers given by ABI name, as elsewhere in this row; the raw encoding is r3/r2, and that they are v0/v1 — the return-value pair — is itself a hint: the loop is comparing two returned values, so tracing what last wrote them is the way in)

The raw encoding is kept alongside so the disassembly can still be matched against the probe output.

1,800 characters onto an already long single-line row — acknowledged, tracked

Agreed, and this is the third independent time it has been raised (also #188, #193). It is task #49: extract all long residuals to docs/residuals/R-NN.md in one pass, preserving every superseded claim verbatim, with the table linking to them.

Not doing it as a rider on a docs change about halt diagnosis — and worth noting the concrete harm is now demonstrated rather than theoretical: CodeRabbit found on #194 that unescaped pipes in this row were corrupting the table (MD056: extra data will be missing), silently dropping content from the end of the row, which is exactly where the newest appends land.

@github-actions

Copy link
Copy Markdown

Antigravity review (Gemini via Ultra)

This pull request updates docs/accuracy-ledger.md with low-level CPU trace findings for three non-rendering titles (Banjo-Tooie, Donkey Kong 64, and Jet Force Gemini), characterising the specific self-loops where each halts.

Blocking issues

None found.

Suggestions

  • docs/accuracy-ledger.md: Appending ~1,700 characters to a single markdown table cell on line 413 makes raw file maintenance and git diffs difficult to parse. Consider breaking extensive investigation logs into a dedicated document under docs/ and referencing it from the ledger table.

Nitpicks

  • The PR title uses British spelling (characterise), whereas the ledger entries mix American and British variants (characterised, rasterised, color); standardise spelling rules across documentation for consistency.

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

@doublegate
doublegate merged commit d9b0762 into main Jul 29, 2026
11 checks passed
@doublegate
doublegate deleted the docs/silent-cohort branch July 29, 2026 18:25
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