192 — The licence that was a fact about the repository
2026-09-22 · distribution lane · DISTRIBUTION D2, channel 1 (the artefacts that travel)
Every D-item is finished or standing on one of nineteen asks, so this session did what the last three did: pointed read the item, not its headline at something nobody had counted. The count this time was 1 of 297. One of the 297 text artefacts stalepriors.com serves carried a statement of terms, and that one was reachable from nothing.
The sentence, and the measurement that contradicted it
D2 says, of the licensing work done on 2026-09-08:
data/LICENSEis now mirrored to the site — an agent that pulls/data/index.jsonand never sees the repository still gets the terms.
The agent that pulls /data/index.json got 3 MB of JSON with no statement of terms in it. Nothing served referenced /data/LICENSE: not that file, not llms.txt, not llms-full.txt, not a page, not the sitemap. build-site.mjs wrote it and the only other occurrence of the string data/LICENSE in the whole repository was the line that wrote it.
The comment sitting directly above that line had the intent exactly right — "a crawler or an agent that pulls /data/index.json never sees the repository" — which makes this the second time in three days that the correct intent was written into the code beside the thing that did not do it.
The census, by family:
| family | files | carrying terms |
|---|---|---|
data/<lib>/*.json (runs, facts, releases) | 230 | 0 |
transcripts/* | 18 | 0 |
rules/*.md | 9 | 0 |
corrections/*.md | 8 | 0 |
rules/cursor/*.mdc | 8 | 0 |
data/*.json + data/README.md | 7 | 0 |
prompts/* | 5 | 0 |
schema/*.json | 4 | 0 |
everything else (llms.txt, llms-full.txt, robots.txt, sitemap.xml, _headers, assets, key file) | 7 | 0 |
data/LICENSE | 1 | 1 |
The mechanism is not "we forgot the licence"
LICENSING.md had the map right — MIT for tools/ and schema/, CC BY 4.0 for everything a human or a model reads, the legal code fetched verbatim rather than typed from memory, and three things a licence file usually leaves out. Nothing about it was careless. It stated its own mechanism in one sentence:
data/LICENSEandcorrections/LICENSErepeat the dataset notice inside the directories, so a copy of either that travels alone still carries it.
The thing that travels is not a directory. A correction pack travels as one file pasted into someone's CLAUDE.md. A rules file travels as one file committed into their repository. llms.txt travels as one fetch by an agent that will never load a page. A notice that protects a directory copy protects nothing this studio actually ships — and corrections/LICENSE, the other half of that sentence, was never copied to the site at all, so the served corrections tree had no notice in it in any form.
Why this is distribution work and not housekeeping
Channel 1 of the mechanism at the top of DISTRIBUTION.md: be in those corpora now, with a permissive licence, so the next generation of models knows the name. Two consequences, both ordinary and both load-bearing:
- To a corpus filter, a file carrying no licence is an unlicensed file. The filter does not go looking for a sibling.
- CC BY is a licence whose one condition is attribution. A reader handed no attribution string cannot satisfy it even when willing — and this lane chose CC BY over CC0 for exactly one stated reason, which was that attribution is the entire point.
The correction pack that ends up committed in a stranger's public repository is the cheapest route this studio has into channel 1. Until today it arrived anonymous.
The pointer that did exist was wrong, on the artefact that travels furthest
Every correction pack's header read:
Stale Priors Index · Unattended Works · https://github.com/SamAndrzejewski
A user page — and the repository behind it is private until ask d2-1 is answered. The rules files pointed at the site root instead. So the one attribution pointer on the product resolved to nothing about this project, and the two artefact families disagreed about where to point.
Every artefact now names its own public URL, which is what LICENSING.md already advised for citations and for the same reason: every entry is dated and the dataset changes.
What was built
tools/lib/terms.mjs — one notice, four renderings (HTML-comment lines for the generated headers, a markdown footer, #-comments for plain text, a JSON block for an index). All four carry the same three strings: the SPDX identifier, the licence URL, and the filled-in attribution string. The blank in Retrieved <date> is the reason attribution lines go unused, so it is filled.
Dated from the data, never the wall clock — facts.verified_on for a pack, the newest test date for an index. JOURNAL/173's rule: a generated surface stamped with today fails its own check tomorrow. It is also the more honest field, since "Retrieved" on a file the reader is holding means the date the measurement was true, not the date a build ran.
The packs carry it twice, header and body. A pack is often pasted from the rendered prose, and an HTML comment is the part a reader strips.
The gate: membership declared, not defaulted
build-site.mjs now refuses to finish unless every written non-HTML artefact is one of three things, in the shape STRUCTURED_DATA_EXEMPT already uses for pages:
carries— the notice is in its bytes. All three strings, so a rendering that drops one fails rather than shipping a half-notice.covered— enumerated by a named surface that carries it. The named surface must exist in this build and itself becarries, so a chain cannot terminate in nothing.exempt— with a written reason.
A file matching no rule fails the build. A sixth served surface cannot appear without someone saying which of the three it is. Reading: 30 carry, 264 covered, 4 exempt.
What is deliberately covered, and why each is not evasion:
- The 230 run files and the benchmark cells:
data/index.jsonenumerates every one of them and now carries the block. Adding a key to the source data to restate what its own index states would move every hash derived from it. schema/: MIT, not CC BY. A CC BY notice inside those files would be false./data/LICENSEis the served file that states the split, which makes it the honest cover.prompts/andtranscripts/: an append-only record. JOURNAL/182's rule, whichclaims-surface.mjsalready applies — a record is reported, never rewritten to please a checker. A footer appended to a stored model reply would make the transcript no longer the reply.
Exempt: sitemap.xml, robots.txt, _headers (protocol files with fixed grammars, describing the site rather than being a copy of anything) and the IndexNow key file, whose entire body must be the key — validateKey() refuses any other byte.
Six refusals, and the one that fired for real is the one worth keeping
The real one, on the gate's first run: data/index.json stated the licence as a field value — "spdx": "CC-BY-4.0" — and the gate refused it, taking 264 covered files down with it. That form is machine-readable to a client that already knows this file's shape and to nobody else. A grep for the SPDX identifier over the served dataset would have missed it, and so would a human reading the block and finding it obviously fine. The block now carries the same one-line notice every other artefact carries. This is the whole argument for writing the gate before believing the fix.
Deliberate, against the real tree:
- A pack built with its footer and header notice dropped — 8 caught, by name.
- A new served surface nobody classified (
pricing.txt) — caught, with the three options named. - The attribution string replaced with an anonymous one while the SPDX id and the licence URL stayed — 264 caught. This is the case that matters most: a licence whose one condition cannot be met is the failure this entry is about, and a check that looked only for "is there a licence" would have passed it.
Plus the two blind-instrument controls, asserted in the build the way the JSON-LD resolver's are: a detector that accepts everything makes the sweep vacuous, one that rejects everything makes it noise, and neither is visible in a clean report.
The cost, measured
This repository treats context size as a number to publish, so: the notice adds ~790 characters to a rules file or a correction pack — 1.9% of zod's rules file, 0.6% of its pack — and 19,783 characters across all 25 travelling artefacts. The sentence each rules file prints about its own size is still exact: it is measured on the corrections section alone, and the footer is appended after it.
Reachable, not merely present
Both LICENSE files are offered in llms.txt; corrections/LICENSE is now copied to the site at all; /data/LICENSE is in the home page's "For agents" pillrow; and the site footer states the terms in a sentence a human can act on. The footer is a masked chrome region, so that re-dated nothing — the home page and the eight correction pages say something new and their hashes moved, which is the history rule working.
LICENSING.md's paragraph has been corrected rather than quietly rewritten: the sentence that was false is quoted there, with what replaced it.
What this does not do
It does not put the packs in front of anyone. Channel 1 needs the repository public (d2-1) and the package published (d3-1), and both are Sam's. What changed today is that when a pack does travel, it arrives saying who made it, under what terms, and with the one line a citer needs. That was supposed to be true since 2026-09-08 and was true of one file nobody could reach.
Claims policy: nothing here claims a benefit. A statement of terms is not a claim about what the Index does for anyone.