Why the full probe took the console down, and the guard that was missing

Measured offline while the console was being re-jailbroken, which is the right place for it:

$ selfish-container --example tag_diff -- build/eboot.bin
   import libs 352, needed modules 352, DT_NEEDED 352

352 DT_NEEDED. A system loader finds and loads every one of them before a single instruction of ours runs. A title gets six, measured from the dynamic-library list of the minimal run that worked. That is why there was no crash report: it died inside the loader, before EXEC, so there was nothing left to report from. (D226)

The guard existed and was at the wrong layer

Every platform symbol is OBS_WEAK and address-checked before it is called, and that is exactly why the probe survives a missing function. It cannot survive a missing library, because linkage happens before the program exists. Nothing had noticed that the whole guarding strategy has a floor under it.

EBOOT_LIBS now fails the eboot build rather than the console. It does not claim to know what a title can load - data/obscene-report.txt says all 352 are "present", which is true of whatever loader wrote it and is not evidence about a game process. The gate refuses to silently require hundreds, and that is all it should do.

Two hypotheses killed offline before spending hardware on them

And the report had nowhere to go anyway

Every output channel wrote to a descriptor, and a title has no parent holding one. sceKernelWrite to standard output returns the byte count and discards - the undetectable success the file's own comment warned about, arriving from an unexpected direction. The report now goes to the system log first. (D225)

So a run that dies is now legible, and a build that would die does not get made.