Lab 04: seven things to build, and one word we have not earned
A build specification for the first thing anybody will ever use — a page that asks what you run, computes what you granted, and hands you the gap — plus a repair to a defect that had put a line of JavaScript at the foot of nine pages.
- Lab 04 — seven things to build, and one word we have not earned↗. Three tools, two vaults, two documents, each card saying what the thing is, where it runs, what it holds, what it must never do, and which open question blocks it. The collector itself; the shape-record schema; the write-only submitting vault and the collection vault behind it; the aggregator that is the only place a suppression rule can actually be enforced; the motivated-intruder assessment; and the employer instrument, which is a second product under different law.
- The arithmetic is the argument. A twenty-connector multi-select carries about 20 bits — more entropy than a well-known browser-fingerprint study measured across a whole fingerprint, where 83.6% of 470,000 samples were instantaneously unique. At 500 responses effectively every respondent is unique, so the submissions are personal data. The fix is to compute the full shape locally and submit only bands and categories.
- One correction to the brief this came from, stated on the page. Banding the connector question cuts it from about 20 bits to about 7, and banding every field cuts the nominal space from roughly 42 bits to roughly 20 — a factor of four million, and the largest single reduction available. It also leaves a banded submission at approximately the entropy of that fingerprint. So banding is the necessary first move and not the whole answer: the page says so, marks the arithmetic as ours rather than a citation, and shows the assumptions it rests on.
- The word anonymous is gated, in public. It may not appear in the product until the banding, the suppression and the written assessment all exist. Until then the honest word is banded, and the page says which of the three are specified and which are not.
Editions can now say what separates them from the edition before. Two PDFs dated a day
apart otherwise read as two states of an argument, and sometimes one of them is only a
repair — as three of today's are. lab-editions.json takes an optional note per
edition and the edition list on each page renders it.
A line of script was rendering onto nine pages. The page scaffolder lifts the shared
JS modules from a page already in site/, and the last of those modules ran to the end of
the donor document — so it carried the donor's own </script></body></html> in with it.
Every scaffolded page therefore closed twice, and the text between the two closes is not
ignored: the parser reparents it into <body>, which put })(); at the foot of
abp↗, the Lab↗ and its three entries, Lisbon↗, the
booth guide, and both work↗ pages. It was in the published PDFs too. Fixed at
the source, trimmed from all nine, and a test now asserts that every page closes exactly
once with nothing after it.
And editions no longer turn over for chrome changes. The renderer's content hash
covered the shared JS modules, so a sync-modules run would have minted a new edition on
every Lab entry the same afternoon — implying four arguments had moved when none had. The
hash now covers the markup between <body and </html> with the script block and the
injected regions removed.