Publish the check, not the promise
Run all 28 of them yourself, here, now.
"Every figure on this site is computed from the catalog" is exactly the sentence a site should not be believed about. So the checks are not a claim on this page — they are a file, /assets/checks.js, which your browser downloads and executes. It imports nothing from the build. Where it can, it takes a deliberately different route: the build summed a field it had already collected, this walks the sources and asks each one.
And the build runs this same file. Not a copy of it and not a second implementation of the same idea — the identical bytes, loaded in Node the way a browser loads them, via new Function('window', src) against a fetch shim. If the file the reader executes and the file the build checks ever became two different files, that would be the exact fault this arrangement exists to prevent.
What the build got when it ran the same file
Node, at build time, against the built site on disk. If your browser disagrees with this table, one of us is wrong and it is worth finding out which.
| Check | Expected | Got | Note | |
|---|---|---|---|---|
| PASS | Source count equals the number of source records | 20 | 20 | walked the array and counted, rather than reading the length the build wrote |
| PASS | Dataset rows equal the sum of every measured row count | 680 | 680 | summed measured.rows across every source, including the ones that have none |
| PASS | Document words equal the sum of every measured word count | 39994 | 39994 | |
| PASS | Byte total equals the sum of every file size | 711593 | 711593 | |
| PASS | Sources permitted to leave the device | 0 | 0 | strict equality to true — a truthy value is not a permission |
| PASS | Sources permitted for training | 0 | 0 | |
| PASS | Restricted sources | 1 | 1 | |
| PASS | Sources never verified | 3 | 3 | |
| PASS | Nothing in the catalog is uncatalogued | 0 | 0 | a staged file with no declaration is a finding, not a default |
| PASS | Every source carries a 64-character hex digest | 0 | 0 | checked 20 digests |
| PASS | No two different sources share a digest | 0 | 0 | identical files would be a duplication worth knowing about, not an error |
| PASS | The engine served to this browser is the engine the catalog recorded | 7939033a95931503a495270902dec4a611a3f6cda5753d7f71a05ec88a41e95a | 7939033a95931503a495270902dec4a611a3f6cda5753d7f71a05ec88a41e95a | the file this page just downloaded, hashed here, against the digest written at build time |
| PASS | The declarations file is the one the catalog was built from | e73634ab3bccfe8adf0ac57fd51bb0cb0eeee2af52a3e83a8fc683d4582ab341 | e73634ab3bccfe8adf0ac57fd51bb0cb0eeee2af52a3e83a8fc683d4582ab341 | |
| PASS | Both revenue sum mismatches reproduce, and the third row does not | 3 rows, 2 mismatched, 1 exact | 3 rows, 2 mismatched, 1 exact | added the parts here with a plain loop. Revenue scenario — Conservative: parts 265200 vs stated 265000 · Revenue scenario — Base: parts 904440 vs stated 904000 |
| PASS | The estate measurement disagrees with the blueprint, and both are dated | at least two dated, disagreeing measurements | 2 claims, 2 distinct values, 2 dated | 301 as at 2026-08-04 vs 543 as at 2026-08-15 |
| PASS | Every extracted claim names a file, a locator and a digest | 0 | 0 | a finding that cannot be walked back to a byte range is not evidence |
| PASS | Every claim’s digest matches the catalogued digest of the file it came from | 0 | 0 | a claim extracted from a file that has since changed would surface here |
| PASS | Every graph edge carries a citation and a named power | 0 | 0 | checked 25 edges. An uncited power is refused at load. |
| PASS | Every graph edge points at actors that exist | 0 | 0 | |
| PASS | Every graph edge states where the power stops | 0 | 0 | a power with no stated limit is the shape of an authority nobody bounded |
| PASS | The electorate is the only actor nothing checks | electorate | electorate | counted inbound edges per actor |
| PASS | Every page linked from the navigation actually answers | 0 | 0 | 13 routes checked |
| PASS | No page requests anything from a third-party host | 0 | 0 | read the served HTML of 5 pages for any absolute URL off this origin |
| PASS | The front page prints figures the catalog supports | 0 | 0 | source count, dataset rows and border count all appear in the page as served |
| PASS | Every loop and poster referenced by a page is actually there | 0 | 0 | 6 loops and 6 posters, each present, non-trivial, and not HTML |
| PASS | No page promises that this costs nothing | 0 | 0 | 13 pages read as text, matched against 11 promise and price-magnitude patterns. The word itself is permitted where a source is being quoted. |
| PASS | The runtime gate on model answers is calibrated in both directions | clears real figures, flags invented ones | real: clear (2 checked) · invented: 2 flagged | 2 of 4 figure(s) appear nowhere in the catalog: 41, 12345. |
| PASS | No street address or telephone number is published | 0 | 0 | checked 3 pages |
The build gates
17 gates, every one poison-tested.
A gate nobody has seen fail is not a gate. node tools/gates.mjs --poison deliberately breaks each condition in a scratch copy of the site and requires the corresponding gate to fail. A gate that stays green against its own poison is reported as vacuous and fails the build on that ground alone.
| Gate | What it refuses | Its poison |
|---|---|---|
catalog-complete | A staged file with no declaration in the knowledge constitution. | Add a file to the staging folder and rebuild the catalog without declaring it. |
engine-identical | The engine served to the browser differing by a single byte from the one the build imported. | Append a comment to web/engine/sovereign.mjs after the copy. |
checks-run | Any check in /assets/checks.js failing when the build runs that same file in Node. | Alter one catalog total so the recomputation disagrees. |
checks-not-vacuous | A checks file that reports nothing, or that passes when the catalog is corrupted. | Run the checks against a catalog with a deliberately wrong source count and require a failure. |
no-dead-links | An internal href pointing at a file that is not in the build. | Rename a page after the HTML referencing it is written. |
no-third-party | Any absolute URL to a host other than this one in the built HTML or CSS. | Insert a Google Fonts link into the layout head. |
no-free-no-price | The word used as a price, or an invented figure for the fee, application or sale. | Put "Explorer — free tier" into a page. |
no-address-no-phone | A street address or a telephone number in any built file. | Add a street line to the footer. |
media-present | A loop, poster or film referenced by a page but missing, tiny, or answering as HTML. | Truncate one loop to a few hundred bytes. |
loops-seamless | A loop whose wrap is more than 2.5x its own median frame step. | Rebuild a loop with the crossfade removed. |
reduced-motion | A page whose reduced-motion rules do not resolve to the finished state. | Remove the reduced-motion block from site.css. |
graph-cited | A graph edge with no citation, no limit, or an endpoint that is not a node. | Blank one citation in data/graph.json. |
claims-anchored | An extracted claim whose digest no longer matches the file it came from. | Change a staged file without re-extracting. |
findings-not-vacuous | A contradiction detector that returns nothing, or that fires on the row which adds up. | Correct the two revenue rows and require the detector to go quiet, and separately require the exact row never to be reported. |
border-denies | A restricted source being permitted to leave in any mode, or private mode permitting anything. | Set may_leave_device true on the restricted source and require a denial anyway. |
runtime-gate-calibrated | A gate on model answers that clears an invented figure, or a console that never calls it. | Rename runtimeGate in the console and require the gate to notice. |
contrast | Hero or band type below 4.5:1 against the graded footage at either luminance extreme. | Set the kicker to the muted grey and require a failure. |