D589 - Delivering the file the asynchronous path resolved changes nothing

Status: measured Date: 2026-09-08

The experiment, and why it was worth running

D587 established what PPSA03416 asks the asynchronous file path for - /app0/Media/globalgamemanagers, one command buffer, one submit, one wait - and that answering all three with success changes nothing. The reading that fit was that the guest wants bytes rather than a status: the Apr read fails, the title falls back to LocalFileSystemPS5::Enumerate (which prints its own TODO: marker), the enumeration finds nothing, and a singleton is never constructed - which is the null the run dies on.

That reading is testable. ORBISTOUN_APR_DELIVER reads the resolved file into the buffer the command header names, and the guest grades it.

orbistoun: delivered 224748 byte(s) of /app0/Media/globalgamemanagers into 0x740009200000

It does not move

distinct imports
baseline 193, 193, 193
delivering 192, 192, 193

Three runs each, because one is not a measurement. The first delivering run reported FURTHER, and it was the 192-to-193 drift Step::CheckRepeats already measures (D583) landing the convenient way round - the same trap this session has now fallen into twice and caught twice. The fault is identical, byte for byte, in every run.

So the guest does not consume the bytes. Either the buffer is not where it expects them, or the wait has to signal completion some other way - libSceAmpr exports sceAmprCommandBufferWriteKernelEventQueueOnCompletion, which suggests completion is reported through an event queue rather than a return - or the whole reading is wrong.

This does not withdraw D587, which established what is asked. It withdraws the inference that supplying it is what the title is waiting for.

What the experiment is worth anyway

It converts a guess into a closed question. Before it, "the guest needs the bytes" was a sentence in a worklog that would have been repeated until somebody tried it. It is now a measurement, and the next reading has to explain why the bytes did not help.

The apparatus stays because it is where a corrected reading gets tested: a different buffer, a different completion signal, a different file all reuse it.

Two things it had to be built honestly to say

It intervenes, and the report says so. Declared Effect::Intervenes, and also carried in Experiments - the second half is the one that gets forgotten. A diagnostic the conditions record does not know about produces a verdict with no caveat beside it, which is the entire failure needs_caveat exists to prevent (D569). Without it the run printed same with nothing saying the run was propped.

The reader is installed from above. These are file operations under the libkernel name, and orbistoun-kernel and orbistoun-fs are sibling subsystems - the relation that kept the clocks out of orbistoun-libc and put them in orbistoun-hle (D536). Splitting libkernel across two crates is the alternative, and a library with two owners is a new concept rather than a new function. So orbistoun-worker, which owns both, installs the reader, and the kernel calls through a hook - the inversion on_guest_stop already uses (D160).

What this does not establish

That the buffer is not the destination. It establishes that filling it does not change what the guest does. A guest that never looks and a guest that looks and rejects are the same result here.

Nor that the file is the right one. The path comes from the last resolve call, because the command storage is empty and names nothing. A title resolving several would get whichever was last, and this one resolves exactly one.

Nor anything about LocalFileSystemPS5::Enumerate. The fallback story is still the reading that fits and is still unmeasured; what this rules out is the step before it.