diff --git a/emulators/bsnes2014.yml b/emulators/bsnes2014.yml index d2bbbb1f..8a11f5ed 100644 --- a/emulators/bsnes2014.yml +++ b/emulators/bsnes2014.yml @@ -26,9 +26,9 @@ notes: | database (ananke/database/). All DSP1 games use DSP1B filenames via heuristic fallback. The database dsp1.program.rom / dsp1.data.rom names are only in the standalone build (target-ethos via ananke). - .info accuracy/balanced: firmware_count=18 (overcounts by 2, includes - phantom dsp1.* from unused database). Performance .info: firmware_count=17 - (also missing cx4.data.rom). + .info accuracy/balanced: firmware_count=18, which counts the two dsp1.* + names of the database this build does not use. Performance .info: + firmware_count=17, without cx4.data.rom. Upstream v094 source is contained within the libretro repo (sfc/, ananke/). bsnes-emu/bsnes is the modern rewrite (v115+). diff --git a/emulators/neocd.yml b/emulators/neocd.yml index 2bb0e32a..fae255d5 100644 --- a/emulators/neocd.yml +++ b/emulators/neocd.yml @@ -29,7 +29,7 @@ notes: | Y-ZOOM ROM (ng-lo.rom / 000-lo.lo) listed in .info but generated algorithmically, never loaded from file (src/memory.cpp:223-253 - generateYZoomData, CRC32 E09E253C). These are phantom .info entries. + generateYZoomData, CRC32 E09E253C), so the core never opens these files. .info firmware_count=12 but 2 are phantoms (Y-ZOOM), effective count=10. .info lists uni-bioscd.rom as "Universe BIOS 3.2" but SHA1 matches diff --git a/emulators/quasi88.yml b/emulators/quasi88.yml index d54d9813..bd1db370 100644 --- a/emulators/quasi88.yml +++ b/emulators/quasi88.yml @@ -40,7 +40,7 @@ systems: # # font.rom divergence: libretro.c:566-571 loads 0x1000 bytes then # overwrites the buffer with kanji ROM + built-in graph. The font.rom -# data is not actually used (bug). Upstream memory.c:427 loads FONT_SZ +# data ends up unused. Upstream memory.c:427 loads FONT_SZ # (2048) and keeps the font data in the first half. # # OPNA rhythm samples (2608_BD.WAV etc.): loaded by upstream via diff --git a/emulators/rustation.yml b/emulators/rustation.yml index 68278e50..c93216fe 100644 --- a/emulators/rustation.yml +++ b/emulators/rustation.yml @@ -19,7 +19,7 @@ notes: > "Boot to BIOS menu" core option allows booting without a disc. Database contains 24 entries (22 good, 2 known-bad rejected) covering BIOS versions 1.0 through 4.5. - .info declares firmware_count=0, which is incorrect. + .info declares firmware_count=0, while the core reads the BIOS images this profile lists. Project abandoned, superseded by rustation-ng. files: diff --git a/emulators/test_netplay.yml b/emulators/test_netplay.yml index 9a8026af..b1dbfcf2 100644 --- a/emulators/test_netplay.yml +++ b/emulators/test_netplay.yml @@ -9,8 +9,8 @@ cores: systems: [] notes: | - Phantom .info: declared in libretro-core-info since 2017 but no source code, - build recipe, or compiled binary exists anywhere in the libretro organization. + Declared in libretro-core-info since 2017. No source code, build recipe or + compiled binary for it could be found in the libretro organization. Not on the buildbot. The .info has empty authors, license, and extensions. No system files required. diff --git a/emulators/x64sdl.yml b/emulators/x64sdl.yml index 80001e8d..55bded75 100644 --- a/emulators/x64sdl.yml +++ b/emulators/x64sdl.yml @@ -14,7 +14,7 @@ notes: > Separate codebase from the newer vice-libretro port. Marked experimental and superseded. Unlike the newer port, this core does NOT embed system ROMs: all ROMs must be on disk in /data/C64/ and /data/DRIVES/. - The .info declares firmware_count=0 which is incorrect. No JiffyDOS support. + The .info declares firmware_count=0, while the core reads the ROMs this profile lists. No JiffyDOS support. No save states, no netplay, no cheats. files: diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 219d61c9..3e75caea 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -3789,12 +3789,12 @@ def generate_gap_analysis( "platform contract, and these numbers show where that contract diverges " "from what the code loads.", "", - "| Platform | Missing from list | Phantom | Hash conflict | Required status |", + "| Platform | Missing from list | Not read by profiles | Hash conflict | Required status |", "|----------|------------------:|--------:|--------------:|----------------:|", *div_rows, "", "- **Missing from list**: a profiled emulator loads the file, the platform list does not mention it", - "- **Phantom**: on the platform list, loaded by no profiled emulator", + "- **Not read by profiles**: on the platform list, loaded by no emulator profiled so far (a profile may still be incomplete)", "- **Hash conflict**: the platform list and the emulator source expect different hashes", "- **Required status**: required/optional differs between list and code", "", diff --git a/wiki/adding-a-scraper.md b/wiki/adding-a-scraper.md index d35aae19..e2628a2c 100644 --- a/wiki/adding-a-scraper.md +++ b/wiki/adding-a-scraper.md @@ -209,7 +209,7 @@ System ID consistency matters for cross-platform operations. The same console mu - Batocera uses 29-character truncated MD5 hashes in some entries. The resolution layer handles prefix matching, but the scraper should store the hash as-is. -Scraped data reflects what the upstream declares, which may not match reality. The scraper's job is faithful transcription of upstream data, not correction. Corrections happen in the emulator profiles (source-verified) and in `_shared.yml` (curated). If a scraper detects an obviously wrong hash or filename, log a warning but still include the upstream value. The divergence will surface during truth diffing. +Scraped data reflects what the upstream declares, which may not match reality. The scraper's job is faithful transcription of upstream data, not correction. Corrections happen in the emulator profiles (source-verified) and in `_shared.yml` (curated). If a scraper meets a hash or filename that differs from the emulator source, log a warning and still include the upstream value. The divergence will surface during truth diffing. ## Creating a target scraper diff --git a/wiki/verification-modes.md b/wiki/verification-modes.md index 951718af..5437f031 100644 --- a/wiki/verification-modes.md +++ b/wiki/verification-modes.md @@ -47,12 +47,13 @@ hashed with MD5, and compared case-insensitively against the expected value. If the `resolve_local_file` step already confirmed the MD5 match (status `md5_exact`), `verify.py` skips re-hashing and returns OK directly. -### Truncated MD5 (Batocera bug) +### Truncated MD5 (Batocera) -Some entries in Batocera's system data contain 29-character MD5 strings instead of -the standard 32. This is a known upstream bug. `verify.py` handles it by prefix matching: -if the expected hash is shorter than 32 characters, the actual hash is compared against -only its first N characters. +Some entries in Batocera's system data carry 29-character MD5 strings instead of +the usual 32. Batocera's script compares the full string (`batocera-systems:1088`), so +those entries report the file as untested. `verify.py` compares the prefix instead, to +find the file the entry designates: if the expected hash is shorter than 32 characters, +the actual hash is compared against only its first N characters. ### md5_composite (Recalbox ZIP verification) @@ -255,8 +256,8 @@ What the pack does with a `hash_mismatch` follows the platform's own mode. An MD5 or SHA1 platform would reject those bytes, so the file is left out and counted as an unsafe exclusion, distinct from a file the collection does not have. An existence platform reads no bytes at all, so the file is packed and -the divergence is printed as a discrepancy: an error in an upstream BIOS list -must not remove a file the frontend would have loaded. +the divergence is printed as a discrepancy: a value in an upstream BIOS list that +differs from the emulator source must not remove a file the frontend would load. ## Discrepancy detection