D189 - The vocabulary was never missing a word; it was missing a shape

decided ยท 2026-08-21

Two titles named four functions themselves once printf could carry the message (D187): scePthreadMutexattrInit, Settype, Setprotocol, Destroy. Confirmed by hash, so they were true - and the generator still could not produce them, which meant the provenance audit could not account for them (D119). A name this repository cannot derive is exactly the name that needs explaining.

D168 recorded the gap as a harvest problem: a missing syscall family in the word list.

That diagnosis is correct, and it is not the explanation for this family. The harvest really is incomplete - it read only lib/libc, lib/libthr, lib/msun and lib/libutil, so socket, setsockopt, sched_yield and their neighbours are genuinely absent, and 218 names in the committed database carry records claiming a list that does not contain them. The audit refuses those, correctly.

But it was the wrong explanation for this family, and applying it here cost weeks. Every token scePthreadMutexattrSettype needs was already harvested. One true diagnosis was reached for and it happened to fit the shape of the question without being its answer - which is a failure mode worth naming, because it is nearly invisible: a correct known problem is the most convincing wrong explanation available.

What was actually missing

Every token needed was already in the harvested list. mutexattr appears in fourteen names; settype and setprotocol appear in pthread_mutexattr_settype and pthread_mutexattr_setprotocol exactly. The words were all there.

The vocabulary was built from vendor-shaped parts - a module, a verb, an object - and no combination of those spells Mutexattr. The vendor did not compose that name. It inherited it from POSIX, whole. A compositional grammar cannot reach a name that was never composed, however many words it holds.

So the fix is one shape, not a longer word list: sce + the harvested name with each underscore-separated part capitalised. pthread_mutexattr_settype becomes scePthreadMutexattrSettype, which is the exact symbol a real title imports.

Derived, not written

The posix vocabulary is generated from the standard word list at load time rather than typed into the grammar file, so there is one source and it cannot drift from the list CI audits. A test regenerates all four names from the harvested list alone - which is what turns them from observed into derivable, and closes the provenance question the guest's own printout had left open.

Cheap, too: one candidate per harvested name, against millions from the compositional patterns.

The lesson worth keeping

A search that misses proves only "not among what was tried", and the instinct is always to try more words. Twice now the answer has been a different kind of candidate rather than more of the same kind. When a family resists naming, ask what shape it is before asking what words it needs.