D658 - What the guest said

Status: measured Date: 2026-09-09

The one signal that arrives already interpreted

Every other thing a run produces has to be reasoned back to a cause: a fault address, an import count, a thread that stopped calling. Each of the last six walls took a measurement, a request to another project, or both.

A guest that is failing usually says so. Engines log their own boot and write a diagnosis before they die, and that text needs no interpretation at all - it is the cause, in the guest's own words. D186 used this once, by hand: two titles printed diagnostics through an implemented printf and reading them named four functions. Nothing made it systematic, so nobody looked again.

Generic by construction, not by effort

The obvious version of this is an engine-specific log reader, and it would be worthless: written for one engine, rewritten for the next, and useless on a homebrew payload.

The capture point is the platform ABI instead - the C library's format family (printf, sprintf, snprintf), the console's sceKernelDebugOutText, and writes to the standard descriptors. That is the one thing every guest on this target shares whatever it was built with. Six call sites, no knowledge of any engine, and a printf from an open-toolchain payload lands in the same ring as a commercial engine's own logger.

It captures what the guest formatted or wrote, deliberately broader than what it printed. A message formatted into a buffer and handed to a write path this project does not implement has still been said - and that is exactly the case worth seeing, because the message survives even when its channel does not.

Bounded and allocation-free

A fixed 64 KiB byte ring, written under a lock, read once the guest has stopped. Recording must not allocate (principle 9), and an unbounded log is a log that changes the program it observes: a guest printing in a loop would take the process down before the run ended. The ring keeps the most recent bytes, because a guest describes its problem immediately before it stops.

One display decision, stated as one: an utterance that does not end in a newline gets one, because a printf without a trailing newline is still a separate thing the guest said. Without it the first run produced Argument Count = 1Arg 0 = ... - two statements read as one, and 121 formatted messages collapsed into five lines.

It is not classified, and that is deliberate

It would be easy to hunt for "error" or "fail" and put those lines first. That is a heuristic dressed as a diagnosis, and this project's rule is that a message naming a cause comes from the branch that determined it. Nothing here determined anything. The guest's words are shown in the guest's order, and the reader draws the conclusion.

What it said immediately

PPSA25872, whose wall four decisions have been about:

[libil2cpp] sceAppContentInitialize returned 0x7fff0001

The engine names the function and quotes back orbistoun's own Unimplemented placeholder. It then enters the diagnostic dump that image+0x17554a3 faults inside. REQ-20260909T2145Z-9e52 had already asked obSCEne about that function on the reasoning that a title unable to initialise its app content has something to report; this turns that from a ranked guess into the guest saying it outright.

And PPSA02664, which had never been read at all:

outbuffer 0_8640KB … 1_8640KB … 2_8640KB … 3_2560KB … 4_192KB
todo: sceVideoOutInitializeOutputOptions will be available in a future SDK
path /app0/Media/globalgamemanagers is not considered suitable for apr reads
TODO: virtual bool LocalFileSystemPS5::Enumerate(...)
todo: void GfxDevicePS5SharedData::CreateWorkload()

Three 8.6 MB display buffers allocated, video-out options attempted, Unity's own boot asset read, and the graphics device creating its workload. This title is further toward a first frame than the one the last week of walls has been about, and nothing in a fault address or an import count said so.

What changes because of it

The ranked findings answer what to implement. This answers where the guest thinks it is, which is a different question and the one that was missing. Both go in the report; neither replaces the other.