The emulator toolkit, and what the first run through it found

The emulators now live in <emulators> - binaries and fourteen shallow source clones - with the run scripts defaulting there (D054). They were in the session scratchpad, which is transient by design; that they survived at all was luck.

docs/EMULATORS.md says what each is and what it is good for. Seven PS4 emulators, two PS5, five format and symbol references.

ps4libdoc gave the hash an independent confirmation

42,010 established names and 1,130,742 unrecovered identifiers. Feeding the names to crack as candidates, with our own harvested corpus as the known set:

# candidates 42010
# generator  reproduced 388 of 389 known pairs
# recovered  0 of 1130742

388 of 389 is agreement. The single name we have and they do not is sceAgcCreateShader - AGC is the PS5 graphics API and that is a PS4 database, so its absence is the expected result rather than a disagreement (D055).

Worth sitting with: this chain began with one published pair. It now agrees with a large independent corpus on every shared name.

recovered 0 is also the expected answer - those NIDs are exactly the residue these names could not crack. That file is a target list for a candidate generator, which is still the piece deliberately not built.

The database carries no library association, which is what stops its 8,572 vendor names from being a census expansion. An import with no library resolves to nothing.

A check of mine that a stub could pass

037-math/inverse-trigonometry passed under shadPS4, and the pass was worthless. Every value it asserts is zero - tan(0), asin(0), acos(1), atan(0), atan2(0, 1) - because zero is the only exact answer those have. A function returning zero to everything satisfies all five.

This is the exact failure 007-responsive exists to prevent, committed inside a value check where that section could not see it. The check now also requires that two differing inputs produce differing answers, which is the responsiveness argument applied in place.

It still passes, and now that means something.

Twenty-seven responsiveness probes added for everything promoted in D051, split across the two verdicts. All answer on glibc, which is what makes a silence under an emulator evidence rather than a guess.

What shadPS4 0.18.0 actually implements

574 records, complete. 60 pass, 5 partial, 34 fail, 7 skip.

Thirty-three of fifty-five C library functions are silent - they return the same value to inputs whose answers must differ, which is a stub rather than a wrong implementation:

strspn toupper tolower isdigit isalpha abs labs atoi atol wcslen strstr strcspn strtol strtoul atoll strtoull llabs strncasecmp sprintf sqrt fabs floor ceil fmod round trunc log2 floorf ceilf fmodf strtod strtof

Twenty-two answer:

strlen strcmp memcmp strncmp strchr pow sin cos exp log log10 tan asin acos atan atan2 powf expf logf sinf cosf tanf

The split is stranger than "the maths library is missing". pow, sin, cos, exp, log, log10 and every inverse trigonometric function work; sqrt, fabs, floor, ceil, fmod, round and trunc do not. log and log10 work and log2 does not. That is not a layer being absent, it is a list somebody has been working through.

This is what the failures above were. "round(2.5) is not away from zero", "llabs is wrong", "strtod("2.5") is wrong" - every one of those functions is silent, so the finding is unimplemented, not incorrect. They need opposite work, and without the responsiveness verdict the report could not tell them apart. Reading the two together is the whole design.

All 262 census symbols resolved. Every one. Presence and implementation are not the same thing, and this run is the clearest demonstration of it the project has produced: 262 symbols present, 33 of the 55 tested behaving as stubs.

A lead worth following: there is no heap

malloc returns null, so calloc, realloc and strdup all skip on a missing capability. Four checks lost to one cause.

The toolchain we now have locally suggests why. OpenOrbis-PS4-Toolchain declares extern uint64_t sceLibcHeapSize and its documentation calls it "maximum heap size libc can use" - a global the runtime is expected to set, with a note that homebrew historically had to because the default cap was small.

Not acted on yet, and it should not be guessed at: whether that global is what shadPS4 reads, and whether a module is meant to define or import it, are two different questions and getting either wrong produces a module that loads and misbehaves. But this is the first concrete lead on the heap, and it came from a repository cloned an hour earlier - which is the argument for having them.