D427 - The GPU subsystem starts at the command builders: a PM4 writer, and the two dispatch calls

measured - 2026-09-01 (user-directed)

The remaining conformance gaps were subsystem-scale, and the GPU is the project's core and biggest lever, so this starts it - at the smallest honest place. 165-gnm probes libSceGnmDriver's command builders: sceGnmDispatchInitDefaultHardwareState and sceGnmDispatchDirect, which write PM4 packets into a caller's buffer and touch no GPU. orbistoun already had the read side (packet::walk decodes a submitted buffer) but no write side and no implementations() for the module - the whole of libSceGnmDriver was declared and stubbed.

Added packet::build, the write side of the walker, sharing one header format so a packet built walks back to the packet it stood for (a test pins exactly that). sceGnmDispatchDirect writes the documented five-dword DISPATCH_DIRECT packet (mesa's PKT3_DISPATCH_DIRECT = 0x15, the dims, and the dispatch initiator) and answers 0; sceGnmDispatchInitDefaultHardwareState reserves 0x100 dwords and returns that, filling them with valid no-op packets - honest placeholder for a default state no lawful source here documents, so a guest's submission walks cleanly and the count it trusts is backed by real dwords rather than the D125 nothing. The submit and flip calls stay declared-only: they are where Vulkan translation begins, and a stub claiming a frame was submitted is the exact plausible output this crate exists first to refuse.

Both checks pass, where they were partial (a stubbed placeholder). dispatch-init matches hardware exactly (0x100). dispatch-direct passes with measure 0x5 where hardware writes 0x6: the console's builder emits one dword more than the documented packet, and matching the count by guessing what it is would be the invention principle 3 forbids - so orbistoun writes the packet it can cite and the one-dword difference stays unmodelled, inside a pass. gpu tests (26) + clippy clean; tally 516 pass / 8 partial / 4 fail / 15 skip. The subsystem is started: a builder to write PM4, a walker to read it, and the first two calls that hand a guest a command buffer - the submit→walk→translate path is the work from here.