How this site is built
One Python file, and a build that refuses to ship
This site is the only web work here you can inspect without asking anybody’s permission, so it is the one making the argument. 100 pages come out of a single generator with no framework under it, 17,670 assertions decide whether they are allowed to exist, and 186 deliberate sabotages prove those assertions are not decoration. Every number here was measured on the date below, and the commands are included so you can disagree with them.
- Standard library only
- 17,670 assertions
- 186 mutants, all caught
- Two defects found here
What it is
The generator is one Python file of 18,663 lines, and it imports the standard
library and nothing else. There is no node_modules, no bundler, no CSS
framework and no content system: the page you are reading was an f-string a moment
before it was HTML. That is not minimalism for its own sake. A dependency is a thing
that can change under you between two deploys, and a site whose only dependency is
the interpreter can still be rebuilt in two years by somebody who is not us.
The generator being the source of truth is the rule that costs something: the HTML is output, so editing a built page is work the next build deletes without mentioning it. The stylesheet and the demo widgets are the exception, because they are hand-written files the build copies rather than emits.
What refuses to ship
A second script, 3,194 lines of it, reads the built HTML and never imports the generator — so it checks the output rather than agreeing with the thing that produced it. 17,670 assertions run over 100 pages, and most of them are not about markup. They are about claims:
- No price on any published surface. A currency symbol in a page body fails the build, deliberately, because what a job costs belongs in a written scope rather than on a page that cannot ask what the job is.
- No partnership, certification or approval we do not hold, and no claim about staff numbers or trades we cannot put a name against.
- A page that names a measured Niagara version carries the caveat that a different version is a different answer, verbatim, because a number measured on one install is not a fact about the framework.
- Every demo says on the page that it is simulated, and stays out of the index while an indexable page explains it.
- Every indexable page needs three inbound internal links. Two means the index and one sibling; three means something chose it.
- A case study’s proof link has to be a public repository or a named forum thread — not a brochure, not a front page, not a link we liked. That gate is the reason this page is not itself a case study: the generator’s repository is private, so the evidence would fail our own test.
The deploy runs the same gate again against a throwaway clone of the committed
tree, so a pass in a dirty working directory cannot ship. A git push
publishes nothing here; one script does, and it takes a lock first.
Gates on the gates
An assertion nobody has watched fail is an assertion nobody has tested. A third script breaks this site on purpose, 186 ways, one at a time: it reverts the tagline, claims a partnership we do not have, publishes a price on a service page, points a case study’s proof link at a forum front page, deletes a container from a stylesheet rule. Each mutation names the failure it expects, and one that produces the wrong complaint is reported as loudly as one that produces none. Then it restores the tree and says whether the restore was clean.
Both gates, 2026-10-04. The check.py line is the run that released this
page. mutate.py ran on the same tree, immediately before its own output
was spliced in here - a transcript cannot contain the run that reads it.
$ python3 check.py
17670 passed, 0 failed, 100 pages
$ python3 mutate.py
baseline: check.py passes on the scratch copy (186 mutations)
CAUGHT claim-tridium-partner 1 of 1 failure(s) name it
CAUGHT claim-iso-9001 1 of 1 failure(s) name it
CAUGHT proof-link-points-at-a-forum-front-page 1 of 1 failure(s) name it
... 170 more, every one caught ...
CAUGHT underline-rule-drops-table-cells 1 of 216 failure(s) name it
CAUGHT underline-rule-drops-step-bodies 1 of 199 failure(s) name it
CAUGHT prose-link-in-an-unmarked-block 1 of 2 failure(s) name it
CAUGHT source-count-no-longer-stated 1 of 1 failure(s) name it
CAUGHT tool-count-in-the-faq-drifts 2 of 2 failure(s) name it
CAUGHT service-count-in-the-index-lede-drifts 4 of 4 failure(s) name it
CAUGHT transcript-names-a-page-that-moved 1 of 1 failure(s) name it
CAUGHT a-route-is-stated-twice 1 of 1 failure(s) name it
CAUGHT 301-and-stub-disagree 1 of 1 failure(s) name it
CAUGHT tool-card-dropped-from-the-hub 1 of 1 failure(s) name it
CAUGHT licence-block-claimed-but-not-in-the-file 1 of 3 failure(s) name it
CAUGHT licence-block-in-the-file-but-not-claimed 1 of 1 failure(s) name it
CAUGHT handoff-warranty-window-drifts 1 of 2 failure(s) name it
186 caught, 0 not caught, restore clean
The last thirteen are the gates this page's own claims rest on: two delete a
container from the stylesheet rule, one puts a link in running text on the
home page, one separates a line count from its unit so the size claim here
stops matching, one lets a published tool count age behind the list it
describes, one does the same to the service count, which had already drifted
in public, one renames a page the Lighthouse table above scored, so the
published evidence points at a 404, one states the same route twice, one
points a real 301 somewhere other than the stub beside it, which is how a
moved page loses the ranking it had, one points a tool's own card at the hub
instead of the tool, which leaves a published page with nothing linking to
it, two hold the licence sentence to the served bytes in both directions -
one takes the notice out of a script the sentence says carries it, one lets
the page go quiet about notices that are in every file, and one moves the
correction window on /handoff/ off the number the subcontract mails state.
We measured our own pages, and two of them failed
None of that says anything about whether the pages are any good to use. So five of them went through Lighthouse under mobile emulation: the home page, a page about what ships with a job, a free tool, a case study and a note. Three came back at 100 across accessibility, best practices and SEO. Two came back at 95, both for the same rule.
Lighthouse 13.4.1, mobile emulation, navigation mode, 2026-10-03.
Scores are out of 100. The performance category is not in this run;
Lighthouse takes it from a trace, not from this audit.
a11y best seo failed url
100 100 100 0 https://plantroomlabs.com/
100 100 100 0 https://plantroomlabs.com/handoff/
100 100 100 0 https://plantroomlabs.com/tools/module-sign-scan/
95 100 100 1 https://plantroomlabs.com/work/decoder-upstream/
95 100 100 1 https://plantroomlabs.com/notes/niagara-poll-rates-and-tuning-policies/
The two 95s are one rule, axe link-in-text-block:
ol.pl-steps > li > div > a -> 1.39:1 against the text around it
tbody > tr > td > a -> 1.22:1 against the text around it
The rule is that a link sitting inside running text has to be distinguishable without colour. This site’s accent measures 1.39:1 against the text around it in one case and 1.22:1 in the other, where the standard asks for 3:1, and neither link carried an underline. The stylesheet had the rule already, written with a comment explaining why it is scoped to prose containers. Its selector list simply never reached a step body, which lives in a bare div, or a table cell.
So the rule was extended to both — and then the same question was asked of every page rather than only of the two that were measured. With the two selectors reverted on a scratch copy, the gate reports exactly what the old list left unmarked across all 100 pages: ten links on ten pages, seven in table cells and three in step bodies. A sweep written by hand first reported only the seven, because it did not count a step body as a block in its own right — which is the argument for gating the rule rather than sweeping for it, and a page about measurement should say when the first measurement was wrong. Both audited pages re-measure at 100: the case study and the note are the two, and the fix is live on this page as well.
The part that matters more than the fix: the gate now reads that selector list back out of the stylesheet and fails the build if a page puts a link in running text the stylesheet cannot reach, or if the rule loses one of its containers. Three of the sabotages above are that gate — two delete a container, one adds a bare link to the home page. The defect was found by measuring, and it is now held by a test rather than by anybody remembering it.
Then the two pages that went up today
Two more pages were published on 4 October: website design and the workbook audit. The first of those sells a measured handover, so publishing it without measuring it would have been the exact defect it is about. Both went through the same audit on the published URL the day they went up.
Lighthouse 13.4.1, mobile emulation, navigation mode, 2026-10-04.
The two pages published that day, on the live URL, plus the home page again.
a11y best seo failed url
100 100 100 0 https://plantroomlabs.com/services/website-design/
100 100 100 0 https://plantroomlabs.com/services/spreadsheet-to-web-app/
100 100 100 0 https://plantroomlabs.com/
The home page is in this run because the row for it in the table above had no
saved report behind it. It measures the same.
Both new pages were also audited against a local copy of the same bytes, where
best practices comes back at 96 and not 100, for one reason: the analytics
beacon cannot load from 127.0.0.1, so the console carries one network error.
That is the harness, not the page.
What a first visit costs
Measured against the live domain, with the compression a browser asks for:
Measured 2026-10-03 against the live site, with the compression a browser asks for.
Every row is one request. Sizes are bytes on the wire.
bytes encoding url
13758 br /
263 br /assets/mark.svg?v=b3d8ec4a5542
2779 br /assets/favicon.ico?v=503bf7424a89
5408 identity /assets/apple-touch-icon.png?v=76d34265a138
64388 identity /assets/fonts/inter-var.woff2
40604 identity /assets/fonts/jetbrains-mono-var.woff2
18989 br /assets/css/plantroom.css?v=402c241bcabb
2999 br /assets/js/site.js?v=f69df5f76fc6
8 requests to this origin, 149188 bytes.
Of that, 104992 bytes is two variable font files, which is 70 per cent.
One request leaves this origin on every page: the Cloudflare analytics beacon.
Cache headers, read from the same responses:
/ cache-control: public, max-age=0, must-revalidate
/assets/... (any asset) cache-control: public, max-age=31536000, immutable
Two variable fonts are 70 per cent of that, which is the honest cost of not
using the system stack, and the only request leaving this origin is the analytics
beacon. Everything under /assets/ is served immutable for a year and
carries a content hash in its URL, so a changed stylesheet is a new URL and an
unchanged one is never fetched twice. That header is also a trap worth naming: on a
stable filename it would mean a CSS fix reaching nobody who had visited before, for
up to a year. The hash in the URL is what makes the header safe, and the build
computes it rather than a person.
What this does not prove
The repository is private, so you cannot read the generator or the gates, and a screenshot of a passing test proves nothing. What is checkable is the output, from outside, without an account:
curl -sI https://plantroomlabs.com/assets/css/plantroom.css— the cache header, and the content hash in the URL above it.- Lighthouse, in your own Chrome, on any page here. The table names the version, the emulation and the date, and three of those five pages are the ones a stranger is most likely to land on.
- Read the page source. There is no bundle to unminify, and the only third-party script on any page is the beacon.
Two things this page deliberately does not claim. There is no performance score here: the audit that produced that table does not include the category, Lighthouse takes it from a trace instead, and quoting a number from a different run would be a different measurement. And none of this is a traffic claim — the search numbers for this domain are small and new, and a page about how a site is tested would be a strange place to pretend otherwise.
What it is offered as is evidence for one line on the web, apps and DevOps page — a build that refuses rather than ships when a check fails — written out at the only address where you can check the claim against the bytes.
Next step
Want this done to something that is already live?
Send the address. What comes back is the same kind of measurement as the one above, against your site rather than ours: what is actually wrong, with the command that shows it, and nothing invented. If nothing is wrong, that is the answer and it cost you one email.