chore: merge the automatic test campaign

This commit is contained in:
Abdessamad Derraz committed 2026-10-27 14:05:18 +01:00
commit 9c8dbcd99a
31 files changed
+4132 -49

No files matched your search

+45 -7
View File
@@ -4,9 +4,14 @@
# Commands run in the automation worktree (.cache/autorun/worktree) unless
# `worktree: false`, which runs them in the main checkout and forbids
# commits. `python` names the interpreter running autorun.py. A step is a
# command list, or a mapping with `run`, `ok_codes` and `stdout` (a file
# the command's output is written to). `twice` recomputes an artifact the
# gate wrote into `{out}` and compares both, timestamps aside. Each commit
# command list, or a mapping with `run`, `ok_codes`, `stdout` (a file the
# command's output is written to) and `env` (variables passed through
# beside PATH, HOME, LANG, LC_*, TZ and TMPDIR). A step never sees a password.
# GITHUB_TOKEN goes to the push, to gh, and to a step marked `github_token:
# true`, which autorun accepts only on check_freshness.py, refresh_stale.py and
# `-m scripts.scraper.*`, tracked here, never in the campaign job. `twice`
# recomputes an artifact the gate wrote into `{out}` and compares both,
# timestamps aside. Each commit
# takes only the changed files its `paths` globs match, and a job that
# leaves any other change behind fails. `report` names a JSON file a step
# writes, kept in the job's status.
@@ -44,10 +49,14 @@ jobs:
- run: [python, scripts/check_freshness.py, --json]
ok_codes: [0, 1]
stdout: tmp/autorun/freshness.json
- [python, scripts/refresh_stale.py, --findings, tmp/autorun/freshness.json,
--only, "data,catalogs"]
- [python, -m, scripts.scraper.mame_hash_scraper]
- [python, -m, scripts.scraper.fbneo_hash_scraper]
github_token: true
- run: [python, scripts/refresh_stale.py, --findings, tmp/autorun/freshness.json,
--only, "data,catalogs"]
github_token: true
- run: [python, -m, scripts.scraper.mame_hash_scraper]
github_token: true
- run: [python, -m, scripts.scraper.fbneo_hash_scraper]
github_token: true
gate:
- [python, scripts/pipeline.py, --offline]
twice:
@@ -85,6 +94,35 @@ jobs:
stdout: tmp/autorun/bios-integrity.json
report: tmp/autorun/bios-integrity.json
campaign:
schedule: "*-*-* 06:00"
network: true
max_load_wait: 7200
timeout: 12600
steps:
- run: [python, scripts/campaign.py, run, --budget, 150m]
ok_codes: [0, 75]
stdout: tmp/autorun/campaign.json
env: [RETROBIOS_ROMFETCH, RETROBIOS_AUTO_LOCK, ROMFETCH_CONTENT_DIR, ROMFETCH_CACHE_DIR,
ROMFETCH_DATS_DIR, ROMFETCH_RETOOL_DIR, ROMFETCH_MIN_INTERVAL, ROMFETCH_MAX_SIZE,
ROMFETCH_DISABLED_SOURCES, XDG_CONFIG_HOME]
gate:
- [python, scripts/campaign.py, gate]
commits:
- subject: "chore: add campaign measurements"
body: >-
Core probe records, findings and the pass summary written by
campaign.py, behind the measurement tests and the schemas.
paths: [measurements/*.jsonl]
- subject: "chore: apply fields the campaign proved"
body: >-
Fields the campaign's rule table settled from real runs, each with
the record ids in evidence:, behind verify and an emulator pack of
every changed profile.
paths: [emulators/*.yml]
report: tmp/autorun/campaign.json
scratch: [tmp/autorun, tmp/core_probe]
assets:
schedule: "*-*-* 04:30"
network: true
+9
View File
@@ -77,6 +77,15 @@ files:
- "scph7003.bin"
- "SCPH7003.bin"
- "SCPH-7003.bin"
- "SCPH5501.BIN"
- "SCPH-5501.BIN"
- "SCPH5503.BIN"
- "SCPH-5503.BIN"
- "SCPH7003.BIN"
- "SCPH-7003.BIN"
evidence:
aliases: ["2026-10-27-48269ae11777", "2026-10-27-ba941702c6c2", "2026-10-27-fc95254312c0", "2026-10-27-5a191f2b540b", "2026-10-27-12ba45024f8c", "2026-10-27-a7c1a301bdb0"]
hle_fallback: ["2026-10-27-f2ecd7ed71b5", "2026-10-27-ca1f49599ca1"]
# -- Region: Europe (REGION_EU) --
+2
View File
@@ -36,6 +36,8 @@ files:
size: 524288
validation: [size]
source_ref: "source frontend/libretro.c:1229 (bios[1]), :1181 (size check)"
evidence:
hle_fallback: ["2026-10-27-cfc47bbfcd02", "2026-10-27-b6d0ce4dfd7e"]
- name: "scph7001.bin"
description: "SCPH-7001 (v4.1 12-16-97 A)"
+2
View File
@@ -44,6 +44,8 @@ files:
validation: [size]
source_ref: "source frontend/libretro.c:3864-3867 (listed_bios[1])"
note: "Preferred US BIOS, searched first by exact filename. The US slot is the detector's default: a disc takes it for both America licence strings and for any licence that is neither \"Inc.\" (JP) nor \"Euro pe\" (EU), and content without a disc boots it too (libpcsxcore/misc.c:422-453, frontend/libretro.c:2167-2171)."
evidence:
hle_fallback: ["2026-10-27-e9eeba54945e"]
# -- Region: Europe (PSX_REGION_EU = 2) --
+2
View File
@@ -62,6 +62,8 @@ files:
validation: [size, md5]
source_ref: "source src/core/bios.cpp:50-51"
aliases: []
evidence:
hle_fallback: ["2026-10-27-dc8ff3969ec2"]
- name: "scph5502.bin"
description: "SCPH-5502, 5552 (v3.0 01-06-97 E)"
+26
View File
@@ -0,0 +1,26 @@
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"mednafen_psx_libretro.so","library_name":"Beetle PSX","library_version":"0.9.44.1 7fea57a","repo":"https://github.com/libretro/beetle-psx-libretro","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.88,1.99,3.26],"load_before":[1.96,2.01,3.27],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-21f4865f4bc7","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T10:53:51+00:00","subject":"files-mednafen-psx-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":2,"13":1,"23":1,"28":1,"32":2374,"35":2,"36":1,"37":8,"40":2373,"44":1,"45":4,"46":1,"47":1,"51":1,"55":18,"57":1,"59":1,"8":1},"files_opened":[{"path":"scph5501.bin","sha1_after":"0555c6fae8906f3f09baf5988f00e55f88e9f30b","sha1_staged":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"files_probed_absent":[],"fps":563.2769357965391,"fps_nominal":59.94,"frames":3600,"input_pressed":0,"input_queries":115200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"Beetle PSX","library_version":"0.9.44.1 7fea57a","loaded":true,"logs":[{"frame":0,"level":"info","text":"Loading \"<content>/Bust-A-Move 2 - Arcade Edition (USA).cue\""},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10000000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10200000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10400000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10600000 succeeded"},{"frame":0,"level":"info","text":"Checking if required firmware is present..."},{"frame":0,"level":"info","text":"Firmware found: <system>/scph5501.bin"},{"frame":0,"level":"info","text":"Firmware SHA1: 0555C6FAE8906F3F09BAF5988F00E55F88E9F30B"},{"frame":0,"level":"info","text":"Controller 1: PlayStation Controller"},{"frame":0,"level":"info","text":"Controller 2: PlayStation Controller"},{"frame":0,"level":"info","text":"Controller 3: PlayStation Controller"},{"frame":0,"level":"info","text"Line truncated
{"check":{"claim":"mednafen_psx reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8eLine truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH5501.BIN","method":"scph5501.bin staged as SCPH5501.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d5Line truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH-5501.BIN","method":"scph5501.bin staged as SCPH-5501.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"Line truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH5503.BIN","method":"scph5501.bin staged as SCPH5503.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d5Line truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH-5503.BIN","method":"scph5501.bin staged as SCPH-5503.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"Line truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH7003.BIN","method":"scph5501.bin staged as SCPH7003.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d5Line truncated
{"check":{"claim":"mednafen_psx opens scph5501.bin as SCPH-7003.BIN","method":"scph5501.bin staged as SCPH-7003.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"Line truncated
{"check":{"claim":"mednafen_psx opens openbios.bin as openbios.bin","method":"openbios.bin staged as openbios.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d5Line truncated
{"check":{"claim":"mednafen_psx opens ps1_rom.bin as ps1_rom.bin","method":"ps1_rom.bin staged as ps1_rom.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d51ab7Line truncated
{"check":{"claim":"mednafen_psx opens psxonpsp660.bin as psxonpsp660.bin","method":"psxonpsp660.bin staged as psxonpsp660.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffbLine truncated
{"check":{"claim":"mednafen_psx opens scph5903.bin as scph5903.bin","method":"scph5903.bin staged as scph5903.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d5Line truncated
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"mednafen_psx_libretro.so","library_name":"Beetle PSX","library_version":"0.9.44.1 7fea57a","repo":"https://github.com/libretro/beetle-psx-libretro","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.6,3.53,3.82],"load_before":[1.77,3.66,3.86],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-5d2017878651","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:01:49+00:00","subject":"bench-mednafen-psx-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":667.3032020023275,"mean":662.4387803707658,"median":661.1868040650347,"min":657.4726790341401,"raw":[666.9244445718946,661.1868040650347,659.3067721804323,657.4726790341401,667.3032020023275],"stdev":4.467182098229173},"ms_per_frame":{"max":1.520975748329268,"mean":1.509628326554472,"median":1.512431878331376,"min":1.4985691616635046,"raw":[1.4994202238934424,1.512431878331376,1.51674462055477,1.520975748329268,1.4985691616635046],"stdev":0.010170742497764122}},"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":2,"13":1,"23":1,"28":1,"32":1174,"35":2,"36":1,"37":8,"40":1173,"44":1,"45":4,"46":1,"47":1,"51":1,"55":18,"57":1,"59":1,"8":1},"files_opened":null,"files_probed_absent":null,"fps":666.9244445718946,"fps_nominal":59.94,"frames":1800,"input_pressed":0,"input_queries":76800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"Beetle PSX","library_version":"0.9.44.1 7fea57a","loaded":true,"logs":[{"frame":0,"level":"info","text":"Loading \"<content>/Bust-A-Move 2 - Arcade Edition (USA).cue\""},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10000000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10200000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10400000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10600000 succeeded"},{"frame":0,"level":"info","text":"Checking if required firmware is present..."},{"frame":0,"level":"info","text":"Firmware found: <system>/scph5501.bin"},{"frame":0,"levelLine truncated
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"mednafen_psx_hw_libretro.so","library_name":"Beetle PSX HW","library_version":"0.9.44.1 7fea57a","repo":"https://github.com/libretro/beetle-psx-libretro","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.65,3.48,3.8],"load_before":[1.6,3.53,3.82],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-50543bf5743c","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T11:01:55+00:00","subject":"files-mednafen-psx-hw-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":2,"13":1,"14":3,"23":1,"28":1,"32":2374,"35":2,"36":1,"37":8,"40":2373,"44":1,"45":4,"46":1,"47":1,"51":1,"55":25,"56":2,"57":1,"59":1,"6":1,"69":1,"8":1},"files_opened":[{"path":"scph5501.bin","sha1_after":"0555c6fae8906f3f09baf5988f00e55f88e9f30b","sha1_staged":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"files_probed_absent":[],"fps":569.4128402084904,"fps_nominal":59.94,"frames":3600,"input_pressed":0,"input_queries":115200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"Beetle PSX HW","library_version":"0.9.44.1 7fea57a","loaded":true,"logs":[{"frame":0,"level":"info","text":"Loading \"<content>/Bust-A-Move 2 - Arcade Edition (USA).cue\""},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10000000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10200000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10400000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10600000 succeeded"},{"frame":0,"level":"info","text":"Checking if required firmware is present..."},{"frame":0,"level":"info","text":"Firmware found: <system>/scph5501.bin"},{"frame":0,"level":"info","text":"Firmware SHA1: 0555C6FAE8906F3F09BAF5988F00E55F88E9F30B"},{"frame":0,"level":"info","text":"Controller 1: PlayStation Controller"},{"frame":0,"level":"info","text":"Controller 2: PlayStation Controller"},{"frame":0,"level":"info","text":"Controller 3: PlayStation ContrLine truncated
{"check":{"claim":"mednafen_psx_hw reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH5501.BIN","method":"scph5501.bin staged as SCPH5501.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH-5501.BIN","method":"scph5501.bin staged as SCPH-5501.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[96Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH5503.BIN","method":"scph5501.bin staged as SCPH5503.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH-5503.BIN","method":"scph5501.bin staged as SCPH-5503.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[96Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH7003.BIN","method":"scph5501.bin staged as SCPH7003.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,Line truncated
{"check":{"claim":"mednafen_psx_hw opens scph5501.bin as SCPH-7003.BIN","method":"scph5501.bin staged as SCPH-7003.BIN, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[96Line truncated
{"check":{"claim":"mednafen_psx_hw opens openbios.bin as openbios.bin","method":"openbios.bin staged as openbios.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,Line truncated
{"check":{"claim":"mednafen_psx_hw opens ps1_rom.bin as ps1_rom.bin","method":"ps1_rom.bin staged as ps1_rom.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,"d51Line truncated
{"check":{"claim":"mednafen_psx_hw opens psxonpsp660.bin as psxonpsp660.bin","method":"psxonpsp660.bin staged as psxonpsp660.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeLine truncated
{"check":{"claim":"mednafen_psx_hw opens scph5903.bin as scph5903.bin","method":"scph5903.bin staged as scph5903.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[10,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[20,"337865a6875563894146c2bf10e400ac4759a23e"],[30,"0304b0afe55ebe3add1ebf5bf41752f97e44204c"],[40,"7c35e737b2ccd7800ea1f0c36f687a9c6dda764c"],[50,"299a3fff10da0b0a116a1ea88d7433af6738de84"],[60,"c12e166c88321b96354829282fc51d5bc21a9b82"],[70,"74eb9bb5d909952545945402db4f6e7556d16e81"],[80,"fa30cf7b1d078ee6b88fee18a4951a7e0451440b"],[90,"539e02cabeebdd160561c5ae9f8c1133de337689"],[100,"fb3ff45d9dcbed0a60c552cb8c88b42115ab4cfd"],[110,"3981635420384123d33c47b909dd3612d6a7bd41"],[120,"fb517372811fb54ecc6820f7f33fee410fd3f94c"],[130,"274796a4421f971ad31f8cfed6143ea1a1f716f8"],[140,"f11ba7396b957127985dff0746fe96c552d01faa"],[150,"352b4bb3233f9e5227c17b9acc64a8f8c12d1a5e"],[160,"fcc27a87c9ed8f96caf75bcf618316ab029935e1"],[170,"ce6cac47ffedc6581fd7cd5234b8eaa491201b29"],[180,"53964f429e207a9e12058d29c03d848fb0ee4bc8"],[190,"556bfc1bd6076747fb1a1cc61195c59935139808"],[200,"d60afa84aa75ac26255e4abcc7787e2c6926a822"],[210,"bf686aec65cb75afa4c2c6a76ed41dc2e7f56473"],[220,"1c30d1c3691149440de2e39c76c9d4c15a3ef887"],[230,"f3f0ab0259b022858fe1f9df5b8b881d20ed9622"],[240,"ccdb9fe1afab16bff7b8abe49d93388a4759b672"],[250,"ef0d5460065e9bea5bf56143dccec95e0f97e9e2"],[260,"37a277f1c7fdd3dbb2957437e97149633bbc46bb"],[270,"c3f66164fa79d8d5387cee765c6c921ef0a5592a"],[280,"949c14bd898ec443eac36d983b1a9b835c1e30bb"],[290,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[300,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[310,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[320,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[330,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[340,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[350,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[360,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[370,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[380,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[390,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[400,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[410,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[420,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[430,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[440,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[450,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[460,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[470,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[480,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[490,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[500,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[510,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[520,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[530,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[540,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[550,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[560,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[570,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[580,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[590,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[600,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[610,"6b056a423c67f7a4675ffdb2f3a62d92f532b358"],[620,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[630,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[640,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[650,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[660,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[670,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[680,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[690,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[700,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[710,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[720,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[730,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[740,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[750,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[760,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[770,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[780,"64646545171a7f81dfcd027089d1f38a7f81b82b"],[790,"ad649e2955576e0af98200564cd4c5e2da081453"],[800,"ad649e2955576e0af98200564cd4c5e2da081453"],[810,"ad649e2955576e0af98200564cd4c5e2da081453"],[820,"ad649e2955576e0af98200564cd4c5e2da081453"],[830,"ad649e2955576e0af98200564cd4c5e2da081453"],[840,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[850,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[860,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[870,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[880,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[890,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[900,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[910,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[920,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[930,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[940,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[950,"d51ab7783f8eeafc63a28f14ce39f8e2babeffb3"],[960,Line truncated
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/mednafen_psx_hw_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"mednafen_psx_hw_libretro.so","library_name":"Beetle PSX HW","library_version":"0.9.44.1 7fea57a","repo":"https://github.com/libretro/beetle-psx-libretro","sha256":"d16c889c9f12bd3265edc3c9d4b0e6e24c1f244d1d8d475235f6a74e65e5b10b"},"emulator":"beetle_psx","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.63,2.67,3.42],"load_before":[1.78,2.77,3.47],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-18a314355341","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:04:53+00:00","subject":"bench-mednafen-psx-hw-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":665.8914452174591,"mean":661.8036805880163,"median":664.3413109199394,"min":649.7759485719646,"raw":[665.7064866444065,665.8914452174591,664.3413109199394,663.3032115863116,649.7759485719646],"stdev":6.806177582641735},"ms_per_frame":{"max":1.538992020553754,"mean":1.5111516665525009,"median":1.5052503638758532,"min":1.5017462788899947,"raw":[1.5021635211046993,1.5017462788899947,1.5052503638758532,1.507606148338204,1.538992020553754],"stdev":0.015745868182457167}},"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":2,"13":1,"14":3,"23":1,"28":1,"32":1174,"35":2,"36":1,"37":8,"40":1173,"44":1,"45":4,"46":1,"47":1,"51":1,"55":25,"56":2,"57":1,"59":1,"6":1,"69":1,"8":1},"files_opened":null,"files_probed_absent":null,"fps":665.7064866444065,"fps_nominal":59.94,"frames":1800,"input_pressed":0,"input_queries":76800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"Beetle PSX HW","library_version":"0.9.44.1 7fea57a","loaded":true,"logs":[{"frame":0,"level":"info","text":"Loading \"<content>/Bust-A-Move 2 - Arcade Edition (USA).cue\""},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10000000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10200000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10400000 succeeded"},{"frame":0,"level":"debug","text":"Regular mmap to address 0x10600000 succeeded"},{"frame":0,"level":"info","text":"Checking if required firmware is present..."},{"frame":0,"level":"info","text":"Firmware fLine truncated
+2
View File
@@ -0,0 +1,2 @@
{"counts":{"done":43,"failed":0,"pending":5},"detail":"","ended_at":"2026-10-27T11:08:32+00:00","failed":[],"findings":{"applied":6,"open":1},"id":"2026-10-27-e3d95336e522","pending_reasons":{"standalone":5},"records":["2026-10-27-21f4865f4bc7","2026-10-27-f2ecd7ed71b5","2026-10-27-48269ae11777","2026-10-27-ba941702c6c2","2026-10-27-fc95254312c0","2026-10-27-5a191f2b540b","2026-10-27-12ba45024f8c","2026-10-27-a7c1a301bdb0","2026-10-27-aacf8d392722","2026-10-27-e15f6d1ba1bd","2026-10-27-c340167e5395","2026-10-27-be71241ad606","2026-10-27-5d2017878651","2026-10-27-50543bf5743c","2026-10-27-ca1f49599ca1","2026-10-27-ed4bfe08b830","2026-10-27-9e96d0551310","2026-10-27-357486f7bd25","2026-10-27-cb014f1f3141","2026-10-27-28e1dc0dd01d","2026-10-27-e7b6b7322029","2026-10-27-9e224aa0ae6e","2026-10-27-44708a334f8a","2026-10-27-c72381d97b6e","2026-10-27-ab2001161aab","2026-10-27-18a314355341","2026-10-27-69bcb2298491","2026-10-27-cfc47bbfcd02","2026-10-27-5dd865291b4a","2026-10-27-9c1fd688e9bb","2026-10-27-a1d61db66051","2026-10-27-cb5ace8c42f9","2026-10-27-e9eeba54945e","2026-10-27-ece16d90b929","2026-10-27-79c00b29bce6","2026-10-27-f15992a9448d","2026-10-27-fbb3ba6b6823","2026-10-27-2138f64f1283","2026-10-27-15fc06931bec","2026-10-27-dc8ff3969ec2","2026-10-27-f9bb455a6001","2026-10-27-6b3344815ce2","2026-10-27-fab739d8fbb6"],"result":"complete","schema_version":1,"started_at":"2026-10-27T10:53:39+00:00"}
{"counts":{"done":43,"failed":0,"pending":5},"detail":"","ended_at":"2026-10-27T11:23:25+00:00","failed":[],"findings":{},"id":"2026-10-27-291e138f7951","pending_reasons":{"standalone":5},"records":["2026-10-27-78b237564589","2026-10-27-b6d0ce4dfd7e","2026-10-27-f509b10a729f","2026-10-27-0b5d6202b40b","2026-10-27-451fadc750e0"],"result":"complete","schema_version":1,"started_at":"2026-10-27T11:20:08+00:00"}
+7
View File
@@ -0,0 +1,7 @@
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-f2ecd7ed71b5"],"field":"required","file":"scph5501.bin","found_at":"2026-10-27T10:54:17+00:00","id":"2026-10-27-ff5965932d94","key":"beetle_psx/sony-playstation/scph5501.bin/required","profile_says":true,"rule":"boots_without_file","run_shows":false,"schema_version":1,"statement":"the profile says scph5501.bin is required, and the core reaches the game without it. The table settles hle_fallback from this run, not required","status":"open","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-48269ae11777"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T10:54:31+00:00","id":"2026-10-27-64e652acc17a","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH5501.BIN","status":"applied","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-ba941702c6c2"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T10:54:45+00:00","id":"2026-10-27-e1837771e970","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH-5501.BIN","status":"applied","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-fc95254312c0"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T10:54:58+00:00","id":"2026-10-27-97dbc4130c8e","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH5503.BIN","status":"applied","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-5a191f2b540b"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T11:00:11+00:00","id":"2026-10-27-7057a71f3ca2","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN","SCPH-5503.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH-5503.BIN","status":"applied","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-12ba45024f8c"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T11:00:24+00:00","id":"2026-10-27-dddd4d6b58d1","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN","SCPH-5503.BIN"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN","SCPH-5503.BIN","SCPH7003.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH7003.BIN","status":"applied","system":"sony-playstation"}
{"content":"Bust-A-Move 2 - Arcade Edition (USA)","core":{"file":"mednafen_psx_libretro.so","library_version":"0.9.44.1 7fea57a","sha256":"a89200443c0afa594e85e5e77630921d5e5b04ebf9c499597f3e6f1c947b0c87"},"emulator":"beetle_psx","evidence":["2026-10-27-a7c1a301bdb0"],"field":"aliases","file":"scph5501.bin","found_at":"2026-10-27T11:00:38+00:00","id":"2026-10-27-c42f5017189c","key":"beetle_psx/sony-playstation/scph5501.bin/aliases","profile_says":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN","SCPH-5503.BIN","SCPH7003.BIN"],"rule":"opened_other_name","run_shows":["SCPH5501.bin","SCPH-5501.bin","scph5503.bin","SCPH5503.bin","SCPH-5503.bin","scph7003.bin","SCPH7003.bin","SCPH-7003.bin","SCPH5501.BIN","SCPH-5501.BIN","SCPH5503.BIN","SCPH-5503.BIN","SCPH7003.BIN","SCPH-7003.BIN"],"schema_version":1,"statement":"the core opened scph5501.bin under the name SCPH-7003.BIN","status":"applied","system":"sony-playstation"}
+10
View File
@@ -0,0 +1,10 @@
{"core":{"build_command":"make -f Makefile.libretro -j6 platform=unix (isolation: bwrap)","commit":"35dabb85ff3af6825820f54090d344945f65d24e","compiler":["GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"],"file":"pcsx1_libretro.so","library_name":"PCSX1","library_version":"r22","repo":"https://github.com/libretro/pcsx1-libretro","sha256":"d7ea1f9596e980b38c6da0b5926c3249ef6adb15c4673dfa37cb70b77941153d"},"emulator":"pcsx1","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.42,2.57,3.38],"load_before":[1.46,2.6,3.39],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-69bcb2298491","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T11:05:08+00:00","subject":"files-pcsx1-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"8":1},"files_opened":[{"path":"scph1001.bin","sha1_after":"10155d8d6e6e832d6ea66db9bc098321fb5e8ebf","sha1_staged":"10155d8d6e6e832d6ea66db9bc098321fb5e8ebf"}],"files_probed_absent":[],"fps":736.1584982351811,"fps_nominal":60.0,"frames":3600,"input_pressed":0,"input_queries":115200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX1","library_version":"r22","loaded":true,"logs":[],"ms_per_frame":1.3584031188899341,"observables":{"audio_sha1":"a22c3c99e06c7cf6ea56ba1d5e107da05b9e5dd1","frame_hashes":[[0,"12c3f670812a586f983758491fce0ce1968e4523"],[10,"12c3f670812a586f983758491fce0ce1968e4523"],[20,"12c3f670812a586f983758491fce0ce1968e4523"],[30,"12c3f670812a586f983758491fce0ce1968e4523"],[40,"12c3f670812a586f983758491fce0ce1968e4523"],[50,"12c3f670812a586f983758491fce0ce1968e4523"],[60,"12c3f670812a586f983758491fce0ce1968e4523"],[70,"12c3f670812a586f983758491fce0ce1968e4523"],[80,"12c3f670812a586f983758491fce0ce1968e4523"],[90,"12c3f670812a586f983758491fce0ce1968e4523"],[100,"12c3f670812a586f983758491fce0ce1968e4523"],[110,"12c3f670812a586f983758491fce0ce1968e4523"],[120,"12c3f670812a586f983758491fce0ce1968e4523"],[130,"12c3f670812a586f983758491fce0ce1968e4523"],[140,"12c3f670812a586f983758491fce0ce1968e4523"],[150,"12c3f670812a586f983758491fce0ce1968e4523"],[160,"12c3f670812a586f983758491fce0ce1968e4523"],[170,"12c3f670812a586f983758491fce0ce1968e4523"],[180,"12c3f670812a586f983758491fce0ce1968e4523"],[190,"12c3f670812a586f983758491fce0ce1968e4523Line truncated
{"check":{"claim":"pcsx1 reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae182Line truncated
{"check":{"claim":"pcsx1 opens scph5501.bin as scph5501.bin","method":"scph5501.bin staged as scph5501.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[930,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[940,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[950,"af2a3131b550b44c268f6eca17ef32635c6e2fec"],[960,"d9680eb8cLine truncated
{"check":{"claim":"pcsx1 opens scph7001.bin as scph7001.bin","method":"scph7001.bin staged as scph7001.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[930,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[940,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[950,"af2a3131b550b44c268f6eca17ef32635c6e2fec"],[960,"d9680eb8cLine truncated
{"core":{"build_command":"make -f Makefile.libretro -j6 platform=unix (isolation: bwrap)","commit":"35dabb85ff3af6825820f54090d344945f65d24e","compiler":["GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"],"file":"pcsx1_libretro.so","library_name":"PCSX1","library_version":"r22","repo":"https://github.com/libretro/pcsx1-libretro","sha256":"d7ea1f9596e980b38c6da0b5926c3249ef6adb15c4673dfa37cb70b77941153d"},"emulator":"pcsx1","flags":["default: repetition 1 disagrees with repetition 0 on state_sha1","default: repetition 2 disagrees with repetition 0 on state_sha1","default: repetition 3 disagrees with repetition 0 on state_sha1","default: repetition 4 disagrees with repetition 0 on state_sha1"],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.76,2.44,3.28],"load_before":[1.6,2.45,3.3],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-a1d61db66051","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:06:05+00:00","subject":"bench-pcsx1-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":811.1268119389562,"mean":801.3472770494415,"median":803.7521845508214,"min":790.0578678893716,"raw":[811.1268119389562,794.0241947359125,790.0578678893716,803.7521845508214,807.7753261321456],"stdev":8.997513427459738},"ms_per_frame":{"max":1.2657300694586917,"mean":1.2480245918850414,"median":1.244164581100146,"min":1.2328528477680973,"raw":[1.2328528477680973,1.2594074672152702,1.2657300694586917,1.244164581100146,1.2379679938830022],"stdev":0.014046978795089}},"variants":[{"flags":["repetition 1 disagrees with repetition 0 on state_sha1","repetition 2 disagrees with repetition 0 on state_sha1","repetition 3 disagrees with repetition 0 on state_sha1","repetition 4 disagrees with repetition 0 on state_sha1"],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"8":1},"files_opened":null,"files_probed_absent":null,"fps":811.1268119389562,"fps_nominal":60.0,"frames":1800,"input_pressed":0,"input_queries":76800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX1","library_version":"r22","loaded":true,"logs":[],"ms_per_frame":1.2328528477680973,"observables":{"audio_sha1":"1a6555e50f83e52783356a5e7f2d49ab4ac31ba2","frame_sha1":"1c47205c0383c6e66c872e7c571e35001910e53e","state_sha1":"fabc38069e4765cfe097a50a543aadc663d5ff7c","video_sha1":"a1fcb4c37221b1177edd55a8a52a298e422fb0Line truncated
{"core":{"build_command":"make -f Makefile.libretro -j6 platform=unix on git archive (isolation: bwrap)","commit":"35dabb85ff3af6825820f54090d344945f65d24e","compiler":["GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"],"file":"pcsx1_libretro.so","library_name":"PCSX1","library_version":"r22","repo":"https://github.com/libretro/pcsx1-libretro","sha256":"2d6b63b537f4147fec585dcd14dc9d022d75608216569438f7c9ed7b9e8bce11"},"emulator":"pcsx1","flags":[],"frontend":{"commit":"f5e98bfda60052f8a5e3249b6b5a6a4c6983248d","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.62,3.08,3.15],"load_before":[1.67,3.11,3.16],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-78b237564589","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T11:22:27+00:00","subject":"files-pcsx1-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"8":1},"files_opened":[{"path":"scph1001.bin","sha1_after":"10155d8d6e6e832d6ea66db9bc098321fb5e8ebf","sha1_staged":"10155d8d6e6e832d6ea66db9bc098321fb5e8ebf"}],"files_probed_absent":[],"fps":731.6103159535502,"fps_nominal":60.0,"frames":3600,"input_pressed":0,"input_queries":115200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX1","library_version":"r22","loaded":true,"logs":[],"ms_per_frame":1.3668478672237445,"observables":{"audio_sha1":"a22c3c99e06c7cf6ea56ba1d5e107da05b9e5dd1","frame_hashes":[[0,"12c3f670812a586f983758491fce0ce1968e4523"],[10,"12c3f670812a586f983758491fce0ce1968e4523"],[20,"12c3f670812a586f983758491fce0ce1968e4523"],[30,"12c3f670812a586f983758491fce0ce1968e4523"],[40,"12c3f670812a586f983758491fce0ce1968e4523"],[50,"12c3f670812a586f983758491fce0ce1968e4523"],[60,"12c3f670812a586f983758491fce0ce1968e4523"],[70,"12c3f670812a586f983758491fce0ce1968e4523"],[80,"12c3f670812a586f983758491fce0ce1968e4523"],[90,"12c3f670812a586f983758491fce0ce1968e4523"],[100,"12c3f670812a586f983758491fce0ce1968e4523"],[110,"12c3f670812a586f983758491fce0ce1968e4523"],[120,"12c3f670812a586f983758491fce0ce1968e4523"],[130,"12c3f670812a586f983758491fce0ce1968e4523"],[140,"12c3f670812a586f983758491fce0ce1968e4523"],[150,"12c3f670812a586f983758491fce0ce1968e4523"],[160,"12c3f670812a586f983758491fce0ce1968e4523"],[170,"12c3f670812a586f983758491fce0ce1968e4523"],[180,"12c3f670812a586f983758491fce0ce1968e4523"],[190,"12c3f670812a586f98375849Line truncated
{"check":{"claim":"pcsx1 reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae182Line truncated
{"check":{"claim":"pcsx1 opens scph5501.bin as scph5501.bin","method":"scph5501.bin staged as scph5501.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[930,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[940,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[950,"af2a3131b550b44c268f6eca17ef32635c6e2fec"],[960,"d9680eb8cLine truncated
{"check":{"claim":"pcsx1 opens scph7001.bin as scph7001.bin","method":"scph7001.bin staged as scph7001.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[130,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[140,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[240,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[250,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[260,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[270,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[280,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[290,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[300,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[360,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[370,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[380,"a7d9a3a92862d233a9af74e14c14a508b8d915d4"],[390,"078c7a10e070de51fb4f3180b943c516723f5c3e"],[400,"0235b8f6fb152b40ba0c2ad9f6bc41701f853bbb"],[410,"85405bb719fe159eabb0df33a9bfac0e6d5339e2"],[420,"6cda59da62a54e53f4412eb37ede5f9069cd4a38"],[430,"936896370c29052c4d7308cdee0482f965f638f1"],[440,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[450,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[460,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[470,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[480,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[490,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[500,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[510,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[520,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[530,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[540,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[550,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[560,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[570,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[580,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[590,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[600,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[610,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[620,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[630,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[640,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[650,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[660,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[670,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"92b7d703db08b980e107a364666cca1929165b8c"],[710,"5117624156ea4de81605adbd552cd1dd21a9ce12"],[720,"b606e0a8f25e951ec900550948393fcc7624b36e"],[730,"8504922b2bc5a9040f42a341882272555e8699ee"],[740,"ded28c56212cc2d08976fb48127f1312bead4661"],[750,"194f4830c6b256dbb7c7719c7563473db678158a"],[760,"f56021b847f3b567f0af5632b429bd4cbfcb17f5"],[770,"a2112ba1401b86fcd4bfd7b00c7d73e023adb366"],[780,"f45803d94670fa4e3020d53eb8a9ff740669e48d"],[790,"0ec516319249a992c2f35d762bbb5da4d2da5be4"],[800,"00efdf1eda323da5943f325cd6ed9fb16783c2ad"],[810,"fe82d42ad21e0685f0867df0b34a46b8ae552e48"],[820,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[830,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[840,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[850,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[860,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[870,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[880,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[890,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[900,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[910,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[920,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[930,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[940,"e10f642259f2906bb39ae07fcb4b5a36eae18287"],[950,"af2a3131b550b44c268f6eca17ef32635c6e2fec"],[960,"d9680eb8cLine truncated
{"core":{"build_command":"make -f Makefile.libretro -j6 platform=unix on git archive (isolation: bwrap)","commit":"35dabb85ff3af6825820f54090d344945f65d24e","compiler":["GCC: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0"],"file":"pcsx1_libretro.so","library_name":"PCSX1","library_version":"r22","repo":"https://github.com/libretro/pcsx1-libretro","sha256":"2d6b63b537f4147fec585dcd14dc9d022d75608216569438f7c9ed7b9e8bce11"},"emulator":"pcsx1","flags":["default: repetition 1 disagrees with repetition 0 on state_sha1","default: repetition 2 disagrees with repetition 0 on state_sha1","default: repetition 3 disagrees with repetition 0 on state_sha1","default: repetition 4 disagrees with repetition 0 on state_sha1","load average reached 3.48 (threshold 3.0)"],"frontend":{"commit":"f5e98bfda60052f8a5e3249b6b5a6a4c6983248d","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[3.48,3.2,3.18],"load_before":[1.38,2.83,3.06],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-451fadc750e0","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:23:25+00:00","subject":"bench-pcsx1-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":789.2269047309904,"mean":766.0268207419689,"median":783.6421325691891,"min":716.8835757587194,"raw":[785.7487831642285,789.2269047309904,783.6421325691891,716.8835757587194,754.6327074867173],"stdev":30.750541678196715},"ms_per_frame":{"max":1.3949266433418315,"mean":1.3071802872258964,"median":1.276092693895205,"min":1.2670627344373822,"raw":[1.2726713950137816,1.2670627344373822,1.276092693895205,1.3949266433418315,1.3251479694412813],"stdev":0.0542885364472984}},"variants":[{"flags":["repetition 1 disagrees with repetition 0 on state_sha1","repetition 2 disagrees with repetition 0 on state_sha1","repetition 3 disagrees with repetition 0 on state_sha1","repetition 4 disagrees with repetition 0 on state_sha1"],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"8":1},"files_opened":null,"files_probed_absent":null,"fps":785.7487831642285,"fps_nominal":60.0,"frames":1800,"input_pressed":0,"input_queries":76800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX1","library_version":"r22","loaded":true,"logs":[],"ms_per_frame":1.2726713950137816,"observables":{"audio_sha1":"1a6555e50f83e52783356a5e7f2d49ab4ac31ba2","frame_sha1":"1c47205c0383c6e66c872e7c571e35001910e53e","state_sha1":"e2208e13055e037a9c58dce85cc8949bLine truncated
+7
View File
@@ -0,0 +1,7 @@
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"pcsx_rearmed_libretro.so","library_name":"PCSX-ReARMed","library_version":"r26 c881679","repo":"https://github.com/libretro/pcsx_rearmed","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","flags":[],"frontend":{"commit":"34963a732f169b0c8ec7d387c742ec367169025e","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[1.86,2.45,3.28],"load_before":[1.76,2.44,3.28],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-cb5ace8c42f9","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T11:06:13+00:00","subject":"files-pcsx-rearmed-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"35":1,"36":1,"37":3,"40":3603,"45":1,"51":1,"57":1,"59":1,"62":1,"63":1,"69":1,"8":1},"files_opened":[{"path":"scph5500.bin","sha1_after":"b05def971d8ec59f346f2d9ac21fb742e3eb6917","sha1_staged":"b05def971d8ec59f346f2d9ac21fb742e3eb6917"},{"path":"scph5501.bin","sha1_after":"0555c6fae8906f3f09baf5988f00e55f88e9f30b","sha1_staged":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"},{"path":"scph5502.bin","sha1_after":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0","sha1_staged":"f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0"}],"files_probed_absent":[],"fps":2902.6046677529957,"fps_nominal":60.0,"frames":3600,"input_pressed":0,"input_queries":460800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX-ReARMed","library_version":"r26 c881679","loaded":true,"logs":[{"frame":0,"level":"info","text":"Starting PCSX-ReARMed r26l-119-gc881679 (cc 9.4.0 64bit pic ssse3 lightrec gpu=neon)"},{"frame":0,"level":"info","text":"build time: Oct 25 2026 06:43:00"},{"frame":0,"level":"info","text":"12 cpu core(s) detected"},{"frame":0,"level":"info","text":"found JP BIOS file, crc32 ff3eeb8c: <system>/scph5500.bin"},{"frame":0,"level":"info","text":"found US BIOS file, crc32 8d8cb7e4: <system>/scph5501.bin"},{"frame":0,"level":"info","text":"found EU BIOS file, crc32 d786f0b9: <system>/scph5502.bin"},{"frame":0,"level":"info","text":"Using PIXEL_FORMAT 2"},{"frame":0,"level":"info","text":"cdrom precache: 12 buffers"},{"frame":0,"level":"info","text":"Line truncated
{"check":{"claim":"pcsx_rearmed reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[130,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[140,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[240,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[250,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[260,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[270,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[280,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[290,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[300,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[360,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[370,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[380,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[390,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[400,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[410,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[420,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[430,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[440,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[450,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[460,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[470,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[480,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[490,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[500,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[510,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[520,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[530,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[540,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[550,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[560,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[570,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[580,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[590,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[600,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[610,"db0161770eb1bac93d8e73be8b494e2239416c92"],[620,"8c8dc030b6e61b982022c5361313d4da5216534f"],[630,"70ee1119e670675f0dd5d2c289f8a9e1568f18a2"],[640,"48ba21b6f1435b76388ef77b97ad63904107c3c3"],[650,"50a116cc0623c4fdb360f11bb2bd3bc5631cd7a4"],[660,"cef9baa991efb00402b2ab14059b1671fc54a70b"],[670,"aa88629f7654142ee3625e7fcc1db7106a531e98"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[710,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[720,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[730,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[740,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[750,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[760,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[770,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[780,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[790,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[800,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[810,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[820,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[830,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[840,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[850,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[860,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[870,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[880,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[890,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[900,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[910,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[920,"dd6dac23da6b8f4f256b8090568c52eLine truncated
{"check":{"claim":"pcsx_rearmed opens scph1001.bin as scph1001.bin","method":"scph1001.bin staged as scph1001.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[130,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[140,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[240,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[250,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[260,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[270,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[280,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[290,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[300,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[360,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[370,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[380,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[390,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[400,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[410,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[420,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[430,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[440,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[450,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[460,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[470,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[480,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[490,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[500,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[510,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[520,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[530,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[540,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[550,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[560,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[570,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[580,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[590,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[600,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[610,"db0161770eb1bac93d8e73be8b494e2239416c92"],[620,"8c8dc030b6e61b982022c5361313d4da5216534f"],[630,"70ee1119e670675f0dd5d2c289f8a9e1568f18a2"],[640,"48ba21b6f1435b76388ef77b97ad63904107c3c3"],[650,"50a116cc0623c4fdb360f11bb2bd3bc5631cd7a4"],[660,"cef9baa991efb00402b2ab14059b1671fc54a70b"],[670,"aa88629f7654142ee3625e7fcc1db7106a531e98"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[710,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[720,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[730,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[740,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[750,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[760,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[770,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[780,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[790,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[800,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[810,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[820,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[830,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[840,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[850,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[860,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[870,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[880,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[890,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[900,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[910,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[920,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[930,"be902fda82dcbae0fb4e3da05095cdc19a6b8039"],[940,"6ecae7882208c18db87b39ec1ded89d16111b7b2"],[950,"a68e30d61a75ee1cd1ba631707285331bedcaf45"],[960,"48Line truncated
{"check":{"claim":"pcsx_rearmed opens scph101.bin as scph101.bin","method":"scph101.bin staged as scph101.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[130,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[140,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[240,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[250,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[260,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[270,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[280,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[290,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[300,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[360,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[370,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[380,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[390,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[400,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[410,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[420,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[430,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[440,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[450,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[460,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[470,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[480,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[490,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[500,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[510,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[520,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[530,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[540,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[550,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[560,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[570,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[580,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[590,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[600,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[610,"db0161770eb1bac93d8e73be8b494e2239416c92"],[620,"8c8dc030b6e61b982022c5361313d4da5216534f"],[630,"70ee1119e670675f0dd5d2c289f8a9e1568f18a2"],[640,"48ba21b6f1435b76388ef77b97ad63904107c3c3"],[650,"50a116cc0623c4fdb360f11bb2bd3bc5631cd7a4"],[660,"cef9baa991efb00402b2ab14059b1671fc54a70b"],[670,"aa88629f7654142ee3625e7fcc1db7106a531e98"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[710,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[720,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[730,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[740,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[750,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[760,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[770,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[780,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[790,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[800,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[810,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[820,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[830,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[840,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[850,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[860,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[870,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[880,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[890,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[900,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[910,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[920,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[930,"be902fda82dcbae0fb4e3da05095cdc19a6b8039"],[940,"6ecae7882208c18db87b39ec1ded89d16111b7b2"],[950,"a68e30d61a75ee1cd1ba631707285331bedcaf45"],[960,"48ba21Line truncated
{"check":{"claim":"the copies of scph5502.bin change what pcsx_rearmed shows on Bust-A-Move 2 - Arcade Edition (USA)","method":"Each copy the collection holds staged as scph5502.bin, each run 2 times for 3600 frames, compared on the sampled frame hashes.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[10,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[20,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[30,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[40,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[50,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[60,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[70,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[80,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[90,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[100,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[110,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[120,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[130,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[140,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[150,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[160,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[170,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[180,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[190,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[200,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[210,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[220,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[230,"7c0a301f6dbdeef5bb7ec89400676ba8f819dcab"],[240,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[250,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[260,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[270,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[280,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[290,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[300,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[310,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[320,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[330,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[340,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[350,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[360,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[370,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[380,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[390,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[400,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[410,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[420,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[430,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[440,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[450,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[460,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[470,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[480,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[490,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[500,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[510,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[520,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[530,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[540,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[550,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[560,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[570,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[580,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[590,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[600,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[610,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[620,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[630,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[640,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[650,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[660,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[670,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[680,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[690,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[700,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[710,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[720,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[730,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[740,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[750,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[760,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[770,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[780,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[790,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[800,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[810,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[820,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[830,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[840,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[850,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[860,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[870,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[880,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[890,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[900,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[910,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[920,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[930,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[940,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[950,"490761d0df7cbf87a09cc167fd710c728a4Line truncated
{"check":{"claim":"pcsx_rearmed opens scph7001.bin as scph7001.bin","method":"scph7001.bin staged as scph7001.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[10,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[20,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[30,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[40,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[50,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[60,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[70,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[80,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[90,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[100,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[110,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[120,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[130,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[140,"36a81577bede5aabaade574c2cb212c2dd0e0071"],[150,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[160,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[170,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[180,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[190,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[200,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[210,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[220,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[230,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[240,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[250,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[260,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[270,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[280,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[290,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[300,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[310,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[320,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[330,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[340,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[350,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[360,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[370,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[380,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[390,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[400,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[410,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[420,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[430,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[440,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[450,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[460,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[470,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[480,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[490,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[500,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[510,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[520,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[530,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[540,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[550,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[560,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[570,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[580,"490761d0df7cbf87a09cc167fd710c728a46cb6f"],[590,"ca7614edfc54ec085049b365dd01e65f59502b7f"],[600,"35a8774a83d48a2892e1f1ce256542f870df77b1"],[610,"db0161770eb1bac93d8e73be8b494e2239416c92"],[620,"8c8dc030b6e61b982022c5361313d4da5216534f"],[630,"70ee1119e670675f0dd5d2c289f8a9e1568f18a2"],[640,"48ba21b6f1435b76388ef77b97ad63904107c3c3"],[650,"50a116cc0623c4fdb360f11bb2bd3bc5631cd7a4"],[660,"cef9baa991efb00402b2ab14059b1671fc54a70b"],[670,"aa88629f7654142ee3625e7fcc1db7106a531e98"],[680,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[690,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[700,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[710,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[720,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[730,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[740,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[750,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[760,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[770,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[780,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[790,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[800,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[810,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[820,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[830,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[840,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[850,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[860,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[870,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[880,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[890,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[900,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[910,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[920,"dd6dac23da6b8f4f256b8090568c52e8f8428425"],[930,"be902fda82dcbae0fb4e3da05095cdc19a6b8039"],[940,"6ecae7882208c18db87b39ec1ded89d16111b7b2"],[950,"a68e30d61a75ee1cd1ba631707285331bedcaf45"],[960,"48Line truncated
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/pcsx_rearmed_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"pcsx_rearmed_libretro.so","library_name":"PCSX-ReARMed","library_version":"r26 c881679","repo":"https://github.com/libretro/pcsx_rearmed","sha256":"bfda3f667f8ea8c2f5cc939b970628174b6f491ad32d7f6b143728322df46af6"},"emulator":"pcsx_rearmed","flags":[],"frontend":{"commit":"fdcf120a7d584f07ba3fbbc8feea507c8ac368ca","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[2.54,2.58,3.23],"load_before":[2.59,2.59,3.24],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-2138f64f1283","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:08:02+00:00","subject":"bench-pcsx-rearmed-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":4331.721103675818,"mean":4267.333877918455,"median":4305.257242302731,"min":4141.151213176667,"raw":[4247.565194060011,4305.257242302731,4310.974636377049,4141.151213176667,4331.721103675818],"stdev":77.13831400255525},"ms_per_frame":{"max":0.24147874552808288,"mean":0.2344006248814468,"median":0.23227415778415483,"min":0.23085512110911724,"raw":[0.23542899386181185,0.23227415778415483,0.23196610612406707,0.24147874552808288,0.23085512110911724],"stdev":0.0043062941011853565}},"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"23":1,"35":1,"36":1,"37":3,"40":2403,"45":1,"51":1,"57":1,"59":1,"62":1,"63":1,"69":1,"8":1},"files_opened":null,"files_probed_absent":null,"fps":4247.565194060011,"fps_nominal":60.0,"frames":1800,"input_pressed":0,"input_queries":307200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"PCSX-ReARMed","library_version":"r26 c881679","loaded":true,"logs":[{"frame":0,"level":"info","text":"Starting PCSX-ReARMed r26l-119-gc881679 (cc 9.4.0 64bit pic ssse3 lightrec gpu=neon)"},{"frame":0,"level":"info","text":"build time: Oct 25 2026 06:43:00"},{"frame":0,"level":"info","text":"12 cpu core(s) detected"},{"frame":0,"level":"info","text":"found US BIOS file, crc32 8d8cb7e4: <system>/scph5501.bin"},{"frame":0,"level":"info","text":"Using PIXEL_FORMAT 2"},{"frame":0,"level":"info","text":"cdrom precache: 12 buffers"},{"frame":0,"level":"info","text":"plugin: /builtin_gpu"},{"frame":0,"level":"info","text":"plugin: /builtin_spu"},{"frame":0,"level":"info","text":"PlugiLine truncated
+5
View File
@@ -0,0 +1,5 @@
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"swanstation_libretro.so","library_name":"SwanStation","library_version":"1.0.0 631f0fb","repo":"https://github.com/libretro/swanstation","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","flags":[],"frontend":{"commit":"fdcf120a7d584f07ba3fbbc8feea507c8ac368ca","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[2.5,2.57,3.22],"load_before":[2.54,2.58,3.23],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-15fc06931bec","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":10,"frames":3600,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1","frame_hashes","uniform_frames"],"options":{},"presses":[],"repetitions":1,"warmup":0},"kind":"run","record_version":3,"recorded_at":"2026-10-27T11:08:04+00:00","subject":"files-swanstation-bust-a-move-2-arcade-edition-usa","supersedes":null,"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"14":15,"23":1,"35":1,"40":3206,"45":3,"47":3600,"51":1,"55":190,"56":1,"57":1,"59":1,"69":1},"files_opened":[{"path":"scph5501.bin","sha1_after":"0555c6fae8906f3f09baf5988f00e55f88e9f30b","sha1_staged":"0555c6fae8906f3f09baf5988f00e55f88e9f30b"}],"files_probed_absent":[],"fps":1542.1811099501474,"fps_nominal":59.81733322143555,"frames":3600,"input_pressed":0,"input_queries":100800,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"SwanStation","library_version":"1.0.0 631f0fb","loaded":true,"logs":[{"frame":0,"level":"warn","text":"[InitDiskControlInterface] Failed to set disk control interface"},{"frame":0,"level":"info","text":"[System] Loading CD image '<content>/Bust-A-Move 2 - Arcade Edition (USA).cue'..."},{"frame":0,"level":"info","text":"[System] Auto-detected console NTSC-U region for '<content>/Bust-A-Move 2 - Arcade Edition (USA).cue' (region NTSC-U)"},{"frame":0,"level":"info","text":"[System] Console Region: NTSC-U/C (US, Canada)"},{"frame":0,"level":"info","text":"[Common::MemoryArena] File mapping name: swanstation_5_0x7bc84dadfc00"},{"frame":0,"level":"info","text":"[CDROMAsyncReader] Read thread started with readahead of 8 sectors"},{"frame":0,"level":"info","text":"[HostInterface] Renderer = OpenGL"},{"frame":0,"level":"info","text":"[HostInterface] Requesting hardware renderer context for OpenGL"},{"frame":0,"level":"error","text":"[RequestHardwareRendererContext] Failed to set any GL HW renderer"},{"frame":1172,Line truncated
{"check":{"claim":"swanstation reaches the game on Bust-A-Move 2 - Arcade Edition (USA) without scph5501.bin","method":"Two variants, scph5501.bin absent and scph5501.bin as the collection holds it, each run 2 times from a fresh process for 3600 frames with no button pressed. Every 10th frame is hashed. The runs without the file are compared with the runs with it on the frames that are not one colour.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"da39a3ee5e6b4b0d3255bfef95601890afd80709"],[10,"33ef0e3028294489c17de8b4dde3048383549dc2"],[20,"e66c21611814a83a8d91f8e1ae83ec2679781373"],[30,"072c5eab08091f3e27874d1a1614a6b66e973787"],[40,"b064548a1ae30980944621fd61e74860b7c2e97e"],[50,"c92e7214dcfea5264ab03e6447c530f443168420"],[60,"769bb96721746fe88b295346a9dc75dd996c8329"],[70,"f369597de01ed10be074b57cd6769caa6707cd94"],[80,"fac01ee8c2c421edf7a4cccfea93da716bea3d88"],[90,"10ee5fea0c82672a6e7e6ecb1e86371bbd34f607"],[100,"2c2abdf70f5c6a906b5e75c59509626bff954934"],[110,"fbf632b4e81fa0ddcaa53b8d59fdf3260d374554"],[120,"3c9be08da1d7853da09cb8bd79708dadfbe35acc"],[130,"e664af3c889e73aa501f7671a54054650d2b6b61"],[140,"9b54f2de7fb75e75846f250bd7abb748de1a477e"],[150,"e50a85fea5654599409f196d1cc0b825cf950fcb"],[160,"7c4bc077108563c81593c4f0c126d94ee5d67364"],[170,"f984202c04722fc8668f374a62cfb7c4d2023c08"],[180,"4a32e1f3e836b0dbb54c267a9e9710814d7a93d2"],[190,"25f248219d0d139236776b725daad917fa6178f7"],[200,"bf0c472bf3d7a9bcb435d821e05ac0037373af8f"],[210,"9c6be0c9b8fac287778dbc2b45df4d132d50b359"],[220,"84a7829a4078ea142f5004681a8cd8ba0f64f772"],[230,"4010d3f53696560c8b1577e168fd8bcd01f89056"],[240,"7046e2f6bda4b360485722ade2c8c94824685540"],[250,"12c3f670812a586f983758491fce0ce1968e4523"],[260,"12c3f670812a586f983758491fce0ce1968e4523"],[270,"12c3f670812a586f983758491fce0ce1968e4523"],[280,"12c3f670812a586f983758491fce0ce1968e4523"],[290,"12c3f670812a586f983758491fce0ce1968e4523"],[300,"12c3f670812a586f983758491fce0ce1968e4523"],[310,"12c3f670812a586f983758491fce0ce1968e4523"],[320,"12c3f670812a586f983758491fce0ce1968e4523"],[330,"12c3f670812a586f983758491fce0ce1968e4523"],[340,"12c3f670812a586f983758491fce0ce1968e4523"],[350,"12c3f670812a586f983758491fce0ce1968e4523"],[360,"12c3f670812a586f983758491fce0ce1968e4523"],[370,"12c3f670812a586f983758491fce0ce1968e4523"],[380,"12c3f670812a586f983758491fce0ce1968e4523"],[390,"12c3f670812a586f983758491fce0ce1968e4523"],[400,"12c3f670812a586f983758491fce0ce1968e4523"],[410,"12c3f670812a586f983758491fce0ce1968e4523"],[420,"12c3f670812a586f983758491fce0ce1968e4523"],[430,"12c3f670812a586f983758491fce0ce1968e4523"],[440,"12c3f670812a586f983758491fce0ce1968e4523"],[450,"12c3f670812a586f983758491fce0ce1968e4523"],[460,"12c3f670812a586f983758491fce0ce1968e4523"],[470,"12c3f670812a586f983758491fce0ce1968e4523"],[480,"12c3f670812a586f983758491fce0ce1968e4523"],[490,"12c3f670812a586f983758491fce0ce1968e4523"],[500,"12c3f670812a586f983758491fce0ce1968e4523"],[510,"12c3f670812a586f983758491fce0ce1968e4523"],[520,"12c3f670812a586f983758491fce0ce1968e4523"],[530,"12c3f670812a586f983758491fce0ce1968e4523"],[540,"12c3f670812a586f983758491fce0ce1968e4523"],[550,"12c3f670812a586f983758491fce0ce1968e4523"],[560,"12c3f670812a586f983758491fce0ce1968e4523"],[570,"12c3f670812a586f983758491fce0ce1968e4523"],[580,"12c3f670812a586f983758491fce0ce1968e4523"],[590,"12c3f670812a586f983758491fce0ce1968e4523"],[600,"12c3f670812a586f983758491fce0ce1968e4523"],[610,"12c3f670812a586f983758491fce0ce1968e4523"],[620,"12c3f670812a586f983758491fce0ce1968e4523"],[630,"12c3f670812a586f983758491fce0ce1968e4523"],[640,"12c3f670812a586f983758491fce0ce1968e4523"],[650,"12c3f670812a586f983758491fce0ce1968e4523"],[660,"12c3f670812a586f983758491fce0ce1968e4523"],[670,"12c3f670812a586f983758491fce0ce1968e4523"],[680,"12c3f670812a586f983758491fce0ce1968e4523"],[690,"12c3f670812a586f983758491fce0ce1968e4523"],[700,"12c3f670812a586f983758491fce0ce1968e4523"],[710,"12c3f670812a586f983758491fce0ce1968e4523"],[720,"12c3f670812a586f983758491fce0ce1968e4523"],[730,"12c3f670812a586f983758491fce0ce1968e4523"],[740,"12c3f670812a586f983758491fce0ce1968e4523"],[750,"12c3f670812a586f983758491fce0ce1968e4523"],[760,"12c3f670812a586f983758491fce0ce1968e4523"],[770,"12c3f670812a586f983758491fce0ce1968e4523"],[780,"12c3f670812a586f983758491fce0ce1968e4523"],[790,"12c3f670812a586f983758491fce0ce1968e4523"],[800,"12c3f670812a586f983758491fce0ce1968e4523"],[810,"12c3f670812a586f983758491fce0ce1968e4523"],[820,"12c3f670812a586f983758491fce0ce1968e4523"],[830,"12c3f670812a586f983758491fce0ce1968e4523"],[840,"12c3f670812a586f983758491fce0ce1968e4523"],[850,"12c3f670812a586f983758491fce0ce1968e4523"],[860,"12c3f670812a586f983758491fce0ce1968e4523"],[870,"12c3f670812a586f983758491fce0ce1968e4523"],[880,"12c3f670812a586f983758491fce0ce1968e4523"],[890,"12c3f670812a586f983758491fce0ce1968e4523"],[900,"12c3f670812a586f983758491fce0ce1968e4523"],[910,"12c3f670812a586f983758491fce0ce1968e4523"],[920,"12c3f670812a586f983758491fce0ce1Line truncated
{"check":{"claim":"swanstation opens ps1_rom.bin as ps1_rom.bin","method":"ps1_rom.bin staged as ps1_rom.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"da39a3ee5e6b4b0d3255bfef95601890afd80709"],[10,"33ef0e3028294489c17de8b4dde3048383549dc2"],[20,"e66c21611814a83a8d91f8e1ae83ec2679781373"],[30,"072c5eab08091f3e27874d1a1614a6b66e973787"],[40,"b064548a1ae30980944621fd61e74860b7c2e97e"],[50,"c92e7214dcfea5264ab03e6447c530f443168420"],[60,"769bb96721746fe88b295346a9dc75dd996c8329"],[70,"f369597de01ed10be074b57cd6769caa6707cd94"],[80,"fac01ee8c2c421edf7a4cccfea93da716bea3d88"],[90,"10ee5fea0c82672a6e7e6ecb1e86371bbd34f607"],[100,"2c2abdf70f5c6a906b5e75c59509626bff954934"],[110,"fbf632b4e81fa0ddcaa53b8d59fdf3260d374554"],[120,"3c9be08da1d7853da09cb8bd79708dadfbe35acc"],[130,"e664af3c889e73aa501f7671a54054650d2b6b61"],[140,"9b54f2de7fb75e75846f250bd7abb748de1a477e"],[150,"e50a85fea5654599409f196d1cc0b825cf950fcb"],[160,"7c4bc077108563c81593c4f0c126d94ee5d67364"],[170,"f984202c04722fc8668f374a62cfb7c4d2023c08"],[180,"4a32e1f3e836b0dbb54c267a9e9710814d7a93d2"],[190,"25f248219d0d139236776b725daad917fa6178f7"],[200,"bf0c472bf3d7a9bcb435d821e05ac0037373af8f"],[210,"9c6be0c9b8fac287778dbc2b45df4d132d50b359"],[220,"84a7829a4078ea142f5004681a8cd8ba0f64f772"],[230,"4010d3f53696560c8b1577e168fd8bcd01f89056"],[240,"7046e2f6bda4b360485722ade2c8c94824685540"],[250,"12c3f670812a586f983758491fce0ce1968e4523"],[260,"12c3f670812a586f983758491fce0ce1968e4523"],[270,"12c3f670812a586f983758491fce0ce1968e4523"],[280,"12c3f670812a586f983758491fce0ce1968e4523"],[290,"12c3f670812a586f983758491fce0ce1968e4523"],[300,"12c3f670812a586f983758491fce0ce1968e4523"],[310,"12c3f670812a586f983758491fce0ce1968e4523"],[320,"12c3f670812a586f983758491fce0ce1968e4523"],[330,"12c3f670812a586f983758491fce0ce1968e4523"],[340,"12c3f670812a586f983758491fce0ce1968e4523"],[350,"12c3f670812a586f983758491fce0ce1968e4523"],[360,"12c3f670812a586f983758491fce0ce1968e4523"],[370,"12c3f670812a586f983758491fce0ce1968e4523"],[380,"12c3f670812a586f983758491fce0ce1968e4523"],[390,"12c3f670812a586f983758491fce0ce1968e4523"],[400,"12c3f670812a586f983758491fce0ce1968e4523"],[410,"12c3f670812a586f983758491fce0ce1968e4523"],[420,"12c3f670812a586f983758491fce0ce1968e4523"],[430,"12c3f670812a586f983758491fce0ce1968e4523"],[440,"12c3f670812a586f983758491fce0ce1968e4523"],[450,"12c3f670812a586f983758491fce0ce1968e4523"],[460,"12c3f670812a586f983758491fce0ce1968e4523"],[470,"12c3f670812a586f983758491fce0ce1968e4523"],[480,"12c3f670812a586f983758491fce0ce1968e4523"],[490,"12c3f670812a586f983758491fce0ce1968e4523"],[500,"12c3f670812a586f983758491fce0ce1968e4523"],[510,"12c3f670812a586f983758491fce0ce1968e4523"],[520,"12c3f670812a586f983758491fce0ce1968e4523"],[530,"12c3f670812a586f983758491fce0ce1968e4523"],[540,"12c3f670812a586f983758491fce0ce1968e4523"],[550,"12c3f670812a586f983758491fce0ce1968e4523"],[560,"12c3f670812a586f983758491fce0ce1968e4523"],[570,"12c3f670812a586f983758491fce0ce1968e4523"],[580,"12c3f670812a586f983758491fce0ce1968e4523"],[590,"12c3f670812a586f983758491fce0ce1968e4523"],[600,"12c3f670812a586f983758491fce0ce1968e4523"],[610,"12c3f670812a586f983758491fce0ce1968e4523"],[620,"12c3f670812a586f983758491fce0ce1968e4523"],[630,"12c3f670812a586f983758491fce0ce1968e4523"],[640,"12c3f670812a586f983758491fce0ce1968e4523"],[650,"12c3f670812a586f983758491fce0ce1968e4523"],[660,"12c3f670812a586f983758491fce0ce1968e4523"],[670,"12c3f670812a586f983758491fce0ce1968e4523"],[680,"12c3f670812a586f983758491fce0ce1968e4523"],[690,"12c3f670812a586f983758491fce0ce1968e4523"],[700,"12c3f670812a586f983758491fce0ce1968e4523"],[710,"12c3f670812a586f983758491fce0ce1968e4523"],[720,"12c3f670812a586f983758491fce0ce1968e4523"],[730,"12c3f670812a586f983758491fce0ce1968e4523"],[740,"12c3f670812a586f983758491fce0ce1968e4523"],[750,"12c3f670812a586f983758491fce0ce1968e4523"],[760,"12c3f670812a586f983758491fce0ce1968e4523"],[770,"12c3f670812a586f983758491fce0ce1968e4523"],[780,"12c3f670812a586f983758491fce0ce1968e4523"],[790,"12c3f670812a586f983758491fce0ce1968e4523"],[800,"12c3f670812a586f983758491fce0ce1968e4523"],[810,"12c3f670812a586f983758491fce0ce1968e4523"],[820,"12c3f670812a586f983758491fce0ce1968e4523"],[830,"12c3f670812a586f983758491fce0ce1968e4523"],[840,"12c3f670812a586f983758491fce0ce1968e4523"],[850,"12c3f670812a586f983758491fce0ce1968e4523"],[860,"12c3f670812a586f983758491fce0ce1968e4523"],[870,"12c3f670812a586f983758491fce0ce1968e4523"],[880,"12c3f670812a586f983758491fce0ce1968e4523"],[890,"12c3f670812a586f983758491fce0ce1968e4523"],[900,"12c3f670812a586f983758491fce0ce1968e4523"],[910,"12c3f670812a586f983758491fce0ce1968e4523"],[920,"12c3f670812a586f983758491fce0ce1968e4523"],[930,"12c3f670812a586f983758491fce0ce1968e4523"],[940,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[950,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[960,"e5af1f2Line truncated
{"check":{"claim":"swanstation opens psxonpsp660.bin as psxonpsp660.bin","method":"psxonpsp660.bin staged as psxonpsp660.bin, against nothing there, 3600 frames of Bust-A-Move 2 - Arcade Edition (USA). The files the core opened are read from strace.","observable":"frame_hashes","result":{"groups":[{"value":[[0,"da39a3ee5e6b4b0d3255bfef95601890afd80709"],[10,"33ef0e3028294489c17de8b4dde3048383549dc2"],[20,"e66c21611814a83a8d91f8e1ae83ec2679781373"],[30,"072c5eab08091f3e27874d1a1614a6b66e973787"],[40,"b064548a1ae30980944621fd61e74860b7c2e97e"],[50,"c92e7214dcfea5264ab03e6447c530f443168420"],[60,"769bb96721746fe88b295346a9dc75dd996c8329"],[70,"f369597de01ed10be074b57cd6769caa6707cd94"],[80,"fac01ee8c2c421edf7a4cccfea93da716bea3d88"],[90,"10ee5fea0c82672a6e7e6ecb1e86371bbd34f607"],[100,"2c2abdf70f5c6a906b5e75c59509626bff954934"],[110,"fbf632b4e81fa0ddcaa53b8d59fdf3260d374554"],[120,"3c9be08da1d7853da09cb8bd79708dadfbe35acc"],[130,"e664af3c889e73aa501f7671a54054650d2b6b61"],[140,"9b54f2de7fb75e75846f250bd7abb748de1a477e"],[150,"e50a85fea5654599409f196d1cc0b825cf950fcb"],[160,"7c4bc077108563c81593c4f0c126d94ee5d67364"],[170,"f984202c04722fc8668f374a62cfb7c4d2023c08"],[180,"4a32e1f3e836b0dbb54c267a9e9710814d7a93d2"],[190,"25f248219d0d139236776b725daad917fa6178f7"],[200,"bf0c472bf3d7a9bcb435d821e05ac0037373af8f"],[210,"9c6be0c9b8fac287778dbc2b45df4d132d50b359"],[220,"84a7829a4078ea142f5004681a8cd8ba0f64f772"],[230,"4010d3f53696560c8b1577e168fd8bcd01f89056"],[240,"7046e2f6bda4b360485722ade2c8c94824685540"],[250,"12c3f670812a586f983758491fce0ce1968e4523"],[260,"12c3f670812a586f983758491fce0ce1968e4523"],[270,"12c3f670812a586f983758491fce0ce1968e4523"],[280,"12c3f670812a586f983758491fce0ce1968e4523"],[290,"12c3f670812a586f983758491fce0ce1968e4523"],[300,"12c3f670812a586f983758491fce0ce1968e4523"],[310,"12c3f670812a586f983758491fce0ce1968e4523"],[320,"12c3f670812a586f983758491fce0ce1968e4523"],[330,"12c3f670812a586f983758491fce0ce1968e4523"],[340,"12c3f670812a586f983758491fce0ce1968e4523"],[350,"12c3f670812a586f983758491fce0ce1968e4523"],[360,"12c3f670812a586f983758491fce0ce1968e4523"],[370,"12c3f670812a586f983758491fce0ce1968e4523"],[380,"12c3f670812a586f983758491fce0ce1968e4523"],[390,"12c3f670812a586f983758491fce0ce1968e4523"],[400,"12c3f670812a586f983758491fce0ce1968e4523"],[410,"12c3f670812a586f983758491fce0ce1968e4523"],[420,"12c3f670812a586f983758491fce0ce1968e4523"],[430,"12c3f670812a586f983758491fce0ce1968e4523"],[440,"12c3f670812a586f983758491fce0ce1968e4523"],[450,"12c3f670812a586f983758491fce0ce1968e4523"],[460,"12c3f670812a586f983758491fce0ce1968e4523"],[470,"12c3f670812a586f983758491fce0ce1968e4523"],[480,"12c3f670812a586f983758491fce0ce1968e4523"],[490,"12c3f670812a586f983758491fce0ce1968e4523"],[500,"12c3f670812a586f983758491fce0ce1968e4523"],[510,"12c3f670812a586f983758491fce0ce1968e4523"],[520,"12c3f670812a586f983758491fce0ce1968e4523"],[530,"12c3f670812a586f983758491fce0ce1968e4523"],[540,"12c3f670812a586f983758491fce0ce1968e4523"],[550,"12c3f670812a586f983758491fce0ce1968e4523"],[560,"12c3f670812a586f983758491fce0ce1968e4523"],[570,"12c3f670812a586f983758491fce0ce1968e4523"],[580,"12c3f670812a586f983758491fce0ce1968e4523"],[590,"12c3f670812a586f983758491fce0ce1968e4523"],[600,"12c3f670812a586f983758491fce0ce1968e4523"],[610,"12c3f670812a586f983758491fce0ce1968e4523"],[620,"12c3f670812a586f983758491fce0ce1968e4523"],[630,"12c3f670812a586f983758491fce0ce1968e4523"],[640,"12c3f670812a586f983758491fce0ce1968e4523"],[650,"12c3f670812a586f983758491fce0ce1968e4523"],[660,"12c3f670812a586f983758491fce0ce1968e4523"],[670,"12c3f670812a586f983758491fce0ce1968e4523"],[680,"12c3f670812a586f983758491fce0ce1968e4523"],[690,"12c3f670812a586f983758491fce0ce1968e4523"],[700,"12c3f670812a586f983758491fce0ce1968e4523"],[710,"12c3f670812a586f983758491fce0ce1968e4523"],[720,"12c3f670812a586f983758491fce0ce1968e4523"],[730,"12c3f670812a586f983758491fce0ce1968e4523"],[740,"12c3f670812a586f983758491fce0ce1968e4523"],[750,"12c3f670812a586f983758491fce0ce1968e4523"],[760,"12c3f670812a586f983758491fce0ce1968e4523"],[770,"12c3f670812a586f983758491fce0ce1968e4523"],[780,"12c3f670812a586f983758491fce0ce1968e4523"],[790,"12c3f670812a586f983758491fce0ce1968e4523"],[800,"12c3f670812a586f983758491fce0ce1968e4523"],[810,"12c3f670812a586f983758491fce0ce1968e4523"],[820,"12c3f670812a586f983758491fce0ce1968e4523"],[830,"12c3f670812a586f983758491fce0ce1968e4523"],[840,"12c3f670812a586f983758491fce0ce1968e4523"],[850,"12c3f670812a586f983758491fce0ce1968e4523"],[860,"12c3f670812a586f983758491fce0ce1968e4523"],[870,"12c3f670812a586f983758491fce0ce1968e4523"],[880,"12c3f670812a586f983758491fce0ce1968e4523"],[890,"12c3f670812a586f983758491fce0ce1968e4523"],[900,"12c3f670812a586f983758491fce0ce1968e4523"],[910,"12c3f670812a586f983758491fce0ce1968e4523"],[920,"12c3f670812a586f983758491fce0ce1968e4523"],[930,"12c3f670812a586f983758491fce0ce1968e4523"],[940,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230"],[950,"e5af1f2023d0d729ce7aabf52d8e03f75bb8d230Line truncated
{"core":{"artifact":"https://buildbot.libretro.com/nightly/linux/x86_64/latest/swanstation_libretro.so.zip","build_command":null,"commit":null,"compiler":["GCC: (Ubuntu 9.4.0-1ubuntu1~16.04) 9.4.0"],"file":"swanstation_libretro.so","library_name":"SwanStation","library_version":"1.0.0 631f0fb","repo":"https://github.com/libretro/swanstation","sha256":"fc65bb2d662c3ad762b611a62ac578f78efd260431d3b8c090f0eb40887a77ea"},"emulator":"swanstation","flags":[],"frontend":{"commit":"fdcf120a7d584f07ba3fbbc8feea507c8ac368ca","script":"scripts/core_probe.py","script_modified":false,"script_sha256":"a3182429ef3e86a03d23ae76326cd4d7b33a12fd18d28ce60c7231fe8ba5fe6e"},"host":{"cpu_count":12,"cpu_model":"13th Gen Intel(R) Core(TM) i9-13900K","kernel":"6.18.54.1-microsoft-standard-WSL2","load_after":[2.28,2.51,3.19],"load_before":[2.39,2.53,3.2],"machine":"x86_64","max_load":3.0,"os":"Linux-6.18.54.1-microsoft-standard-WSL2-x86_64-with-glibc2.39","python":"3.12.3"},"id":"2026-10-27-fab739d8fbb6","inputs":{"content":{"label":"Bust-A-Move 2 - Arcade Edition (USA)","sha1":"ed4a437a6f653cc71ad6ac0da68cc85eb093f298","size":1947,"tracks":[{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 01).bin","sha1":"de8ecb522f6fb6091e5a8f7571fa1cfdf1570a46","size":28311024},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 02).bin","sha1":"4d08db14699c9e1006e0fd64580308266bea5d4e","size":1869840},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 03).bin","sha1":"bc9073820c6caab2a1d5cc69238587e6bde475f7","size":13345248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 04).bin","sha1":"e26b0dc47797003b467891f51d8e2084d17f30d7","size":12726672},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 05).bin","sha1":"80a25117805df470e174222daad36861c2db2fd1","size":33958176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 06).bin","sha1":"0a393b4015a63e8d51e3f4e17e09cf0648523561","size":35030688},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 07).bin","sha1":"f007bd4c61f7dc30fa32244f538f35d3cda72420","size":33795888},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 08).bin","sha1":"a001e6a91d13a08b1e8fd94ab211871b9d183117","size":34898976},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 09).bin","sha1":"d1765b989974cd7bf68f16e29e77f76956c84994","size":34219248},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 10).bin","sha1":"79eaef819941ef937534279e6279b0b9624ed32c","size":1691088},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 11).bin","sha1":"95062adcbfe6763522d728e6ba0fe51a2f83df0b","size":25458048},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 12).bin","sha1":"69813fee25b96a9bc68c14ec34291609b8d79d1f","size":10033632},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 13).bin","sha1":"5635907f575c7d71109370fb8c87f4fc006d6711","size":13053600},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 14).bin","sha1":"444f7bc8f28e8972807c555a80f81bc3dbbf4590","size":36016176},{"file":"Bust-A-Move 2 - Arcade Edition (USA) (Track 15).bin","sha1":"bea344b803475b463195df6fd60834069afe246e","size":32163600}]},"env":{},"frame_hash_every":0,"frames":1800,"joypad_ports":2,"observables":["frame_sha1","video_sha1","audio_sha1","state_sha1"],"options":{},"presses":[],"repetitions":5,"warmup":600},"kind":"bench","record_version":3,"recorded_at":"2026-10-27T11:08:32+00:00","subject":"bench-swanstation-bust-a-move-2-arcade-edition-usa","supersedes":null,"timing":{"fps":{"max":2378.8980515207204,"mean":2330.070066463387,"median":2335.1319947212696,"min":2258.6641821703206,"raw":[2351.6114770653353,2326.0446268392902,2258.6641821703206,2378.8980515207204,2335.1319947212696],"stdev":44.69013338817331},"ms_per_frame":{"max":0.44273956610898796,"mean":0.42929965154811117,"median":0.4282413166624287,"min":0.42036269665307674,"raw":[0.4252403127611615,0.42991436555490103,0.44273956610898796,0.42036269665307674,0.4282413166624287],"stdev":0.008343809735773854}},"variants":[{"flags":[],"label":"default","repetitions":[{"env_unanswered":{"11":1,"13":1,"14":15,"23":1,"35":1,"40":2006,"45":3,"47":2400,"51":1,"55":190,"56":1,"57":1,"59":1,"69":1},"files_opened":null,"files_probed_absent":null,"fps":2351.6114770653353,"fps_nominal":59.81733322143555,"frames":1800,"input_pressed":0,"input_queries":67200,"isolation":"bwrap","last_frame_size":[320,240],"library_name":"SwanStation","library_version":"1.0.0 631f0fb","loaded":true,"logs":[{"frame":0,"level":"warn","text":"[InitDiskControlInterface] Failed to set disk control interface"},{"frame":0,"level":"info","text":"[System] Loading CD image '<content>/Bust-A-Move 2 - Arcade Edition (USA).cue'..."},{"frame":0,"level":"info","text":"[System] Auto-detected console NTSC-U region for '<content>/Bust-A-Move 2 - Arcade Edition (USA).cue' (region NTSC-U)"},{"frame":0,"level":"info","text":"[System] Console Region: NTSC-U/C (US, Canada)"},{"frame":0,"level":"info","text":"[Common::MemoryArena] File mapping name: swanstation_2_0x7e39e7cdfc00"},{"frame":0,"level":"info","text":"[CDROMAsLine truncated
+53
View File
@@ -0,0 +1,53 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://abdess.github.io/retrobios/api/v1/schemas/campaign-finding.schema.json",
"title": "RetroBIOS campaign finding",
"description": "One line of measurements/findings.jsonl: what a real-condition run showed about one field of one profile entry, the rule that settled it or the reason it waits for review, and the records that show it. Lines are appended, never rewritten: the latest line of a key is its state.",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "id", "found_at", "key", "emulator", "system", "file", "field",
"status", "rule", "profile_says", "run_shows", "statement", "evidence", "core", "content"],
"properties": {
"schema_version": { "const": 1 },
"id": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$",
"description": "Date and the first 12 hex digits of the sha256 of the line without its id, in canonical JSON."
},
"found_at": { "type": "string", "format": "date-time" },
"key": {
"type": "string",
"minLength": 1,
"description": "emulator/system/file/field: the lines of one key are the history of one claim."
},
"emulator": { "type": "string", "pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$" },
"system": { "type": "string", "minLength": 1 },
"file": { "type": "string", "minLength": 1 },
"field": { "type": "string", "minLength": 1 },
"status": {
"enum": ["applied", "open", "flagged", "resolved"],
"description": "applied: the rule table settled the field and the profile was changed. open: no rule settles it, it waits for review. flagged: a declared file the runs never opened. resolved: a later run found the profile in agreement."
},
"rule": { "type": "string", "minLength": 1 },
"profile_says": {},
"run_shows": {},
"statement": { "type": "string", "minLength": 1 },
"evidence": {
"type": "array",
"minItems": 1,
"items": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$" },
"description": "Ids of the records in measurements/<emulator>.jsonl that show it."
},
"core": {
"type": "object",
"additionalProperties": false,
"required": ["file", "sha256", "library_version"],
"properties": {
"file": { "type": "string", "minLength": 1 },
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"library_version": { "type": ["string", "null"] }
}
},
"content": { "type": ["string", "null"] }
}
}
+58
View File
@@ -0,0 +1,58 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://abdess.github.io/retrobios/api/v1/schemas/campaign-run.schema.json",
"title": "RetroBIOS campaign run",
"description": "One line of measurements/campaign-runs.jsonl: one pass of scripts/campaign.py, what it left done, failed and pending, and the records and findings it added. Lines are appended, never rewritten.",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "id", "started_at", "ended_at", "result", "detail", "counts",
"pending_reasons", "failed", "records", "findings"],
"properties": {
"schema_version": { "const": 1 },
"id": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$" },
"started_at": { "type": "string", "format": "date-time" },
"ended_at": { "type": "string", "format": "date-time" },
"result": {
"enum": ["complete", "budget", "paused", "stopped", "refused"],
"description": "complete: nothing runnable was left. budget: the time budget ended the pass. paused: a busy host or a full disk ended it, the next pass resumes. stopped: interrupted. refused: no sandbox for third-party code, nothing ran."
},
"detail": { "type": "string" },
"counts": {
"type": "object",
"additionalProperties": false,
"required": ["done", "failed", "pending"],
"properties": {
"done": { "type": "integer", "minimum": 0 },
"failed": { "type": "integer", "minimum": 0 },
"pending": { "type": "integer", "minimum": 0 }
}
},
"pending_reasons": {
"type": "object",
"additionalProperties": { "type": "integer", "minimum": 1 },
"description": "Pending checks counted by reason."
},
"failed": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["emulator", "check", "reason"],
"properties": {
"emulator": { "type": "string" },
"check": { "type": "string" },
"reason": { "type": "string" }
}
}
},
"records": {
"type": "array",
"items": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$" }
},
"findings": {
"type": "object",
"additionalProperties": { "type": "integer", "minimum": 0 },
"description": "Finding lines added by this pass, counted by status."
}
}
}
+9
View File
@@ -125,6 +125,11 @@
"string",
"null"
]
},
"artifact": {
"type": "string",
"format": "uri",
"description": "Where the .so was downloaded from, such as a libretro buildbot nightly. Absent for a core built locally."
}
}
},
@@ -681,6 +686,10 @@
"tracing": {
"type": "string"
},
"isolation": {
"type": "string",
"description": "How the core ran: `bwrap` (read-only tree, no network, the user's credentials masked, an empty environment beside the --env values) or `environment only: ...` with the reason bubblewrap was not used."
},
"input_queries": {
"type": "integer",
"minimum": 0
+12
View File
@@ -478,6 +478,18 @@
"hle_fallback": {
"type": "boolean"
},
"evidence": {
"description": "Real-condition runs that settled a field of this entry, by field: the ids of the core probe records in measurements/<emulator>.jsonl. Written by scripts/campaign.py when its rule table settles the field.",
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"properties": {
"required": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
"hle_fallback": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
"path": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}},
"aliases": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[0-9a-f]{12}$"}}
}
},
"adler32_byteswap": {
"type": "boolean"
},
+112 -18
View File
@@ -53,6 +53,7 @@ JOBS_FILE = REPO_ROOT / "automation" / "jobs.yml"
AUTORUN_DIR = Path(".cache") / "autorun"
DEFAULT_LOCK = Path.home() / ".local" / "state" / "retrobios" / "auto.lock"
LOCK_ENV = "RETROBIOS_AUTO_LOCK"
LOCK_HELD_ENV = "RETROBIOS_AUTO_LOCK_HELD"
BRANCH = "autorun"
REMOTE = "origin"
@@ -99,6 +100,10 @@ class Step:
argv: tuple[str, ...]
ok_codes: tuple[int, ...] = (0,)
stdout: str = ""
# Variables passed through beside the allowlist (romfetch's settings).
env: tuple[str, ...] = ()
# GITHUB_TOKEN for a first-party script that calls the GitHub API.
github_token: bool = False
@dataclass(frozen=True)
@@ -191,17 +196,61 @@ def check_subject(subject: str, body: str = "") -> list[str]:
return problems(f"{subject}\n\n{body}" if body else subject)
def _step(raw: object, where: str) -> Step:
# The first-party scripts that call the GitHub API and may receive
# GITHUB_TOKEN: run as `python <script>` or `python -m <module>`, and tracked
# by git in this repository. Nothing else ever gets it, third-party code least.
TOKEN_SCRIPTS = ("scripts/check_freshness.py", "scripts/refresh_stale.py")
TOKEN_MODULE_PREFIX = "scripts.scraper."
NO_TOKEN_JOBS = frozenset({"campaign"})
def tracked(path: str, repo: Path = REPO_ROOT) -> bool:
proc = subprocess.run(["git", "-C", str(repo), "ls-files", "--error-unmatch", "--", path],
capture_output=True, check=False)
return proc.returncode == 0
def token_script(argv: Sequence[str], repo: Path = REPO_ROOT) -> str:
"""The tracked first-party script a step runs, or '' when it runs anything else."""
if len(argv) < 2 or argv[0] != "python":
return ""
if argv[1] in TOKEN_SCRIPTS:
path = argv[1]
elif argv[1] == "-m" and len(argv) > 2 and argv[2].startswith(TOKEN_MODULE_PREFIX) \
and re.fullmatch(r"[a-z0-9_.]+", argv[2]):
path = argv[2].replace(".", "/") + ".py"
else:
return ""
return path if tracked(path, repo) else ""
def _step(raw: object, where: str, job: str = "") -> Step:
if isinstance(raw, list):
return Step(argv=tuple(str(a) for a in raw))
if isinstance(raw, dict) and isinstance(raw.get("run"), list):
unknown = set(raw) - {"run", "ok_codes", "stdout"}
unknown = set(raw) - {"run", "ok_codes", "stdout", "env", "github_token"}
if unknown:
raise ValueError(f"{where}: unknown step key {sorted(unknown)}")
names = tuple(str(n) for n in raw.get("env") or ())
secret = [n for n in names if is_secret(n)]
if secret:
raise ValueError(f"{where}: a step never receives {', '.join(secret)}")
argv = tuple(str(a) for a in raw["run"])
token = raw.get("github_token", False)
if token is not False:
if token is not True:
raise ValueError(f"{where}: github_token is true or absent")
if job in NO_TOKEN_JOBS:
raise ValueError(f"{where}: job {job} never receives GITHUB_TOKEN")
if not token_script(argv):
raise ValueError(f"{where}: github_token only goes to {', '.join(TOKEN_SCRIPTS)} "
f"or python -m {TOKEN_MODULE_PREFIX}*, tracked in this repository")
return Step(
argv=tuple(str(a) for a in raw["run"]),
argv=argv,
ok_codes=tuple(int(c) for c in raw.get("ok_codes", (0,))),
stdout=str(raw.get("stdout") or ""),
env=names,
github_token=token is True,
)
raise ValueError(f"{where}: a step is a command list or a mapping with 'run'")
@@ -236,8 +285,8 @@ def parse_jobs(data: dict) -> dict[str, Job]:
raise ValueError(f"job {name}: a job that commits runs in the worktree")
jobs[name] = Job(
name=name,
steps=tuple(_step(s, f"job {name}") for s in raw.get("steps") or ()),
gate=tuple(_step(s, f"job {name} gate") for s in raw.get("gate") or ()),
steps=tuple(_step(s, f"job {name}", name) for s in raw.get("steps") or ()),
gate=tuple(_step(s, f"job {name} gate", name) for s in raw.get("gate") or ()),
twice=tuple(twice),
commits=tuple(commits),
schedule=str(raw.get("schedule") or ""),
@@ -438,9 +487,10 @@ def twice(
# Git
def git(cwd: Path, *args: str, check: bool = True) -> subprocess.CompletedProcess:
def git(cwd: Path, *args: str, check: bool = True,
env: dict[str, str] | None = None) -> subprocess.CompletedProcess:
proc = subprocess.run(
["git", "-C", str(cwd), *args], capture_output=True, text=True, check=False,
["git", "-C", str(cwd), *args], capture_output=True, text=True, check=False, env=env,
)
if check and proc.returncode != 0:
raise AutorunError(
@@ -565,7 +615,7 @@ def push_batch(worktree: Path, gate_base: str, regate: Callable[[], bool]) -> st
raise AutorunError(BLOCKED, f"rebase onto {upstream} conflicts, batch kept")
if git(worktree, "rev-parse", upstream).stdout.strip() != gate_base and not regate():
raise AutorunError(FAILED, f"gate failed on the batch rebased onto {upstream}")
git(worktree, "push", "--quiet", REMOTE, f"HEAD:{TARGET}")
git(worktree, "push", "--quiet", REMOTE, f"HEAD:{TARGET}", env=token_env())
return git(worktree, "rev-parse", "HEAD").stdout.strip()
@@ -577,6 +627,7 @@ def gh_json(args: list[str]) -> object:
try:
proc = subprocess.run(
["gh", *args], capture_output=True, text=True, timeout=120, check=False,
env=token_env(),
)
except (OSError, subprocess.TimeoutExpired):
return None
@@ -699,14 +750,54 @@ def set_alert(state: dict, name: str, active: bool, detail: str, now: str) -> No
# Running a job
def job_env(job: Job) -> dict[str, str]:
env = os.environ.copy()
env["RETROBIOS_AUTO"] = "1"
if job.network:
sys.path.insert(0, str(REPO_ROOT / "scripts"))
from common import github_token
# What a job step inherits. A step can run third-party code (a buildbot
# core, a scraped page, a downloaded tool), so it gets the variables a
# program needs to run and nothing it could leak: no token, no password.
SAFE_ENV = frozenset({"PATH", "HOME", "LANG", "TZ", "TMPDIR"})
SECRET_NAMES = frozenset({"GITHUB_TOKEN", "GH_TOKEN", "ROMSTATION_USER", "ROMSTATION_PASS"})
SECRET_MARKERS = ("TOKEN", "SECRET", "PASS")
token = github_token()
def is_secret(name: str) -> bool:
upper = name.upper()
return name in SECRET_NAMES or any(marker in upper for marker in SECRET_MARKERS)
def safe_env(names: Sequence[str] = (), add: dict[str, str] | None = None,
source: dict[str, str] | None = None) -> dict[str, str]:
"""The allowlisted environment, plus the variables a step names
explicitly. A secret is dropped even when named."""
source = dict(os.environ) if source is None else source
wanted = set(names)
env = {key: value for key, value in source.items()
if (key in SAFE_ENV or key.startswith("LC_") or key in wanted) and not is_secret(key)}
env.update({key: value for key, value in (add or {}).items() if not is_secret(key)})
return env
def token_env() -> dict[str, str]:
"""The environment of the phases that need GitHub: the push and gh."""
sys.path.insert(0, str(REPO_ROOT / "scripts"))
from common import github_token
env = dict(os.environ)
token = github_token()
if token:
env["GITHUB_TOKEN"] = token
return env
def job_env(job: Job, step: Step | None = None) -> dict[str, str]:
"""A step's environment: the allowlist, the runner's own markers and the
variables the step names. GITHUB_TOKEN only for a step that declares
github_token, which the registry allows on first-party scripts alone."""
add = {"RETROBIOS_AUTO": "1"}
if job.lock:
# A step that takes the host lock itself (campaign.py) runs under ours.
add[LOCK_HELD_ENV] = "1"
env = safe_env(step.env if step else (), add)
if step is not None and step.github_token and job.name not in NO_TOKEN_JOBS:
token = token_env().get("GITHUB_TOKEN")
if token:
env["GITHUB_TOKEN"] = token
return env
@@ -744,7 +835,6 @@ class Runner:
self.cwd = ctx.worktree if job.worktree else ctx.repo
self.log = ctx.home / "logs" / job.name / f"{dt.date.today().isoformat()}.log"
self.deadline = ctx.host.clock() + job.timeout
self.env: dict[str, str] = {}
self.commits: list[str] = []
self.retried: list[str] = []
self.report: object = None
@@ -766,7 +856,7 @@ class Runner:
left = self.deadline - self.ctx.host.clock()
if left <= 0:
return Outcome(124, "job timeout reached")
return execute(argv, self.cwd, self.log, self.env, left, stdout)
return execute(argv, self.cwd, self.log, job_env(self.job, step), left, stdout)
outcome = run_with_retry(once, step.ok_codes, self.wait_idle)
if outcome.retried:
@@ -856,7 +946,6 @@ class Runner:
refresh_breaker(self.state, ctx.gh, now_iso())
if job.commits and self.state.get("breaker", {}).get("open"):
return BLOCKED, "circuit breaker open: a pushed automation commit failed CI"
self.env = job_env(job)
base = ""
if job.worktree:
ensure_worktree(ctx.repo, ctx.worktree)
@@ -940,6 +1029,11 @@ def run_job(ctx: Context, name: str) -> tuple[str, str]:
else previous.get("consecutive_failures", 0) + 1,
}
state["jobs"][name] = record
# A job's report can raise an alert of its own: campaign.py refusing to
# run third-party code outside its sandbox.
alert = runner.report.get("alert") if isinstance(runner.report, dict) else None
if result != DEFERRED:
set_alert(state, f"job:{name}", bool(alert), str(alert or ""), now_iso())
prune_logs(ctx.home / "logs")
save_state(ctx.state_path, state)
return result, detail
+1754
View File
File diff suppressed because it is too large. Load diff
+161
View File
@@ -0,0 +1,161 @@
"""Write a settled field into one entry of a profile, and nothing else.
The profile is edited as text, so its comments, order and quoting stay as
the maintainer wrote them. Every edit is checked by parsing the result: the
edited entry must equal the old one with the new fields, and every other
part of the profile must parse to what it did before. An edit that cannot
hold both is refused (ProfileEditError), never written.
"""
from __future__ import annotations
import json
import re
from pathlib import Path
import yaml
ITEM = re.compile(r"^(?P<indent>\s*)- ")
KEY = re.compile(r"^(?P<indent>\s*)(?P<key>[A-Za-z_][A-Za-z0-9_]*):(?P<rest>.*)$")
# Where a new key goes: after the first of these the entry has, else last.
ANCHORS = {
"required": ("name",),
"hle_fallback": ("required", "name"),
"path": ("name",),
"aliases": ("path", "name"),
}
class ProfileEditError(ValueError):
"""An edit the profile's layout does not allow to make safely."""
def scalar(value: object) -> str:
if isinstance(value, bool):
return "true" if value else "false"
if value is None:
return "null"
if isinstance(value, (int, float)):
return str(value)
if isinstance(value, str):
return json.dumps(value, ensure_ascii=False)
if isinstance(value, list):
return "[" + ", ".join(scalar(v) for v in value) + "]"
raise ProfileEditError(f"no scalar form for {value!r}")
def item_spans(lines: list[str]) -> list[tuple[int, int, int]]:
"""(first line, end line, item indent) of each item of the top-level files: list."""
try:
start = next(i for i, line in enumerate(lines) if line.rstrip() == "files:")
except StopIteration as exc:
raise ProfileEditError("no top-level files: list") from exc
spans: list[tuple[int, int, int]] = []
indent: int | None = None
current: int | None = None
end = len(lines)
for i in range(start + 1, len(lines)):
line = lines[i]
stripped = line.strip()
if not stripped or stripped.startswith("#"):
continue
width = len(line) - len(line.lstrip(" "))
if width == 0 and not line.startswith("-"):
end = i
break
match = ITEM.match(line)
if match and (indent is None or width == indent):
indent = width
if current is not None:
spans.append((current, i, indent))
current = i
if current is not None:
spans.append((current, end, indent or 0))
# An item ends at its last line of content: the comments and blank lines
# before the next item belong to that item.
trimmed = []
for first, stop, width in spans:
last = stop
while last > first + 1 and (not lines[last - 1].strip() or lines[last - 1].strip().startswith("#")):
last -= 1
trimmed.append((first, last, width))
return trimmed
def key_lines(lines: list[str], first: int, stop: int, key_indent: int) -> dict[str, tuple[int, int]]:
"""key -> (line, end line) for each key of one item, its continuation lines included."""
keys: dict[str, tuple[int, int]] = {}
order: list[tuple[str, int]] = []
for i in range(first, stop):
# The item's first line carries the dash where its first key's indent is.
line = " " * key_indent + lines[i][key_indent:] if i == first else lines[i]
match = KEY.match(line)
if match and len(match["indent"]) == key_indent:
order.append((match["key"], i))
for position, (key, line) in enumerate(order):
end = order[position + 1][1] if position + 1 < len(order) else stop
while end > line + 1 and (not lines[end - 1].strip() or lines[end - 1].strip().startswith("#")):
end -= 1
keys[key] = (line, end)
return keys
def _render(key: str, value: object, indent: int, block: bool = False) -> list[str]:
"""One key as lines. A list keeps the block style it was written in."""
pad = " " * indent
if isinstance(value, dict):
return [f"{pad}{key}:"] + [f"{pad} {k}: {scalar(v)}" for k, v in value.items()]
if block and isinstance(value, list):
return [f"{pad}{key}:"] + [f"{pad} - {scalar(v)}" for v in value]
return [f"{pad}{key}: {scalar(value)}"]
def set_fields(text: str, index: int, updates: dict[str, object]) -> str:
"""The profile with these keys of files[index] set, the rest untouched."""
before = yaml.safe_load(text)
entries = before.get("files") or []
if not 0 <= index < len(entries):
raise ProfileEditError(f"no files[{index}]")
lines = text.splitlines()
spans = item_spans(lines)
if len(spans) != len(entries):
raise ProfileEditError(f"{len(spans)} items read as text, {len(entries)} parsed")
first, stop, item_indent = spans[index]
key_indent = item_indent + 2
for key, value in updates.items():
keys = key_lines(lines, first, stop, key_indent)
if key in keys:
start, end = keys[key]
rendered = _render(key, value, key_indent, block=lines[start].rstrip().endswith(":"))
if start == first:
raise ProfileEditError(f"files[{index}]: {key} is the item's first key")
lines[start:end] = rendered
stop += len(rendered) - (end - start)
continue
rendered = _render(key, value, key_indent)
anchor = next((keys[a][1] for a in ANCHORS.get(key, ()) if a in keys), None)
at = anchor if anchor is not None else stop
lines[at:at] = rendered
stop += len(rendered)
out = "\n".join(lines) + ("\n" if text.endswith("\n") else "")
after = yaml.safe_load(out)
expected = {**entries[index], **updates}
if after.get("files", [None] * (index + 1))[index] != expected:
raise ProfileEditError(f"files[{index}]: the edit does not parse to the intended entry")
rest_before = {k: v for k, v in before.items() if k != "files"}
rest_after = {k: v for k, v in after.items() if k != "files"}
others_before = [e for i, e in enumerate(entries) if i != index]
others_after = [e for i, e in enumerate(after.get("files") or []) if i != index]
if rest_before != rest_after or others_before != others_after:
raise ProfileEditError(f"files[{index}]: the edit changes another part of the profile")
return out
def write_fields(path: Path, index: int, updates: dict[str, object]) -> bool:
"""Apply the edit to the file. False when it changes nothing."""
text = path.read_text(encoding="utf-8")
out = set_fields(text, index, updates)
if out == text:
return False
path.write_text(out, encoding="utf-8")
return True
+203
View File
@@ -0,0 +1,203 @@
"""The campaign's fixed rule table: which observable settles which profile field.
Each rule is a pure function of a core probe record (or what was read from
one) and a profile entry. It returns verdicts. A verdict with `apply` set is
settled by the table and written into the profile with the record ids as
`evidence:`. Any other verdict goes to the review queue
(measurements/findings.jsonl).
observable field settled
boots to the game with no file hle_fallback true
no game screen without it, the game with it required true
hle_fallback false
opens the staged file under another path path that path
opens the staged file under another name aliases name added
a staged file the content should use, never read - flagged only
"Boots to the game" is read from the sampled frames: the run without the
file shows at least MIN_SHARED_SCREENS distinct screens that the run with
the file also shows, single-colour frames excluded. "No game screen" is a
run that did not load, or whose every sampled frame is a single colour. A
run that shows screens of its own that the reference never shows settles
nothing.
Standard library only.
"""
from __future__ import annotations
from collections.abc import Iterable, Sequence
from dataclasses import dataclass, field
MIN_SHARED_SCREENS = 2
BOOTS = "boots"
FAILS = "fails"
INCONCLUSIVE = "inconclusive"
# A field an entry leaves out reads as this value.
FIELD_DEFAULTS: dict[str, object] = {"hle_fallback": False, "path": None, "aliases": []}
SETTLED_FIELDS = ("required", "hle_fallback", "path", "aliases")
@dataclass(frozen=True)
class Boot:
"""What the runs without the file showed, against the runs with it."""
status: str
detail: str
shared: int = 0
@dataclass(frozen=True)
class Verdict:
rule: str
field: str
value: object
statement: str
evidence: tuple[str, ...]
apply: bool = False
@dataclass(frozen=True)
class Opened:
"""Where a run found the staged file opened."""
dest: str
record_id: str
extra: dict = field(default_factory=dict)
def screens(repetition: dict) -> set[str]:
"""The distinct sampled frames of a repetition that are not one colour."""
observables = repetition.get("observables") or {}
uniform = set(observables.get("uniform_frames") or ())
return {digest for _, digest in observables.get("frame_hashes") or () if digest not in uniform}
def variant(record: dict, label: str) -> dict:
for item in record.get("variants") or ():
if item.get("label") == label:
return item
raise KeyError(f"record {record.get('id')}: no variant {label!r}")
def boot_outcome(record: dict, absent_label: str, present_label: str) -> Boot:
"""Whether the core reached the game without the file.
Every repetition must agree: one that boots and one that does not leave
the question open.
"""
present = variant(record, present_label)["repetitions"]
if any(not rep.get("loaded") for rep in present):
return Boot(INCONCLUSIVE, "with the file, the core did not load the content")
reference: set[str] = set()
for rep in present:
shown = screens(rep)
if not shown:
return Boot(INCONCLUSIVE, "with the file, the core showed no game screen")
reference |= shown
outcomes: list[str] = []
shared_counts: list[int] = []
for rep in variant(record, absent_label)["repetitions"]:
if not rep.get("loaded"):
outcomes.append(FAILS)
continue
shown = screens(rep)
if not shown:
outcomes.append(FAILS)
continue
shared = len(shown & reference)
shared_counts.append(shared)
outcomes.append(BOOTS if shared >= MIN_SHARED_SCREENS else INCONCLUSIVE)
shared = min(shared_counts) if shared_counts else 0
if all(o == BOOTS for o in outcomes):
return Boot(BOOTS, f"without the file, every run showed {shared} or more screens the "
f"run with the file shows", shared)
if all(o == FAILS for o in outcomes):
return Boot(FAILS, "without the file, no run loaded the content or showed more than "
"one colour, while the run with the file reached the game")
return Boot(INCONCLUSIVE, "without the file, the runs showed screens the run with the file "
"never shows, or disagreed with each other", shared)
def current(entry: dict, name: str) -> object:
if name in entry:
return entry[name]
return FIELD_DEFAULTS.get(name)
def agrees(entry: dict, verdict: Verdict) -> bool:
"""True when the profile already says what the run showed."""
if verdict.field == "aliases":
return set(verdict.value or ()) <= set(entry.get("aliases") or ())
return current(entry, verdict.field) == verdict.value
def rule_bios_need(boot: Boot, entry: dict, record_id: str) -> list[Verdict]:
"""Boot with no file against boot with the declared file."""
name = entry["name"]
evidence = (record_id,)
if boot.status == BOOTS:
out = [Verdict("boots_without_file", "hle_fallback", True,
f"the core reaches the game without {name}: {boot.detail}", evidence, True)]
if entry.get("required") is True:
out.append(Verdict(
"boots_without_file", "required", False,
f"the profile says {name} is required, and the core reaches the game "
f"without it. The table settles hle_fallback from this run, not required",
evidence))
return out
if boot.status == FAILS:
return [
Verdict("fails_without_file", "required", True,
f"the core reaches the game only with {name}: {boot.detail}", evidence, True),
Verdict("fails_without_file", "hle_fallback", False,
f"no stand-in for {name}: {boot.detail}", evidence, True),
]
return [Verdict("inconclusive", "hle_fallback", None,
f"the runs with and without {name} settle nothing: {boot.detail}", evidence)]
def rule_path(entry: dict, declared: str, opened: Opened) -> Verdict | None:
"""The core opened the file at another place under the system directory."""
if opened.dest == declared:
return None
return Verdict("opened_under_other_path", "path", opened.dest,
f"the core opened {entry['name']} as {opened.dest}, the profile declares "
f"{declared}", (opened.record_id,), True)
def rule_alias(entry: dict, opened: Opened) -> Verdict | None:
"""The core opened the file under a name the entry does not declare."""
name = opened.dest.rsplit("/", 1)[-1]
known = [entry["name"], *(entry.get("aliases") or ())]
if name in known:
return None
return Verdict("opened_other_name", "aliases", [*(entry.get("aliases") or ()), name],
f"the core opened {entry['name']} under the name {name}",
(opened.record_id,), True)
def rule_never_opened(entry: dict, record_ids: Sequence[str], content: str) -> Verdict:
return Verdict("never_opened", "opened", False,
f"{entry['name']} was staged and the core never opened it while running "
f"{content}", tuple(record_ids))
def rule_variants(status: str, labels: Iterable[str], entry: dict, record_id: str) -> Verdict | None:
"""Copies of one file that change what the core shows: a pack choice to review."""
if status != "differs":
return None
return Verdict("variant_changes_output", "variants", sorted(labels),
f"the copies of {entry['name']} change what the core shows",
(record_id,))
def merge_evidence(existing: dict | None, verdict: Verdict) -> dict:
"""The entry's evidence: map with the verdict's record ids added under its field."""
out = {key: list(value) for key, value in (existing or {}).items()}
ids = out.setdefault(verdict.field, [])
for rid in verdict.evidence:
if rid not in ids:
ids.append(rid)
return {key: out[key] for key in sorted(out)}
+149 -12
View File
@@ -18,6 +18,7 @@ reproduce it (core build, frontend commit, host, inputs by hash).
from __future__ import annotations
import argparse
import contextlib
import ctypes
import datetime as dt
import hashlib
@@ -26,6 +27,7 @@ import os
import platform
import re
import shutil
import signal
import statistics
import struct
import subprocess
@@ -269,6 +271,14 @@ def render_printf(fmt: bytes, args: Sequence[int]) -> str:
return "".join(out).rstrip("\n")
def uniform_frame(frame: bytes, pixel_bytes: int) -> bool:
"""True for a frame of one colour, an empty one included: a screen that
shows nothing of the game."""
if len(frame) <= pixel_bytes:
return True
return frame == frame[:pixel_bytes] * (len(frame) // pixel_bytes)
def png_bytes(width: int, height: int, rgb: bytes) -> bytes:
def chunk(tag: bytes, body: bytes) -> bytes:
return struct.pack(">I", len(body)) + tag + body + struct.pack(">I", zlib.crc32(tag + body))
@@ -359,6 +369,7 @@ class Frontend:
self.video = hashlib.sha1()
self.audio = hashlib.sha1()
self.frame_hashes: list[list] = []
self.uniform: set[str] = set()
self.logs: list[dict] = []
self.presses: list[tuple[int, int, int]] = [tuple(p) for p in spec["presses"]]
self.unanswered: dict[int, int] = {}
@@ -433,7 +444,10 @@ class Frontend:
self.video.update(struct.pack("<II", *self.last_size) + hashlib.sha1(self.last_frame).digest())
every = self.spec["frame_hash_every"]
if every and self.frame % every == 0:
self.frame_hashes.append([self.frame, hashlib.sha1(self.last_frame).hexdigest()])
digest = hashlib.sha1(self.last_frame).hexdigest()
self.frame_hashes.append([self.frame, digest])
if digest not in self.uniform and uniform_frame(self.last_frame, PIXEL_BYTES[self.pixel_format]):
self.uniform.add(digest)
png_dir = self.spec.get("png_dir")
if png_dir and self.last_frame:
rgb = to_rgb(self.pixel_format, *self.last_size, self.last_frame)
@@ -458,6 +472,9 @@ class Frontend:
def run_worker(spec: dict) -> dict:
"""Load the core in this process and run it. Returns the measured result."""
# Nothing of the host's environment reaches the core: only what --env gave.
os.environ.clear()
os.environ.update(spec["env"])
core = ctypes.CDLL(spec["core"])
front = Frontend(spec)
for name, fn in zip(("retro_set_environment", "retro_set_video_refresh", "retro_set_audio_sample",
@@ -514,6 +531,7 @@ def run_worker(spec: dict) -> dict:
observables[f"state:{name}"] = state_vars.get(name)
if spec["frame_hash_every"]:
observables["frame_hashes"] = front.frame_hashes
observables["uniform_frames"] = sorted(front.uniform)
core.retro_unload_game()
core.retro_deinit()
return {
@@ -584,7 +602,7 @@ def frontend_identity() -> dict:
def core_identity(args: argparse.Namespace) -> dict:
core = Path(args.core)
return {
identity = {
"file": core.name,
"sha256": file_digest(core, "sha256"),
"repo": args.core_repo,
@@ -592,6 +610,9 @@ def core_identity(args: argparse.Namespace) -> dict:
"build_command": args.build_command,
"compiler": elf_comment(core) or None,
}
if args.core_artifact:
identity["artifact"] = args.core_artifact
return identity
# --------------------------------------------------------------------------
@@ -630,6 +651,84 @@ def host_paths_hidden(text: str, places: Sequence[tuple[str, str]]) -> str:
return text
_BWRAP_WORKS: dict[str, bool] = {}
SANDBOX = "bwrap"
# What a core or a build sees of the host, read-only: the system's programs
# and libraries, and the parts of /etc the dynamic loader, fonts, TLS, the
# clock and user lookups read. Nothing else of the tree exists inside.
SANDBOX_SYSTEM = ("/usr", "/lib", "/lib32", "/lib64", "/libx32", "/bin", "/sbin")
SANDBOX_ETC = ("/etc/ld.so.cache", "/etc/ld.so.conf", "/etc/ld.so.conf.d", "/etc/fonts",
"/etc/ssl", "/etc/ca-certificates", "/etc/localtime", "/etc/nsswitch.conf",
"/etc/passwd", "/etc/group", "/etc/alternatives")
def _bwrap_base(bwrap: str, network: bool) -> list[str]:
argv = [bwrap, "--unshare-all", "--die-with-parent", "--new-session"]
if network:
argv.append("--share-net")
for path in SANDBOX_SYSTEM:
if os.path.islink(path):
# usrmerge: /lib -> usr/lib is a link, made again inside.
argv += ["--symlink", os.readlink(path), path]
elif os.path.isdir(path):
argv += ["--ro-bind", path, path]
for path in SANDBOX_ETC:
argv += ["--ro-bind-try", path, path]
argv += ["--ro-bind-try", "/sys/devices/system/cpu", "/sys/devices/system/cpu",
"--proc", "/proc", "--dev", "/dev", "--tmpfs", "/dev/shm", "--tmpfs", "/tmp",
"--tmpfs", "/mnt", "--tmpfs", str(Path.home())]
return argv
def sandbox_argv(writable: Sequence[Path], readonly: Sequence[Path] = (),
network: bool = False) -> tuple[list[str], str]:
"""The bubblewrap prefix a third-party program runs under, and its name.
An allowlist: the system's programs and libraries and a few files of
/etc read-only, an empty home, empty /tmp and /mnt, the `readonly` paths
(the core, the content, the staged system directory) read-only, and only
`writable` writable. Every namespace is unshared, the network too unless
`network` asks for it. Without a working bwrap the returned prefix is
empty and the name says why, so the caller can refuse to run.
"""
bwrap = shutil.which("bwrap")
if not bwrap:
return [], "environment only: bwrap not found"
if bwrap not in _BWRAP_WORKS:
probe_run = subprocess.run(_bwrap_base(bwrap, False) + ["/bin/true"], capture_output=True,
check=False, env={})
_BWRAP_WORKS[bwrap] = probe_run.returncode == 0
if not _BWRAP_WORKS[bwrap]:
return [], "environment only: bwrap cannot create a sandbox here"
argv = _bwrap_base(bwrap, network)
for path in readonly:
resolved = Path(path).resolve()
argv += ["--ro-bind", str(resolved), str(resolved)]
for path in writable:
resolved = Path(path).resolve()
resolved.mkdir(parents=True, exist_ok=True)
argv += ["--bind", str(resolved), str(resolved)]
return argv, SANDBOX
def run_group(command: list[str], timeout: float, env: dict[str, str]) -> subprocess.CompletedProcess:
"""Run the worker in a process group of its own and kill the whole group
when it outlives the timeout. Killing strace alone left a hung core
spinning, detached from anything that would ever stop it."""
with subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
env=env, start_new_session=True) as proc:
try:
out, err = proc.communicate(timeout=timeout)
except BaseException:
with contextlib.suppress(ProcessLookupError):
os.killpg(proc.pid, signal.SIGKILL)
proc.communicate()
raise
return subprocess.CompletedProcess(command, proc.returncode, out, err)
def run_once(args: argparse.Namespace, system_dir: Path, scratch: Path, state_out: Path | None,
png_dir: Path | None) -> dict:
save_dir = scratch / "save"
@@ -648,6 +747,7 @@ def run_once(args: argparse.Namespace, system_dir: Path, scratch: Path, state_ou
"joypad_ports": args.joypad_ports,
"png_dir": str(png_dir) if png_dir else None,
"state_out": str(state_out) if state_out else None,
"env": dict(args.env),
}
spec_path, out_path, trace_path = scratch / "spec.json", scratch / "result.json", scratch / "strace.txt"
spec_path.write_text(json.dumps(spec), encoding="utf-8")
@@ -655,9 +755,16 @@ def run_once(args: argparse.Namespace, system_dir: Path, scratch: Path, state_ou
strace = shutil.which("strace") if not args.no_trace else None
if strace:
command = [strace, "-f", "-qq", "-s", "4096", "-e", "trace=openat,open", "-o", str(trace_path)] + command
env = {**os.environ, **dict(args.env)}
proc = subprocess.run(command, check=False, capture_output=True, text=True,
timeout=args.timeout, env=env)
writable = [scratch] + [p for p in (png_dir, state_out.parent if state_out else None) if p]
readonly = [Path(__file__), Path(args.core), system_dir]
if args.content:
readonly.append(Path(args.content).resolve().parent)
readonly += [Path(value) for _, value in args.env if Path(value).is_absolute() and Path(value).exists()]
prefix, isolation = sandbox_argv(writable, readonly)
if args.require_sandbox and isolation != SANDBOX:
raise ProbeError(f"refused to run the core outside a sandbox: {isolation}")
# The core sees the variables it was given and nothing of the host's.
proc = run_group(prefix + command, args.timeout, dict(args.env))
if proc.returncode != 0 or not out_path.exists():
raise ProbeError(f"worker exited {proc.returncode}: {proc.stderr.strip()[-2000:]}")
result = json.loads(out_path.read_text(encoding="utf-8"))
@@ -681,6 +788,7 @@ def run_once(args: argparse.Namespace, system_dir: Path, scratch: Path, state_ou
if result.get("wall_s") and result.get("frames"):
result["ms_per_frame"] = result["wall_s"] * 1000 / result["frames"]
result["fps"] = result["frames"] / result["wall_s"]
result["isolation"] = isolation
return result
@@ -769,6 +877,8 @@ def build_parser() -> argparse.ArgumentParser:
common.add_argument("--core-repo", help="source repository URL of the core build")
common.add_argument("--core-commit", help="commit the core was built from")
common.add_argument("--build-command", help="command and flags that built the core")
common.add_argument("--core-artifact", metavar="URL",
help="where the .so was downloaded from, such as a buildbot nightly")
common.add_argument("--record", metavar="DIR", nargs="?", const=str(ROOT),
help="append the record as one line of measurements/<emulator>.jsonl "
"in the checkout DIR (default: this one)")
@@ -786,6 +896,8 @@ def build_parser() -> argparse.ArgumentParser:
common.add_argument("--work-dir", default=str(DEFAULT_WORK_DIR), help="scratch directory")
common.add_argument("--timeout", type=int, default=1800, help="seconds per repetition")
common.add_argument("--no-trace", action="store_true", help="do not run the worker under strace")
common.add_argument("--require-sandbox", action="store_true",
help="refuse to run the core unless bubblewrap can isolate it")
sub.add_parser("run", parents=[common], help="one execution")
bench = sub.add_parser("bench", parents=[common], help="timed repetitions")
@@ -806,6 +918,20 @@ def build_parser() -> argparse.ArgumentParser:
return parser
def not_a_checkout_root(directory: Path) -> str | None:
"""Why --record DIR is refused, or None. DIR is the checkout, never its
measurements/ folder: that wrote measurements/measurements/<emulator>.jsonl."""
form = "--record names the root of a git checkout (the folder holding measurements/), e.g. --record ."
if not (directory / ".git").exists():
return f"--record {directory}: not a git checkout root. {form}"
proc = subprocess.run(["git", "-C", str(directory), "rev-parse", "--show-toplevel"],
capture_output=True, text=True, check=False)
top = proc.stdout.strip()
if proc.returncode != 0 or not top or Path(top).resolve() != directory.resolve():
return f"--record {directory}: not a git checkout root (its root is {top or 'unknown'}). {form}"
return None
def validate_args(args: argparse.Namespace) -> list[str]:
problems: list[str] = []
if not Path(args.core).is_file():
@@ -817,9 +943,16 @@ def validate_args(args: argparse.Namespace) -> list[str]:
problems.append(f"--system-file {dest}={src}: not a file")
if args.frames < 1 or args.warmup < 0:
problems.append("--frames must be >= 1 and --warmup >= 0")
if args.require_sandbox:
isolation = sandbox_argv([])[1]
if isolation != SANDBOX:
problems.append(f"--require-sandbox: {isolation}")
if args.png_dir and not args.frame_hash_every:
problems.append("--png-dir needs --frame-hash-every")
if args.record:
wrong = not_a_checkout_root(Path(args.record))
if wrong:
problems.append(wrong)
if not args.emulator and Path(args.core).is_file():
try:
default_emulator(Path(args.core), None)
@@ -841,7 +974,7 @@ def validate_args(args: argparse.Namespace) -> list[str]:
problems.append(f"--vary {dest}={src}: not a file")
names = set(BASE_OBSERVABLES) | {f"state:{v}" for v in args.state_var}
if args.frame_hash_every:
names.add("frame_hashes")
names.update(("frame_hashes", "uniform_frames"))
if args.observable not in names:
problems.append(f"--observable {args.observable}: not one of {', '.join(sorted(names))}")
return problems
@@ -936,8 +1069,9 @@ def default_subject(record: dict) -> str:
return f"{record['kind']}-{slugify(content, 30)}-{digest}"
def write_record(directory: Path, full: dict) -> Path:
"""Append the record, with its id, to its emulator's .jsonl."""
def write_record(directory: Path, full: dict) -> tuple[Path, dict]:
"""Append the record, with its id, to its emulator's .jsonl. Returns the
file and the record as written."""
from measurement_records import line_text, parse_lines, records_path, seal # noqa: PLC0415
sealed = seal(full)
@@ -948,7 +1082,7 @@ def write_record(directory: Path, full: dict) -> Path:
lines.parent.mkdir(parents=True, exist_ok=True)
with lines.open("a", encoding="utf-8") as handle:
handle.write(line_text(sealed) + "\n")
return lines
return lines, sealed
def probe(args: argparse.Namespace) -> int:
@@ -999,7 +1133,7 @@ def probe(args: argparse.Namespace) -> int:
"repetitions": repetitions,
"presses": [{"frame": f, "button": b, "length": n} for f, b, n in args.press],
"observables": list(BASE_OBSERVABLES) + [f"state:{v}" for v in args.state_var]
+ (["frame_hashes"] if args.frame_hash_every else []),
+ (["frame_hashes", "uniform_frames"] if args.frame_hash_every else []),
"frame_hash_every": args.frame_hash_every,
"joypad_ports": args.joypad_ports,
},
@@ -1025,7 +1159,7 @@ def probe(args: argparse.Namespace) -> int:
record["subject"] = args.subject or default_subject(record)
if args.record:
try:
lines = write_record(Path(args.record), record)
lines, record = write_record(Path(args.record), record)
except ProbeError as exc:
print(f"ERROR: {exc}", file=sys.stderr)
return 2
@@ -1050,7 +1184,10 @@ def main(argv: Sequence[str] | None = None) -> int:
if __name__ == "__main__":
# The worker runs under -I, which leaves the script directory off sys.path.
if sys.argv[1:2] == ["_worker"]:
# The worker runs in the sandbox, where this file is all of the
# repository there is: it imports nothing beside the standard library.
sys.exit(main())
sys.path.insert(0, str(Path(__file__).resolve().parent))
from common import run_cli
+43
View File
@@ -81,6 +81,47 @@ def records_path(emulator: str) -> str:
return f"{RECORDS_DIR}/{emulator}.jsonl"
# The campaign's own files beside the records: append-only like them, one
# line per finding or per pass, each line hashed to its id. No profile takes
# these names (tests/test_campaign.py checks it).
FINDINGS = "findings"
CAMPAIGN_RUNS = "campaign-runs"
CAMPAIGN_FILES = {
FINDINGS: ("found_at", "campaign-finding.schema.json"),
CAMPAIGN_RUNS: ("started_at", "campaign-run.schema.json"),
}
def line_id(line: dict, date_key: str) -> str:
body = {key: value for key, value in line.items() if key != "id"}
return f"{line[date_key][:10]}-{sha256_hex(canonical(body))[:12]}"
def seal_line(line: dict, date_key: str) -> dict:
return {**line, "id": line_id(line, date_key)}
def read_campaign(root: Path, name: str) -> list[dict]:
"""The lines of one campaign file, each checked against its id."""
path = root / records_path(name)
if not path.is_file():
return []
date_key = CAMPAIGN_FILES[name][0]
lines = parse_lines(path.read_text(encoding="utf-8"), records_path(name))
problems = []
seen: set[str] = set()
for number, line in enumerate(lines, 1):
rid = str(line.get("id", ""))
if not ID_PATTERN.match(rid) or date_key not in line or line_id(line, date_key) != rid:
problems.append(f"{records_path(name)}:{number}: id {rid!r} does not hash the line")
if rid in seen:
problems.append(f"{records_path(name)}:{number}: id {rid} appears twice")
seen.add(rid)
if problems:
raise MeasurementsError("\n ".join(problems))
return lines
IDENTITY = ("id", "emulator", "subject", "supersedes", "migrated_from_version")
@@ -177,6 +218,8 @@ def read_records(root: Path) -> list[Stored]:
if not path.endswith(".jsonl") or "/" in emulator:
problems.append(f"{path}: {RECORDS_DIR}/ holds <emulator>.jsonl files only")
continue
if emulator in CAMPAIGN_FILES:
continue
seen: set[str] = set()
try:
records = parse_lines(files[path].read_text(encoding="utf-8"), path)
+101
View File
@@ -140,6 +140,105 @@ def build_index(stored: list[mr.Stored], source: dict | None, profiles: dict,
}
def campaign_summary(root: Path, stored: list[mr.Stored], source: dict | None) -> dict:
"""The last campaign pass and the findings still waiting for review.
A finding's history is its lines under one key: the latest line is its
state, and only an open or flagged one is listed.
"""
runs = mr.read_campaign(root, mr.CAMPAIGN_RUNS)
latest: dict[str, dict] = {}
applied = 0
for line in mr.read_campaign(root, mr.FINDINGS):
latest[line["key"]] = line
applied += line["status"] == "applied"
where = {s.record["id"]: s for s in stored}
links = {}
for line in latest.values():
for rid in line["evidence"]:
found = where.get(rid)
if found and source and source.get("commit"):
links[rid] = permalink(source["repo"], source["commit"],
mr.records_path(found.emulator), found.line)
open_items = [{**line, "links": [links.get(rid) for rid in line["evidence"]]}
for _, line in sorted(latest.items()) if line["status"] in ("open", "flagged")]
return {"last_run": runs[-1] if runs else None, "passes": len(runs), "applied": applied,
"open": open_items}
# Characters a campaign value could use to leave its place on the page: HTML
# and MDX syntax ({ } opens an expression), code spans, emphasis and links.
_UNSAFE = {"&": "&amp;", "<": "&lt;", ">": "&gt;", "{": "&#123;", "}": "&#125;", "`": "&#96;",
"[": "&#91;", "]": "&#93;", "*": "&#42;", "_": "&#95;", "\\": "&#92;", "|": "&#124;"}
def _plain(value: object) -> str:
"""Text a run produced (core output, a romfetch error, a profile name),
shown as text: every character that is markup on the page is a
character reference."""
text = " ".join(str(value if value is not None else "").split())
return "".join(_UNSAFE.get(char, char) for char in text)
def _sentence(value: object) -> str:
"""A finding's statement as a sentence of the page: capital first."""
text = _plain(value)
return text[:1].upper() + text[1:]
def _code(value: object) -> str:
"""A value as code that cannot close its element or open an expression."""
return f"<code>{_plain(value)}</code>"
def _value(value: object) -> str:
return _code(json.dumps(value, ensure_ascii=False)) if value is not None else "nothing"
def campaign_section(summary: dict | None) -> list[str]:
"""The campaign's last pass and its open findings, for the explorer page."""
if not summary or not summary.get("last_run"):
return []
last = summary["last_run"]
counts = last["counts"]
lines = [
"## Campaign",
"",
f"Tests run by themselves every night on an idle computer ([how]({METHOD_PAGE})). "
f"Last pass: {_plain(last['ended_at'][:10])}, {_plain(last['result'])}"
+ (f" ({_plain(last['detail'])})" if last.get("detail") else "") + ". "
f"{int(counts['done'])} tests done, {int(counts['failed'])} failed, {int(counts['pending'])} waiting. "
f"{summary['applied']} profile fields were set from a run.",
"",
]
if last["pending_reasons"]:
lines += ["| Waiting for | Tests |", "|-------------|------:|"]
lines += [f"| {_plain(reason)} | {int(number)} |"
for reason, number in sorted(last["pending_reasons"].items(), key=lambda kv: (-kv[1], kv[0]))]
lines.append("")
if last["failed"]:
lines += ["Failed tests:", ""]
lines += [f"- {_plain(item['emulator'])}, {_code(item['check'])}: {_plain(item['reason'])}"
for item in last["failed"]]
lines.append("")
lines += ["### Open findings", ""]
if not summary["open"]:
lines += ["None: every finding was settled by a rule or resolved by a later run.", ""]
return lines
lines += ["A finding is what a run showed that no rule settles. It waits for someone to "
"read the emulator's code.", ""]
for item in summary["open"]:
records = ", ".join(f"[{_plain(rid)}]({link})" if link else _code(rid)
for rid, link in zip(item["evidence"], item["links"]))
lines += [
f"- **{_plain(item['emulator'])}**, {_code(item['file'])}, {_code(item['field'])} "
f"({_plain(item['status'])}): the profile says {_value(item['profile_says'])}, the run "
f"shows {_value(item['run_shows'])}. {_sentence(item['statement'])}. Records: {records}.",
"",
]
return lines
# --------------------------------------------------------------------------
# SQLite
# --------------------------------------------------------------------------
@@ -360,6 +459,7 @@ def build(public: Path, root: Path = ROOT, emulators_dir: Path = ROOT / "emulato
source = {"repo": repo, "commit": commit or (records_commit(root) if stored else None)}
profiles = load_profiles(emulators_dir)
index = build_index(stored, source, profiles, system_names)
index["campaign"] = campaign_summary(root, stored, source)
paths = [public / INDEX_PATH]
(public / INDEX_PATH).parent.mkdir(parents=True, exist_ok=True)
write_if_changed(str(public / INDEX_PATH),
@@ -485,6 +585,7 @@ def generate_explorer_page(index: dict) -> str:
"",
"<MeasurementsExplorer />",
"",
*campaign_section(index.get("campaign")),
])
+5 -1
View File
@@ -601,6 +601,8 @@ def _measurement_errors(root: Path | None = None) -> list[str]:
root = root or ROOT
validator = _validator("core-probe-record.schema.json")
out: list[str] = []
campaign = {mr.records_path(name): _validator(schema)
for name, (_, schema) in mr.CAMPAIGN_FILES.items()}
for path, file in sorted(mr.tree_files(root).items()):
if not path.endswith(".jsonl"):
continue
@@ -610,10 +612,12 @@ def _measurement_errors(root: Path | None = None) -> list[str]:
except json.JSONDecodeError as exc:
out.append(f"{path}:{number}: {exc}")
continue
out.extend(_errors(validator, record, f"{path}:{number}"))
out.extend(_errors(campaign.get(path, validator), record, f"{path}:{number}"))
if not out:
try:
mr.read_records(root)
for name in mr.CAMPAIGN_FILES:
mr.read_campaign(root, name)
except mr.MeasurementsError as exc:
out.append(str(exc))
return out
+42
View File
@@ -0,0 +1,42 @@
# Test content of the real-condition campaign (scripts/campaign.py), per system.
#
# Each entry names a catalog entry, never a file: `name` is the exact Redump or
# No-Intro name romfetch fetches and verifies (`romfetch get <romfetch> <name>`),
# and `reason` says why this game serves the test. Content is read from
# .cache/test-content/<romfetch>/<name>/ with its identity.json, and never
# enters git. A record keeps only its identity (catalog name, sha1, tracks).
#
# region the territory of the disc or cartridge: the BIOS entry the
# boot test varies is the one whose `region:` holds it, or one
# without `region:`
# load the file handed to the core: `cue` (the .cue sheet) or a
# file name inside the folder, by default the single file
# frames frames run per repetition, the same with and without the file
# frame_hash_every frames between two sampled frame hashes
# pinned never deleted by the campaign, whoever fetched it
# boot_file (per system) the declared file the boot test varies, when a
# profile declares it under this name or an alias
#
# The checks a game is used for are the boot test (no file against the
# declared file), the files test (every declared file staged, which ones the
# core opens) and the benchmark.
systems:
sony-playstation:
romfetch: psx
# The file the boot test varies, when the profile declares it: the US
# BIOS of a US disc, the same file for every core so the runs compare.
boot_file: scph5501.bin
content:
- name: "Bust-A-Move 2 - Arcade Edition (USA)"
catalog: redump
reason: >-
A US disc that goes through the BIOS shell and its licence screen, then
reaches the publisher logos and the attract mode within a minute, with
no button pressed. Several static screens, so a run with and a run
without the BIOS can be compared frame by frame.
region: north-america
load: cue
frames: 3600
frame_hash_every: 10
pinned: true
+95
View File
@@ -19,6 +19,7 @@ import time
import unittest
import unittest.mock
from pathlib import Path
from types import MappingProxyType
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
@@ -196,6 +197,100 @@ class Guards(Scratch):
self.assertIsNone(record["last_success"])
class StepEnvironment(Scratch):
"""A step can run third-party code: it never inherits a token or a password."""
HOST = MappingProxyType({
"PATH": "/usr/bin", "HOME": "/home/u", "LANG": "C.UTF-8", "LC_ALL": "C", "TZ": "UTC",
"TMPDIR": "/t", "GITHUB_TOKEN": "t1", "GH_TOKEN": "t2", "ROMSTATION_USER": "u",
"ROMSTATION_PASS": "p", "NPM_TOKEN": "t3", "AWS_SECRET_ACCESS_KEY": "s",
"DB_PASSWORD": "p2", "ROMFETCH_CONTENT_DIR": "/c", "EDITOR": "vi"})
def test_the_allowlist(self):
env = ar.safe_env(["ROMFETCH_CONTENT_DIR", "GITHUB_TOKEN"], {"RETROBIOS_AUTO": "1"},
source=dict(self.HOST))
self.assertEqual(env, {"PATH": "/usr/bin", "HOME": "/home/u", "LANG": "C.UTF-8",
"LC_ALL": "C", "TZ": "UTC", "TMPDIR": "/t",
"ROMFETCH_CONTENT_DIR": "/c", "RETROBIOS_AUTO": "1"})
def test_a_step_naming_a_secret_is_refused_at_load(self):
for name in ("GITHUB_TOKEN", "ROMSTATION_PASS", "MY_SECRET"):
with self.subTest(name=name), self.assertRaises(ValueError):
ar.parse_jobs({"jobs": {"x": {"steps": [{"run": [PY, "-V"], "env": [name]}]}}})
def test_a_network_job_step_sees_no_token(self):
dump = "import json, os; print(json.dumps(dict(os.environ)))"
ctx = self.context({"x": {"worktree": False, "min_free_gb": 0, "network": True,
"steps": [{"run": [PY, "-c", dump], "stdout": "env.json",
"env": ["ROMFETCH_CONTENT_DIR"]}]}})
with unittest.mock.patch.dict(os.environ, {"GITHUB_TOKEN": "t1", "GH_TOKEN": "t2",
"ROMSTATION_PASS": "p",
"ROMFETCH_CONTENT_DIR": "/c", "EDITOR": "vi"}):
self.assertEqual(ar.run_job(ctx, "x")[0], ar.OK)
given = ar.token_env()
seen = json.loads((ctx.repo / "env.json").read_text())
self.assertFalse({"GITHUB_TOKEN", "GH_TOKEN", "ROMSTATION_PASS", "EDITOR"} & set(seen))
self.assertEqual((seen["ROMFETCH_CONTENT_DIR"], seen["RETROBIOS_AUTO"]), ("/c", "1"))
self.assertEqual(seen[ar.LOCK_HELD_ENV], "1")
# The push and gh are the phases that get it.
self.assertEqual(given["GITHUB_TOKEN"], "t1")
class GithubTokenPerStep(Scratch):
"""GITHUB_TOKEN goes to first-party scripts that call the API, declared
per step, and never to third-party code or the campaign."""
def job(self, run: list[str], name: str = "x") -> dict:
return ar.parse_jobs({"jobs": {name: {"steps": [{"run": run, "github_token": True}]}}})
def test_allowed_on_the_scrapers_and_freshness_scripts(self):
for run in ([PY, "-m", "scripts.scraper.mame_hash_scraper"],
[PY, "scripts/check_freshness.py", "--json"],
[PY, "scripts/refresh_stale.py", "--only", "data"]):
with self.subTest(run=run):
step = self.job(run)["x"].steps[0]
self.assertTrue(step.github_token)
with unittest.mock.patch.object(ar, "token_env", return_value={"GITHUB_TOKEN": "t1"}):
self.assertEqual(ar.job_env(self.job(run)["x"], step)["GITHUB_TOKEN"], "t1")
def test_refused_on_any_other_step(self):
for run in ([PY, "-c", "print(1)"], [PY, "scripts/campaign.py", "run"],
[PY, "scripts/core_probe.py", "run"], ["sh", "-c", "env"],
[PY, "scripts/not_tracked_here.py"], [PY, "-m", "scripts.scraper.not_tracked"],
[PY, "-m", "os"], ["/usr/bin/python3", "scripts/check_freshness.py"]):
with self.subTest(run=run), self.assertRaises(ValueError):
self.job(run)
def test_refused_in_the_campaign_job_even_on_a_scraper(self):
with self.assertRaisesRegex(ValueError, "campaign never receives"):
self.job([PY, "-m", "scripts.scraper.mame_hash_scraper"], name="campaign")
def test_an_undeclared_step_gets_no_token(self):
job = ar.parse_jobs({"jobs": {"x": {"network": True, "steps": [
[PY, "-m", "scripts.scraper.mame_hash_scraper"]]}}})["x"]
with unittest.mock.patch.object(ar, "token_env", return_value={"GITHUB_TOKEN": "t1"}), \
unittest.mock.patch.dict(os.environ, {"GITHUB_TOKEN": "t1"}):
self.assertNotIn("GITHUB_TOKEN", ar.job_env(job, job.steps[0]))
def test_the_committed_registry(self):
jobs = ar.load_jobs()
self.assertTrue(all(step.github_token for step in jobs["nightly"].steps))
self.assertFalse(any(step.github_token for step in jobs["campaign"].steps + jobs["campaign"].gate))
class ReportAlert(Scratch):
def test_a_report_alert_is_raised_then_cleared(self):
write = "import json, sys; json.dump({'alert': sys.argv[1]} if sys.argv[1] else {}, open('r.json', 'w'))"
for message, expected in (("no sandbox", True), ("", False)):
ctx = self.context({"x": {"worktree": False, "min_free_gb": 0, "report": "r.json",
"steps": [[PY, "-c", write, message]]}})
ar.run_job(ctx, "x")
alerts = self.state(ctx).get("alerts", {})
self.assertEqual("job:x" in alerts, expected)
if expected:
self.assertEqual(alerts["job:x"]["detail"], "no sandbox")
class Retry(Scratch):
def _runs(self, *outcomes: ar.Outcome):
queue = list(outcomes)
+999
View File
@@ -0,0 +1,999 @@
"""campaign.py runs the real-condition campaign: state, guards, content, rules.
No network and no real core. The rules and the profile editor are checked on
synthetic records and profiles, the guards and the probe retries on a fake
host, the content store on folders made in the test. One class builds a
libretro core from C, when a compiler is there, and runs whole passes on a
synthetic checkout: records, rules applied with their evidence, findings,
resume and rerun on a changed core.
"""
from __future__ import annotations
import contextlib
import hashlib
import io
import json
import os
import shutil
import subprocess
import sys
import tempfile
import unittest
import unittest.mock
from pathlib import Path
from types import MappingProxyType
import yaml
REPO_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import campaign
import campaign_profiles
import campaign_rules as rules
import measurement_records as mr
import sitemeasurements
TMP = REPO_ROOT / "tmp" / "tests"
PROFILE = """\
emulator: Fake
type: libretro
cores: [fake]
systems: [fake-system]
notes: >
A profile for the tests.
files:
# -- the BIOS --
- name: "bios.bin"
description: "The BIOS"
required: true
size: 4
validation: [size]
aliases:
- "Bios.bin"
- name: "other.bin"
required: false
"""
FAKE_CORE = r"""
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct retro_system_info { const char *n, *v, *e; bool full, block; };
struct retro_game_geometry { unsigned bw, bh, mw, mh; float a; };
struct retro_system_timing { double fps, rate; };
struct retro_system_av_info { struct retro_game_geometry g; struct retro_system_timing t; };
typedef bool (*env_t)(unsigned, void *);
typedef void (*video_t)(const void *, unsigned, unsigned, size_t);
typedef size_t (*batch_t)(const int16_t *, size_t);
typedef int16_t (*input_t)(unsigned, unsigned, unsigned, unsigned);
static env_t env; static video_t video; static batch_t batch;
static uint16_t pixels[4 * 2]; static int booted; static unsigned frame;
void retro_set_environment(env_t e) { bool t = true; env = e; env(18, &t); }
void retro_set_video_refresh(video_t v) { video = v; }
void retro_set_audio_sample(void *f) { (void)f; }
void retro_set_audio_sample_batch(batch_t b) { batch = b; }
void retro_set_input_poll(void *f) { (void)f; }
void retro_set_input_state(input_t f) { (void)f; }
void retro_set_controller_port_device(unsigned port, unsigned device) { (void)port; (void)device; }
void retro_get_system_info(struct retro_system_info *i) {
i->n = "Fake"; i->v = "1"; i->e = ""; i->full = true; i->block = false; }
void retro_get_system_av_info(struct retro_system_av_info *i) {
memset(i, 0, sizeof *i); i->t.fps = 60.0; i->t.rate = 44100.0; }
void retro_init(void) {}
void retro_deinit(void) {}
static FILE *try_open(const char *dir, const char *name) {
char path[4096]; snprintf(path, sizeof path, "%s/%s", dir, name); return fopen(path, "rb"); }
bool retro_load_game(const void *g) {
const char *dir = NULL; FILE *f; (void)g; env(9, &dir);
f = try_open(dir, "bios.bin");
if (!f) f = try_open(dir, "BIOS.BIN");
#ifdef FAKE_HLE
if (f) fclose(f);
booted = 1;
#else
if (f) { fclose(f); booted = 1; } else booted = 0;
#endif
return true; }
void retro_unload_game(void) {}
void retro_run(void) {
int16_t s[4] = {1, 2, 3, 4};
#ifdef FAKE_HANG
for (;;) {}
#endif
for (int i = 0; i < 8; i++) pixels[i] = booted ? (uint16_t)(frame / 2 + i) : 0;
frame++;
video(pixels, 4, 2, 8); batch(s, 2); }
size_t retro_serialize_size(void) { return 0; }
bool retro_serialize(void *d, size_t n) { (void)d; (void)n; return false; }
"""
def rep(frames: list[str], uniform: list[str] | None = None, loaded: bool = True) -> dict:
return {"loaded": loaded, "observables": {
"frame_hashes": [[i * 10, h] for i, h in enumerate(frames)],
"uniform_frames": sorted(set(uniform or []))}}
def boot_record(absent: list[dict], present: list[dict], rid: str = "2026-10-27-aaaaaaaaaaaa") -> dict:
return {"id": rid, "variants": [{"label": "bios.bin-absent", "repetitions": absent},
{"label": "bios.bin", "repetitions": present}]}
class BootOutcome(unittest.TestCase):
GAME = ("black", "logo", "title", "title2")
def test_boots_when_screens_are_shared(self) -> None:
record = boot_record([rep(["black", "hle", "logo", "title"], ["black"])] * 2,
[rep(self.GAME, ["black"])] * 2)
boot = rules.boot_outcome(record, "bios.bin-absent", "bios.bin")
self.assertEqual((boot.status, boot.shared), (rules.BOOTS, 2))
def test_one_colour_and_no_load_fail(self) -> None:
black = boot_record([rep(["black"], ["black"]), rep([], [], loaded=False)],
[rep(self.GAME, ["black"])])
self.assertEqual(rules.boot_outcome(black, "bios.bin-absent", "bios.bin").status, rules.FAILS)
def test_a_shared_blank_screen_proves_nothing(self) -> None:
# The black frame both runs start on is one colour: it is no game screen.
record = boot_record([rep(["black", "error"], ["black"])], [rep(self.GAME, ["black"])])
self.assertEqual(rules.boot_outcome(record, "bios.bin-absent", "bios.bin").status,
rules.INCONCLUSIVE)
def test_one_shared_screen_is_not_enough(self) -> None:
record = boot_record([rep(["logo", "error"])], [rep(self.GAME, ["black"])])
self.assertEqual(rules.boot_outcome(record, "bios.bin-absent", "bios.bin").status,
rules.INCONCLUSIVE)
def test_repetitions_that_disagree_settle_nothing(self) -> None:
record = boot_record([rep(["logo", "title"]), rep(["black"], ["black"])],
[rep(self.GAME, ["black"])])
self.assertEqual(rules.boot_outcome(record, "bios.bin-absent", "bios.bin").status,
rules.INCONCLUSIVE)
def test_a_reference_that_shows_nothing_settles_nothing(self) -> None:
record = boot_record([rep(["logo", "title"])], [rep(["black"], ["black"])])
self.assertEqual(rules.boot_outcome(record, "bios.bin-absent", "bios.bin").status,
rules.INCONCLUSIVE)
record = boot_record([rep(["logo", "title"])], [rep(self.GAME, loaded=False)])
self.assertEqual(rules.boot_outcome(record, "bios.bin-absent", "bios.bin").status,
rules.INCONCLUSIVE)
class RuleTable(unittest.TestCase):
ENTRY = MappingProxyType({"name": "bios.bin", "required": True, "aliases": ["Bios.bin"]})
RID = "2026-10-27-bbbbbbbbbbbb"
def test_boots_without_settles_hle_and_queues_required(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.BOOTS, "x", 3), self.ENTRY, self.RID)
self.assertEqual([(v.field, v.value, v.apply) for v in verdicts],
[("hle_fallback", True, True), ("required", False, False)])
self.assertEqual(verdicts[0].evidence, (self.RID,))
optional = rules.rule_bios_need(rules.Boot(rules.BOOTS, "x", 3),
{"name": "a", "required": False}, self.RID)
self.assertEqual([v.field for v in optional], ["hle_fallback"])
def test_fails_without_settles_required_and_no_hle(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.FAILS, "x"), self.ENTRY, self.RID)
self.assertEqual([(v.field, v.value, v.apply) for v in verdicts],
[("required", True, True), ("hle_fallback", False, True)])
def test_inconclusive_is_queued(self) -> None:
(verdict,) = rules.rule_bios_need(rules.Boot(rules.INCONCLUSIVE, "x"), self.ENTRY, self.RID)
self.assertFalse(verdict.apply)
def test_path_and_alias(self) -> None:
self.assertIsNone(rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("bios.bin", self.RID)))
moved = rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("sys/bios.bin", self.RID))
self.assertEqual((moved.field, moved.value, moved.apply), ("path", "sys/bios.bin", True))
self.assertIsNone(rules.rule_alias(self.ENTRY, rules.Opened("Bios.bin", self.RID)))
alias = rules.rule_alias(self.ENTRY, rules.Opened("BIOS.BIN", self.RID))
self.assertEqual((alias.field, alias.value), ("aliases", ["Bios.bin", "BIOS.BIN"]))
def test_never_opened_is_flagged_not_applied(self) -> None:
verdict = rules.rule_never_opened(self.ENTRY, [self.RID], "Game (USA)")
self.assertFalse(verdict.apply)
self.assertEqual(verdict.rule, "never_opened")
def test_variants(self) -> None:
self.assertIsNone(rules.rule_variants("same", ["a", "b"], self.ENTRY, self.RID))
self.assertFalse(rules.rule_variants("differs", ["b", "a"], self.ENTRY, self.RID).apply)
def test_agreement_and_evidence(self) -> None:
self.assertTrue(rules.agrees({"name": "a"}, rules.Verdict("r", "hle_fallback", False, "", ())))
self.assertFalse(rules.agrees({"name": "a"}, rules.Verdict("r", "hle_fallback", True, "", ())))
self.assertTrue(rules.agrees(self.ENTRY, rules.Verdict("r", "aliases", ["Bios.bin"], "", ())))
merged = rules.merge_evidence({"required": ["x"]}, rules.Verdict("r", "required", True, "", ("y", "x")))
self.assertEqual(merged, {"required": ["x", "y"]})
class ProfileEditor(unittest.TestCase):
def test_replace_insert_and_keep_the_rest(self) -> None:
out = campaign_profiles.set_fields(PROFILE, 0, {
"required": False, "hle_fallback": True,
"aliases": ["Bios.bin", "BIOS.BIN"], "evidence": {"hle_fallback": ["2026-10-27-cccccccccccc"]}})
parsed = yaml.safe_load(out)
self.assertEqual(parsed["files"][0]["hle_fallback"], True)
self.assertEqual(parsed["files"][0]["aliases"], ["Bios.bin", "BIOS.BIN"])
self.assertEqual(parsed["files"][1], {"name": "other.bin", "required": False})
self.assertIn(" # -- the BIOS --", out)
self.assertIn(' required: false\n hle_fallback: true\n', out)
self.assertIn(' - "BIOS.BIN"\n', out)
lines = out.splitlines()
self.assertEqual(lines[lines.index(' evidence:') + 1], ' hle_fallback: ["2026-10-27-cccccccccccc"]')
def test_the_last_entry_and_a_no_op(self) -> None:
out = campaign_profiles.set_fields(PROFILE, 1, {"path": "sub/other.bin"})
self.assertEqual(yaml.safe_load(out)["files"][1]["path"], "sub/other.bin")
self.assertEqual(campaign_profiles.set_fields(PROFILE, 1, {"required": False}), PROFILE)
def test_refusals(self) -> None:
with self.assertRaises(campaign_profiles.ProfileEditError):
campaign_profiles.set_fields(PROFILE, 2, {"required": False})
with self.assertRaises(campaign_profiles.ProfileEditError):
campaign_profiles.set_fields("emulator: X\n", 0, {"required": False})
with self.assertRaises(campaign_profiles.ProfileEditError):
campaign_profiles.set_fields(PROFILE, 0, {"name": "x.bin"})
def test_every_profile_reads_as_its_entries(self) -> None:
# The text layout the editor reads holds in every profile it may edit.
for path in sorted((REPO_ROOT / "emulators").glob("*.yml")):
text = path.read_text(encoding="utf-8")
entries = (yaml.safe_load(text) or {}).get("files") or []
if not entries or "\nfiles:\n" not in text:
continue
with self.subTest(profile=path.name):
self.assertEqual(len(campaign_profiles.item_spans(text.splitlines())), len(entries))
class FakeHost(campaign.Host):
def __init__(self, loads: list[float] | None = None, free: float = 500.0) -> None:
super().__init__()
self.loads = list(loads or [0.0])
self.now = 0.0
self.slept: list[float] = []
self.free = free
self.calls: list[list[str]] = []
self.results: list[object] = []
self.loadavg = self._load
self.sleep = self._sleep
self.clock = lambda: self.now
self.free_gb = lambda path: self.free
self.cpu_count = 4
self.run = self._run
def _load(self) -> tuple[float, float, float]:
value = self.loads.pop(0) if len(self.loads) > 1 else self.loads[0]
return (value, value, value)
def _sleep(self, seconds: float) -> None:
self.slept.append(seconds)
self.now += seconds
def _run(self, argv, **kwargs):
self.calls.append(list(argv))
result = self.results.pop(0) if len(self.results) > 1 else self.results[0]
if isinstance(result, BaseException):
raise result
return result
class Workspace(unittest.TestCase):
def setUp(self) -> None:
TMP.mkdir(parents=True, exist_ok=True)
self.tmp = Path(tempfile.mkdtemp(dir=TMP))
self.root = self.tmp / "repo"
(self.root / "emulators").mkdir(parents=True)
subprocess.run(["git", "init", "-q", str(self.root)], check=True)
(self.root / "emulators" / "fake.yml").write_text(PROFILE, encoding="utf-8")
bios = self.root / "bios" / "Fake" / "bios.bin"
bios.parent.mkdir(parents=True)
bios.write_bytes(b"BIOS")
sha1 = hashlib.sha1(b"BIOS").hexdigest()
db = {"files": {sha1: {"path": "bios/Fake/bios.bin", "name": "bios.bin", "size": 4,
"sha1": sha1, "md5": hashlib.md5(b"BIOS").hexdigest()}},
"indexes": {"by_name": {"bios.bin": [sha1]}, "by_md5": {}, "by_crc32": {},
"by_sha256": {}, "by_path_suffix": {}}}
(self.root / "database.json").write_text(json.dumps(db), encoding="utf-8")
self.content_file = self.tmp / "content.yml"
self.content_file.write_text(yaml.safe_dump({"systems": {"fake-system": {
"romfetch": "fakesys", "content": [{
"name": "Fake Game (World)", "catalog": "no-intro", "reason": "a test",
"frames": 12, "frame_hash_every": 2}]}}}), encoding="utf-8")
self.game = self.tmp / "content" / "fakesys" / "Fake Game (World)"
self.paths = campaign.Paths(root=self.root, home=self.tmp / "home",
content=self.tmp / "content", db=self.root / "database.json",
content_file=self.content_file)
def tearDown(self) -> None:
shutil.rmtree(self.tmp, ignore_errors=True)
def put_game(self, folder: Path | None = None, payload: bytes = b"GAME") -> Path:
folder = folder or self.game
folder.mkdir(parents=True, exist_ok=True)
(folder / "game.bin").write_bytes(payload)
(folder / "identity.json").write_text(json.dumps({"status": "verified", "files": [
{"name": "game.bin", "size": len(payload), "sha1": hashlib.sha1(payload).hexdigest()}]}))
return folder
def make(self, host: campaign.Host | None = None, **settings: object) -> campaign.Campaign:
values = {"delays": (1, 2), "echo": False, **settings}
return campaign.Campaign(self.paths, campaign.Settings(**values), host or FakeHost(),
lock_path=self.tmp / "auto.lock")
class StateAndResume(Workspace):
def test_should_run(self) -> None:
self.assertTrue(campaign.should_run(None, "a", "d"))
done = {"status": "done", "core_sha256": "a", "profile_digest": "d"}
self.assertFalse(campaign.should_run(done, "a", "d"))
self.assertTrue(campaign.should_run(done, "b", "d"))
self.assertTrue(campaign.should_run(done, "a", "e"))
self.assertTrue(campaign.should_run({**done, "status": "pending"}, "a", "d"))
self.assertFalse(campaign.should_run({**done, "status": "failed"}, "a", "d"))
def test_evidence_does_not_change_the_digest(self) -> None:
profile = yaml.safe_load(PROFILE)
before = campaign.profile_digest(profile)
profile["files"][0]["evidence"] = {"required": ["2026-10-27-dddddddddddd"]}
self.assertEqual(campaign.profile_digest(profile), before)
profile["files"][0]["required"] = False
self.assertNotEqual(campaign.profile_digest(profile), before)
def test_state_survives_a_reload(self) -> None:
c = self.make()
c.pending("fake", "fake/fake-system/x/files", "content: romfetch not found")
campaign.save_state(self.paths.state, c.state)
again = self.make()
self.assertEqual(again.state["checks"]["fake"]["fake/fake-system/x/files"]["status"], "pending")
def test_budget(self) -> None:
self.assertEqual(campaign.parse_budget("6h"), 21600)
self.assertEqual(campaign.parse_budget("90m"), 5400)
self.assertEqual(campaign.parse_budget("30"), 30)
class Guards(Workspace):
def test_busy_host_waits_then_runs(self) -> None:
host = FakeHost(loads=[5.0, 5.0, 0.5])
c = self.make(host, max_load_wait=600)
c.deadline = 10_000
c.guard()
self.assertEqual(host.slept, [60.0, 60.0])
def test_busy_host_pauses(self) -> None:
host = FakeHost(loads=[5.0])
c = self.make(host, max_load_wait=120)
c.deadline = 10_000
with self.assertRaisesRegex(campaign.Pause, "busy host"):
c.guard()
def test_full_disk_pauses(self) -> None:
c = self.make(FakeHost(free=10.0), min_free_gb=30)
c.deadline = 10_000
with self.assertRaisesRegex(campaign.Pause, "disk"):
c.guard()
def test_budget_pauses(self) -> None:
c = self.make()
c.deadline = 0
with self.assertRaisesRegex(campaign.Pause, "budget"):
c.guard()
def test_the_lock_is_skipped_under_autorun(self) -> None:
lock = self.tmp / "held.lock"
with campaign.autorun.global_lock(lock):
with self.assertRaises(campaign.autorun.LockBusy), campaign.host_lock(lock):
pass
os.environ[campaign.LOCK_HELD_ENV] = "1"
try:
with campaign.host_lock(lock):
pass
finally:
del os.environ[campaign.LOCK_HELD_ENV]
class ChildEnvironment(unittest.TestCase):
def test_probes_builds_and_romfetch_get_no_secret(self) -> None:
host = {"GITHUB_TOKEN": "t", "GH_TOKEN": "t", "ROMSTATION_USER": "u", "ROMSTATION_PASS": "p",
"ROMFETCH_CONTENT_DIR": "/c", "SSH_AUTH_SOCK": "/s", "PATH": "/usr/bin"}
with unittest.mock.patch.dict(os.environ, host):
probe, fetch = campaign.child_env(), campaign.child_env(romfetch=True)
for env in (probe, fetch):
self.assertFalse({"GITHUB_TOKEN", "GH_TOKEN", "ROMSTATION_USER", "ROMSTATION_PASS",
"SSH_AUTH_SOCK"} & set(env))
self.assertEqual(env["PATH"], "/usr/bin")
self.assertNotIn("ROMFETCH_CONTENT_DIR", probe)
self.assertEqual(fetch["ROMFETCH_CONTENT_DIR"], "/c")
def test_the_probe_is_started_with_that_environment(self) -> None:
seen: list[dict] = []
host = FakeHost()
host.run = lambda argv, **kw: (seen.append(kw.get("env")),
subprocess.CompletedProcess([], 0, '{"id": "x"}', ""))[1]
with tempfile.TemporaryDirectory(dir=TMP) as tmp:
paths = campaign.Paths(root=Path(tmp), home=Path(tmp) / "h", content=Path(tmp) / "c",
db=Path(tmp) / "db.json", content_file=campaign.CONTENT_FILE)
c = campaign.Campaign(paths, campaign.Settings(echo=False), host, lock_path=Path(tmp) / "l")
c.deadline = 10_000
with unittest.mock.patch.dict(os.environ, {"GITHUB_TOKEN": "t"}):
c.probe(["run"], "x")
self.assertNotIn("GITHUB_TOKEN", seen[0])
class FailClosed(Workspace):
"""No core and no build runs outside the sandbox unless asked."""
def test_a_pass_without_a_sandbox_is_refused(self) -> None:
host = FakeHost()
host.results = [subprocess.CompletedProcess([], 0, "{}", "")]
c = self.make(host)
with unittest.mock.patch.object(campaign.core_probe.shutil, "which", return_value=None):
current = c.run(set(), None)
self.assertEqual(current.result, "refused")
self.assertIn("bwrap not found", current.detail)
self.assertEqual(host.calls, [])
self.assertEqual(mr.read_campaign(self.root, mr.CAMPAIGN_RUNS)[-1]["result"], "refused")
def test_the_override_lets_it_run(self) -> None:
c = self.make(allow_unsandboxed=True)
c.unit_cores = lambda *a, **k: []
with unittest.mock.patch.object(campaign.core_probe.shutil, "which", return_value=None):
self.assertEqual(c.run(set(), None).result, "complete")
def test_every_probe_requires_the_sandbox(self) -> None:
core = campaign.Core("fake", self.tmp / "x.so", "a" * 64)
self.assertIn("--require-sandbox", self.make().probe_args("run", core, "fake", "s", None, None))
self.assertNotIn("--require-sandbox", self.make(allow_unsandboxed=True).probe_args(
"run", core, "fake", "s", None, None))
def test_a_build_without_a_sandbox_is_refused(self) -> None:
c = self.make()
src = c.paths.home / "src" / campaign.slug("https://example.invalid/x")
(src / ".git").mkdir(parents=True)
(src / "Makefile").write_text("all:\n")
host = c.host
host.results = [subprocess.CompletedProcess([], 0, "", "")]
with unittest.mock.patch.object(campaign.core_probe.shutil, "which", return_value=None), \
self.assertRaisesRegex(campaign.Unavailable, "refused: no sandbox"):
c.cores.compile("https://example.invalid/x", "a" * 40, self.tmp / "out")
self.assertFalse(any(call[0] == "make" for call in host.calls))
@unittest.skipUnless(shutil.which("git") and shutil.which("make"), "no git or make")
class BuildIsolation(unittest.TestCase):
"""Builds run on an archive exported from bare mirrors that only host git
touches: a build cannot reach the mirror, and host git runs nothing a
repository's config or attributes name."""
MAIN = "https://example.invalid/team/main.git"
SUB = "https://example.invalid/team/sub.git"
def setUp(self) -> None:
TMP.mkdir(parents=True, exist_ok=True)
self.tmp = Path(tempfile.mkdtemp(dir=TMP))
self.addCleanup(shutil.rmtree, self.tmp, True)
self.pwned = self.tmp / "PWNED"
sub = self.repo("sub", {"sub.c": "int x;\n"})
self.sub_sha = self.git(sub, "rev-parse", "HEAD").strip()
self.mirrors = {self.SUB: self.bare(sub, "sub")}
main_mirror = self.tmp / "mirrors" / "main.git"
# A Makefile that tries to plant a hook and a config line in the mirror.
makefile = (
"all:\n"
f"\t-mkdir -p {main_mirror}/hooks\n"
f"\t-echo 'touch {self.pwned}' > {main_mirror}/hooks/post-checkout\n"
f"\t-printf '[core]\\n\\tfsmonitor = touch {self.pwned}\\n' >> {main_mirror}/config\n"
"\ttouch fake_libretro.so\n")
main = self.repo("main", {"Makefile": makefile, ".gitmodules":
'[submodule "lib"]\n\tpath = lib\n\turl = ../sub.git\n'})
self.git(main, "update-index", "--add", "--cacheinfo", f"160000,{self.sub_sha},lib")
self.git(main, "commit", "-q", "-m", "submodule")
self.commit = self.git(main, "rev-parse", "HEAD").strip()
self.mirrors[self.MAIN] = self.bare(main, "main")
self.config = (main_mirror / "config").read_text()
def git(self, repo: Path, *args: str) -> str:
return subprocess.run(["git", "-c", "user.name=t", "-c", "user.email=t@t", "-C", str(repo), *args],
check=True, capture_output=True, text=True).stdout
def repo(self, name: str, files: dict[str, str]) -> Path:
path = self.tmp / "work" / name
subprocess.run(["git", "init", "-q", str(path)], check=True)
for rel, text in files.items():
(path / rel).write_text(text)
self.git(path, "add", *files)
self.git(path, "commit", "-q", "-m", "one")
return path
def bare(self, work: Path, name: str) -> Path:
path = self.tmp / "mirrors" / f"{name}.git"
subprocess.run(["git", "clone", "-q", "--bare", str(work), str(path)], check=True)
return path
def test_the_export_holds_the_tree_and_its_submodule_and_no_git(self) -> None:
tree = self.tmp / "tree"
campaign.export_commit(self.mirrors.__getitem__, self.MAIN, self.commit, tree)
self.assertEqual((tree / "lib" / "sub.c").read_text(), "int x;\n")
self.assertTrue((tree / "Makefile").is_file())
self.assertEqual([p for p in tree.rglob(".git")], [])
def test_a_build_cannot_reach_the_mirror(self) -> None:
tree = self.tmp / "tree"
prefix, isolation = campaign.core_probe.sandbox_argv([tree])
if isolation != campaign.core_probe.SANDBOX:
self.skipTest("no working bwrap on this host")
campaign.export_commit(self.mirrors.__getitem__, self.MAIN, self.commit, tree)
proc = subprocess.run(prefix + ["make"], cwd=tree, capture_output=True, text=True,
check=False, env=campaign.child_env())
self.assertEqual(proc.returncode, 0, proc.stderr)
mirror = self.mirrors[self.MAIN]
self.assertFalse((mirror / "hooks" / "post-checkout").exists())
self.assertEqual((mirror / "config").read_text(), self.config)
campaign.export_commit(self.mirrors.__getitem__, self.MAIN, self.commit, self.tmp / "again")
self.assertFalse(self.pwned.exists())
def test_host_git_runs_nothing_a_repository_config_names(self) -> None:
mirror = self.mirrors[self.MAIN]
hook = mirror / "hooks" / "reference-transaction"
hook.write_text(f"#!/bin/sh\ntouch {self.pwned}\n")
hook.chmod(0o755)
with (mirror / "config").open("a") as handle:
handle.write(f"[core]\n\tfsmonitor = touch {self.pwned}\n\tsshCommand = touch {self.pwned}\n"
f'[filter "x"]\n\tsmudge = touch {self.pwned}\n')
(mirror / "info").mkdir(exist_ok=True)
(mirror / "info" / "attributes").write_text("* filter=x\n")
campaign.export_commit(self.mirrors.__getitem__, self.MAIN, self.commit, self.tmp / "tree")
campaign.git_out("-C", str(mirror), "update-ref", "refs/x", self.commit)
self.assertFalse(self.pwned.exists())
# Plain git on the same mirror runs the planted hook: the test plants a live one.
subprocess.run(["git", "-C", str(mirror), "update-ref", "refs/y", self.commit], check=True)
self.assertTrue(self.pwned.exists())
def test_only_https_mirrors(self) -> None:
c = campaign.Campaign(campaign.Paths(root=self.tmp, home=self.tmp / "home", content=self.tmp,
db=self.tmp / "db.json", content_file=campaign.CONTENT_FILE),
campaign.Settings(echo=False), FakeHost(), lock_path=self.tmp / "l")
for url in ("file:///etc", "/home/x/repo", "ext::sh -c touch", "ssh://h/r", "git@h:r"):
with self.subTest(url=url), self.assertRaises(campaign.Unavailable):
c.cores.mirror(url)
self.assertEqual(campaign.submodule_url(self.MAIN, "../sub.git"), self.SUB)
self.assertEqual(campaign.git_env()["GIT_ALLOW_PROTOCOL"], "https")
def test_a_whole_build_wipes_old_clones_and_copies_a_regular_file(self) -> None:
if campaign.core_probe.sandbox_argv([])[1] != campaign.core_probe.SANDBOX:
self.skipTest("no working bwrap on this host")
home = self.tmp / "home"
(home / "src" / "old" / ".git").mkdir(parents=True)
c = campaign.Campaign(campaign.Paths(root=self.tmp, home=home, content=self.tmp,
db=self.tmp / "db.json", content_file=campaign.CONTENT_FILE),
campaign.Settings(echo=False), campaign.Host(), lock_path=self.tmp / "l")
c.cores.mirror = self.mirrors.__getitem__
so, command = c.cores.compile(self.MAIN, self.commit, self.tmp / "out")
self.assertEqual(so, self.tmp / "out" / "fake_libretro.so")
self.assertIn("isolation: bwrap", command)
self.assertFalse((home / "src").exists())
class BuiltCore(unittest.TestCase):
def setUp(self) -> None:
TMP.mkdir(parents=True, exist_ok=True)
self.tree = Path(tempfile.mkdtemp(dir=TMP))
self.addCleanup(shutil.rmtree, self.tree, True)
self.secret = self.tree.parent / f"{self.tree.name}-host-file"
self.secret.write_text("host secret")
self.addCleanup(self.secret.unlink)
def test_a_link_is_never_taken_for_the_core(self) -> None:
(self.tree / "a_libretro.so").symlink_to(self.secret)
with self.assertRaises(campaign.Unavailable):
campaign.built_core(self.tree)
(self.tree / "sub").mkdir()
(self.tree / "sub" / "b_libretro.so").write_bytes(b"\x7fELF")
self.assertEqual(campaign.built_core(self.tree), self.tree / "sub" / "b_libretro.so")
def test_copy_refuses_a_link(self) -> None:
link = self.tree / "c_libretro.so"
link.symlink_to(self.secret)
with self.assertRaises(OSError):
campaign.copy_regular(link, self.tree / "out.so")
self.assertFalse((self.tree / "out.so").exists())
class ProbeRuns(Workspace):
def completed(self, code: int, stdout: str = "", stderr: str = "") -> subprocess.CompletedProcess:
return subprocess.CompletedProcess([], code, stdout, stderr)
def probe(self, *results: object) -> tuple[campaign.ProbeResult, FakeHost]:
host = FakeHost()
host.results = list(results)
c = self.make(host)
c.deadline = 10_000
return c.probe(["run", "--core", "x.so"], "fake-run"), host
def test_timeout_is_failed_and_not_retried(self) -> None:
result, host = self.probe(subprocess.TimeoutExpired(["x"], 1))
self.assertEqual((result.status, result.reason), ("failed", "timeout"))
self.assertEqual(len(host.calls), 1)
self.assertIn("killed after", Path(result.log).read_text())
result, host = self.probe(self.completed(1, stderr="subprocess.TimeoutExpired: timed out after 900 seconds"))
self.assertEqual((result.reason, len(host.calls)), ("timeout", 1))
def test_a_crashing_core_is_tried_three_times(self) -> None:
result, host = self.probe(self.completed(1, stderr="worker exited -11"))
self.assertEqual((result.status, result.reason), ("failed", "crashed 3 times"))
self.assertEqual(len(host.calls), 3)
def test_a_crash_then_a_record(self) -> None:
record = {"id": "2026-10-27-eeeeeeeeeeee"}
result, host = self.probe(self.completed(1, stderr="worker exited -11"),
self.completed(0, stdout=json.dumps(record)))
self.assertEqual((result.status, result.record, len(host.calls)), ("done", record, 2))
def test_refusal_on_a_busy_host_pauses(self) -> None:
with self.assertRaisesRegex(campaign.Pause, "busy host"):
self.probe(self.completed(3, stderr="load average"))
class Content(Workspace):
def content(self, name: str = "Fake Game (World)", pinned: bool = False) -> campaign.Content:
return campaign.Content("fake-system", "fakesys", name, "no-intro", "r", None, "", 12, 2,
pinned, None)
def test_local_content_is_verified_by_its_identity(self) -> None:
self.put_game()
c = self.make()
self.assertEqual(c.store.get(self.content()), self.game)
(self.game / "game.bin").write_bytes(b"EDIT")
with self.assertRaisesRegex(campaign.Unavailable, "does not match"):
self.make().store.get(self.content())
def test_without_romfetch_the_check_waits_for_content(self) -> None:
c = self.make(romfetch=str(self.tmp / "absent-romfetch"))
with self.assertRaisesRegex(campaign.Unavailable, "romfetch not found"):
c.store.get(self.content())
def test_romfetch_is_retried_on_a_source_error(self) -> None:
fetcher = self.tmp / "romfetch"
fetcher.write_text("#!/bin/sh\n")
fetcher.chmod(0o755)
host = FakeHost()
error = json.dumps({"error": {"code": "network", "message": "m", "hint": "h"}})
game = self.game
def fetched(*args, **kwargs):
self.put_game(game)
return subprocess.CompletedProcess([], 0, '{"status": "verified"}', "")
host.results = [subprocess.CompletedProcess([], 3, error, ""), None]
host.run = lambda argv, **kw: (host.calls.append(argv), fetched() if len(host.calls) == 2
else host.results[0])[1]
c = self.make(host, romfetch=str(fetcher))
self.assertEqual(c.store.get(self.content()), self.game)
self.assertEqual(host.slept, [1])
self.assertEqual(host.calls[0][1:4], ["get", "fakesys", "Fake Game (World)"])
self.assertTrue(c.state["content"]["fakesys/Fake Game (World)"]["fetched_by_campaign"])
def test_romfetch_not_found_names_its_code(self) -> None:
fetcher = self.tmp / "romfetch"
fetcher.write_text("#!/bin/sh\n")
host = FakeHost()
host.results = [subprocess.CompletedProcess(
[], 1, json.dumps({"error": {"code": "no_entry", "message": "m", "hint": "h"}}), "")]
c = self.make(host, romfetch=str(fetcher))
with self.assertRaisesRegex(campaign.Unavailable, r"exit 1 \(no_entry\)"):
c.store.get(self.content())
self.assertEqual(len(host.calls), 1)
def test_shared_content_stays_until_its_last_user(self) -> None:
c = self.make()
self.put_game()
content = self.content()
c.state["content"][content.key] = {"fetched_by_campaign": True, "pinned": False, "size": 4}
c.store.hold(content, "alpha")
c.store.hold(content, "beta")
c.store.release(content, "alpha")
self.assertTrue(self.game.is_dir())
c.store.release(content, "beta")
self.assertFalse(self.game.exists())
def test_pinned_or_foreign_content_is_never_deleted(self) -> None:
c = self.make()
self.put_game()
content = self.content(pinned=True)
c.state["content"][content.key] = {"fetched_by_campaign": True, "pinned": True}
c.store.hold(content, "alpha")
c.store.release(content, "alpha")
self.assertTrue(self.game.is_dir())
c.state["content"][content.key] = {"fetched_by_campaign": False, "pinned": False}
c.store.hold(content, "alpha")
c.store.release(content, "alpha")
self.assertTrue(self.game.is_dir())
def test_least_recently_used_goes_first_past_the_cap(self) -> None:
c = self.make(cache_cap_gb=5e-9)
for name, used in (("Old", "2026-01-01"), ("New", "2026-06-01"), ("Kept", "2025-01-01")):
self.put_game(self.tmp / "content" / "fakesys" / name)
c.state["content"][f"fakesys/{name}"] = {"fetched_by_campaign": True, "pinned": name == "Kept",
"size": 4, "last_used": used}
self.assertEqual(c.store.evict(keep=set()), ["fakesys/Old"])
self.assertTrue((self.tmp / "content" / "fakesys" / "New").is_dir())
self.assertTrue((self.tmp / "content" / "fakesys" / "Kept").is_dir())
def test_load_file(self) -> None:
self.put_game()
self.assertEqual(campaign.load_file(self.game, ""), self.game / "game.bin")
with self.assertRaises(campaign.Unavailable):
campaign.load_file(self.game, "cue")
class Findings(Workspace):
RID = "2026-10-27-ffffffffffff"
def setUp(self) -> None:
super().setUp()
self.c = self.make()
self.c.current = campaign.Pass(started=campaign.now_iso())
self.content = campaign.Content("fake-system", "fakesys", "Fake Game (World)", "no-intro",
"r", None, "", 12, 2, False, None)
self.core = campaign.Core("fake", self.tmp / "fake_libretro.so", "a" * 64)
self.profile = self.root / "emulators" / "fake.yml"
def lines(self) -> list[dict]:
return mr.read_campaign(self.root, mr.FINDINGS)
def entry(self, index: int = 0) -> dict:
return yaml.safe_load(self.profile.read_text())["files"][index]
def test_a_settled_field_is_written_with_its_evidence(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.BOOTS, "shown", 4), self.entry(), self.RID)
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
entry = self.entry()
self.assertEqual(entry["hle_fallback"], True)
self.assertEqual(entry["evidence"], {"hle_fallback": [self.RID]})
self.assertEqual(entry["required"], True)
self.assertEqual([(line["field"], line["status"]) for line in self.lines()],
[("hle_fallback", "applied"), ("required", "open")])
self.assertIn("emulators/fake.yml", self.c.current.touched)
# The same outcome a second time adds nothing.
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
self.assertEqual(len(self.lines()), 2)
def test_an_agreeing_run_adds_evidence_only(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.FAILS, "nothing"), self.entry(), self.RID)
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
entry = self.entry()
self.assertEqual((entry["required"], entry["hle_fallback"]), (True, False))
self.assertEqual(entry["evidence"], {"hle_fallback": [self.RID], "required": [self.RID]})
self.assertEqual(self.lines(), [])
def test_a_later_agreement_resolves_the_open_finding(self) -> None:
(verdict,) = rules.rule_bios_need(rules.Boot(rules.INCONCLUSIVE, "?"), self.entry(), self.RID)
self.c.settle("fake", self.content, self.core, 0, self.entry(), [verdict])
self.assertEqual(self.lines()[-1]["status"], "open")
later = rules.Verdict("inconclusive", "hle_fallback", False, "agrees now", ("2026-10-28-000000000000",))
self.c.settle("fake", self.content, self.core, 0, self.entry(), [later])
self.assertEqual([line["status"] for line in self.lines()], ["open", "resolved"])
def test_never_opened_is_flagged(self) -> None:
verdict = rules.rule_never_opened(self.entry(1), [self.RID], "Fake Game (World)")
self.c.settle("fake", self.content, self.core, 1, self.entry(1), [verdict])
self.assertEqual(self.lines()[0]["status"], "flagged")
self.assertNotIn("evidence", self.entry(1))
def test_finding_lines_validate(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.BOOTS, "shown", 4), self.entry(), self.RID)
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
self.c.write_run_line(self.c.current)
try:
from jsonschema import Draft202012Validator
except ImportError:
self.skipTest("jsonschema is a tooling dependency")
for name, (_, schema_name) in mr.CAMPAIGN_FILES.items():
schema = json.loads((REPO_ROOT / "schemas" / schema_name).read_text())
for line in mr.read_campaign(self.root, name):
self.assertEqual(list(Draft202012Validator(schema).iter_errors(line)), [], name)
def test_the_batch_commit_plan(self) -> None:
verdicts = rules.rule_bios_need(rules.Boot(rules.BOOTS, "shown", 4), self.entry(), self.RID)
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)
self.c.current.touched.add(mr.records_path("fake"))
plan = self.c.plan_commits(set())
self.assertEqual(plan, [
("chore: add campaign measurements", ["measurements/fake.jsonl", "measurements/findings.jsonl"]),
("chore: apply tested fields to fake", ["emulators/fake.yml"])])
for subject, _ in plan:
self.assertEqual(campaign.autorun.check_subject(subject), [], subject)
# A file someone had changed before the pass is left to them.
self.assertEqual(self.c.plan_commits({"emulators/fake.yml"})[1:], [])
out = io.StringIO()
with contextlib.redirect_stdout(out):
self.assertEqual(self.c.commit_batch(dry_run=True), [])
self.assertIn("would commit 'chore: add campaign measurements'", out.getvalue())
class Registry(unittest.TestCase):
def test_no_profile_takes_a_campaign_file_name(self) -> None:
stems = {p.stem for p in (REPO_ROOT / "emulators").glob("*.yml")}
self.assertEqual(stems & set(mr.CAMPAIGN_FILES), set())
def test_content_list(self) -> None:
content = campaign.load_content(campaign.CONTENT_FILE)
systems = {s for p in (REPO_ROOT / "emulators").glob("*.yml")
for s in (yaml.safe_load(p.read_text()) or {}).get("systems") or ()}
self.assertTrue(content)
for system, items in content.items():
self.assertIn(system, systems)
for item in items:
self.assertIn(item.catalog, ("redump", "no-intro"))
self.assertGreater(len(item.reason), 40)
self.assertGreater(item.frames, item.frame_hash_every)
def test_the_autorun_job(self) -> None:
jobs = campaign.autorun.load_jobs()
job = jobs["campaign"]
self.assertTrue(job.lock and job.worktree and job.schedule)
self.assertEqual(job.gate[0].argv, ("python", "scripts/campaign.py", "gate"))
self.assertEqual({p for rule in job.commits for p in rule.paths},
{"measurements/*.jsonl", "emulators/*.yml"})
self.assertGreater(job.schedule, jobs["nightly"].schedule)
def test_autorun_tells_its_steps_the_lock_is_held(self) -> None:
job = campaign.autorun.load_jobs()["campaign"]
self.assertEqual(campaign.autorun.job_env(job)[campaign.LOCK_HELD_ENV], "1")
class SitePage(unittest.TestCase):
def test_last_pass_and_open_findings(self) -> None:
summary = {
"last_run": {"ended_at": "2026-10-27T10:00:00+00:00", "result": "complete", "detail": "",
"counts": {"done": 12, "failed": 1, "pending": 3},
"pending_reasons": {"standalone": 3},
"failed": [{"emulator": "fake", "check": "fake/x/y/bench", "reason": "timeout"}]},
"passes": 1, "applied": 2,
"open": [{"emulator": "fake", "file": "bios.bin", "field": "required", "status": "open",
"profile_says": True, "run_shows": False, "statement": "the core boots without it",
"evidence": ["2026-10-27-aaaaaaaaaaaa"], "links": ["https://x/l#L1"]}],
}
page = "\n".join(sitemeasurements.campaign_section(summary))
self.assertIn("12 tests done, 1 failed, 3 waiting", page)
self.assertIn("| standalone | 3 |", page)
self.assertIn("the profile says <code>true</code>, the run shows <code>false</code>", page)
self.assertIn("[2026-10-27-aaaaaaaaaaaa](https://x/l#L1)", page)
self.assertIn("<code>false</code>. The core boots without it. Records:", page)
self.assertEqual(sitemeasurements.campaign_section({"last_run": None}), [])
def test_observed_values_cannot_leave_their_place(self) -> None:
# A value comes from a core's output or a romfetch error: it may hold
# backticks, MDX braces and HTML.
hostile = "``}{import x}<script>alert(1)</script>`` | [a](javascript:x) *b*"
summary = {
"last_run": {"ended_at": "2026-10-27T10:00:00+00:00", "result": "paused", "detail": hostile,
"counts": {"done": 0, "failed": 1, "pending": 1},
"pending_reasons": {hostile: 1},
"failed": [{"emulator": hostile, "check": hostile, "reason": hostile}]},
"passes": 1, "applied": 0,
"open": [{"emulator": "fake", "file": hostile, "field": hostile, "status": "open",
"profile_says": {"k": hostile}, "run_shows": [hostile], "statement": hostile,
"evidence": ["2026-10-27-aaaaaaaaaaaa"], "links": [None]}],
}
page = "\n".join(sitemeasurements.campaign_section(summary))
for raw in ("<script", "{import", "}{", "``", "](javascript", "*b*", "| [a]"):
self.assertNotIn(raw, page)
self.assertIn("&lt;script&gt;alert(1)&lt;/script&gt;", page)
self.assertIn("&#123;import x&#125;", page)
# The JSON dumps are escaped too: no brace reaches the page as syntax.
self.assertNotIn("{", page)
self.assertNotIn("}", page)
@unittest.skipUnless(shutil.which("cc") and shutil.which("strace"), "no C compiler or no strace")
class FakeCorePasses(Workspace):
"""Whole passes against a core compiled from FAKE_CORE."""
@classmethod
def setUpClass(cls) -> None:
TMP.mkdir(parents=True, exist_ok=True)
cls.build = Path(tempfile.mkdtemp(dir=TMP))
source = cls.build / "fake.c"
source.write_text(FAKE_CORE, encoding="utf-8")
# The core sees no variable of the host, so its behaviour is compiled in.
cls.cores = {}
for kind, flags in (("plain", []), ("hle", ["-DFAKE_HLE"]), ("hang", ["-DFAKE_HANG"])):
cls.cores[kind] = cls.build / f"fake_{kind}_libretro.so"
subprocess.run(["cc", "-shared", "-fPIC", *flags, "-o", str(cls.cores[kind]), str(source)],
check=True)
@classmethod
def tearDownClass(cls) -> None:
shutil.rmtree(cls.build, ignore_errors=True)
def passing(self, kind: str = "plain", core: Path | None = None,
**settings: object) -> campaign.Campaign:
self.put_game()
# The core_probe threshold follows the host: a test never waits on the real load.
host = campaign.Host(loadavg=lambda: (0.0, 0.0, 0.0), free_gb=lambda path: 500.0,
cpu_count=1_000_000)
values = {"bench_warmup": 2, "bench_frames": 4, "check_repeat": 2, "probe_timeout": 30,
"delays": (1,), "echo": False, **settings}
c = campaign.Campaign(self.paths, campaign.Settings(**values), host,
lock_path=self.tmp / "auto.lock")
so = core or self.cores[kind]
c.unit_cores = lambda *a, **k: [campaign.Core("fake", so, campaign.file_sha256(so))]
return c
def test_a_stand_in_is_proven_and_written(self) -> None:
c = self.passing("hle")
current = c.run(set(), None)
self.assertEqual(current.result, "complete")
records = [s.record for s in mr.read_records(self.root)]
isolations = {rep["isolation"] for r in records for v in r["variants"] for rep in v["repetitions"]}
self.assertEqual(isolations, {campaign.core_probe.SANDBOX})
kinds = sorted(r["subject"].split("-")[0] for r in records)
self.assertEqual(kinds, ["alias", "bench", "boot", "files"])
boot = next(r for r in records if r["subject"].startswith("boot"))
alias = next(r for r in records if r["subject"].startswith("alias"))
entry = yaml.safe_load((self.root / "emulators" / "fake.yml").read_text())["files"][0]
self.assertEqual(entry["hle_fallback"], True)
self.assertEqual(entry["evidence"], {"aliases": [alias["id"]], "hle_fallback": [boot["id"]]})
statuses = {(f["field"], f["status"]) for f in mr.read_campaign(self.root, mr.FINDINGS)}
self.assertEqual(statuses, {("hle_fallback", "applied"), ("required", "open"),
("aliases", "applied")})
runs = mr.read_campaign(self.root, mr.CAMPAIGN_RUNS)
self.assertEqual(runs[-1]["counts"]["done"], 4)
# The game is pinned by nobody but was not fetched by the campaign: kept.
self.assertTrue(self.game.is_dir())
# A second pass on the same core and profile runs nothing.
again = self.passing("hle")
self.assertEqual(again.run(set(), None).records, [])
# A new build of the core runs everything again.
rebuilt = self.build / "fake2_libretro.so"
shutil.copy2(self.cores["hle"], rebuilt)
with rebuilt.open("ab") as handle:
handle.write(b"\0")
third = self.passing("hle", core=rebuilt)
# BIOS.BIN is declared now, so no alias run follows the boot test.
self.assertEqual(len(third.run(set(), None).records), 3)
def test_no_stand_in_settles_required_and_finds_an_alias(self) -> None:
c = self.passing()
c.run(set(), None)
entry = yaml.safe_load((self.root / "emulators" / "fake.yml").read_text())["files"][0]
self.assertEqual((entry["required"], entry["hle_fallback"]), (True, False))
self.assertIn("BIOS.BIN", entry["aliases"])
self.assertEqual(sorted(entry["evidence"]), ["aliases", "hle_fallback", "required"])
alias = [f for f in mr.read_campaign(self.root, mr.FINDINGS) if f["field"] == "aliases"]
self.assertEqual(alias[0]["status"], "applied")
def test_a_hung_core_is_killed_and_the_pass_moves_on(self) -> None:
c = self.passing("hang", probe_timeout=2)
c.run(set(), None)
# The whole process group went with the run: no worker spins on.
left = subprocess.run(["pgrep", "-f", str(self.cores["hang"])], capture_output=True, check=False)
self.assertEqual(left.stdout, b"")
checks = c.state["checks"]["fake"]
self.assertTrue(checks)
self.assertEqual({entry["status"] for entry in checks.values()}, {"failed"})
self.assertEqual({entry["reason"] for entry in checks.values()}, {"timeout"})
self.assertEqual(mr.read_records(self.root), [])
def test_missing_content_leaves_the_checks_pending(self) -> None:
c = self.passing(romfetch=str(self.tmp / "no-romfetch"))
shutil.rmtree(self.game)
c.run(set(), None)
reasons = {entry["reason"] for entry in c.state["checks"]["fake"].values()}
self.assertEqual(len(reasons), 1)
self.assertIn("romfetch not found", reasons.pop())
if __name__ == "__main__":
unittest.main()
+112 -7
View File
@@ -11,12 +11,14 @@ import argparse
import contextlib
import io
import json
import os
import shutil
import struct
import subprocess
import sys
import tempfile
import unittest
import unittest.mock
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent
@@ -99,6 +101,13 @@ def mednafen_state(sections: dict[str, dict[str, bytes]]) -> bytes:
return b"MDFNSVST".ljust(32, b"\0") + body
def checkout(path: Path) -> Path:
"""A folder made the root of a git checkout, as --record requires."""
path.mkdir(parents=True, exist_ok=True)
subprocess.run(["git", "init", "-q", str(path)], check=True)
return path
class ParsingTests(unittest.TestCase):
def test_assignment(self) -> None:
self.assertEqual(core_probe.parse_assignment("a=b=c", "--option"), ("a", "b=c"))
@@ -154,6 +163,12 @@ class ParsingTests(unittest.TestCase):
self.assertEqual(described, f"{library.name} sha256:{core_probe.file_digest(library, 'sha256')}")
self.assertEqual(core_probe.describe_env_value("2000-01-01 00:00:00"), "2000-01-01 00:00:00")
def test_uniform_frame(self) -> None:
self.assertTrue(core_probe.uniform_frame(b"", 2))
self.assertTrue(core_probe.uniform_frame(b"\x01\x02" * 8, 2))
self.assertFalse(core_probe.uniform_frame(b"\x01\x02" * 7 + b"\x01\x03", 2))
self.assertFalse(core_probe.uniform_frame(b"\x00\x00\x00\x00\x00\x00\x00\x01", 4))
def test_cue_tracks(self) -> None:
with tempfile.TemporaryDirectory(dir=REPO_ROOT / "tmp" / "tests") as tmp:
cue = Path(tmp, "d.cue")
@@ -238,7 +253,7 @@ class FakeCoreTests(unittest.TestCase):
return code, json.loads(out.getvalue()) if code == 0 else None
def test_run_record(self) -> None:
record_dir = self.tmp / "records"
record_dir = checkout(self.tmp / "records")
code, record = self.probe(["check", "--core", str(self.core), "--frames", "3",
"--vary", f"card.bin={self.cards[0]}", "--vary", f"card.bin={self.cards[1]}",
"--vary", f"card.bin={self.cards[2]}", "--vary", "card.bin=",
@@ -262,11 +277,12 @@ class FakeCoreTests(unittest.TestCase):
self.assertEqual(first["frames"], 3)
self.assertEqual(record["emulator"], "fake")
self.assertEqual([p.relative_to(record_dir).as_posix()
for p in record_dir.rglob("*") if p.is_file()], ["measurements/fake.jsonl"])
for p in record_dir.rglob("*") if p.is_file() and ".git" not in p.parts],
["measurements/fake.jsonl"])
line = json.loads((record_dir / "measurements" / "fake.jsonl").read_text())
self.assertEqual(measurement_records.check_line(line), [])
# The line is the record the run printed, with its id.
self.assertEqual({k: v for k, v in line.items() if k != "id"}, record)
# The line is the record the run printed, id included.
self.assertEqual(line, record)
try:
from jsonschema import Draft202012Validator
except ImportError:
@@ -275,7 +291,7 @@ class FakeCoreTests(unittest.TestCase):
self.assertEqual(list(Draft202012Validator(schema).iter_errors(line)), [])
def test_second_run_is_appended_beside_the_first(self) -> None:
record_dir = self.tmp / "appended"
record_dir = checkout(self.tmp / "appended")
argv = ["run", "--core", str(self.core), "--frames", "1", "--no-trace", "--max-load", "1000",
"--record", str(record_dir), "--subject", "smoke"]
self.assertEqual(self.probe(argv)[0], 0)
@@ -307,10 +323,99 @@ class FakeCoreTests(unittest.TestCase):
self.assertEqual(record["flags"], [])
def test_busy_machine_refused(self) -> None:
refused = checkout(self.tmp / "refused")
code, _ = self.probe(["run", "--core", str(self.core), "--frames", "1", "--record",
str(self.tmp / "refused"), "--max-load", "-1"])
str(refused), "--max-load", "-1"])
self.assertEqual(code, 3)
self.assertFalse((self.tmp / "refused").exists())
self.assertFalse((refused / "measurements").exists())
def test_record_names_a_checkout_root(self) -> None:
# --record measurements wrote measurements/measurements/<emulator>.jsonl.
root = checkout(self.tmp / "rooted")
(root / "measurements").mkdir()
for wrong in (root / "measurements", self.tmp / "plain"):
wrong.mkdir(exist_ok=True)
err = io.StringIO()
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(err):
code = core_probe.main(["run", "--core", str(self.core), "--frames", "1", "--no-trace",
"--record", str(wrong), "--work-dir", str(self.tmp / "work")])
self.assertEqual(code, 2)
self.assertIn("not a git checkout root", err.getvalue())
self.assertIn("--record .", err.getvalue())
self.assertFalse((wrong / "measurements" / "fake.jsonl").exists())
self.assertIsNone(core_probe.not_a_checkout_root(root))
self.assertIsNone(core_probe.not_a_checkout_root(REPO_ROOT))
def test_the_core_sees_only_the_env_it_was_given(self) -> None:
os.environ["CORE_PROBE_TEST_TAG"] = "from-the-host"
os.environ["GITHUB_TOKEN"] = "secret"
try:
code, record = self.probe(["run", "--core", str(self.core), "--frames", "1",
"--no-trace"])
finally:
del os.environ["CORE_PROBE_TEST_TAG"]
del os.environ["GITHUB_TOKEN"]
self.assertEqual(code, 0)
rep = record["variants"][0]["repetitions"][0]
self.assertEqual(rep["logs"][1]["text"], "tag unset")
self.assertTrue(rep["isolation"] == "bwrap" or rep["isolation"].startswith("environment only"))
class Sandbox(unittest.TestCase):
"""What a core run under bubblewrap can reach: an allowlist."""
def setUp(self) -> None:
if not core_probe.sandbox_argv([])[0]:
self.skipTest("no working bwrap on this host")
self.tmp = Path(tempfile.mkdtemp(dir=REPO_ROOT / "tmp" / "tests"))
self.addCleanup(shutil.rmtree, self.tmp, True)
self.out = self.tmp / "out"
self.inputs = self.tmp / "inputs"
self.inputs.mkdir()
(self.inputs / "bios.bin").write_text("BIOS")
self.elsewhere = self.tmp / "elsewhere"
self.elsewhere.mkdir()
def inside(self, script: str, **kwargs: object) -> subprocess.CompletedProcess:
prefix, isolation = core_probe.sandbox_argv([self.out], [self.inputs], **kwargs)
self.assertEqual(isolation, core_probe.SANDBOX)
return subprocess.run(prefix + ["/bin/sh", "-c", script], capture_output=True, text=True,
check=False, env={"PATH": "/usr/bin:/bin"})
def test_nothing_of_the_user_or_the_checkout_is_reachable(self) -> None:
home = Path.home()
hidden = [home / ".config", home / ".ssh", home / ".git-credentials", home / ".netrc",
home / ".gitconfig", REPO_ROOT / ".git", REPO_ROOT / "scripts", REPO_ROOT / "bios",
REPO_ROOT / "emulators", self.elsewhere,
Path("/mnt/c"), Path("/root"), Path("/var"), Path("/etc/shadow"), Path("/opt")]
script = "; ".join(f'test -e "{path}" && echo "LEAK {path}"' for path in hidden)
# The checkout exists only as the path down to the bound folders.
script += f'; ls -A /mnt /tmp; ls -A ~ 2>/dev/null; ls -A "{REPO_ROOT}"; echo end'
proc = self.inside(script)
self.assertNotIn("LEAK", proc.stdout)
self.assertEqual(proc.stdout.split(), ["/mnt:", "/tmp:", "tmp", "end"])
def test_inputs_read_only_work_dir_writable(self) -> None:
proc = self.inside(f'cat "{self.inputs}/bios.bin"; echo; echo x > "{self.inputs}/bios.bin" 2>/dev/null '
f'|| echo refused; echo ok > "{self.out}/w"; echo no > "{self.elsewhere}/w" '
f'2>/dev/null || echo gone')
self.assertEqual(proc.stdout.split(), ["BIOS", "refused", "gone"])
self.assertEqual((self.inputs / "bios.bin").read_text(), "BIOS")
self.assertEqual((self.out / "w").read_text(), "ok\n")
self.assertFalse((self.elsewhere / "w").exists())
def test_no_network_unless_asked(self) -> None:
devices = "tail -n +3 /proc/net/dev | cut -d: -f1"
self.assertEqual(self.inside(devices).stdout.split(), ["lo"])
self.assertNotEqual(self.inside(devices, network=True).stdout.split(), ["lo"])
def test_a_probe_can_require_the_sandbox(self) -> None:
args = core_probe.build_parser().parse_args(
["run", "--core", sys.executable, "--require-sandbox"])
self.assertEqual([p for p in core_probe.validate_args(args) if "sandbox" in p], [])
with unittest.mock.patch.object(core_probe.shutil, "which", return_value=None):
problems = core_probe.validate_args(args)
self.assertIn("--require-sandbox: environment only: bwrap not found", problems)
if __name__ == "__main__":
+8
View File
@@ -19,6 +19,14 @@ the emulator's page shows a **Tested** block. Every result is on the
- It compares what the emulator showed, played or saved, by fingerprint (a hash).
- Each version runs at least twice, each time from a fresh start.
## When tests run
Tests run by themselves each night on an idle computer. A clear result updates
the emulator's page and names the test as proof.
Anything else waits on the [Measurements](../measurements.md) page for someone
to read the code.
## What a result says
- **same**: the file changed nothing that was compared.
+1
View File
@@ -601,6 +601,7 @@ does not look.
| `aliases` | alternate filenames for the same file |
| `mode` | `libretro`, `standalone`, or `both` |
| `hle_fallback` | true if a high-level emulation path exists |
| `evidence` | by field (`required`, `hle_fallback`, `path`, `aliases`), the ids of the records in `measurements/<emulator>.jsonl` whose runs settled it. Written by `campaign.py` from its rule table, never by hand |
| `category` | `bios` (default), `game_data`, `bios_zip` |
| `region` | always a list of territory slugs from the schema enum (`[north-america]`, `[japan, asia-ntsc]`). The region the code selects the file **for**, never the region of the dump. See step 3b |
| `region_check` | true if the core refuses to boot a game whose region does not match the BIOS |
+1
View File
@@ -58,6 +58,7 @@ Every module in `tests/`, by the area it guards.
| Handheld launchers | a pty as the console, fake installer and firmware tools, stubbed PortMaster dialogs | `test_handheld_launchers`, `test_port` |
| Running cores | parsers on fixed inputs, a libretro core built from C in the test when a compiler exists | `test_core_probe` |
| Measurement records | synthetic record files, the committed `measurements/` against HEAD | `test_measurements` |
| Real-condition campaign | synthetic profiles, records and content folders, a fake host for load, disk, clock and commands, and whole passes against a libretro core built from C when a compiler and strace exist | `test_campaign` |
| Automation runner, disk cleanup, asset sync and bit-flip repair | fake jobs, git repositories with a bare origin and session worktrees, a committed file with one bit flipped, canned CI runs in place of `gh` | `test_autorun` |
| Truth and native export | synthetic + cached originals | `test_export_counts`, `test_export_native_layer`, `test_export_report`, `test_exporters`, `test_truth_data_dir_readers`, `test_truth_diff`, `test_truth_layout` |
| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_availability`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_emulator_page`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_picker`, `test_site_platform_hashes`, `test_site_r2_components`, `test_site_r2_css`, `test_site_r2_emulators`, `test_site_r2_entry`, `test_site_r2_gate`, `test_site_r2_nav`, `test_site_r2_p0`, `test_site_r2_reference`, `test_site_r2_systems`, `test_site_r2_wiki`, `test_site_r3_collection`, `test_site_r3_components`, `test_site_r3_css`, `test_site_r3_emulators`, `test_site_r3_entry`, `test_site_r3_nav`, `test_site_r3_p0`, `test_site_r3_reference`, `test_site_r3_systems`, `test_site_r3_wiki`, `test_site_r4_components`, `test_site_r4_css`, `test_site_r4_emulators`, `test_site_r4_entry`, `test_site_r4_merge`, `test_site_r4_p0`, `test_site_r4_reference`, `test_site_r4_search`, `test_site_r4_systems`, `test_site_r4_wiki`, `test_site_r5_components`, `test_site_r5_css`, `test_site_r5_emulators`, `test_site_r5_entry`, `test_site_r5_reference`, `test_site_r5_search`, `test_site_r5_systems`, `test_site_r5_wiki`, `test_site_render`, `test_site_system_links`, `test_site_validation`, `test_site_weight`, `test_site_write`, `test_source_ref_targets`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_workflow_paths` |
+97 -4
View File
@@ -717,6 +717,7 @@ them is a reviewed commit.
| Load | Waits while the 1-minute load is above a quarter of the CPUs, up to `max_load_wait` seconds, then `deferred`. |
| Disk | Below the job's `min_free_gb` the job is `refused`. Under 100 GB free the `disk` alert is raised. |
| Retry | Exit 139 (or signal 11), `SystemError` or "unknown opcode" is run again once on an idle host. A second failure is a failure. |
| Environment | A step, gate or recomputation inherits `PATH`, `HOME`, `LANG`, `LC_*`, `TZ` and `TMPDIR`, the runner's own markers and the variables its `env:` key names. A name with `TOKEN`, `SECRET` or `PASS` in it, `GH_TOKEN` and the RomStation account are dropped even when named, and a step naming one is refused when the registry loads. `GITHUB_TOKEN` goes to the push, the `gh` calls that read CI, and a step marked `github_token: true`. The registry accepts that key only on `python scripts/check_freshness.py`, `python scripts/refresh_stale.py` and `python -m scripts.scraper.*` tracked in this repository, and never in the `campaign` job. |
| Double computation | Each `twice` entry recomputes an artifact the gate wrote and compares both, timestamps aside. A difference is recomputed once on an idle host, then the job fails with the `host-integrity` alert. |
Jobs that commit run in `.cache/autorun/worktree`, on the branch `autorun`,
@@ -739,13 +740,15 @@ until a green run on `main` follows.
State is `.cache/autorun/state.json`, logs are
`.cache/autorun/logs/<job>/<date>.log`, kept 30 days. A job's `report` key
names a JSON file one of its steps writes, and the runner keeps it in the
job's status. Exit codes: 0 for `ok`,
job's status. A report holding an `alert` raises the `job:<name>` alert
until a report without one. Exit codes: 0 for `ok`,
75 for `deferred`, 1 otherwise.
| Job | Schedule | What it does |
|-----|----------|--------------|
| `nightly` | 02:00 | `check_freshness.py --json` saved to a file, `refresh_stale.py --findings` on its `data` and `catalogs` rows, the MAME and FBNeo hash scrapers, then `pipeline.py --offline` as the gate. `database.json` and `install/*.json` are computed a second time and compared. Commits the hash profiles, the recipes and the regenerated records |
| `assets` | 04:30 | `sync_release_assets.py`, as a dry run |
| `campaign` | 06:00 | `campaign.py run --budget 150m` once the host is idle (up to two hours of waiting), gated by `campaign.py gate`. Commits the records, findings and pass line, then the profile fields the runs proved |
| `bios-integrity` | Sunday 08:30 | `bios_integrity.py --apply --json` in the main checkout, once the host is idle (up to four hours of waiting). Its report is kept in the job's status |
| `cleanup` | 05:30 | `cleanup_disk.py --apply --hours 72` in the main checkout |
| `disk-check` | hourly | `cleanup_disk.py --check`, without the lock |
@@ -845,7 +848,18 @@ python scripts/core_probe.py check --core core.so --content disc.cue \
```
Each repetition runs in a fresh process under `strace -f -e trace=openat,open`
when strace is installed. The files the core opened under the system
when strace is installed. The worker starts with an empty environment and
clears its own before it loads the core, keeping only the `--env` values.
When bubblewrap works on the host, the worker runs in it, built as an
allowlist: `/usr` and the `/lib*`, `/bin`, `/sbin` links, the files of `/etc`
the loader, fonts, TLS, the clock and user lookups read, all read-only. Home,
`/tmp` and `/mnt` are empty, the core, the content folder and the staged
system directory are read-only, and only the repetition's scratch folder is
writable. Every namespace is unshared, the network included, so nothing of
the user (`~/.config`, `~/.ssh`, `~/.git-credentials`) or of the checkout is
there to read. Each repetition names what it ran under in `isolation`
(`bwrap`, or `environment only` with the reason), and `--require-sandbox`
refuses to run without it. A timeout kills the worker's whole process group. The files the core opened under the system
directory come from the kernel, each hashed again after the run. Without
strace the record says that tracing was unavailable.
@@ -863,7 +877,8 @@ strace the record says that tracing was unavailable.
| `--state-var SECTION.VAR` | a variable of a Mednafen save state, as an observable |
| `--state-dir` | keep the save state taken at the end of the first repetition |
| `--core-repo`, `--core-commit`, `--build-command` | where the core build comes from, copied into the record |
| `--record [DIR]` | append the record as one line of `measurements/<emulator>.jsonl` in the checkout `DIR`, by default this one. Commit it |
| `--core-artifact URL` | where a downloaded `.so` came from, such as a buildbot nightly, copied into the record |
| `--record [DIR]` | append the record as one line of `measurements/<emulator>.jsonl` in the checkout `DIR`, by default this one. `DIR` must be the root of a git checkout, never its `measurements/` folder. Commit it |
| `--emulator` | the profile the record is filed under. By default the profile whose `cores:` names the `.so`, else the core's library name |
| `--subject` | a slug naming the test, shared by its reruns. By default derived from the claim and method, or from the inputs of a run or bench |
| `--supersedes ID` | the id of an earlier record of the same emulator this one corrects |
@@ -873,7 +888,8 @@ strace the record says that tracing was unavailable.
Observables are `frame_sha1` (last frame), `video_sha1` (every frame, chained),
`audio_sha1`, `state_sha1` (save state at the end), plus `state:SECTION.VAR`
and `frame_hashes` when asked for. A repetition that disagrees with the first
and `frame_hashes` when asked for, with `uniform_frames` (the sampled frames
of a single colour) beside it. A repetition that disagrees with the first
one is flagged. A `check` reports `inconclusive` instead of a comparison when,
in any variant, the compared observable differs between repetitions, a run did
not load, or a file changed during the run. A disagreement on another
@@ -905,6 +921,8 @@ and a gzip data file, then merged back into one line. Each keeps its first
id, which hashes the first file (`migrated_from_version: 1`), so the line
still proves it rebuilds that file. Two branches that each add a line
merge cleanly: `.gitattributes` marks `measurements/*.jsonl` `merge=union`.
`findings.jsonl` and `campaign-runs.jsonl` sit beside the records under the
same rules, written by `campaign.py`, and no profile takes those names.
`generate_site.py` compiles the records into files it never commits
(`sitemeasurements.py`): `public/data/measurements/index.json` (one item per
@@ -916,6 +934,81 @@ emulator. A permalink names the last commit that touched `measurements/`, and
the build warns when the records on disk differ from that commit. Rows are
sorted and nothing reads the clock, so two builds give the same bytes.
### campaign.py
Runs the real-condition campaign with nobody watching: for each emulator
profile in scope it gets the core and the test content, runs `core_probe.py`,
applies what the runs prove and queues the rest. It is a thin layer over
`core_probe.py`, the libretro buildbot and romfetch. RetroArch's
`--max-frames` and libretro.py were the other candidates: neither traces the
files a core opens nor writes a record.
```bash
python scripts/campaign.py run --system sony-playstation --budget 6h
python scripts/campaign.py run --only beetle_psx,swanstation --dry-run
python scripts/campaign.py run --commit --commit-every 10
python scripts/campaign.py status # done, failed, pending, and why
python scripts/campaign.py findings # what waits for review
python scripts/campaign.py gate # the checks behind a commit
python scripts/campaign.py install-timer # the autorun units, the campaign's among them
```
| Step | What happens |
|------|--------------|
| Core | The x86_64 Linux nightly from `buildbot.libretro.com`, for each name of the profile's `cores:` the buildbot publishes, downloaded again only when its `ETag` or `Last-Modified` changes. The record keeps the artifact URL, the `.so` sha256 and the `retro_get_system_info` version. With no nightly, the profile's `source_commit` is cloned and built once with `make` (`Makefile.libretro` first), the failure kept so it is not tried again for that commit. Host git only fetches into bare mirrors (`.cache/campaign/mirrors/`), one per repository, submodules included, that it alone touches: no working tree, never bound into a sandbox, and earlier working-tree clones are deleted. It runs with no user or system config, https as the only transport, and `-c` overrides emptying hooks, `core.fsmonitor`, `core.sshCommand`, `core.gitProxy`, credential helpers and every filter driver the mirror's config defines. The commit and each submodule at the commit its tree records are exported with `git archive` into a fresh folder, and `make` runs there in the same bubblewrap sandbox as a core, that folder the one writable path. The core copied out is the newest `*_libretro.so` that is a regular file inside that folder, opened without following links. The record's `build_command` says which isolation was used. A standalone emulator is `pending: standalone` |
| Content | Each system's games come from `tests/campaign/content.yml`, by catalog name and with the reason each was chosen. They are read from `.cache/test-content/<romfetch system>/<name>/`, each file checked against its `identity.json`. Missing content is fetched with `romfetch get <system> <name> --json` when romfetch is on `PATH`, in `RETROBIOS_ROMFETCH` or given with `--romfetch`. Otherwise the checks are `pending: content`, with romfetch's exit code and error code when it failed. Content never enters git, and a record keeps only its identity |
| Checks | `files` stages every declared file the collection holds and reads which ones the core opens (strace). `boot` runs the game with no file and with the declared one (`boot_file:`, else the entry of the game's region). An entry the `files` run left unread is staged `alone`, then where the core looked for it (`path`) and under the names it looked for (`alias`). `variants` runs each `.variants/` copy of a file the core opened. `bench` times the game, warm-up excluded, 5 repetitions |
| Rules | `campaign_rules.py`, a fixed table of pure functions (below). A field the table settles is written into the profile, with `evidence:` naming the record ids. Anything else is a line of `measurements/findings.jsonl` |
| Content reuse | A game stays on disk until the last emulator that needs it in the pass is done, then the campaign deletes it if it fetched it. Past `--cache-cap-gb` (default 20) the least recently used goes first. An entry marked `pinned:`, or one the campaign did not fetch, is never deleted |
| Observable | Field | Written |
|------------|-------|---------|
| Without the file, at least 2 screens the run with the file also shows (single-colour frames left out), in every repetition | `hle_fallback` | `true` |
| Without the file, no repetition loads the game or shows more than one colour, while the run with it reaches the game | `required`, `hle_fallback` | `true`, `false` |
| The core opened the file staged at another place it looked for | `path` | that path |
| The core opened the file staged under a name no entry declares | `aliases` | the name added |
| A staged file the game's region uses, never opened, staged alone either | nothing | flagged |
| Anything else (runs that disagree, a profile that says `required: true` for a file the core boots without) | nothing | open finding |
A run that agrees with the profile adds its record id to `evidence:` and
resolves an open finding of the same field. The profile is edited as text and
the edit is refused unless the result parses to the same profile with only
those fields changed.
State lives in `.cache/campaign/state.json` of the main checkout: each check
is `done`, `failed` (with the reason and its log) or `pending` (with the
reason), with the core sha256 and the profile digest it ran against. A pass
skips a check that is done or failed against the same core and profile, so it
takes new nightlies, changed profiles, newly fetched content and pending
checks. The campaign's own `evidence:` writes do not count as a profile change.
| Guard | Rule |
|-------|------|
| Lock | The host-wide autorun lock. Under the `campaign` job, autorun holds it and says so with `RETROBIOS_AUTO_LOCK_HELD` |
| Environment | `core_probe.py`, git and `make` get autorun's allowlist, romfetch the same plus its `ROMFETCH_*` settings. None sees a token or a password |
| Sandbox | Fails closed: without a working bubblewrap the pass is `refused` (exit 3) and nothing third-party runs, every probe is started with `--require-sandbox`, and a build is refused. `--allow-unsandboxed` overrides. Under autorun the refusal raises the `job:campaign` alert |
| Load | Before each run, waits while the 1-minute load is above a quarter of the CPUs, up to `--max-load-wait` seconds, then the pass stops as `paused` |
| Disk | Below `--min-free-gb` (default 30) the pass stops as `paused` |
| Budget | No check starts after `--budget` |
| Timeout | A run is killed after 900 seconds per repetition and variant, recorded `failed: timeout`, and the pass moves on |
| Crash | A run that dies is tried 3 times, then `failed` with its log |
| Network | Buildbot and romfetch source errors are retried after 10, 60 and 300 seconds |
Each pass appends one line to `measurements/campaign-runs.jsonl`: when it ran,
how it ended, the checks done, failed and pending by reason, the records and
the findings it added. Logs are `.cache/campaign/logs/`, kept 30 days.
`--commit` commits the records, findings and pass line in one commit, and
each changed profile in its own, behind `campaign.py gate`: the measurement
and campaign tests, `validate_schemas.py --source-only`, then `verify.py
--emulator` and `generate_pack.py --emulator` for each changed profile. A file
that had uncommitted changes before the pass is left alone. The nightly
`campaign` autorun job (06:00, after `nightly`) runs a 150-minute pass in the
automation worktree, gates it with `campaign.py gate` and commits with its
own rules, pushing only with `--push`.
Schemas: `campaign-finding.schema.json` and `campaign-run.schema.json`.
### Other tools
| Script | Purpose |