D015 - selfish-elf depends on selfish-nid, which reorders the spine

The spine was written as abi, elf, container, nid, pfs, pkg - nid after elf, because the hash looked independent of the executable format. It is not. A vendor module's undefined symbols are named <hash>#<library>#<module>, so reading the symbol table and decoding the hash are the same operation: an ELF reader that stops before decoding hands its caller a string that every caller then has to take apart the same way.

The spine is now abi, nid, elf, container, pfs, pkg. nid still depends on nothing.

The cost is that sha1 reaches the loader path, and CLAUDE.md promises an emulator reading a bare executable can take elf and stop. It still can - it just gets the decoder with it, and it needs one, because resolving an import is the reason it read the table.

The alternative was leaving the join to each consumer. Three consumers writing the same twenty lines is the duplication this repository exists to end, and it would be a silent one: each copy would look correct in isolation, and D016 is what happens when one of them is not.