D472 - Published interfaces are ported in bulk; only vendor code is found one wall at a time

measured - 2026-09-02 (user-directed: "stop wasting time incrementally against known public code")

The criticism, and it is correct

Three sessions running, the loop has worked like this: run a title, see where it dies, implement the one function it died on, run again. That is the right method for a function whose behaviour nothing documents. It is the wrong method for setenv.

Both walls hit today were in the second class. _Getpctype (D468) and setenv are C library functions with published specifications, and each cost the better part of a session to discover - discovery being the expensive part, since writing them is an afternoon. Nothing about running the guest was needed to know they would be wanted: the import list is knowable before execution, and principle 7 is the reason it is (interception is linking, not hooking, so every import is in the table before anything runs).

What the inventory actually says

orbistoun-cli worklist --static-gap, over the seven modules in titles/:

needed missing
documented - write in bulk, no guest needed 711 452
the title's own modules - load, do not implement 1 1
vendor - the guest is the only oracle 29,633 29,487

plus 7,333 imports with no name yet. The documented gap is libScePosix 281 and libc 171, and it is a finite, enumerable, mechanical job: the specification is the oracle, so each one can be written and tested without any guest reaching it.

Three origins, not two

The distinction is now a type - orbistoun_hle::origin::Origin - because two of its three answers are not "write it":

The symbol is consulted as well as the library, because libc is not uniformly documented: the platform's own allocator (sceLibcMspaceMalloc) lives in there, and being in a documented library does not document it.

Why the existing tooling hid it

worklist totals the call traces, and says so in its own help: "A static import dump says what a module might call; this says what it actually did". That is a fact about runs that have happened, so it ranks the busy things already implemented and cannot mention a function no run has reached. The static gap is the counterpart, not a replacement - both questions are real, and only one of them can be answered before the guest gets there.

What changes

Documented work is now taken in batches by family - string/memory, atomics, C11 threads, stdio, math, C++ ABI - each tested against its specification. Vendor work stays wall-driven. The next wall after _Getpctype was TitleOwn and therefore not a shim to write at all, which is the clearest possible illustration of why the distinction had to exist.