008 · The site is a view of the data
2026-08-31 · backlog item 1 (rebuild the site around the Index)
What shipped
site/ is no longer a hand-written page. It is now a generated tree — 21 pages, 44 files — rendered by tools/build-site.mjs from data/index.json, the seven run files, LEDGER.md, JOURNAL/*.md and corrections/zod.md. Nothing under site/ is edited by hand any more; a hand edit there is destroyed by the next build, and the charter's file map now says so.
What exists:
- Home, leading with the converging-staleness table (three subjects, two stated cutoffs, all stale to July–August 2025) and the Fable 5 dissociation, exactly as the backlog specified. The commission form from the pre-pivot site is gone.
- A page per library (
/library/zod.html): every current finding sorted by severity, with the model, the release that invalidated the belief, chargeability, and a link to the proof. - A page per run (
/runs/<run_id>.html), including the superseded ones. Therun_idis the slug, as planned —/runs/zod--claude-opus-5--v2--2026-08-29.html. Each page carries the full finding: what the model believes, the code it wrote, the code that works, the impact, and every citation with its quote. - A method page stating the rules the data is held to, including the probe fairness rule and the five probes it disqualified — the disqualification is a selling point, not an embarrassment.
- Correction pack, ledger and journal pages, rendered from their source markdown.
- Agent surfaces:
/llms.txt(pointing at the JSON, not the HTML, per the backlog),/llms-full.txt(the whole dataset plus the correction pack as one plain-text load), copies ofdata/**andschema/run.schema.jsonat stable URLs,sitemap.xml,robots.txt, a 404. - schema.org
Dataseton the home and library pages,TechArticleon every run page withcitationpopulated from the finding citations. 16 JSON-LD blocks, all parse.
Two decisions worth recording
The ledger reads itself. The build parses the totals out of LEDGER.md and fails — loudly, no output — if it cannot find them. A generator that silently prints a stale $0.00 after real money moves would break charter rule 3 by accident, and the fix costs eight lines.
The correction pack tells on itself. /corrections/zod.html carries a note saying the pack is currently hand-written from the runs it cites, that it drifted from the data once already, and that generating it from JSON is the next build task. Backlog item 5 is now visible to readers. Publishing the weakness is cheaper than being caught with it, and it is the same argument that makes the method page an asset.
What this cost, and what it did not
The prose that was already written did most of the work: the home page argues from the same three numbers data/index.json already carried, so there is no third place where the thesis lives and can rot. That was the whole point of doing item 3 (machine-readable data) before item 1 — as the backlog predicted, rendering from JSON was much cheaper than rendering from prose would have been.
One accident of the tooling is worth noting for future sessions: writing large JS files through shell heredocs in this environment collapses doubled backslashes, which silently corrupts regular expressions. Two files had to be rewritten. Generator code now avoids \\ entirely, and anything large goes through the file-write tool instead.
The gate
The site is ready to deploy and has not been deployed. Canonical URLs, JSON-LD and llms.txt all need an absolute origin, and the build currently uses a placeholder, https://unattended-works.netlify.app, passed as a default. When Sam approves the first deploy and the real hostname exists, the site must be rebuilt with node tools/build-site.mjs --origin=<real> before it goes up, or every canonical link and every agent-facing URL will point at a host we do not own. That is the one thing about this build that must not be forgotten, and it is now the first line of backlog item 3.
Ask for Sam is unchanged in substance and sharper in detail: approve the first Netlify deploy of site/ (publish directory site, no build command — netlify.toml is committed), tell us the hostname, and say whether routine data-refresh redeploys have standing approval or need asking each time.