D328 - a pending status, and peripheral probes that wait for their input rather than failing

assumed - 2026-09-08

oops-sdk needs a set of measurements only hardware can give: the controller read's record stride, which buttons arrive on which bits, the stick and trigger raw ranges, the keyboard and mouse record layouts, the audio format selector and blocking behaviour, and the video attribute block. Most of these need a peripheral attached and, for some, a button pressed while the probe watches. A probe that needs a controller and finds none has not failed and has not skipped - it is waiting. This records the status added for that, and the probes built on it.

The status

OBS_PENDING (pending on the wire) is a fifth-and-a-sixth outcome beside pass/partial/fail/ skip/crash. It means the check can run but was not given the input it needs. It is never blocking and never fatal: the check samples its window, finds nothing, and reports that it is still waiting; a re-run with the peripheral attached or the button pressed produces the real result.

It is distinct from skip, which says the check does not apply here (a library absent, a prerequisite unmet). pending says it does apply and an input away from an answer, so it is worth seeing apart from a skip and does not count against coverage the way a skip does. In the severity order it sits crash < pending < skip < fail < partial < pass - unresolved like a skip, but carrying an action rather than a dismissal.

The report contract gains it the way crash was added (D325): a trailing pending field on the tally and section tally (a pre-pending parser reads it as zero), a pending status row, and the tooling's enum, colour (cyan) and marker (PEND). Principle 1 is untouched - a PENDING res follows its try normally, because the call did return; it just returned without the input.

The probes

All call their functions as imports so they run in every leg (the earlier out-param probes went through dlsym and skipped on a native eboot). Where the peripheral or the input is absent, the result is PENDING. Four census names became callable for this - scePadRead, sceAudioOutGetPortState, sceAudioOutOutput, sceAudioOutSetVolume - moved to @called-elsewhere with declarations in platform.h and entries in imports.c.

Reporting

A peripherals record is emitted once per run - pad, keyboard, mouse, audio, each opened and closed at run start - so a peripheral probe's PENDING (or a zero extent) reads as "nothing plugged in" rather than a defect. The SDK poll probe now dumps its raw record, not only the button word, so a pass carries the bytes a later layout question will need. Every probe keeps all three legs, because the app-versus-eboot split is itself a finding.

Left for later

The event-queue flip-wait shape (32- vs 64-bit timeout timing) needs the libkernel equeue symbols, which are not yet on the surface - a census move of their own, deferred rather than stubbed as a permanent skip. The full visual-flip tear/duplicate observation is the PENDING 080-video/visual-flip until it is run in a context built to hand the probe the display.