fix(test): restore the ROM-gated audio checks (stale paths + a committed self-referential symlink) - #231
Open
JoeMatt wants to merge 2 commits into
Open
fix(test): restore the ROM-gated audio checks (stale paths + a committed self-referential symlink)#231JoeMatt wants to merge 2 commits into
JoeMatt wants to merge 2 commits into
Conversation
The four ROM-gated audio checks in `make test` looked only in test/roms/private/ flat. When the local corpus keeps cartridges under test/roms/private/ROMS/ instead, every one of them takes the else branch, prints "SKIP: ... not available" and the suite still exits 0 — so the audio regression guard silently stops running while the run still reads green. That is the exact masked-failure mode CLAUDE.md warns about for audio work, except here the check never executes at all rather than passing wrongly. Try the flat path first, then the ROMS/ subdirectory, for all four lookups. On a corpus using the ROMS/ layout this restores three checks that had been skipping: Clipping check: Atari Karts (negative control) RMS 407.8, 0/52 hot frames Clipping check: Iron Soldier 2 RMS 2599.3, 0/240 hot frames PASS: audio is present and within expected envelope (Iron Soldier 1) Skyhammer still reports SKIP — that ROM is genuinely absent here, which is what the SKIP branch is for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
f8a1543 committed test/roms/private as a symlink alongside an unrelated cpuextra.c change — an absolute path into one developer's home directory that also points at itself: test/roms/private -> /Users/.../virtualjaguar-libretro/test/roms/private Every clone therefore materialises a self-referential symlink: any access under it fails with ELOOP ("Too many levels of symbolic links"). Locally that silently disables the whole private ROM corpus — which is how the ROM-gated audio checks in `make test` began reporting SKIP. .gitignore already listed `test/roms/private/`, but the trailing slash makes the pattern match directories only, so the symlink was never ignored. Drop the slash so both a real directory and a symlink to one are covered, and untrack the entry. Nothing is deleted from anyone's working tree — the path stays on disk, just no longer version-controlled. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Regression:
|
| ROM | Status | Details | Diff |
|---|---|---|---|
| jagniccc | 🆕 NEW | no baseline | - |
| yarc | 🆕 NEW | no baseline | - |
| jagniccc (determinism) | ✅ PASS | identical across runs | - |
| yarc (determinism) | ✅ PASS | identical across runs | - |
| jagniccc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| yarc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| jagniccc (save state) | ✅ PASS | round-trip matches | - |
| yarc (save state) | ✅ PASS | round-trip matches | - |
| jagniccc (rewind) | ✅ PASS | rewind matches | - |
| yarc (rewind) | ✅ PASS | rewind matches | - |
Platform: Linux x86_64
Updated by CI at 2026-07-31T06:11:04.404Z
Contributor
There was a problem hiding this comment.
Pull request overview
Restores execution of ROM-gated audio regression checks in the make test target by making ROM path detection robust to both supported private-corpus layouts and by updating .gitignore to ignore a test/roms/private symlink as well as a directory.
Changes:
- Update ROM-gated audio test lookups to try both
test/roms/private/<rom>andtest/roms/private/ROMS/<rom>before emittingSKIP. - Adjust
.gitignoreto ignoretest/roms/privatewithout a trailing slash so it matches both a directory and a symlink.
Reviewed changes
Copilot reviewed 2 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| Makefile | Makes ROM-gated audio checks probe both supported corpus layouts so the checks run instead of silently skipping. |
| .gitignore | Changes the ignore pattern to cover test/roms/private when it is a symlink (in addition to a directory). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Regression:
|
| ROM | Status | Details | Diff |
|---|---|---|---|
| jagniccc | 🆕 NEW | no baseline | - |
| yarc | 🆕 NEW | no baseline | - |
| jagniccc (determinism) | ✅ PASS | identical across runs | - |
| yarc (determinism) | ✅ PASS | identical across runs | - |
| jagniccc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| yarc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| jagniccc (save state) | ✅ PASS | round-trip matches | - |
| yarc (save state) | ✅ PASS | round-trip matches | - |
| jagniccc (rewind) | ✅ PASS | rewind matches | - |
| yarc (rewind) | ✅ PASS | rewind matches | - |
Platform: Darwin arm64
Updated by CI at 2026-07-31T06:11:42.928Z
Regression:
|
| ROM | Status | Details | Diff |
|---|---|---|---|
| jagniccc | 🆕 NEW | no baseline | - |
| yarc | 🆕 NEW | no baseline | - |
| jagniccc (determinism) | ✅ PASS | identical across runs | - |
| yarc (determinism) | ✅ PASS | identical across runs | - |
| jagniccc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| yarc (frameskip) | ✅ PASS | skip=0 matches skip=3 | - |
| jagniccc (save state) | ✅ PASS | round-trip matches | - |
| yarc (save state) | ✅ PASS | round-trip matches | - |
| jagniccc (rewind) | ✅ PASS | rewind matches | - |
| yarc (rewind) | ✅ PASS | rewind matches | - |
Platform: Linux aarch64
Updated by CI at 2026-07-31T06:12:05.306Z
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The four ROM-gated audio checks in
make testhad stopped running. They did not fail — they printedSKIPand the suite still exited 0, so the audio regression guard was silently absent while every run read green.Two independent causes, one per commit.
1. A machine-specific symlink is committed to the repo
f8a1543("fix(m68k): gate all group-0 frame metadata on address-error exceptions") committedtest/roms/privatealongside itscpuextra.cchange — agit add -Aaccident. It is a symlink to an absolute path inside one developer's home directory, and that path is its own location:So every clone materialises a self-referential symlink, and any access under it fails:
.gitignorealready listedtest/roms/private/— but the trailing slash makes the pattern match directories only, so a symlink was never covered by it and slipped straight through.Fix: drop the trailing slash so both a real directory and a symlink to one are ignored, and
git rm --cachedthe entry. Nothing is deleted from anyone's working tree — the path stays on disk, it just stops being version-controlled. The corpus is normally a symlink to a directory kept outside the repo, which is exactly what the ignore rule is meant to cover.2. The lookups only checked one of the two corpus layouts
Each check looked only in
test/roms/private/flat. Where the local corpus keeps cartridges undertest/roms/private/ROMS/, all four take theelsebranch and skip. Each lookup now tries the flat path first, thenROMS/.Effect
Measured on a corpus using the
ROMS/layout, before → after:SKIPSKIPSKIPSKIPSKIP— genuinely absent from this machine; that is what the branch is formake TEST_EXPORTS=1 testexits 0 with 0 failures both before and after — which is the point: the suite could not tell the difference, and now three real checks are back.Iron Soldier 1 presence is the one CLAUDE.md calls mandatory for audio work ("running only one masks the silencing-regression class"). It had not been executing.
Notes
SKIP— correctly and by design.Makefileand.gitignoreonly.🤖 Generated with Claude Code