507. create-shader succeeded on hardware, and the fill is held for the object model

2026-09-11 - loop, on obSCEne's 20260910-214758-eboot.obs.log (operator pointed me at it)

The shader wall's missing piece - measured. And a deliberate decision not to implement it yet.

The breakthrough

obSCEne's Phase-6 sweep called sceAgcCreateShader with a retail argument shape (not the synthetic well-formed shape that refused with 0x8a6c002f, worklogs 505/D565) and it succeeded:

This is exactly what worklog 505 named as the blocker: "the fill needs measuring." It is now measured, on real hardware, by obSCEne calling the actual library - external oracle, the safe kind. Recorded on the sceAgcCreateShader knowledge entry, known_by = measured.

Why it is not implemented yet - a new mechanism, and a moving target

Implementing it is not a shim. A handler is fn(args) -> rax and can only write guest memory it is handed an address to (how the Gnm builders and pad-reads fill guest-supplied buffers). sceAgcCreateShader must produce an object: arg0 is a pointer-to-pointer (D556), so the call allocates a region, writes its pointer into *arg0, and populates it. Nothing in orbistoun produces guest-resident objects, and the current contract cannot. Doing it needs either a richer handler contract or a reserved shader-object region in the address map - and the latter touches the loader/mem setup denied to this session.

Two unknowns compound it: the object's size and where it lives (driver-heap vs guest-adjacent) are unmeasured, and the operator's own oops-sdk is actively driving obSCEne into 3D/Phase-6 (sceAgcDriverCreateQueue, SET_CONTEXT_REG, shader stage differentiation) - so the object's shape is still moving under any implementation.

Decision: B then A (operator-chosen)

This keeps to the session's through-line: build against obSCEne/hardware (external truth), never against our own apps (the home caution earlier today), and flag a new mechanism rather than assume it.

Housekeeping

Next