Every Lab page is also a dated PDF, and the whole Lab is one file you can send
The Lab holds current thinking, and current thinking moves. That was a real problem rather than a cosmetic one: the page that argues something in September will argue something else in November, and the earlier reasoning goes with it — which is exactly the part a business partner needs, because the journey explains the conclusion. A link is no help either, since it shows the reader whatever the page says by the time they arrive.
So every Lab page is now also cut as a dated PDF, and the old ones are kept.
- Each entry has its own editions, listed on the page itself, newest first, with the date and the size. Nothing is rewritten and nothing is removed — the list only grows, so a reader can see that the page has moved and go and read what it used to say.
- The Lab index's edition is the whole Lab in one file: all three entries in reading order, 22 pages, one PDF. That is the artefact to attach when somebody should follow the whole argument rather than land in the middle of it — and it is a file, so it travels through a chat app or a post attachment where a link would not.
- Each edition carries a cover and a running stamp. The cover names the entry, its state and the edition, and says in as many words that this is a dated copy of a page that changes. Every page after it carries the source URL, the edition and a page number in the footer, so a printed sheet on somebody's desk still says where it came from.
- And every edition is checkable.
lab-editions.json↗ records the SHA-256 of each PDF, so a file somebody was sent can be verified against the register rather than taken on trust. A CI gate now recomputes every digest, because these are the only artefacts on the site that may already be in somebody's inbox — a missing or altered one is a broken promise rather than a stale build.
An edition is only cut when the thinking changes. The renderer hashes the page body with the injected regions removed — the menu, the version chip, the edition list — so a version bump or a nav change does not mint a new edition. Re-styling a page does not either, which is a deliberate choice: these editions mark the argument moving, not the CSS.
A second tool, for the same reason as the first.
scripts/site/render-lab-pdfs.mjs cuts and registers editions;
scripts/site/sync-modules.mjs, added in v1.2.1, pushes a shared-module fix into every
page. Both exist because having no build step means each page is a complete document,
and the price of that is doing some things thirty-one times.