diff --git a/README.md b/README.md index 3b5a5b60..d552ceb3 100644 --- a/README.md +++ b/README.md @@ -66,22 +66,23 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/ ## Coverage -| Platform | Coverage | Verified | Untested | Missing | -|----------|----------|----------|----------|---------| -| Batocera | 353/353 (100.0%) | 353 | 0 | 0 | -| BizHawk | 118/118 (100.0%) | 118 | 0 | 0 | -| EmuDeck | 161/161 (100.0%) | 161 | 0 | 0 | -| Lakka | 530/530 (100.0%) | 530 | 0 | 0 | -| MiSTer FPGA | 65/65 (100.0%) | 65 | 0 | 0 | -| ROCKNIX | 38/38 (100.0%) | 38 | 0 | 0 | -| Recalbox | 346/346 (100.0%) | 346 | 0 | 0 | -| RetroArch | 530/530 (100.0%) | 530 | 0 | 0 | -| RetroBat | 341/341 (100.0%) | 341 | 0 | 0 | -| RetroDECK | 2008/2008 (100.0%) | 2008 | 0 | 0 | -| RetroPie | 530/530 (100.0%) | 530 | 0 | 0 | -| RomM | 374/374 (100.0%) | 374 | 0 | 0 | +| Platform | Coverage | Verified | Untested | Missing | Source-backed | +|----------|----------|----------|----------|---------|---------------| +| Batocera | 353/353 (100.0%) | 353 | 0 | 0 | 95/353 (27%) | +| BizHawk | 118/118 (100.0%) | 118 | 0 | 0 | 4/118 (3%) | +| EmuDeck | 161/161 (100.0%) | 161 | 0 | 0 | 15/161 (9%) | +| Lakka | 530/530 (100.0%) | 530 | 0 | 0 | 118/530 (22%) | +| MiSTer FPGA | 65/65 (100.0%) | 65 | 0 | 0 | 0/65 (0%) | +| ROCKNIX | 38/38 (100.0%) | 38 | 0 | 0 | 29/38 (76%) | +| Recalbox | 346/346 (100.0%) | 346 | 0 | 0 | 83/346 (24%) | +| RetroArch | 530/530 (100.0%) | 530 | 0 | 0 | 118/530 (22%) | +| RetroBat | 341/341 (100.0%) | 341 | 0 | 0 | 81/341 (24%) | +| RetroDECK | 2008/2008 (100.0%) | 2008 | 0 | 0 | 104/2008 (5%) | +| RetroPie | 530/530 (100.0%) | 530 | 0 | 0 | 118/530 (22%) | +| RomM | 374/374 (100.0%) | 374 | 0 | 0 | 84/374 (22%) | Coverage is measured against the file list each platform declares, using that platform's own verification mode. +Source-backed counts the files whose expectations were also read from an emulator's source code; the rest rely on the platform list alone. Where platform lists and emulator source code disagree, the differences are tracked in the [gap analysis](https://abdess.github.io/retrobios/gaps/). ## Build your own pack @@ -153,4 +154,4 @@ The scripts and tooling are released under the [MIT License](LICENSE). The BIOS and firmware files are not covered by that license: they are third-party system software, preserved and provided for personal backup, archival, and interoperability with emulation software. The legal reasoning is laid out in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal). -*Auto-generated on 2026-08-07T13:24:31Z* +*Auto-generated on 2026-08-07T14:01:25Z* diff --git a/scripts/generate_readme.py b/scripts/generate_readme.py index 7d498eab..9a959bad 100644 --- a/scripts/generate_readme.py +++ b/scripts/generate_readme.py @@ -60,6 +60,10 @@ def compute_coverage( "mode": config.get("verification_mode", "existence"), "details": result["details"], "config": config, + "ground_truth": result.get( + "ground_truth_coverage", + {"with_validation": 0, "platform_only": total, "total": total}, + ), } @@ -261,16 +265,23 @@ def generate_readme(db: dict, platforms_dir: str) -> str: "", "## Coverage", "", - "| Platform | Coverage | Verified | Untested | Missing |", - "|----------|----------|----------|----------|---------|", + "| Platform | Coverage | Verified | Untested | Missing | Source-backed |", + "|----------|----------|----------|----------|---------|---------------|", ] ) for name, cov in sorted(coverages.items(), key=lambda x: x[1]["platform"]): pct = f"{cov['percentage']:.1f}%" + gt = cov["ground_truth"] + gt_pct = ( + f"{gt['with_validation'] / gt['total'] * 100:.0f}%" + if gt["total"] + else "0%" + ) lines.append( f"| {cov['platform']} | {cov['present']}/{cov['total']} ({pct}) | " - f"{cov['verified']} | {cov['untested']} | {cov['missing']} |" + f"{cov['verified']} | {cov['untested']} | {cov['missing']} | " + f"{gt['with_validation']}/{gt['total']} ({gt_pct}) |" ) lines.extend( @@ -278,6 +289,9 @@ def generate_readme(db: dict, platforms_dir: str) -> str: "", "Coverage is measured against the file list each platform declares," " using that platform's own verification mode.", + "Source-backed counts the files whose expectations were also read" + " from an emulator's source code; the rest rely on the platform" + " list alone.", "Where platform lists and emulator source code disagree, the" f" differences are tracked in the [gap analysis]({SITE_URL}gaps/).", "", diff --git a/scripts/generate_site.py b/scripts/generate_site.py index e9562c69..fd0662a6 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -1520,8 +1520,8 @@ def generate_gap_analysis( lines.extend([ "## Verification by Platform", "", - "| Platform | Files | Verified | Untested | Missing | Mode |", - "|----------|------:|---------:|---------:|--------:|------|", + "| Platform | Files | Verified | Untested | Missing | Mode | Source-backed |", + "|----------|------:|---------:|---------:|--------:|------|--------------:|", ]) for pname, cov in sorted(coverages.items(), key=lambda x: x[1]["platform"]): @@ -1538,19 +1538,29 @@ def generate_gap_analysis( if u > 0 else str(u) ) + gt = cov["ground_truth"] + gt_pct = ( + f"{gt['with_validation'] / gt['total'] * 100:.0f}%" + if gt["total"] + else "0%" + ) lines.append( f"| [{display}](platforms/{pname}.md) " f"| {cov['total']} " f"| {cov['verified']} " f"| {untested_str} " f"| {missing_str} " - f"| {cov['mode']} |" + f"| {cov['mode']} " + f"| {gt['with_validation']}/{gt['total']} ({gt_pct}) |" ) lines.extend([ "", "Verification follows each platform's own runtime check " "([how each mode works](wiki/verification-modes.md)): the counts " - "measure the repository against the file list each platform declares.", + "measure the repository against the file list each platform declares. " + "Source-backed counts the files whose expectations were also read " + "from an emulator's source code; the rest rely on the platform list " + "alone.", "", ])