diff --git a/install/targets/emudeck.json b/install/targets/emudeck.json index 4ef016714..995b97a60 100644 --- a/install/targets/emudeck.json +++ b/install/targets/emudeck.json @@ -342,7 +342,6 @@ "freechaf", "freeintv", "frodo", - "fsuae", "fuse", "galaksija", "gam4980", @@ -424,7 +423,6 @@ "nxengine", "o2em", "oberon", - "omicron", "openlara", "opera", "panda3ds", @@ -505,7 +503,6 @@ "vice_xplus4", "vice_xscpu64", "vice_xvic", - "video_processor", "vircon32", "virtualjaguar", "virtualxt", diff --git a/measurements/pack-probes.jsonl b/measurements/pack-probes.jsonl index 4f4d63da7..b485648dc 100644 --- a/measurements/pack-probes.jsonl +++ b/measurements/pack-probes.jsonl @@ -13,20 +13,20 @@ {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","file":"mednafen_psx_hw_libretro.so","last_modified":"Tue, 27 Oct 2026 05:06:00 GMT","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-7117d9fe809f","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:54:23+00:00","records":["2026-10-27-436b1708ef9b"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2"},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-f215251f1fbe","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:55:00+00:00","records":["2026-10-27-dcc3253dd29c"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2"},"staged":22,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-e0de25b19c5d","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:55:04+00:00","records":["2026-10-27-4b1fae82aa24"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2"},"staged":160,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"files:bios_MD.bin","path":"bios_MD.bin","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[{"declared_by":["tmss.md"],"kind":"missing_declared","path":"tmss.md","paths":[]}],"id":"2026-10-27-999ee89554ae","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:55:53+00:00","records":["2026-10-27-20cd02176c4b"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":9,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/clownmdemu_libretro.so.zip","file":"clownmdemu_libretro.so","last_modified":"Mon, 26 Oct 2026 05:34:34 GMT","sha256":"0d85101878d347a420cf67bf35d9fa339ac8bbe0a636064a5a66af43eb9cec2a"},"emulator":"clownmdemu","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-401e733ca21d","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:56:45+00:00","records":["2026-10-27-1642d5598a5b"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":3,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_libretro.so.zip","file":"genesis_plus_gx_libretro.so","last_modified":"Sat, 24 Oct 2026 07:22:46 GMT","sha256":"90b3b66fa998b7769e0c56c6aa288f891eec33c3cd1cf328ccbddb2d628a1522"},"emulator":"genesis_plus_gx","error":null,"files_opened":[{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-ac147338e3a8","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:17+00:00","records":["2026-10-27-1510af952e4f"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":12,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_wide_libretro.so.zip","file":"genesis_plus_gx_wide_libretro.so","last_modified":"Sun, 25 Oct 2026 06:32:50 GMT","sha256":"03e157b15bd9faadab5a79dde1986c90ba7da9c11b5b44d4243b60c931e23d78"},"emulator":"genesis_plus_gx_wide","error":null,"files_opened":[{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-7b9744e164c6","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:19+00:00","records":["2026-10-27-d192c31e4bbc"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":12,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/picodrive_libretro.so.zip","file":"picodrive_libretro.so","last_modified":"Sun, 25 Oct 2026 05:53:32 GMT","sha256":"fd4010afa91f69d3c61be49c95e14a5c37117c4d0899d3e593ccc4339c1417d5"},"emulator":"picodrive","error":null,"files_opened":[{"created":false,"entry":"files:us_scd2_9306.bin","path":"us_scd2_9306.bin","sha1":"5adb6c3af218c60868e6b723ec47e36bbdf5e6f0"},{"created":false,"entry":"files:carthw.cfg","path":"carthw.cfg","sha1":"d3fe0b958705e4cb5eeb7822e60d474204df4bd3"}],"findings":[],"id":"2026-10-27-019d891b68e9","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:20+00:00","records":["2026-10-27-568e6ae9560c"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":16,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-6207be7f6fa2","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:31+00:00","records":["2026-10-27-323214feeed8"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":19,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-c2f209b271ee","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:32+00:00","records":["2026-10-27-f9b964643090"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":18,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-f39c67d20831","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:32+00:00","records":["2026-10-27-a9e89d04a77f"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":13,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabause_libretro.so.zip","file":"yabause_libretro.so","last_modified":"Tue, 27 Oct 2026 06:42:50 GMT","sha256":"974a4cc700ed7eef80b8a33abd33ed07ab317f2123a1014b78c57e043b923296"},"emulator":"yabause","error":null,"files_opened":[{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"}],"findings":[],"id":"2026-10-27-00c60e795b5f","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:39+00:00","records":["2026-10-27-6ca3d0d1f0ec"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":13,"system":"sega-saturn","target":"linux-x86_64","verdict":"hang","verdict_evidence":{"detail":"1 of 1 repetitions: the last 183 sampled frames are one colour each","repetitions":["hang"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/ymir_libretro.so.zip","file":"ymir_libretro.so","last_modified":"Tue, 27 Oct 2026 05:34:56 GMT","sha256":"237d154fa6ef5caccc1d2899e0a2444947e4391a81bd241803932d1319832712"},"emulator":"ymir","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"},{"created":false,"entry":"files:mpr-17933.bin","path":"mpr-17933.bin","sha1":"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3"},{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"},{"created":false,"entry":"files:cdb/cdb_rom.bin","path":"cdb/cdb_rom.bin","sha1":"b3c20fbe57cd2eb595e9edac86817e5948dccae4"}],"findings":[],"id":"2026-10-27-da1992edf668","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:51+00:00","records":["2026-10-27-0cfeae5767b2"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":14,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-400f6875c7b5","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:59+00:00","records":["2026-10-27-953506afe46d"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","file":"mednafen_psx_hw_libretro.so","last_modified":"Tue, 27 Oct 2026 05:06:00 GMT","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-3ac99e860c4f","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:05+00:00","records":["2026-10-27-01ee781f441e"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"files:scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"files:scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-5305f9a96888","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:13+00:00","records":["2026-10-27-ebaf456445fd"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":22,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-5bd8c6d9541c","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:16+00:00","records":["2026-10-27-9165bec33048"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":160,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"files:bios_MD.bin","path":"bios_MD.bin","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[{"declared_by":["tmss.md"],"kind":"missing_declared","path":"tmss.md","paths":[]}],"id":"2026-10-27-6d9bf0105e6b","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:55:53+00:00","records":["2026-10-27-20cd02176c4b"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":9,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/clownmdemu_libretro.so.zip","file":"clownmdemu_libretro.so","last_modified":"Mon, 26 Oct 2026 05:34:34 GMT","sha256":"0d85101878d347a420cf67bf35d9fa339ac8bbe0a636064a5a66af43eb9cec2a"},"emulator":"clownmdemu","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-57ca2c364da2","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:56:45+00:00","records":["2026-10-27-1642d5598a5b"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":3,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_libretro.so.zip","file":"genesis_plus_gx_libretro.so","last_modified":"Sat, 24 Oct 2026 07:22:46 GMT","sha256":"90b3b66fa998b7769e0c56c6aa288f891eec33c3cd1cf328ccbddb2d628a1522"},"emulator":"genesis_plus_gx","error":null,"files_opened":[{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-7fdea1d8d23a","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:17+00:00","records":["2026-10-27-1510af952e4f"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":12,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_wide_libretro.so.zip","file":"genesis_plus_gx_wide_libretro.so","last_modified":"Sun, 25 Oct 2026 06:32:50 GMT","sha256":"03e157b15bd9faadab5a79dde1986c90ba7da9c11b5b44d4243b60c931e23d78"},"emulator":"genesis_plus_gx_wide","error":null,"files_opened":[{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-63b36da4e56d","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:19+00:00","records":["2026-10-27-d192c31e4bbc"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":12,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/picodrive_libretro.so.zip","file":"picodrive_libretro.so","last_modified":"Sun, 25 Oct 2026 05:53:32 GMT","sha256":"fd4010afa91f69d3c61be49c95e14a5c37117c4d0899d3e593ccc4339c1417d5"},"emulator":"picodrive","error":null,"files_opened":[{"created":false,"entry":"files:us_scd2_9306.bin","path":"us_scd2_9306.bin","sha1":"5adb6c3af218c60868e6b723ec47e36bbdf5e6f0"},{"created":false,"entry":"files:carthw.cfg","path":"carthw.cfg","sha1":"d3fe0b958705e4cb5eeb7822e60d474204df4bd3"}],"findings":[],"id":"2026-10-27-fff0117b43b1","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:20+00:00","records":["2026-10-27-568e6ae9560c"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":16,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-cba4ec471283","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:31+00:00","records":["2026-10-27-323214feeed8"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":19,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-52f7110f988c","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:32+00:00","records":["2026-10-27-f9b964643090"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":18,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-4801da4eab2a","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:32+00:00","records":["2026-10-27-a9e89d04a77f"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":13,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabause_libretro.so.zip","file":"yabause_libretro.so","last_modified":"Tue, 27 Oct 2026 06:42:50 GMT","sha256":"974a4cc700ed7eef80b8a33abd33ed07ab317f2123a1014b78c57e043b923296"},"emulator":"yabause","error":null,"files_opened":[{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"}],"findings":[],"id":"2026-10-27-1f998c82b1ae","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:39+00:00","records":["2026-10-27-6ca3d0d1f0ec"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":13,"system":"sega-saturn","target":"linux-x86_64","verdict":"hang","verdict_evidence":{"detail":"1 of 1 repetitions: the last 183 sampled frames are one colour each","repetitions":["hang"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/ymir_libretro.so.zip","file":"ymir_libretro.so","last_modified":"Tue, 27 Oct 2026 05:34:56 GMT","sha256":"237d154fa6ef5caccc1d2899e0a2444947e4391a81bd241803932d1319832712"},"emulator":"ymir","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"},{"created":false,"entry":"files:mpr-17933.bin","path":"mpr-17933.bin","sha1":"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3"},{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"},{"created":false,"entry":"files:cdb/cdb_rom.bin","path":"cdb/cdb_rom.bin","sha1":"b3c20fbe57cd2eb595e9edac86817e5948dccae4"}],"findings":[],"id":"2026-10-27-b2819fb679eb","install":"installer","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:51+00:00","records":["2026-10-27-0cfeae5767b2"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":14,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-65efad62e33f","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:57:59+00:00","records":["2026-10-27-953506afe46d"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","file":"mednafen_psx_hw_libretro.so","last_modified":"Tue, 27 Oct 2026 05:06:00 GMT","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-fc5fd143e6e9","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:05+00:00","records":["2026-10-27-01ee781f441e"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"files:scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"files:scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-500d09e316a3","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:13+00:00","records":["2026-10-27-ebaf456445fd"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":22,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-b5d57c2a3d85","install":"installer","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T14:58:16+00:00","records":["2026-10-27-9165bec33048"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"49b47355b9504dbefcb0261513b18e9f15dc20a2","save_dir_files":106},"staged":160,"system":"sony-playstation","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"tmss.md","path":"tmss.md","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"5adb6c3af218c60868e6b723ec47e36bbdf5e6f0"}],"findings":[],"id":"2026-10-27-2b3b2b6e67b7","install":"pack","platform":"batocera","platform_system":"sega-mega-cd","platform_version":"43.1","probed_at":"2026-10-27T17:07:16+00:00","records":["2026-10-27-788859c63e16"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"052986c92351077a88cba47b5314727cb3984f82"},"staged":10,"system":"sega-mega-cd","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_libretro.so.zip","file":"genesis_plus_gx_libretro.so","last_modified":"Sat, 24 Oct 2026 07:22:46 GMT","sha256":"90b3b66fa998b7769e0c56c6aa288f891eec33c3cd1cf328ccbddb2d628a1522"},"emulator":"genesis_plus_gx","error":null,"files_opened":[{"created":false,"entry":"bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"5adb6c3af218c60868e6b723ec47e36bbdf5e6f0"}],"findings":[],"id":"2026-10-27-2745e259a3bd","install":"pack","platform":"batocera","platform_system":"sega-mega-cd","platform_version":"43.1","probed_at":"2026-10-27T17:07:18+00:00","records":["2026-10-27-34ef09cf10e7"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"052986c92351077a88cba47b5314727cb3984f82"},"staged":12,"system":"sega-mega-cd","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/genesis_plus_gx_wide_libretro.so.zip","file":"genesis_plus_gx_wide_libretro.so","last_modified":"Sun, 25 Oct 2026 06:32:50 GMT","sha256":"03e157b15bd9faadab5a79dde1986c90ba7da9c11b5b44d4243b60c931e23d78"},"emulator":"genesis_plus_gx_wide","error":null,"files_opened":[{"created":false,"entry":"bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"5adb6c3af218c60868e6b723ec47e36bbdf5e6f0"}],"findings":[],"id":"2026-10-27-6275db21bd63","install":"pack","platform":"batocera","platform_system":"sega-mega-cd","platform_version":"43.1","probed_at":"2026-10-27T17:07:20+00:00","records":["2026-10-27-e63bf0cea0fa"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"052986c92351077a88cba47b5314727cb3984f82"},"staged":12,"system":"sega-mega-cd","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} @@ -68,7 +68,7 @@ {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"files:scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"files:scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-98b9d80687bc","install":"installer","platform":"retrobat","platform_system":"sony-playstation","platform_version":"8.3.1","probed_at":"2026-10-27T21:46:41+00:00","records":["2026-10-27-c6d5fc766117"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/pak000.pk4, base/pak002.pk4, base/pak003.pk4, base/pak004.pk4 return-to-castle-wolfenstein (realrtcw): main/sp_pak1.pk3 sonic-mania (sonic-mania): Data.rsdk sonic3-air (sonic3-air): Sonic_Knuckles_wSonic3.bin starship (starship): baserom.us.rev1.z64 Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"94a79556469df55169be485274bfb6c6defb7a52a85319440112d0c8f89df1fb"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"7433d49666b848062b67cf3a16975be907705ab2","save_dir_files":41},"staged":7,"system":"sony-playstation","target":"windows","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 530 shows Now Loading with the yellow bubble","frame":530,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-c0cd95f153a0","install":"installer","platform":"retrobat","platform_system":"sony-playstation","platform_version":"8.3.1","probed_at":"2026-10-27T21:48:52+00:00","records":["2026-10-27-feb3fc839667"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/pak000.pk4, base/pak002.pk4, base/pak003.pk4, base/pak004.pk4 return-to-castle-wolfenstein (realrtcw): main/sp_pak1.pk3 sonic-mania (sonic-mania): Data.rsdk sonic3-air (sonic3-air): Sonic_Knuckles_wSonic3.bin starship (starship): baserom.us.rev1.z64 Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"94a79556469df55169be485274bfb6c6defb7a52a85319440112d0c8f89df1fb"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"7433d49666b848062b67cf3a16975be907705ab2","save_dir_files":41},"staged":307,"system":"sony-playstation","target":"windows","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1300 shows Now Loading with the yellow bubble","frame":1300,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"bios_MD.bin","path":"bios_MD.bin","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-fd43eb05c3ce","install":"pack","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T21:51:08+00:00","records":["2026-10-27-fffd76b0df0c"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"7433d49666b848062b67cf3a16975be907705ab2"},"staged":9,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"files:bios_MD.bin","path":"bios_MD.bin","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-50353e16d141","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T21:53:14+00:00","records":["2026-10-27-888669b2583b"],"rounds":1,"schema_version":1,"source":{"installer_summary":"-af6705283a8fc4932/tmp/pack_probe/retroarch/installer/system 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"7433d49666b848062b67cf3a16975be907705ab2","save_dir_files":106},"staged":9,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"After Burner III (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/blastem_libretro.so.zip","file":"blastem_libretro.so","last_modified":"Tue, 27 Oct 2026 06:40:24 GMT","sha256":"1901fcbccef88c088328a18e680e11f3626175ea4cc36ba31674286afdc7ac9f"},"emulator":"blastem","error":null,"files_opened":[{"created":false,"entry":"files:bios_MD.bin","path":"bios_MD.bin","sha1":"3f50b76b0529db7f79c396b5e808cc0786ffc311"},{"created":false,"entry":"files:bios_CD_U.bin","path":"bios_CD_U.bin","sha1":"f4f315adcef9b8feb0364c21ab7f0eaf5457f3ed"}],"findings":[],"id":"2026-10-27-0acbb63a8c6b","install":"installer","platform":"retroarch","platform_system":"sega-mega-cd","platform_version":"v1.22.2","probed_at":"2026-10-27T21:53:14+00:00","records":["2026-10-27-888669b2583b"],"rounds":1,"schema_version":1,"source":{"installer_summary":" 37 files were not installed: the collection does not hold them, or its copy fails their check. Needed to start an emulator (1 file): jazz-jackrabbit-2 (jazz2-native): jazz2/Source/Anims.j2a Each emulator's page says what these files are: https://abdess.github.io/retrobios/emulators/ To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":10986,"path":"install/retroarch.json","sha256":"115639363828622f29ac8784bc534bb8560a0198ca57aaa19be3f649b9bb8199"},"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"7433d49666b848062b67cf3a16975be907705ab2","save_dir_files":106},"staged":9,"system":"sega-mega-cd","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-a2f102062caa","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T21:55:45+00:00","records":["2026-10-27-cb2f506d7cc9"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"a2d30046f2903132fe478661edbbf75c7d2a4767"},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1280 shows Now Loading with the yellow bubble","frame":1280,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","file":"mednafen_psx_hw_libretro.so","last_modified":"Tue, 27 Oct 2026 05:06:00 GMT","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-46d676fbc1ea","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T21:58:05+00:00","records":["2026-10-27-01436f3dd1dd"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"a2d30046f2903132fe478661edbbf75c7d2a4767"},"staged":24,"system":"sony-playstation","target":"linux-x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1280 shows Now Loading with the yellow bubble","frame":1280,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-74b70e46cfb2","install":"pack","platform":"retroarch","platform_system":"sony-playstation","platform_version":"v1.22.2","probed_at":"2026-10-27T22:00:07+00:00","records":["2026-10-27-258389f4d7f9"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5"},"staged":22,"system":"sony-playstation","target":"linux-x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 530 shows Now Loading with the yellow bubble","frame":530,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} @@ -80,9 +80,9 @@ {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-35f5003364b6","install":"pack","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:23:32+00:00","records":["2026-10-27-0959ceac43e0"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5"},"staged":10,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1280 shows Now Loading with the yellow bubble","frame":1280,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-2e558db8013d","install":"pack","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:24:58+00:00","records":["2026-10-27-9e53883a5566"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5"},"staged":7,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 530 shows Now Loading with the yellow bubble","frame":530,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-44d39a8db0d9","install":"pack","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:25:46+00:00","records":["2026-10-27-bc55bc2a98c6"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5"},"staged":258,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1300 shows Now Loading with the yellow bubble","frame":1300,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-c47c2647917e","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:27:45+00:00","records":["2026-10-27-f2d677e3e4fc"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":10,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1280 shows Now Loading with the yellow bubble","frame":1280,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3","stages":["bios","game"]}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"files:scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"files:scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-328db80ddaba","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:28:53+00:00","records":["2026-10-27-77ae5a4a34e4"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":7,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 530 shows Now Loading with the yellow bubble","frame":530,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} -{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-3443028e79fd","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:30:09+00:00","records":["2026-10-27-c17d693b47cf"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":258,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1300 shows Now Loading with the yellow bubble","frame":1300,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","file":"mednafen_psx_libretro.so","last_modified":"Tue, 27 Oct 2026 05:05:54 GMT","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-83d50aaa94c9","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:27:45+00:00","records":["2026-10-27-f2d677e3e4fc"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":10,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1280 shows Now Loading with the yellow bubble","frame":1280,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3","stages":["bios","game"]}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","file":"pcsx_rearmed_libretro.so","last_modified":"Sun, 25 Oct 2026 06:43:04 GMT","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","error":null,"files_opened":[{"created":false,"entry":"files:scph5500.bin","path":"scph5500.bin","sha1":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"created":false,"entry":"files:scph5502.bin","path":"scph5502.bin","sha1":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"findings":[],"id":"2026-10-27-29a98aa66a34","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:28:53+00:00","records":["2026-10-27-77ae5a4a34e4"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":7,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 530 shows Now Loading with the yellow bubble","frame":530,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} +{"content":{"catalog":"redump","label":"Bust-A-Move 2 - Arcade Edition (USA)","region":"north-america"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","file":"swanstation_libretro.so","last_modified":"Tue, 27 Oct 2026 05:20:50 GMT","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","error":null,"files_opened":[{"created":false,"entry":"files:scph5501.bin","path":"scph5501.bin","sha1":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"findings":[],"id":"2026-10-27-020dd1920ba1","install":"installer","platform":"batocera","platform_system":"sony-playstation","platform_version":"43.1","probed_at":"2026-10-27T22:30:09+00:00","records":["2026-10-27-c17d693b47cf"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"44e08162359530f95bb4d34687ca7b22e01296d5","save_dir_files":23},"staged":258,"system":"sony-playstation","target":"x86_64","verdict":"boots","verdict_evidence":{"detail":"1 of 1 repetitions: frame 1300 shows Now Loading with the yellow bubble","frame":1300,"repetitions":["boots"],"rule":"repetitions_agree","sha1":"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230","stages":["bios","game"]}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-41d8ddbf0157","install":"pack","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T22:38:01+00:00","records":["2026-10-27-b35ffbd53148"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":19,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-3f4e8af52ea7","install":"pack","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T22:48:37+00:00","records":["2026-10-27-c30af9f8fdf6"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":18,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-01198b318217","install":"pack","platform":"retroarch","platform_system":"sega-saturn","platform_version":"v1.22.2","probed_at":"2026-10-27T22:53:33+00:00","records":["2026-10-27-6448739cb5b6"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroArch_v1.22.2_BIOS_Pack.zip","members":10986,"sha256":"2a99c4568ea11beec6a38a7851a4bc1a122309357f601118981674d5d64dbba0","size":4337327025},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":13,"system":"sega-saturn","target":"linux-x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} @@ -96,14 +96,14 @@ {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-4ebba9f9c0df","install":"pack","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:18:01+00:00","records":["2026-10-27-613759bd1faf"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-2629752432de","install":"pack","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:19:16+00:00","records":["2026-10-27-89d7c65a2d30"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-226e22f6fa88","install":"pack","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:21:32+00:00","records":["2026-10-27-19b6b995c8b3"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":5,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-1ef12db748b4","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:28:01+00:00","records":["2026-10-27-af15e4bf2a6c"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-6e7e85fca75c","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:37:55+00:00","records":["2026-10-27-6cb5e0f338df"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-5f6ba47b3c86","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:50:03+00:00","records":["2026-10-27-828497f9002d"],"rounds":1,"schema_version":1,"source":{"installer_summary":"tem/.claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/batocera/installer/system/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":5,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-bcbd05911326","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:28:01+00:00","records":["2026-10-27-af15e4bf2a6c"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-4a878b5f4350","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:37:55+00:00","records":["2026-10-27-6cb5e0f338df"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":11,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-c50f17aa847e","install":"installer","platform":"batocera","platform_system":"sega-saturn","platform_version":"43.1","probed_at":"2026-10-27T23:50:03+00:00","records":["2026-10-27-828497f9002d"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /Source/, /base/ and 10 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":14725,"path":"install/batocera.json","sha256":"960b377a8e03a9333bb4853e54425a0f889eecf9342c9c1aadebf3601ae27f20"},"pack":{"file":"Batocera_43.1_BIOS_Pack.zip","members":14725,"sha256":"494c82fe9aff94e0ad6bc1cad0e14f00719ca5dccf057293009659572988806a","size":6969317213},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":23},"staged":5,"system":"sega-saturn","target":"x86_64","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-804ca236cadc","install":"pack","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:51:45+00:00","records":["2026-10-27-07310c597c37"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":13,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-bb15cfe730d7","install":"pack","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:52:42+00:00","records":["2026-10-27-6bd260b246f8"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":11,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-babce101aafc","install":"pack","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:52:42+00:00","records":["2026-10-27-b92d0c40b7cb"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":7,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} {"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/ymir_libretro.so.zip","file":"ymir_libretro.so","last_modified":"Tue, 27 Oct 2026 05:34:56 GMT","sha256":"237d154fa6ef5caccc1d2899e0a2444947e4391a81bd241803932d1319832712"},"emulator":"ymir","error":null,"files_opened":[{"created":false,"entry":"sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"},{"created":false,"entry":"mpr-17933.bin","path":"mpr-17933.bin","sha1":"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3"},{"created":false,"entry":"saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"},{"created":false,"entry":"cdb/cdb_rom.bin","path":"cdb/cdb_rom.bin","sha1":"b3c20fbe57cd2eb595e9edac86817e5948dccae4"}],"findings":[],"id":"2026-10-27-19073ee28285","install":"pack","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:52:54+00:00","records":["2026-10-27-e4aee262160e"],"rounds":1,"schema_version":1,"source":{"manifest":null,"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251"},"staged":8,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-ce9ff2f7f69e","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:19+00:00","records":["2026-10-27-dcac17ec3f00"],"rounds":1,"schema_version":1,"source":{"installer_summary":".claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/retrobat/installer/system/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":13,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-3c840e36bf04","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:19+00:00","records":["2026-10-27-41b7958405f2"],"rounds":1,"schema_version":1,"source":{"installer_summary":".claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/retrobat/installer/system/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":11,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-90f89c3310ca","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:20+00:00","records":["2026-10-27-b25e77568729"],"rounds":1,"schema_version":1,"source":{"installer_summary":".claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/retrobat/installer/system/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":7,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} -{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/ymir_libretro.so.zip","file":"ymir_libretro.so","last_modified":"Tue, 27 Oct 2026 05:34:56 GMT","sha256":"237d154fa6ef5caccc1d2899e0a2444947e4391a81bd241803932d1319832712"},"emulator":"ymir","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"},{"created":false,"entry":"files:mpr-17933.bin","path":"mpr-17933.bin","sha1":"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3"},{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"},{"created":false,"entry":"files:cdb/cdb_rom.bin","path":"cdb/cdb_rom.bin","sha1":"b3c20fbe57cd2eb595e9edac86817e5948dccae4"}],"findings":[],"id":"2026-10-27-373980ad54bf","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:32+00:00","records":["2026-10-27-9b443640216e"],"rounds":1,"schema_version":1,"source":{"installer_summary":".claude/worktrees/agent-af6705283a8fc4932/tmp/pack_probe/retrobat/installer/system/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":8,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_saturn_libretro.so.zip","file":"mednafen_saturn_libretro.so","last_modified":"Tue, 27 Oct 2026 07:34:40 GMT","sha256":"2cef16a3444d45032ad0ae0d523cbff0e5655f4bc15eb33406c81212f54dc9c1"},"emulator":"beetle_saturn","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"}],"findings":[],"id":"2026-10-27-38228b00f155","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:19+00:00","records":["2026-10-27-dcac17ec3f00"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":13,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/kronos_libretro.so.zip","file":"kronos_libretro.so","last_modified":"Tue, 27 Oct 2026 06:30:48 GMT","sha256":"ca7d0655cb4283b1749ddd2751450d2ec0fd2ea3a3686bde5c4b626cb99e06ac"},"emulator":"kronos","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-c59960b4781f","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:19+00:00","records":["2026-10-27-41b7958405f2"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":11,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/yabasanshiro_libretro.so.zip","file":"yabasanshiro_libretro.so","last_modified":"Tue, 27 Oct 2026 06:26:02 GMT","sha256":"d75ae811201373f0b3db69b4258f5d19ee42bfb81231af8abeb6a8389a8417ec"},"emulator":"yabasanshiro","error":null,"files_opened":[],"findings":[],"id":"2026-10-27-52334b9682db","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:20+00:00","records":["2026-10-27-b25e77568729"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":7,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: retro_load_game returned false and no error pattern matched","repetitions":["unknown"],"rule":"repetitions_agree"}} +{"content":{"catalog":"redump","label":"Lunar - Silver Star Story Complete (Japan)","region":"japan"},"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/ymir_libretro.so.zip","file":"ymir_libretro.so","last_modified":"Tue, 27 Oct 2026 05:34:56 GMT","sha256":"237d154fa6ef5caccc1d2899e0a2444947e4391a81bd241803932d1319832712"},"emulator":"ymir","error":null,"files_opened":[{"created":false,"entry":"files:sega_101.bin","path":"sega_101.bin","sha1":"df94c5b4d47eb3cc404d88b33a8fda237eaf4720"},{"created":false,"entry":"files:mpr-17933.bin","path":"mpr-17933.bin","sha1":"faa8ea183a6d7bbe5d4e03bb1332519800d3fbc3"},{"created":false,"entry":"files:saturn_bios.bin","path":"saturn_bios.bin","sha1":"2b8cb4f87580683eb4d760e4ed210813d667f0a2"},{"created":false,"entry":"files:cdb/cdb_rom.bin","path":"cdb/cdb_rom.bin","sha1":"b3c20fbe57cd2eb595e9edac86817e5948dccae4"}],"findings":[],"id":"2026-10-27-3b4ca79d1253","install":"installer","platform":"retrobat","platform_system":"sega-saturn","platform_version":"8.3.1","probed_at":"2026-10-27T23:54:32+00:00","records":["2026-10-27-9b443640216e"],"rounds":1,"schema_version":1,"source":{"installer_summary":"/, /base/, /devilutionx/ and 1 more folders. To check this later, run the same command with --check.","manifest":{"generated":"2026-10-27T10:27:58Z","pack_files":5561,"path":"install/retrobat.json","sha256":"ef2c453bbd23f10a19322b9b31f0983bfc3cdc36bcea5442f88f42b5a2eb9608"},"pack":{"file":"RetroBat_8.3.1_BIOS_Pack.zip","members":5561,"sha256":"89bdc445768e9568bd88737871f1e713df3d08fe0e191de18d228291d6e40647","size":5644690738},"repo_commit":"83712af0cea136bfc15a7088c06c27af028d3251","save_dir_files":41},"staged":8,"system":"sega-saturn","target":"windows","verdict":"unknown","verdict_evidence":{"detail":"1 of 1 repetitions: no reference frame is known for this content on this core","repetitions":["unknown"],"rule":"repetitions_agree"}} diff --git a/platforms/targets/emudeck.yml b/platforms/targets/emudeck.yml index c445457fb..e20859dc3 100644 --- a/platforms/targets/emudeck.yml +++ b/platforms/targets/emudeck.yml @@ -1,6 +1,6 @@ platform: emudeck source: https://github.com/dragoonDorise/EmuDeck/tree/dddb30229adbbd54d5ff7283cfd70e11c4322c26 -scraped_at: '2026-11-06T07:10:22Z' +scraped_at: '2026-11-06T13:46:57Z' targets: steamos: architecture: x86_64 @@ -348,7 +348,6 @@ targets: - freechaf - freeintv - frodo - - fsuae - fuse - galaksija - gam4980 @@ -430,7 +429,6 @@ targets: - nxengine - o2em - oberon - - omicron - openlara - opera - panda3ds @@ -511,7 +509,6 @@ targets: - vice_xplus4 - vice_xscpu64 - vice_xvic - - video_processor - vircon32 - virtualjaguar - virtualxt diff --git a/scripts/check_freshness.py b/scripts/check_freshness.py index d5b0df8c9..ac1e02188 100644 --- a/scripts/check_freshness.py +++ b/scripts/check_freshness.py @@ -54,11 +54,13 @@ import pin_installer # noqa: E402 import refresh_data_dirs # noqa: E402 import upstream # noqa: E402 from common import ( # noqa: E402 + InputMissing, apply_target_overrides, list_registered_platforms, load_emulator_profiles, load_platform_registry, require_directory, + suggest_names, upstream_profile_index, write_text_atomic, yaml_load, @@ -73,9 +75,13 @@ REPO_ROOT = Path(__file__).resolve().parents[1] CORE_INFO_REPO = "https://github.com/libretro/libretro-core-info" # The git blob of every .info as last reviewed: `--record-coreinfo` writes it. CORE_INFO_RECORD = REPO_ROOT / "platforms" / "_core_info.json" -NO_INTRO_MIRROR = "https://github.com/hugo19941994/auto-datfile-generator" -NO_INTRO_RELEASE = "Daily_Rebuild" -NO_INTRO_ASSET = "no-intro.zip" +NO_INTRO_MIRROR = game_dat_importer.NOINTRO_MIRROR +NO_INTRO_RELEASE = game_dat_importer.NOINTRO_RELEASE +NO_INTRO_ASSET = game_dat_importer.NOINTRO_ASSET +# The mirror rebuilds daily. A pack older than this is a mirror that stopped: +# hugo19941994's failed every day from 2026-07-08, and comparing our import +# date with its asset read OK for four months. +NO_INTRO_MAX_AGE_DAYS = 7 TOSEC_DOWNLOADS = "https://www.tosecdev.org/downloads" MAME_REPO = "https://github.com/mamedev/mame" FBNEO_REPO = "https://github.com/libretro/FBNeo" @@ -893,7 +899,10 @@ def record_core_info( """ unknown = sorted(set(names) - set(blobs)) if unknown: - raise ValueError(f"no such .info in core-info: {', '.join(unknown)}") + raise InputMissing( + f"no such .info in core-info: {', '.join(unknown)}. " + + suggest_names(unknown, list(blobs), "libretro-core-info") + ) recorded = load_core_info_record(path) or {} recorded.update({n: blobs[n] for n in (names or blobs)}) payload = {"repository": CORE_INFO_REPO, "blobs": dict(sorted(recorded.items()))} @@ -1083,6 +1092,25 @@ def _no_intro_asset_date(cache_dir: str, offline: bool) -> str: return "" +def _today() -> str: + return datetime.now(timezone.utc).strftime("%Y-%m-%d") + + +def _no_intro_row(subject: str, local: str, updated: str) -> Finding: + """Our import against the mirror's pack, and the pack against today.""" + age = (datetime.fromisoformat(_today()) - datetime.fromisoformat(updated)).days + if age > NO_INTRO_MAX_AGE_DAYS: + return Finding( + "catalogs", subject, STALE, local=local, remote=updated, + detail=f"the mirror last rebuilt {NO_INTRO_ASSET} on {updated}, {age} days ago, " + f"though it rebuilds daily: {NO_INTRO_MIRROR}/actions", + ) + return Finding( + "catalogs", subject, STALE if updated > local else OK, + local=local, remote=updated, detail=f"{NO_INTRO_ASSET} rebuilt {updated}", + ) + + def _check_nointro_games(cache_dir: str, offline: bool) -> Finding: """games/catalogs/no-intro/ against the pack it was read from. The pack holds every DAT: rebuilt after the catalogs were read, it may carry @@ -1094,10 +1122,7 @@ def _check_nointro_games(cache_dir: str, offline: bool) -> Finding: updated = _no_intro_asset_date(cache_dir, offline) if not updated: return Finding("catalogs", subject, UNKNOWN, local=fetched, detail="asset not listed") - return Finding( - "catalogs", subject, STALE if updated > fetched else OK, - local=fetched, remote=updated, detail=f"{NO_INTRO_ASSET} rebuilt {updated}", - ) + return _no_intro_row(subject, fetched, updated) def redump_datfile_version(code: str) -> str: @@ -1171,14 +1196,7 @@ def _check_no_intro(cache_dir: str, offline: bool) -> Finding: updated = _no_intro_asset_date(cache_dir, offline) if not updated: return Finding("catalogs", "no-intro", UNKNOWN, local=imported, detail="asset not listed") - return Finding( - "catalogs", - "no-intro", - STALE if updated > imported else OK, - local=imported, - remote=updated, - detail=f"{NO_INTRO_ASSET} rebuilt {updated}", - ) + return _no_intro_row("no-intro", imported, updated) def tosec_latest_pack(html: str) -> str | None: @@ -1839,7 +1857,10 @@ def main() -> int: if args.record_coreinfo is not None: blobs = core_info_blobs(args.cache_dir, args.offline) if not blobs: - raise RuntimeError("core-info listing unavailable: nothing recorded") + raise InputMissing( + f"core-info listing not in {args.cache_dir}: run without --offline" + if args.offline else "core-info listing unavailable: the GitHub API did not answer" + ) done = record_core_info(blobs, args.record_coreinfo) print(f"recorded {len(done)} .info file(s) as reviewed") return 0 diff --git a/scripts/check_platform_folder.py b/scripts/check_platform_folder.py index 4c5401a44..7c8de3ddd 100644 --- a/scripts/check_platform_folder.py +++ b/scripts/check_platform_folder.py @@ -1,11 +1,9 @@ -"""Check a BIOS folder against one platform's list, from the published data only: -python check_platform_folder.py batocera path/to/bios. Exit 1 on a file wrong or missing.""" +"""Usage: python check_platform_folder.py batocera path/to/bios. Exit 1 on a file wrong or missing.""" from __future__ import annotations import hashlib import json import sys -import urllib.error import urllib.request import zipfile from pathlib import Path @@ -42,14 +40,12 @@ def check(platform: str, root: Path, api: str = API) -> list[tuple[str, str]]: """(destination, ok | wrong | missing) per entry. With no destination (EmuDeck), any file with its hash passes.""" with urllib.request.urlopen(f"{api}{platform}.json") as response: contract = json.load(response)["items"][0]["contract"] - mode, results = contract["verification_mode"], [] - loose = [path for path in root.iterdir() if path.is_file()] if root.is_dir() else [] + mode, results, loose = contract["verification_mode"], [], [p for p in root.iterdir() if p.is_file()] for system_id, system in contract["systems"].items(): listed = [e for e in system.get("files") or [] if not e.get("destination")] for entry in (e for e in system.get("files") or [] if e.get("destination")): path = root / entry["destination"] - verdict = "ok" if accepts(entry, path, mode) else "wrong" if path.is_file() else "missing" - results.append((entry["destination"], verdict)) + results.append((entry["destination"], "ok" if accepts(entry, path, mode) else "wrong" if path.is_file() else "missing")) if listed: held = any(accepts(e, path, mode) for e in listed for path in loose) results.append((f"{system_id}: any file", "ok" if held else "missing")) @@ -57,12 +53,16 @@ def check(platform: str, root: Path, api: str = API) -> list[tuple[str, str]]: if __name__ == "__main__": + if len(sys.argv) != 3: + sys.exit(__doc__) try: found = check(sys.argv[1], Path(sys.argv[2])) - except urllib.error.HTTPError as error: # a 404: no platform has that name + except urllib.request.HTTPError as error: # a 404: no platform has that name with urllib.request.urlopen(API.replace("platforms/", "catalog.json")) as response: known = sorted(i["url"][10:-5] for i in json.load(response)["items"] if i["url"].startswith("manifests/")) sys.exit(f"unknown platform: {sys.argv[1]}. Known: {', '.join(known)}" if error.code == 404 else error) + except OSError as error: # no such folder, or no network (URLError) + sys.exit(f"error: {error}") for verdict in ("ok", "wrong", "missing"): names = sorted({dest for dest, seen in found if seen == verdict}) print(f"{verdict}: {len(names)}" + "".join(f"\n {name}" for name in names if verdict != "ok")) diff --git a/scripts/exporter/recalbox_exporter.py b/scripts/exporter/recalbox_exporter.py index bad223329..161c9a9bb 100644 --- a/scripts/exporter/recalbox_exporter.py +++ b/scripts/exporter/recalbox_exporter.py @@ -221,12 +221,19 @@ class Exporter(BaseExporter): ours = str(entry.get("path") or entry.get("name", "")).split("/")[:-1] return not {d.casefold() for d in theirs} & {d.casefold() for d in ours} - def _bios_element(self, fe: NativeFile, native_id: str) -> str: + def _bios_element( + self, fe: NativeFile, native_id: str, also: tuple[NativeFile, ...] = () + ) -> str: + """``also`` are further additions at fe's path: Bios.cpp reads one + element per path, and its md5 and core lists take every one of them.""" + group = (fe, *also) + md5 = dict.fromkeys(h for f in group for h in f.hashes("md5")) + cores = dict.fromkeys(c for f in group for c in f.cores()) attrs = [f"path={quoteattr(self._path(fe))}"] - attrs.append(f'md5={quoteattr(",".join(fe.hashes("md5")))}') - attrs.append(f'core={quoteattr(",".join(fe.cores()))}') + attrs.append(f'md5={quoteattr(",".join(md5))}') + attrs.append(f'core={quoteattr(",".join(cores))}') - if not self.required_value(fe): + if not any(self.required_value(f) for f in group): attrs.append('mandatory="false"') elif fe.native("mandatory_declared", None) is True: attrs.append('mandatory="true"') @@ -343,11 +350,17 @@ class Exporter(BaseExporter): } ours: dict[str, tuple[NativeSystem, dict[str, tuple[NativeFile, str]]]] = {} for system in systems.values(): - writable = [fe for fe in system.files if self.writable(fe)] - if writable: + # Two additions at one path (two cores, two dumps) are one + # element: keyed by path, the second replaced the first and its + # md5 left the file while both were counted added. + at_path: dict[str, list[NativeFile]] = {} + for fe in system.files: + if self.writable(fe): + at_path.setdefault(self._path(fe), []).append(fe) + if at_path: ours[system.native_id] = (system, { - self._path(fe): (fe, self._bios_element(fe, system.native_id)) - for fe in writable + path: (group[0], self._bios_element(group[0], system.native_id, tuple(group[1:]))) + for path, group in at_path.items() }) def element(attrs: dict[str, str]) -> str: diff --git a/scripts/exporter/retrodeck_exporter.py b/scripts/exporter/retrodeck_exporter.py index b742b796c..b9a88a027 100644 --- a/scripts/exporter/retrodeck_exporter.py +++ b/scripts/exporter/retrodeck_exporter.py @@ -215,6 +215,7 @@ class Exporter(BaseExporter): ours: list[OrderedDict], additions: list[OrderedDict] | None = None, appended: set[tuple[str, str]] | None = None, + held_back: list[int] | None = None, ) -> list[OrderedDict]: """Correct the component's own list, never replace it. @@ -301,13 +302,19 @@ class Exporter(BaseExporter): for e in merged for system in (_systems_of(e) or [""]) } - for entry in additions or []: + for index, entry in enumerate(additions or []): key = (str(entry.get("filename", "")), str(entry.get("system", "")), _paths_key(entry)) if key[0] and key not in held: held.add(key) merged.append(entry) + elif held_back is not None: + held_back.append(index) return merged + def lands(self, fe: NativeFile) -> bool: + """An addition the list already held is not written a second time.""" + return self.writable(fe) and id(fe) not in getattr(self, "_held_back", set()) + def render( self, systems: dict[str, NativeSystem], @@ -317,6 +324,7 @@ class Exporter(BaseExporter): ) -> dict[str, str]: self._place_additions(systems) self._appended: set[int] = set() + self._held_back: set[int] = set() grouped = self._by_component(systems) produced: dict[str, str] = {} @@ -331,25 +339,28 @@ class Exporter(BaseExporter): continue entries = [self._entry(fe) for fe in files if fe.platform is not None] - additions = [self._entry(fe) for fe in files if fe.platform is None] + added = [fe for fe in files if fe.platform is None] + additions = [self._entry(fe) for fe in added] appended: set[tuple[str, str]] = set() + held_back: list[int] = [] for component_value in manifest.values(): if not isinstance(component_value, dict): continue holder = self._bios_holder(component_value) if holder is None: component_value["bios"] = self._merge( - None, entries, additions, appended + None, entries, additions, appended, held_back ) else: container, key = holder written = container.get(key) - merged = self._merge(written, entries, additions, appended) + merged = self._merge(written, entries, additions, appended, held_back) # A single object stays one while nothing is added to it. container[key] = ( merged[0] if isinstance(written, dict) and len(merged) == 1 else merged ) break + self._held_back.update(id(added[index]) for index in held_back) # A declared entry whose revision the platform does not hold is # written beside theirs: a new line, not a corrected value. self._appended.update( diff --git a/scripts/exporter/retropie_exporter.py b/scripts/exporter/retropie_exporter.py index 7e31af28a..8f9607365 100644 --- a/scripts/exporter/retropie_exporter.py +++ b/scripts/exporter/retropie_exporter.py @@ -336,6 +336,8 @@ class Exporter(BaseExporter): systems_of.setdefault(str(name).lower(), set()).add(fe.native_system) known = set(systems_of) self._skipped: dict[str, list[str]] = {} + # Rewritten, with a file of a system no clause lists left out. + self._partial: list[str] = [] self._named: set[int] = set() produced: dict[str, str] = {} @@ -400,12 +402,11 @@ class Exporter(BaseExporter): homes.setdefault(owners[0], []).append(fe) else: homeless = True - if homeless: - # No enumeration of that system to extend, and a sentence we - # would have to write ourselves is a documentation change, - # not a correction. - skip("whose help text lists no files of that system to add to", module_id) + # No enumeration of that system to extend, and a sentence we + # would have to write ourselves is a documentation change, not a + # correction. With nothing placed the package is left as is. if not homes: + skip("whose help text lists no files of that system to add to", module_id) continue added = sum(len(self._in_search_order(fes)) for fes in homes.values()) @@ -428,6 +429,8 @@ class Exporter(BaseExporter): f'rp_module_help="{new_help}"', 1, ) + if homeless: + self._partial.append(module_id) return produced @@ -454,12 +457,20 @@ class Exporter(BaseExporter): ) -> str: """Packages are the unit here, not file entries.""" skipped: dict[str, list[str]] = getattr(self, "_skipped", {}) + + def shown(modules: list[str]) -> str: + names = ", ".join(sorted(modules)[:4]) + return names + (f" and {len(modules) - 4} more" if len(modules) > 4 else "") + parts = [f"{len(produced)} packages updated"] + partial = getattr(self, "_partial", []) + if partial: + parts.append( + f"Updated in part: {shown(partial)}, whose help text lists no files " + "of one of their systems to add to" + ) for reason, modules in sorted(skipped.items()): - shown = ", ".join(sorted(modules)[:4]) - if len(modules) > 4: - shown += f" and {len(modules) - 4} more" - parts.append(f"Left as is: {shown}, {reason}") + parts.append(f"Left as is: {shown(modules)}, {reason}") return ". ".join(parts) def validate( diff --git a/scripts/exporter/systemdat_exporter.py b/scripts/exporter/systemdat_exporter.py index a42aa6c86..3bb02de04 100644 --- a/scripts/exporter/systemdat_exporter.py +++ b/scripts/exporter/systemdat_exporter.py @@ -175,6 +175,9 @@ class Exporter(BaseExporter): ours: dict[str, dict[str, str]] = {} added: dict[str, set[str]] = {} + # A rom name is one line: an addition whose name an earlier entry + # took is not written, and was counted added. + self._shadowed: set[int] = set() for system, files in self.exportable(systems): rendered: dict[str, str] = {} for fe in files: @@ -194,7 +197,11 @@ class Exporter(BaseExporter): sha1 = fe.record_hash("sha1") if sha1: parts.append(f"sha1 {sha1}") - rendered.setdefault(name, f"\trom ( {' '.join(parts)} )") + if name in rendered: + if fe.platform is None: + self._shadowed.add(id(fe)) + continue + rendered[name] = f"\trom ( {' '.join(parts)} )" if fe.platform is None: added.setdefault(system.native_id, set()).add(name) if rendered: @@ -241,7 +248,11 @@ class Exporter(BaseExporter): return {self.native_filename(): "\n".join(lines)} def lands(self, fe: NativeFile) -> bool: - return self.writable(fe) and id(fe) not in getattr(self, "_untitled", set()) + return ( + self.writable(fe) + and id(fe) not in getattr(self, "_untitled", set()) + and id(fe) not in getattr(self, "_shadowed", set()) + ) def validate( self, diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 67898e5ec..97a5cd586 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -55,6 +55,7 @@ from common import ( load_platform_config, load_provenance_snapshots, native_layer, + require_directory, require_yaml, resolution_is_hash_exact, resolve_local_file, @@ -2330,7 +2331,7 @@ def generate_data_page(exports: list[dict], measurements_sqlite: Path | None = N f"({REPO_URL}/blob/main/scripts/check_platform_folder.py). A test runs it " "against the verifier on a sample folder, so the two give the same answer. " "It exits 1 when a file is wrong or missing. For an unknown platform it " - "prints the known ones.", + "prints the known ones, and it names a folder that does not exist.", "", "`install.py --check` answers another question by default: whether the folder " "holds what the pack installs, the manifest above. With `--declared-only`, or " @@ -12390,6 +12391,10 @@ def main() -> None: args = parser.parse_args() if args.docs_dir is None: args.docs_dir = str(Path(args.site_dir) / STARLIGHT_CONTENT) + # Before any write: the public assets and the bootstraps went out first, + # and a mistyped folder stopped the run only after them. + require_directory(args.emulators_dir, "--emulators-dir") + require_directory(args.platforms_dir, "--platforms-dir") try: # Two runs over one docs/ delete each other's pages and scratch # files in the sweep, so the second is refused instead. diff --git a/scripts/profile_sync.py b/scripts/profile_sync.py index 05774c6e7..16e47ffba 100644 --- a/scripts/profile_sync.py +++ b/scripts/profile_sync.py @@ -20,6 +20,7 @@ import re import subprocess import sys import tempfile +import time from collections import Counter from collections.abc import Callable, Iterable, Iterator, Sequence from dataclasses import asdict, dataclass, field, replace @@ -80,6 +81,9 @@ from upstream import CompareResult, find_renamed DEFAULT_CACHE = upstream.CACHE_DIR ANON_QUOTA = 60 TRIAGE_PATH_SAMPLE = 5 +# A pass that asks the forges says where it is at this interval: an online +# --all --triage ran 15 minutes without a word and read as hung. +PROGRESS_SECONDS = 30 STATUS_ORDER = ( "ANCHORED", "UNCHECKED", "EXTERNAL", "BINARY", "SHIFTED", "RENAMED", "MOVED", @@ -4991,35 +4995,40 @@ def _print_extras_from( print(f" {line}") +class _Progress: + """A stderr line every PROGRESS_SECONDS while a pass asks the forges.""" + + def __init__(self, total: int, doing: str, quiet: bool) -> None: + self.total, self.doing, self.quiet = total, doing, quiet + self.last = time.monotonic() + + def step(self, done: int, name: str) -> None: + now = time.monotonic() + if not self.quiet and now - self.last >= PROGRESS_SECONDS: + print(f"{self.doing}: {done} of {self.total}, at {name}", file=sys.stderr, flush=True) + self.last = now + + +def _interrupted(done: int, total: int, what: str) -> None: + print(f"interrupted after {done} of {total} profiles: {what}", file=sys.stderr, flush=True) + + def _print_triage( args: argparse.Namespace, selected: dict, reports: list[ProfileReport] -) -> None: - """Profiles ranked by drift, worst first.""" +) -> bool: + """Profiles ranked by drift, worst first. False when Ctrl-C cut the + scoring short: the ranking then covers the profiles scored.""" ranked = [] sampled = 0 - for report in reports: - profile = selected[report.name] - version = None - commits = 0 - refused = "" - repo = select_repo(profile) - if report.head and repo is not None: - paths = _cited_paths(report) - try: - version = check_version(profile, repo, args.cache_dir, args.offline) - for path in paths[:TRIAGE_PATH_SAMPLE]: - commits += upstream.commits_touching( - repo, path, report.pin, args.cache_dir, args.offline, - head=report.head, - ) - except upstream.UpstreamError as exc: - # One forge refusing a request (Eden's answers 403 to commit - # lookups) leaves this profile unscored, not the whole ranking. - refused = "commit history unreachable" - print(f"{report.name}: {exc}", file=sys.stderr) - if len(paths) > TRIAGE_PATH_SAMPLE and not refused: - sampled += 1 - ranked.append((drift_score(report, version, commits), report, refused)) + progress = _Progress(len(reports), "scored", args.offline or len(reports) < 2) + complete = True + try: + for done, report in enumerate(reports): + progress.step(done, report.name) + sampled += _score(args, selected, report, ranked) + except KeyboardInterrupt: + _interrupted(len(ranked), len(reports), "the ranking covers those scored") + complete = False if sampled: # One line for the run: a notice per profile buried the ranking # under 254 lines of stderr. @@ -5037,6 +5046,37 @@ def _print_triage( pending += bool(report.needs_review() or report.uncheckable()) print(f"{score:5d} {report.name:30s} {state}") print(f"{len(ranked)} profiles, {pending} with something to review") + return complete + + +def _score( + args: argparse.Namespace, selected: dict, report: ProfileReport, ranked: list +) -> bool: + """Append one profile's drift score to ``ranked``. True when its commit + count was read on a sample of the paths it cites.""" + profile = selected[report.name] + version = None + commits = 0 + refused = "" + sampled = False + repo = select_repo(profile) + if report.head and repo is not None: + paths = _cited_paths(report) + try: + version = check_version(profile, repo, args.cache_dir, args.offline) + for path in paths[:TRIAGE_PATH_SAMPLE]: + commits += upstream.commits_touching( + repo, path, report.pin, args.cache_dir, args.offline, + head=report.head, + ) + except upstream.UpstreamError as exc: + # One forge refusing a request (Eden's answers 403 to commit + # lookups) leaves this profile unscored, not the whole ranking. + refused = "commit history unreachable" + print(f"{report.name}: {exc}", file=sys.stderr) + sampled = len(paths) > TRIAGE_PATH_SAMPLE and not refused + ranked.append((drift_score(report, version, commits), report, refused)) + return sampled def _refuse_flag_combinations(args: argparse.Namespace) -> None: @@ -5260,30 +5300,24 @@ def main() -> None: return reports = [] - for name, profile in selected.items(): - profile_path = Path(args.emulators_dir) / f"{name}.yml" - try: - report = _build_full_report(args, name, profile, profile_path, failed) - except upstream.RateLimitError as exc: - # A quota is one forge's: git.libretro.com answering 429 said - # nothing about the 600 profiles on GitHub. upstream stops asking - # that host, so the rest of the pass costs it nothing. - print(f"{name}: {exc}", file=sys.stderr) - report = ProfileReport( - name=name, entries=[], counts={}, - skipped=f"rate limited: {exc.host or exc}", - ) - failed.add(name) - reports.append(report) - continue - reports.append(report) - if writes: - try: - _apply_writes(args, name, profile, report) - except YamlWriteError as exc: - # The guard already left the file untouched, so keep going. - print(f"{name}: write refused: {exc}", file=sys.stderr) - failed.add(name) + quiet = args.offline or len(selected) < 2 + if not quiet: + print( + f"reading {len(selected)} profiles against their forges, a line every " + f"{PROGRESS_SECONDS} s. --offline answers from the cache alone.", + file=sys.stderr, flush=True, + ) + progress = _Progress(len(selected), "read", quiet) + complete = True + try: + for name, profile in selected.items(): + progress.step(len(reports), name) + _read_one(args, name, profile, reports, failed, writes) + except KeyboardInterrupt: + # What was read is still worth printing: a ranking of 200 profiles + # beats none after 15 minutes. + _interrupted(len(reports), len(selected), "the output covers those read") + complete = False # --changed-only narrows every output, not the text report alone: the # documented `--all --changed-only --json` listed every profile. @@ -5291,14 +5325,49 @@ def main() -> None: report for report in reports if not args.changed_only or report.needs_review() or report.name in failed ] - _emit(args, selected, reports, shown) + complete = _emit(args, selected, reports, shown) is not False and complete _refresh_source_paths(args) + if not complete: + raise SystemExit(130) if failed or (args.strict and any( report.needs_review() or report.uncheckable() for report in reports )): raise SystemExit(1) +def _read_one( + args: argparse.Namespace, + name: str, + profile: dict, + reports: list[ProfileReport], + failed: set[str], + writes: bool, +) -> None: + """Build one profile's report into ``reports``, then apply the writes.""" + profile_path = Path(args.emulators_dir) / f"{name}.yml" + try: + report = _build_full_report(args, name, profile, profile_path, failed) + except upstream.RateLimitError as exc: + # A quota is one forge's: git.libretro.com answering 429 said + # nothing about the 600 profiles on GitHub. upstream stops asking + # that host, so the rest of the pass costs it nothing. + print(f"{name}: {exc}", file=sys.stderr) + reports.append(ProfileReport( + name=name, entries=[], counts={}, + skipped=f"rate limited: {exc.host or exc}", + )) + failed.add(name) + return + reports.append(report) + if writes: + try: + _apply_writes(args, name, profile, report) + except YamlWriteError as exc: + # The guard already left the file untouched, so keep going. + print(f"{name}: write refused: {exc}", file=sys.stderr) + failed.add(name) + + # Profiles this run wrote. Their new pins name trees the site's record of # cited source paths does not hold yet. _WRITTEN: set[str] = set() @@ -5400,8 +5469,9 @@ def _emit( selected: dict, reports: list[ProfileReport], shown: list[ProfileReport], -) -> None: - """Write the reports in the form the flags ask for.""" +) -> bool | None: + """Write the reports in the form the flags ask for. False when the + triage was cut short.""" if args.as_json: print(json.dumps([report_to_dict(r) for r in shown], indent=2)) return @@ -5417,8 +5487,7 @@ def _emit( print(url) return if args.triage: - _print_triage(args, selected, shown) - return + return _print_triage(args, selected, shown) for report in shown: print(format_report(report, args.changed_only)) _print_extras(args, selected[report.name], report) diff --git a/scripts/refresh_stale.py b/scripts/refresh_stale.py index bf65bb6ac..b50e472d8 100755 --- a/scripts/refresh_stale.py +++ b/scripts/refresh_stale.py @@ -148,18 +148,28 @@ def _run_check_freshness(areas: tuple[str, ...], extra: list[str]) -> list[dict] if areas and set(areas) != set(AUTO_AREAS + MANUAL_AREAS): cmd += ["--only", ",".join(areas)] cmd += extra - proc = subprocess.run( - cmd, cwd=REPO_ROOT, capture_output=True, text=True, check=False, timeout=1800 - ) - if proc.returncode not in (0, 1): + try: + proc = subprocess.run( + cmd, cwd=REPO_ROOT, capture_output=True, text=True, check=False, timeout=1800 + ) + except subprocess.TimeoutExpired as exc: + raise RuntimeError( + f"check_freshness.py did not finish in {exc.timeout:.0f} s: run " + f"`{' '.join(cmd[1:])} > report.json` alone, then pass --findings report.json" + ) from exc + # Exit 1 is the STALE rows, and also a crash: only a JSON list on stdout + # tells them apart, and the crash's own message is on stderr. + try: + findings = json.loads(proc.stdout) if proc.returncode in (0, 1) else None + except json.JSONDecodeError: + findings = None + if not isinstance(findings, list): tail = (proc.stderr or proc.stdout).strip().splitlines()[-3:] raise RuntimeError( - "check_freshness.py failed:\n" + "\n".join(tail or ["(no output)"]) + f"check_freshness.py failed (exit {proc.returncode}):\n" + + "\n".join(tail or ["(no output)"]) ) - try: - return json.loads(proc.stdout) - except json.JSONDecodeError as exc: - raise RuntimeError(f"check_freshness.py returned unreadable JSON: {exc}") from exc + return findings def load_findings(path: Path, areas: tuple[str, ...]) -> list[dict]: diff --git a/scripts/scraper/arcade_parent_importer.py b/scripts/scraper/arcade_parent_importer.py index a884b3188..59c885032 100644 --- a/scripts/scraper/arcade_parent_importer.py +++ b/scripts/scraper/arcade_parent_importer.py @@ -1122,7 +1122,7 @@ def main() -> int: which.add_argument("--all", action="store_true", help="every profile with an arcade source") parser.add_argument("--emulators-dir", default="emulators", help="profiles whose BIOS sets are read (default emulators)") - parser.add_argument("--database", default="database.json", + parser.add_argument("--db", default="database.json", help="collection index, to name BIOS sets the collection lacks") parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT, help=f"where the parent maps are written (default {DEFAULT_OUTPUT})") @@ -1133,7 +1133,7 @@ def main() -> int: args = parser.parse_args() profiles = load_emulator_profiles(args.emulators_dir, skip_aliases=False) - names = collection_names(Path(args.database)) + names = collection_names(Path(args.db)) failed = False for profile in sorted(PROFILES) if args.all else args.profile: if profile not in profiles: diff --git a/scripts/scraper/game_dat_importer.py b/scripts/scraper/game_dat_importer.py index 0968008bf..87522041c 100644 --- a/scripts/scraper/game_dat_importer.py +++ b/scripts/scraper/game_dat_importer.py @@ -14,6 +14,9 @@ games/catalogs/ and never in provenance/. No-Intro comes from the auto-datfile-generator release asset (Dat-o-Matic bans automated clients), Redump from redump.info's per-system datfile route. +The mirror is dantob's fork: hugo19941994's original has failed its daily +rebuild since Dat-o-Matic's 2026-07 re-layout (no-intro.zip last rebuilt +2026-07-08), and the fork carries the fix (d4a9d769, 2026-07-31). Every download is cached under .cache/game-dats/ with what the server said about it, so a second run reads nothing from the network and writes the same bytes. A DAT's region tag is a market label, never the value a core computes. @@ -49,8 +52,11 @@ SOURCES = ("no-intro", "redump") CACHE_DIR = Path(".cache") / "game-dats" OUTPUT_DIR = Path("games") / "catalogs" +NOINTRO_MIRROR = "https://github.com/dantob/auto-datfile-generator" +NOINTRO_RELEASE = "Daily_Rebuild" NOINTRO_RELEASE_API = ( - "https://api.github.com/repos/hugo19941994/auto-datfile-generator/releases/tags/Daily_Rebuild" + NOINTRO_MIRROR.replace("https://github.com/", "https://api.github.com/repos/") + + f"/releases/tags/{NOINTRO_RELEASE}" ) NOINTRO_ASSET = "no-intro.zip" REDUMP_DATFILE_URL = "https://redump.info/datfile/{code}" @@ -120,7 +126,7 @@ LICENCES: dict[str, dict] = { "website or its operators is required for such use." ), "mirror": { - "repo": "https://github.com/hugo19941994/auto-datfile-generator", + "repo": NOINTRO_MIRROR, "licence": "MIT", "scope": "the mirror's scripts only, the DATs it republishes stay under the terms above", }, diff --git a/scripts/scraper/targets/emudeck_targets_scraper.py b/scripts/scraper/targets/emudeck_targets_scraper.py index fa8fa75b2..6920e42c3 100644 --- a/scripts/scraper/targets/emudeck_targets_scraper.py +++ b/scripts/scraper/targets/emudeck_targets_scraper.py @@ -16,6 +16,7 @@ import sys import urllib.error import urllib.request from datetime import datetime, timezone +from pathlib import Path import yaml @@ -32,6 +33,7 @@ STEAMOS_API = ( WINDOWS_API = ( "https://api.github.com/repos/EmuDeck/emudeck-we/contents/functions/EmuScripts" ) +RETROARCH_TARGETS = Path(__file__).resolve().parents[3] / "platforms" / "targets" / "retroarch.yml" def _fetch(url: str) -> str: headers = {"User-Agent": "retrobios-scraper/1.0"} @@ -75,7 +77,7 @@ class Scraper(BaseTargetScraper): return self._revision def _fetch_cores_for_target( - self, api_url: str, label: str, arch: str = "x86_64" + self, api_url: str, label: str, retroarch_target: str ) -> list[str]: print(f" fetching {label} EmuScripts...", file=sys.stderr) scripts = _list_emuscripts(api_url) @@ -94,7 +96,7 @@ class Scraper(BaseTargetScraper): standalone_count = len(cores) # EmuDeck ships RetroArch = all its libretro cores are available if has_retroarch: - ra_cores = self._load_retroarch_cores(arch) + ra_cores = self._load_retroarch_cores(retroarch_target) for c in ra_cores: if c not in seen: seen.add(c) @@ -108,24 +110,21 @@ class Scraper(BaseTargetScraper): return sorted(cores) @staticmethod - def _load_retroarch_cores(arch: str) -> list[str]: - """Load RetroArch target cores for given architecture.""" - import os - - target_path = os.path.join("platforms", "targets", "retroarch.yml") - with open(target_path) as f: + def _load_retroarch_cores(target: str, path: Path = RETROARCH_TARGETS) -> list[str]: + """The buildbot's libretro cores for one RetroArch target, by name: + linux-x86_64 and windows-x86_64 share an architecture, not a list.""" + with path.open(encoding="utf-8") as f: data = yaml_load(f) or {} - # Find a target matching the architecture - for tinfo in data.get("targets", {}).values(): - if tinfo.get("architecture") == arch and tinfo.get("cores"): - return tinfo["cores"] - raise RuntimeError(f"no {arch} core list in {target_path}") + cores = ((data.get("targets") or {}).get(target) or {}).get("cores") + if not cores: + raise RuntimeError(f"no {target} core list in {path}") + return cores def fetch_targets(self) -> dict: steamos_cores = self._fetch_cores_for_target( - f"{STEAMOS_API}?ref={self.revision}", "SteamOS" + f"{STEAMOS_API}?ref={self.revision}", "SteamOS", "linux-x86_64" ) - windows_cores = self._fetch_cores_for_target(WINDOWS_API, "Windows") + windows_cores = self._fetch_cores_for_target(WINDOWS_API, "Windows", "windows-x86_64") targets: dict[str, dict] = {} if steamos_cores: diff --git a/tests/scratchtree.py b/tests/scratchtree.py new file mode 100644 index 000000000..93ec3fdae --- /dev/null +++ b/tests/scratchtree.py @@ -0,0 +1,78 @@ +"""A disposable copy of the checkout, for tests that run a writer and expect +it to refuse. + +Run in the checkout, a regression made the very write the test guards +against: generate_site rewrote website/src/data/published-parts.json and the +FAQ page whatever --docs-dir said, and a pipeline whose lock probe failed +would regenerate database.json and install/. A file another session had +already changed listed the same name in `git diff --name-only` before and +after, so its edits were lost without a signal. + +The copy holds every file git tracks or would track, as the working tree has +it. bios/ and data/ (17 GB and 600 MB of inputs no such test writes) are +links to the checkout's. +""" + +from __future__ import annotations + +import atexit +import hashlib +import os +import shutil +import subprocess +import tempfile +from functools import cache +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent +LINKED = ("bios", "data") + + +@cache +def scratch_checkout() -> Path: + """The copy, built once per test process and removed at its exit.""" + root = Path(tempfile.mkdtemp(prefix="checkout-", dir=REPO_ROOT / "tmp" / "tests")) + # A detached worktree with nothing checked out: the scripts that read + # HEAD (the site's bootstrap pin) find this commit. + subprocess.run( + ["git", "worktree", "add", "--quiet", "--detach", "--no-checkout", str(root), "HEAD"], + cwd=REPO_ROOT, capture_output=True, check=True, + ) + atexit.register(_remove, root) + listed = subprocess.run( + ["git", "ls-files", "-z", "--cached", "--others", "--exclude-standard"], + cwd=REPO_ROOT, capture_output=True, check=True, + ).stdout.decode("utf-8") + for name in filter(None, listed.split("\0")): + source = REPO_ROOT / name + if name.split("/", 1)[0] in LINKED or not source.is_file() or source.is_symlink(): + continue + target = root / name + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(source, target) + for name in LINKED: + if (REPO_ROOT / name).exists(): + (root / name).symlink_to(REPO_ROOT / name, target_is_directory=True) + return root + + +def _remove(root: Path) -> None: + subprocess.run(["git", "worktree", "remove", "--force", str(root)], + cwd=REPO_ROOT, capture_output=True, check=False) + shutil.rmtree(root, ignore_errors=True) + + +def snapshot(root: Path) -> dict[str, str]: + """The SHA-1 of every file under root, links not followed. A file + written with the bytes it held is no change: what is caught is a file + whose content a run replaced. Scratch space, caches, bytecode and lock + files are no output.""" + seen = {} + for directory, dirs, files in os.walk(root): + dirs[:] = [d for d in dirs if d != "__pycache__" + and Path(directory, d) not in (root / "tmp", root / ".cache")] + for name in files: + path = Path(directory) / name + if name != ".lock" and not path.is_symlink(): + seen[str(path.relative_to(root))] = hashlib.sha1(path.read_bytes()).hexdigest() + return seen diff --git a/tests/test_artifact_lock.py b/tests/test_artifact_lock.py index c99ce7c4d..ae0f964af 100644 --- a/tests/test_artifact_lock.py +++ b/tests/test_artifact_lock.py @@ -27,6 +27,7 @@ from common import ( # noqa: E402 hold_repository_outputs, publish_hold, ) +from tests.scratchtree import scratch_checkout # noqa: E402 def _tempdir(test: unittest.TestCase) -> str: @@ -117,11 +118,13 @@ class PackLockCliTest(unittest.TestCase): self.dir = _tempdir(self) def _run(self, argv: list[str]) -> subprocess.CompletedProcess: + # In a copy: a pipeline that missed the lock regenerated + # database.json and install/ wherever it ran. return subprocess.run( [sys.executable, *argv], capture_output=True, text=True, - cwd=str(REPO_ROOT), + cwd=str(scratch_checkout()), timeout=300, ) @@ -236,11 +239,12 @@ class PipelineHoldsItsFixedOutputs(unittest.TestCase): def test_a_second_pipeline_is_refused_whatever_its_output_dir(self): scratch = _tempdir(self) - with hold_repository_outputs(str(REPO_ROOT)): + checkout = scratch_checkout() + with hold_repository_outputs(str(checkout)): proc = subprocess.run( [sys.executable, "scripts/pipeline.py", "--offline", "--skip-docs", "--output-dir", scratch], - capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=120, + capture_output=True, text=True, cwd=str(checkout), timeout=120, ) self.assertEqual(proc.returncode, 1, proc.stdout + proc.stderr) self.assertIn("another run is writing database.json", proc.stderr) @@ -262,11 +266,12 @@ class StandaloneWritersHonourTheRepositoryHold(unittest.TestCase): env = {k: v for k, v in os.environ.items() if k != "RETROBIOS_HELD_ARTIFACT_DIR"} return subprocess.run( [sys.executable, *argv], capture_output=True, text=True, - cwd=str(REPO_ROOT), timeout=300, env=env, check=False, + cwd=str(scratch_checkout()), timeout=300, env=env, check=False, ) def test_a_writer_of_a_fixed_output_is_refused(self): - with hold_repository_outputs(str(REPO_ROOT)): + # The writers run in a copy, where a missed lock writes nothing of ours. + with hold_repository_outputs(str(scratch_checkout())): for argv in ( ["scripts/generate_db.py", "--bios-dir", "bios", "--output", "database.json"], ["scripts/generate_pack.py", "--all", "--manifest", "--offline", @@ -371,7 +376,7 @@ class SiteGenerationHoldsDocs(unittest.TestCase): with artifact_lock(docs): result = subprocess.run( [sys.executable, "scripts/generate_site.py", "--docs-dir", docs], - cwd=REPO_ROOT, capture_output=True, text=True, timeout=600, + cwd=scratch_checkout(), capture_output=True, text=True, timeout=600, ) self.assertEqual(result.returncode, 1, result.stdout + result.stderr) self.assertIn("in use by another run", result.stderr) diff --git a/tests/test_check_freshness.py b/tests/test_check_freshness.py index 0aa42c799..c1bf68952 100644 --- a/tests/test_check_freshness.py +++ b/tests/test_check_freshness.py @@ -318,8 +318,23 @@ class CoreResolutionTests(unittest.TestCase): record.write_text(cf.json.dumps({"blobs": {"a": "1", "b": "1"}})) cf.record_core_info({"a": "2", "b": "2"}, ["a"], record) self.assertEqual(cf.load_core_info_record(record), {"a": "2", "b": "1"}) - with self.assertRaises(ValueError): - cf.record_core_info({"a": "2"}, ["ghost"], record) + with self.assertRaises(cf.InputMissing) as raised: + cf.record_core_info({"a": "2", "ghosts": "1"}, ["ghost"], record) + self.assertIn("Did you mean: ghosts?", str(raised.exception)) + + def test_record_errors_are_one_line(self): + """A mistyped core and an empty offline cache ended on a traceback.""" + import subprocess # noqa: PLC0415 + + with tempfile.TemporaryDirectory() as tmp: + proc = subprocess.run( + [sys.executable, str(REPO_ROOT / "scripts" / "check_freshness.py"), "--offline", + "--cache-dir", tmp, "--record-coreinfo"], + capture_output=True, text=True, check=False, timeout=120, + ) + self.assertEqual(proc.returncode, 1) + self.assertNotIn("Traceback", proc.stderr) + self.assertIn("run without --offline", proc.stderr) def test_offline_without_a_cached_listing_is_skipped(self): """Offline, the row read UNKNOWN and failed the run as an upstream @@ -462,10 +477,28 @@ class CatalogParsingTests(unittest.TestCase): row = cf._check_redump_games(False) self.assertEqual((row.status, row.items), (cf.STALE, ["sony-playstation"])) self.assertEqual(cf._check_redump_games(True).status, cf.SKIPPED) - with mock.patch.object(cf, "_game_catalogs", return_value=[{"fetched": "2026-11-03"}]): - for rebuilt, status in (("2026-07-08", cf.OK), ("2026-11-04", cf.STALE)): + with mock.patch.object(cf, "_game_catalogs", return_value=[{"fetched": "2026-11-03"}]), \ + mock.patch.object(cf, "_today", return_value="2026-11-06"): + for rebuilt, status in (("2026-11-02", cf.OK), ("2026-11-04", cf.STALE)): with mock.patch.object(cf, "_no_intro_asset_date", return_value=rebuilt): self.assertEqual(cf._check_nointro_games("", False).status, status) + + def test_a_mirror_that_stopped_rebuilding_is_stale(self): + """The mirror failed every daily rebuild from 2026-07-08, and both + No-Intro rows read OK: an import newer than a dead pack is no + sign of a fresh catalog.""" + with mock.patch.object(cf, "_today", return_value="2026-11-06"), \ + mock.patch.object(cf, "_no_intro_asset_date", return_value="2026-07-08"), \ + mock.patch.object(cf, "_game_catalogs", return_value=[{"fetched": "2026-11-03"}]), \ + mock.patch.object(cf, "_snapshot", return_value={"imported_at": "2026-08-08"}): + for row in (cf._check_nointro_games("", False), cf._check_no_intro("", False)): + self.assertEqual(row.status, cf.STALE) + self.assertIn("2026-07-08, 121 days ago", row.detail) + + def test_the_freshness_check_reads_the_importer_mirror(self): + self.assertEqual(cf.NO_INTRO_MIRROR, cf.game_dat_importer.NOINTRO_MIRROR) + self.assertIn(cf.NO_INTRO_MIRROR.removeprefix("https://github.com/"), + cf.game_dat_importer.NOINTRO_RELEASE_API) self.assertIn("no-intro games", [f.subject for f in cf.check_catalogs("", True)]) diff --git a/tests/test_exporters.py b/tests/test_exporters.py index ccd275ccf..d4181744c 100644 --- a/tests/test_exporters.py +++ b/tests/test_exporters.py @@ -803,14 +803,20 @@ class SearchOrder(unittest.TestCase): longest = ('rp_module_id="xm7"\nrp_module_help="Copy bios files ' + ", ".join(f"n{i}.rom" for i in range(12)) + ' and n12.rom to $biosdir"\n') exporter = discover_exporters()["retropie"]() - produced = exporter.render( + written = exporter.render( systems, None, {"scriptmodules/libretrocores/lr-flycast.sh": script, "scriptmodules/emulators/xm7.sh": longest}, - )["scriptmodules/libretrocores/lr-flycast.sh"] + ) + produced = written["scriptmodules/libretrocores/lr-flycast.sh"] self.assertIn("Dreamcast BIOS file dc_boot.bin to", produced) self.assertIn("BIOS files naomi.zip, awbios.zip and naomi2.zip to", produced) self.assertNotIn("other.zip", produced) + # Rewritten for naomi2.zip, other.zip left out: the summary said + # "Left as is" of a package in the diff. + outcome = exporter.outcome(systems, written) + self.assertIn("Updated in part: lr-flycast,", outcome) + self.assertNotIn("Left as is: lr-flycast", outcome) def test_cores_that_disagree_keep_the_best_rank(self): """Nothing is dropped on the rank here, so the best one wins. @@ -829,6 +835,70 @@ class SearchOrder(unittest.TestCase): self.assertEqual(entry.priority, 2) +class TwoAdditionsAtOnePath(unittest.TestCase): + """Two cores declaring two dumps of one file the platform lacks: both + were counted added while the render wrote one. Recalbox's md5 list takes + both, a System.dat name and a RetroDECK path hold one.""" + + A, B = "615a" + "0" * 28, "ef49" + "0" * 28 + + def _addition(self, md5: str, core: str, system: str = "dos") -> NativeFile: + return NativeFile( + name="MT32_CONTROL.ROM", destination="mt32/MT32_CONTROL.ROM", native_system=system, + truth={"name": "MT32_CONTROL.ROM", "path": "mt32/MT32_CONTROL.ROM", "md5": md5, + "crc32": md5[:8], "required": True, "_cores": [core]}, + runners=[(False, core)], + ) + + def _added(self, exporter, systems) -> list[str]: + return [c["name"] for c in landed_changes(exporter, systems).records + if c["kind"] == "added"] + + def test_recalbox_writes_both_md5_in_one_element(self): + systems = {"dos": NativeSystem("dos", files=[ + self._addition(self.A, "dosbox_pure"), self._addition(self.B, "dosbox_core")])} + exporter = discover_exporters()["recalbox"]() + produced = exporter.render(systems, Report(), {})["es_bios.xml"] + elements = [e for e in ET.fromstring(produced).iter("bios")] + self.assertEqual(len(elements), 1) + self.assertEqual(elements[0].get("md5").split(","), [self.A, self.B]) + self.assertEqual(elements[0].get("core"), "libretro/dosbox_pure,libretro/dosbox_core") + self.assertEqual(exporter.validate(systems, {"es_bios.xml": produced}), []) + self.assertEqual(len(self._added(exporter, systems)), 2) + + def test_system_dat_counts_the_line_it_wrote(self): + systems = {"DOS": NativeSystem("DOS", files=[ + self._addition(self.A, "dosbox_pure", "DOS"), + self._addition(self.B, "dosbox_core", "DOS")])} + exporter = discover_exporters()["retroarch"]() + original = 'clrmamepro (\n\tname "System"\n)\n\ngame (\n\tname "System"\n' \ + '\tcomment "System"\n\n\tcomment "DOS"\n\trom ( name a.bin size 1 crc 00000000 )\n)\n' + produced = exporter.render(systems, Report(), {"System.dat": original})["System.dat"] + self.assertEqual(produced.count("MT32_CONTROL.ROM"), 1) + self.assertEqual(len(self._added(exporter, systems)), 1) + + def test_retrodeck_counts_the_entry_it_appended(self): + theirs = NativeFile( + name="scph1001.bin", destination="scph1001.bin", native_system="psx", + platform={"name": "scph1001.bin", "md5": "1" * 32, "component": "duckstation"}) + + def addition(md5: str) -> NativeFile: + return NativeFile( + name="scph5501.bin", destination="scph5501.bin", native_system="psx", + truth={"name": "scph5501.bin", "md5": md5, "required": True, + "_cores": ["duckstation"]}, + runners=[(True, "duckstation")]) + + systems = {"psx": NativeSystem("psx", files=[theirs, addition(self.A), addition(self.B)])} + manifest = json.dumps({"duckstation": {"name": "DuckStation", "bios": [ + {"filename": "scph1001.bin", "md5": "1" * 32, "system": "psx"}]}}) + exporter = discover_exporters()["retrodeck"]() + produced = exporter.render(systems, Report(), {"duckstation/component_manifest.json": manifest}) + bios = json.loads(produced["duckstation/component_manifest.json"])["duckstation"]["bios"] + self.assertEqual([e["filename"] for e in bios], ["scph1001.bin", "scph5501.bin"]) + self.assertEqual(self._added(exporter, systems), ["scph5501.bin"]) + + class AdditionOrder(unittest.TestCase): """What we add is listed the way the code looks for it.""" diff --git a/tests/test_pack_probe.py b/tests/test_pack_probe.py index 3d43ff2c4..a729dc933 100644 --- a/tests/test_pack_probe.py +++ b/tests/test_pack_probe.py @@ -299,12 +299,19 @@ class RecordsNameNoLocalPath(unittest.TestCase): self.assertEqual(summary, "Copy it from your own copy of the game into /jazz2/Source/. " "Saves go to .") - def test_no_committed_record_holds_an_absolute_path(self) -> None: - path = REPO_ROOT / "measurements" / "pack-probes.jsonl" + def test_no_committed_record_holds_a_local_path(self) -> None: + """Ten records cut at 400 characters inside the scratch path kept + its tail, which no absolute-path pattern sees.""" absolute = re.compile(r"(?-])/(?:home|root|tmp|mnt|Users|srv)/") - records = [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines()] - found = [r["id"] for r in records - if absolute.search((r.get("source") or {}).get("installer_summary", ""))] + # The tail of a scratch folder: a worktree, or the probes' own tmp/ + # subfolders. + scratch = re.compile(r"worktrees/|\btmp/(?:pack_probe|tests|campaign)\b") + found = [ + f"{path.name}:{number}" + for path in sorted((REPO_ROOT / "measurements").glob("*.jsonl")) + for number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1) + if absolute.search(line) or scratch.search(line) + ] self.assertEqual(found, []) diff --git a/tests/test_profile_sync.py b/tests/test_profile_sync.py index 7724ad0d8..6711b143e 100644 --- a/tests/test_profile_sync.py +++ b/tests/test_profile_sync.py @@ -5983,6 +5983,55 @@ class ARoleIsReadPerPart(unittest.TestCase): self.assertEqual(list(_prose_runs("read at boot (:507), devilutionx.mpq")), []) +class AnOnlinePassSaysWhereItIs(unittest.TestCase): + """`--all --triage` online printed nothing for 15 minutes, and Ctrl-C + left no ranking at all, while --offline answered in three.""" + + def _main(self, *argv: str, stop_after: int | None = None): + calls = [] + + def build(_args, name, _profile, _path, _failed): + if stop_after is not None and len(calls) == stop_after: + raise KeyboardInterrupt + calls.append(name) + return ProfileReport(name=name, entries=[], counts={}) + + out, err = io.StringIO(), io.StringIO() + saved = sys.argv + try: + sys.argv = ["profile_sync.py", "--all", "--triage", *argv] + with mock.patch.object(profile_sync, "_build_full_report", side_effect=build), \ + mock.patch.object(profile_sync, "_check_quota"), \ + contextlib.redirect_stdout(out), contextlib.redirect_stderr(err), \ + self.assertRaises(SystemExit) as caught: + profile_sync.main() + raise SystemExit(0) + finally: + sys.argv = saved + return caught.exception.code, out.getvalue(), err.getvalue() + + def test_ctrl_c_prints_the_ranking_of_what_was_read(self): + code, out, err = self._main("--offline", stop_after=3) + self.assertEqual(code, 130) + self.assertEqual(out.splitlines()[-1], "3 profiles, 0 with something to review") + self.assertIn("interrupted after 3 of", err) + + def test_an_online_pass_names_its_size_and_the_offline_mode(self): + _code, _out, err = self._main("--limit", "2") + self.assertIn("reading 2 profiles against their forges", err) + self.assertIn("--offline answers from the cache alone", err) + + def test_a_progress_line_at_each_interval(self): + clock = iter([0.0, 10.0, profile_sync.PROGRESS_SECONDS + 1, 40.0]) + err = io.StringIO() + with mock.patch.object(profile_sync.time, "monotonic", lambda: next(clock)), \ + contextlib.redirect_stderr(err): + progress = profile_sync._Progress(9, "read", quiet=False) + for done, name in enumerate(("a", "b", "c")): + progress.step(done, name) + self.assertEqual(err.getvalue(), "read: 1 of 9, at b\n") + + class TheTriageCountsWhatBlocksThePin(unittest.TestCase): """Prose written under an older pin refuses the recale and the bump, yet the triage, --changed-only and --strict read "0 to review" on blastem, diff --git a/tests/test_refresh_stale.py b/tests/test_refresh_stale.py index c6916358b..b262fcc9e 100644 --- a/tests/test_refresh_stale.py +++ b/tests/test_refresh_stale.py @@ -10,10 +10,12 @@ from __future__ import annotations import tests # noqa: F401 offline, scratch under tmp/, the suite's own cache +import subprocess import sys import tempfile import unittest from pathlib import Path +from unittest import mock REPO_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(REPO_ROOT / "scripts")) @@ -281,5 +283,31 @@ class SavedFindings(unittest.TestCase): rs.load_findings(path, ("data",)) +class AFailedCheckIsNamed(unittest.TestCase): + """A crash of check_freshness exits 1 like a STALE row: its traceback, + on stderr, was dropped for "unreadable JSON", and a timeout ended on + a traceback of refresh_stale itself.""" + + def _run(self, raises: Exception | None = None, **result): + proc = subprocess.CompletedProcess([], **result) if result else None + with mock.patch.object(rs.subprocess, "run", side_effect=raises, return_value=proc): + return rs._run_check_freshness(("coreinfo",), []) # noqa: SLF001 + + def test_a_crash_shows_its_stderr(self): + with self.assertRaises(RuntimeError) as raised: + self._run(returncode=1, stdout="", stderr="Traceback\nRuntimeError: no listing\n") + self.assertIn("RuntimeError: no listing", str(raised.exception)) + self.assertNotIn("JSON", str(raised.exception)) + + def test_stale_rows_are_read(self): + self.assertEqual(self._run(returncode=1, stdout='[{"area": "coreinfo"}]', stderr=""), + [{"area": "coreinfo"}]) + + def test_a_timeout_says_what_to_run(self): + with self.assertRaises(RuntimeError) as raised: + self._run(raises=subprocess.TimeoutExpired(["x"], 1800)) + self.assertIn("--findings", str(raised.exception)) + + if __name__ == "__main__": unittest.main() diff --git a/tests/test_scraper_contract.py b/tests/test_scraper_contract.py index 9615e9ebd..e4ca795b4 100644 --- a/tests/test_scraper_contract.py +++ b/tests/test_scraper_contract.py @@ -644,21 +644,26 @@ class UnreadableReleaseStopsTheScrape(unittest.TestCase): def _refuse(*_args, **_kwargs): raise urllib.error.HTTPError("https://api.github.com/x", 403, "rate limited", {}, None) + # Read at a release tag: the pin is the tag, not a branch commit. + TAG_PINNED = {"amberelec", "batocera", "bizhawk", "emuelec", "knulli", "recalbox", + "rocknix", "romm"} + + @staticmethod + def _registry_scrapers() -> list[str]: + """Every platform scraper the registry names: a hand-written list + left rocknix, retrodeck, minui, nextui and myminui unchecked.""" + import yaml # noqa: PLC0415 + + registry = yaml.safe_load((REPO_ROOT / "platforms" / "_registry.yml").read_text()) + return sorted({entry["scraper"] for entry in registry["platforms"].values() + if entry.get("scraper")}) + + def test_the_tag_pinned_scrapers_are_registered(self): + self.assertLessEqual(self.TAG_PINNED, set(self._registry_scrapers())) + def test_every_pinned_scraper_raises(self): - for name in ( - "scraper.bizhawk_scraper", - "scraper.romm_scraper", - "scraper.batocera_scraper", - "scraper.recalbox_scraper", - "scraper.libretro_scraper", - "scraper.retrobat_scraper", - "scraper.emudeck_scraper", - "scraper.misterfpga_scraper", - "scraper.retropie_scraper", - "scraper.amberelec_scraper", - "scraper.emuelec_scraper", - "scraper.knulli_scraper", - ): + for scraper in self._registry_scrapers(): + name = f"scraper.{scraper}_scraper" module = importlib.import_module(name) with self.subTest(scraper=name), mock.patch( "urllib.request.urlopen", self._refuse @@ -681,16 +686,16 @@ class UnreadableReleaseStopsTheScrape(unittest.TestCase): def answer(request, timeout=None): return Answer(json.dumps({"sha": sha}).encode()) - for name in ( - "scraper.libretro_scraper", - "scraper.retrobat_scraper", - "scraper.emudeck_scraper", - "scraper.misterfpga_scraper", - "scraper.retropie_scraper", - ): + branch_read = [s for s in self._registry_scrapers() if s not in self.TAG_PINNED] + self.assertGreater(len(branch_read), 8) + for scraper in branch_read: + name = f"scraper.{scraper}_scraper" module = importlib.import_module(name) with self.subTest(scraper=name), mock.patch("urllib.request.urlopen", answer): - self.assertRegex(module.Scraper().url, f"/{sha}(/|$)") + instance = module.Scraper() + # RetroDECK reads a tree of manifests and keeps the commit apart. + recorded = getattr(instance, "revision", "") or instance.url + self.assertRegex(recorded, f"(^|/){sha}(/|$)") def test_the_export_reads_the_recorded_tarball(self): from export_native import _tarball_at diff --git a/tests/test_site_reference.py b/tests/test_site_reference.py index e70976dd8..a7619f931 100644 --- a/tests/test_site_reference.py +++ b/tests/test_site_reference.py @@ -1466,6 +1466,31 @@ class TheFolderCheckExitCode(unittest.TestCase): "nosuch", Path(folder), {"/nosuch.json": None, "/catalog.json": catalog}) self.assertEqual(code, "unknown platform: nosuch. Known: batocera") + def test_a_folder_that_is_not_there_is_named(self): + """A mistyped folder read as every file missing, exit 1.""" + with tempfile.TemporaryDirectory() as folder: + code, _err = self.run_script("p", Path(folder) / "bois", {"/p.json": self.CONTRACT}) + self.assertIsInstance(code, str) + self.assertIn("bois", code) + self.assertIn("No such file or directory", code) + + def test_a_missing_argument_prints_the_usage(self): + err = io.StringIO() + with mock.patch.object(sys, "argv", ["check", "batocera"]), \ + mock.patch("sys.stderr", err), self.assertRaises(SystemExit) as raised: + runpy.run_path(self.SCRIPT, run_name="__main__") + self.assertTrue(str(raised.exception.code).startswith("Usage: ")) + + def test_no_network_is_a_message(self): + def offline(url: str, *args, **kwargs): + raise urllib.error.URLError("Name or service not known") + with tempfile.TemporaryDirectory() as folder, \ + mock.patch("urllib.request.urlopen", offline), \ + mock.patch.object(sys, "argv", ["check", "p", folder]), \ + self.assertRaises(SystemExit) as raised: + runpy.run_path(self.SCRIPT, run_name="__main__") + self.assertEqual(raised.exception.code, "error: ") + def test_the_page_shows_the_script(self): script = Path(self.SCRIPT).read_text(encoding="utf-8") self.assertIn("```python\n" + script.rstrip("\n") + "\n```", diff --git a/tests/test_system_selection.py b/tests/test_system_selection.py index 514c47262..4ddafd5b0 100644 --- a/tests/test_system_selection.py +++ b/tests/test_system_selection.py @@ -25,6 +25,7 @@ sys.path.insert(0, str(REPO_ROOT / "scripts")) import common # noqa: E402 import generate_pack as builder # noqa: E402 +from tests.scratchtree import scratch_checkout, snapshot # noqa: E402 class SpellingsAgree(unittest.TestCase): @@ -221,7 +222,7 @@ class AMissingDatabaseIsNamed(unittest.TestCase): with self.subTest(script=script): proc = subprocess.run( [sys.executable, f"scripts/{script}", "--db", "nosuch.json", *extra], - capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=600, + capture_output=True, text=True, cwd=str(scratch_checkout()), timeout=600, check=False, ) self.assertNotEqual(proc.returncode, 0, proc.stdout[-500:]) @@ -256,7 +257,7 @@ class AMissingBiosDirIsRefused(unittest.TestCase): with self.subTest(script=script): proc = subprocess.run( [sys.executable, f"scripts/{script}", "--bios-dir", "nosuch", *extra], - capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=600, + capture_output=True, text=True, cwd=str(scratch_checkout()), timeout=600, check=False, ) self.assertNotEqual(proc.returncode, 0) @@ -309,14 +310,15 @@ class AMissingProfileDirIsRefused(unittest.TestCase): "dat": str(root / "empty.dat")} taking = _scripts_taking("--emulators-dir") self.assertGreater(len(taking), 15) - tracked = ["git", "diff", "--name-only"] - before = subprocess.run(tracked, cwd=REPO_ROOT, capture_output=True, text=True).stdout + # In a copy: run in the checkout, a regression wrote there first. + checkout = scratch_checkout() + before = snapshot(checkout) for path in taking: extra = [arg.format(**values) for arg in self.EXTRA.get(path.stem, [])] with self.subTest(script=path.stem): proc = subprocess.run( [*_command(path), "--emulators-dir", "nosuch", *extra], - capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=600, + capture_output=True, text=True, cwd=str(checkout), timeout=600, check=False, env={**os.environ, "RETROBIOS_OFFLINE": "1"}, ) self.assertNotEqual(proc.returncode, 0, proc.stdout[-500:]) @@ -328,9 +330,11 @@ class AMissingProfileDirIsRefused(unittest.TestCase): ] self.assertEqual(written, []) # Read as empty, generate_site rewrote published-parts.json and the - # FAQ, and sitesources source-paths.json. - after = subprocess.run(tracked, cwd=REPO_ROOT, capture_output=True, text=True).stdout - self.assertEqual(after, before) + # FAQ, and sitesources source-paths.json. The copy compares the + # files themselves: a name `git diff` already listed hid a rewrite. + after = snapshot(checkout) + self.assertEqual(sorted(k for k in before.keys() | after.keys() + if before.get(k) != after.get(k)), []) class AMissingPlatformsDirIsRefused(unittest.TestCase): @@ -369,7 +373,7 @@ class AMissingPlatformsDirIsRefused(unittest.TestCase): with self.subTest(script=path.stem): proc = subprocess.run( [*_command(path), "--platforms-dir", "nosuch", *extra], - capture_output=True, text=True, cwd=str(REPO_ROOT), timeout=600, + capture_output=True, text=True, cwd=str(scratch_checkout()), timeout=600, check=False, env={**os.environ, "RETROBIOS_OFFLINE": "1"}, ) self.assertNotEqual(proc.returncode, 0, proc.stdout[-500:]) @@ -377,6 +381,28 @@ class AMissingPlatformsDirIsRefused(unittest.TestCase): self.assertRegex(proc.stderr, r"ERROR: .*nosuch") +class TheCopyKeepsTheCheckoutOutOfReach(unittest.TestCase): + """The refusal tests above run their writers in a copy.""" + + def test_a_script_in_the_copy_writes_to_the_copy(self): + checkout = scratch_checkout() + proc = subprocess.run( + [sys.executable, "-c", "import sys; sys.path.insert(0, 'scripts'); " + "import generate_site; print(generate_site._REPO_ROOT)"], + capture_output=True, text=True, cwd=str(checkout), timeout=300, check=True, + ) + self.assertEqual(Path(proc.stdout.strip()), checkout.resolve()) + + def test_a_rewrite_of_a_file_is_seen(self): + checkout = scratch_checkout() + page = checkout / "wiki" / "index.md" + before = snapshot(checkout) + original = page.read_bytes() + self.addCleanup(page.write_bytes, original) + page.write_bytes(original + b"\n") + self.assertNotEqual(snapshot(checkout), before) + + class AMissingInputFileIsNamed(unittest.TestCase): """The documented `--from-md5-file missing.txt` ended on a FileNotFoundError at the bottom of a stack trace.""" diff --git a/tests/test_target_scrapers.py b/tests/test_target_scrapers.py index 4bb1b7ba6..d55033cff 100644 --- a/tests/test_target_scrapers.py +++ b/tests/test_target_scrapers.py @@ -11,6 +11,7 @@ from __future__ import annotations import tests # noqa: F401 offline, scratch under tmp/, the suite's own cache import json +import os import sys import unittest import urllib.error @@ -591,12 +592,42 @@ class EmuDeckScriptNamesHaveOneRule(unittest.TestCase): with mock.patch.object( emudeck_targets_scraper, "_list_emuscripts", return_value=listing ), mock.patch.object(scraper, "_load_retroarch_cores", return_value=["mgba"]): - cores = scraper._fetch_cores_for_target("unused", "Windows") + cores = scraper._fetch_cores_for_target("unused", "Windows", "windows-x86_64") standalone = {emulator_of_script(name) for name in listing} - {None, "retroarch"} self.assertEqual(standalone, {"mupen64plus_next", "pcsx2", "xemu"}) self.assertEqual(cores, sorted(standalone | {"mgba"})) +class EmuDeckWindowsReadsTheWindowsBuild(unittest.TestCase): + """The RetroArch list was the first target of the architecture: + EmuDeck's Windows target carried fsuae, omicron and video_processor, + which the buildbot publishes for Linux only.""" + + def test_each_target_gets_its_own_retroarch_list(self): + seen: list[str] = [] + + def load(target: str) -> list[str]: + seen.append(target) + return [target] + + scraper = emudeck_targets_scraper.Scraper(revision="0" * 40) + with mock.patch.object( + emudeck_targets_scraper, "_list_emuscripts", return_value=["emuDeckRetroArch.sh"] + ), mock.patch.object(scraper, "_load_retroarch_cores", side_effect=load): + data = scraper.fetch_targets() + self.assertEqual(seen, ["linux-x86_64", "windows-x86_64"]) + self.assertEqual(data["targets"]["windows"]["cores"], ["windows-x86_64"]) + + def test_the_list_is_read_by_target_name_from_any_directory(self): + cwd = os.getcwd() + self.addCleanup(os.chdir, cwd) + os.chdir(Path(__file__).parent) + load = emudeck_targets_scraper.Scraper._load_retroarch_cores + windows, linux = load("windows-x86_64"), load("linux-x86_64") + self.assertNotIn("video_processor", windows) + self.assertIn("video_processor", linux) + + class HashScrapersRefuseAnUnknownVersion(unittest.TestCase): """mame_hash_scraper wrote core_version "unknown" after a failed API call and cached it for a day, while the pipeline step still read OK.""" diff --git a/tests/test_tool_messages.py b/tests/test_tool_messages.py index 7a7a61217..d297c7419 100644 --- a/tests/test_tool_messages.py +++ b/tests/test_tool_messages.py @@ -603,6 +603,25 @@ class OneSpellingPerOption(unittest.TestCase): missing.append(f"{path.relative_to(REPO_ROOT)}:{node.lineno} {long}") self.assertEqual(missing, []) + def test_one_long_name_per_option(self): + """arcade_parent_importer took --database where every other script + takes --db, and refused `--db database.json`.""" + import ast # noqa: PLC0415 + + renamed = {"--database": "--db"} + found = [] + for path in sorted((REPO_ROOT / "scripts").rglob("*.py")): + tree = ast.parse(path.read_text(encoding="utf-8")) + for node in ast.walk(tree): + if (isinstance(node, ast.Call) + and getattr(node.func, "attr", None) == "add_argument"): + found.extend( + f"{path.relative_to(REPO_ROOT)}:{node.lineno} {a.value}" + for a in node.args + if isinstance(a, ast.Constant) and a.value in renamed + ) + self.assertEqual(found, []) + class ThePipelineRefreshesTheCommittedExport(unittest.TestCase): """Step 2e wrote to /upstream while exports/ is the copy the diff --git a/wiki/tools.md b/wiki/tools.md index 608f60318..763189ae2 100644 --- a/wiki/tools.md +++ b/wiki/tools.md @@ -513,7 +513,10 @@ A part opening with `source` or `upstream`, in a source_ref or in prose, is read in that repository. The word belongs to the part, not to its path: one profile can cite the same file under both. `--triage` prints a header, ranks worst first and closes on the number of profiles with something to -review. +review. Online, a pass over many profiles takes several minutes or more: it +names its size on stderr, then writes a progress line every 30 seconds. +Ctrl-C prints the output for the profiles already read and exits 130. +`--offline` answers from the cache alone. A single cited line is often not distinctive, so the anchor widens by steps of ±3, ±6, ±12, ±25 and ±50 lines until it is unique. Three further @@ -1416,7 +1419,7 @@ Further options, by script: | `scraper/mame_hash_scraper.py` | `--release mameNNNN --profile FILE --source-commit SHA --core NAME --built-by PLATFORM` writes the profile of a MAME build a platform compiles. `--devices --listxml FILE` documents in `mame.yml` every device set with dumped ROMs that the release's `-listxml` names (`isdevice="yes"`), with `--dry-run` to preview | | `scraper/romset_dat_importer.py` | `--cache-dir` (downloaded listxml and DATs) | | `scraper/game_dat_importer.py` | `--source no-intro\|redump` (repeatable), `--pack FILE` imports a local ZIP, directory or DAT, `--refresh` asks the servers again, `--cache-dir`, `--output-dir`, `--dry-run` | -| `scraper/arcade_parent_importer.py` | `--profile NAME` (one core version), `--emulators-dir`, `--database` (BIOS roots checked against it by archive name), `--output-dir`, `--cache-dir`, `--offline`, `--dry-run` | +| `scraper/arcade_parent_importer.py` | `--profile NAME` (one core version), `--emulators-dir`, `--db` (BIOS roots checked against it by archive name), `--output-dir`, `--cache-dir`, `--offline`, `--dry-run` | | `scraper/romfolders` | `--sources DIR` (default `platforms/romfolders/_sources`), `--output-dir`, `--dry-run` | | `game_rules.py` | `--regions`, `--extras`, `--headers` (files checked against the profiles and the header readers), `--emulators-dir`, `--json` | | `generate_games_index.py` | `--output-dir` (default `install/games`), `--check`, `--quiet` | @@ -1659,7 +1662,7 @@ names the profiles read. | Catalog | Acquisition | Notes | |---------|------------|-------| | Redump | direct fetch from redump.info, one `/bios/` route per system | 4 BIOS DATs. redump.org serves BIOS DATs dated 2010 to 2022, redump.info the current ones | -| No-Intro | local pack, imported with `dat_pack_importer` | Dat-o-Matic serves its DATs through a browser session, and the `hugo19941994/auto-datfile-generator` mirror rebuilds daily | +| No-Intro | local pack, imported with `dat_pack_importer` | Dat-o-Matic serves its DATs through a browser session, and the `dantob/auto-datfile-generator` mirror rebuilds daily. `check_freshness` reads a pack older than a week as a stopped mirror | | TOSEC | local pack, imported with `dat_pack_importer` | annual pack from tosecdev.org, 138 Firmware DATs | The join is by SHA1, then by MD5 + size. A match sets the `provenance` field