DuckStation (bios.cpp:208, 397-427), SwanStation (host_interface.cpp:
136-194), rustation (lib.rs:107-160), FS-UAE (rommgr.cpp:92-151),
ares (firmware.cpp:116-136) and Altirra (uifirmwarescan.cpp:29-113)
scan a folder and identify firmware by hash; Ymir does in its
standalone build only. FS-UAE still opens rom.key by name
(rommgr.cpp:1397-1498). The export then stops writing their labels
into platform lists: Batocera's psx block goes from 106 entries to 10,
and System.dat's scph5000.bin keeps its own hashes.
Ymir standalone identifies an IPL by its XXH128 with seed kIPLHashSeed (memory_defs.hpp:10) against ipl_db.cpp:9-17. Each image's digest was recomputed with that seed and falls on the cited row.
The standalone build loads it from the working directory then the profile root (app.cpp:5084-5119). The release packages ship it, the libretro tree never reads it.
Profiles, the wiki, comments, docstrings, command output and schema descriptions carried em-dashes, clause-joining semicolons, unicode arrows, box-drawing banners and check-mark glyphs. Each sentence was rewritten rather than having its character swapped. Hashes, paths, source_ref values and every cited file:line are unchanged, which a comparison of each parsed profile against the previous revision confirms.
validate_pr comments now say PASS and FAIL in words, and source_ref values in a profile's structured blocks render as code. test_prose_style fails if any of these comes back, in tracked files or in the generated site.