The surface generator had stopped working, and nothing was watching

obscene-tool surface replaces gen-surface.py, and the port found the generator already broken: it refused its own definition. Ten names had been promoted to platform.h over time - seven networking calls and this morning's three mutex-attribute ones - and each was removed from surface.h and added to the refusal list while staying in the generator's own group list. Running it printed scePthreadMutexattrInit is declared in platform.h and cannot also be censused and wrote nothing.

Nobody knew because it was never gated. verify.sh gates it now, which is the part that matters more than the port: a generator whose output is committed and whose input nobody runs is a generator that has already diverged, you just cannot see it yet.

The committed header also carried a note the generator never had. A four-line comment explaining that the networking names moved to platform.h was hand-added to surface.h, so even a working generator would have deleted it. Restored into the data file, where it belongs.

The definition moved to data/surface.txt for the same reason the GPU table did: seventeen groups, several pages of prose and 371 names are data, and retyping data into a new language is how a transcription error gets into a census. surface.h now regenerates byte-for-byte.

Getting there took three formatting corrections, all of the same kind - whitespace nobody can see is still content. A blank line between a note and its macro; a trailing newline on a prose block that split #define OBS_SURFACE_LIBRARIES(L) \ across two lines; and a block separator the reader could not distinguish from a blank line the prose actually wanted. The last one is why blocks now close with an explicit @end rather than a blank line: a terminator that means "end" cannot be confused with content that happens to be empty.

Also ported: shaders and mine. Four Python scripts remain, none of them gated - the build and the gate are Python-free.