D128 - 30,610 names mined from seven emulators. The hash reproduces 30,137 of them, and every exception is the source's naming, not the hash

Status: derived - by comparison against every identifier the toolkit publishes.

scripts/mine-nids.py reads seven emulators in six formats and produces data/mined-names.txt: every symbol name any loader in the toolkit knows, with the identifiers it claims.

source rows
fpPS4 ps4libdoc.pas 78,372
shadPS4 LIB_FUNCTION 5,174
PS5PCEM Zig tables 1,496
SharpEMU 1,190
craziiEmu 945
GPCS4 899
ChonkyStation4 507
ps4libdoc known_names 22,382

30,610 unique names, 22,944 corroborated by two or more independent sources. obSCEne knows 564 and 530 of those appear here, so the surface would grow 54-fold.

The hash, checked against all of it

30,137 match. 473 do not, and none is a hash failure:

So the corroboration is now seven-way and spans both generations.

Two things that must happen before any of this is ingested

A name that does not hash to a claimed identifier must not enter the surface. It would make obSCEne import a symbol that cannot exist - harmless, since an unresolved import is reported absent, but 250 rows of noise in a census whose value is that its absences mean something. The miner needs to check each row against the hash and mark it.

25,320 of the 30,610 have no library attribution, because only three of the seven sources publish it. That matters for obSCEne's own answer and not at all for supplying identifiers to a name search - the two goals want different things from the same corpus.

The number that reframes the exercise

ps4libdoc carries 1,130,742 identifiers observed in real modules with no known name, against the 30,610 names collected here. 2.64%.

Mining every emulator in existence still leaves 97% of the observed surface nameless. The named set is the rounding error; the unnamed identifiers are the interesting half, and obSCEne can import those directly because the import is the identifier and the name only ever existed to compute it.