D182 - The container format is derived the way NIDs already are: binaries outside, provenance-headed data inside

The question was whether reading a package to build a package writer crosses principle 6 - no code written while reading vendor binaries. It does, if the reading and the writing are the same act. The NID chain already solved this, and the solution was sitting in the repository unrecognised.

obscene-tool mine takes --firmware pointing at extracted trees outside the repository, and writes data/mined-names.txt with this at the top:

# mined-from: ChonkyStation4@d181f4d GPCS4@88480de PS5PCEM@f87d2a8 SharpEMU@a2241d0
#             craziiEmu@8a13647 fpPS4@04cefd4 ps4_module_loader@657f9d3 shadPS4@be21649
# firmware: 1.05,1.06,1.76,2.00,2.57,...,9.00,misc

and data/unnamed-nids.txt states its source outright: "Identifiers observed in firmware modules with no known name." So the project has been deriving from vendor binaries since early on, under an arrangement nobody wrote down as a policy:

That header is the proof. Not a promise about what was read - a statement checkable by someone who has the inputs and can re-run the miner, and falsifiable by someone who does and gets something else.

The wrinkle, and why it is not one

Mining NIDs extracts a table. A package builder is code, and code shaped by reading a binary converges on that binary - which is the thing the rule is actually about.

It resolves through this repository's own architecture rather than by argument. CLAUDE.md already says of data/:

the source of truth for everything generated … These are data - judgements with prose attached - and they live outside the generators deliberately: retyping a judgement into a new language is how a transcription error gets into a census.

So the container format is written down as data, not as code. A field table - offset, size, meaning, and where each entry was established - lives in data/ with a provenance header. mkpkg reads that table. The generator never opens a package, exactly as census never opens a firmware module.

This is also what mkmodule did, arrived at from the other direction: "every fixup here came from a rejection, not a specification". The knowledge was recorded, then the tool was written from the record.

The chain

titles/                    gitignored. Derivation input and conformance oracle. Never read by a build.
data/pkg-format.tsv        the field table, provenance header naming each source by title id and hash
obscene-tool pkgmine       refreshes the table from titles/
obscene-tool mkpkg         builds a package from the table - never reads titles/
obscene-tool pkgcheck      compares an output against a real package: pass or fail, nothing else

pkgcheck cannot run in CI, because 43-81MB of packages are not a repository fixture and the provenance job refuses tracked binaries outright. So the package chain is verified locally and the documentation has to say so, or the gap becomes invisible - which is the failure this project keeps meeting from other directions.

Gated on mkself regardless: a package wraps an eboot.bin rather than replacing one. (D180)

Status: decided for the arrangement; pkgmine, mkpkg and pkgcheck are unimplemented.