2026-09-07 - The futex and the stack attributes stop being census entries

Two behavioural sections for the sibling emulator's open threading premises, both promoted out of the census into real calls. Documented in docs/decisions/D322 and docs/backlog/024.

What was added

Five names moved from the census to platform.h, imports.c and the @called-elsewhere block: scePthreadAttrGet, scePthreadAttrGetstackaddr, scePthreadAttrGetstacksize, sceKernelSyncOnAddressWait and sceKernelSyncOnAddressWake. The OBS_SURFACE_SYNC_ON_ADDRESS group held exactly those last two and is gone; the sized variants in ..._ADDRESS2 stay censused. 239 -> 246 checks, 48 -> 50 sections, 39532 -> 39527 symbols.

Every check was made to fail before being believed

make host passes all seven. That is the weaker half of the evidence; each was then broken on purpose:

break result
the host wake does nothing wake-releases-a-waiter failed naming the state the worker stopped in; compare-width skipped; the run finished
the host compares 32 bits compare-width reported 32 and recorded the worker's release
the address is the stack's top address-is-the-base reported a top
the region contains no frame address-is-the-base failed, naming the address

The first of those is the one that matters most: it proves a platform whose futex never returns costs one worker thread and not the run, which is the entire safety argument for calling a blocking function at all (D322).

Surprises

What is owed

The hardware run. Both sections are assumed/derived until a console produces the records docs/backlog/024 lists, and the futex's third register - a timeout in an unestablished unit - is deliberately not declared and not probed.