Skip to content

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

Measured

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.