Gates

What has to pass
before this ships.

Ten automated checks can stop a change from going live. Seven run on every push and stop the deploy if one fails. Three run in real browsers before a layout change is committed. Edge drift checks the live site after a deploy, so it can't stop one and isn't counted in the ten. Each check records its own result when it runs, and this page prints that record. All are currently green.

Each check reports two numbers: how much it examined, and how much of that failed.

  1. Harness

    the checks themselves, tested first

    • gate unit tests172tests0failingnpm run testjust now

      the gate scripts against fixtures with planted faults, the Worker and its validator, the commit hook, the Wrangler configs, and every link between the docs

  2. Source

    the files as written

    • type check54files0errorsnpm run typecheckjust now

      Astro's checker over the site and tsc over the Worker, against the bindings wrangler generates and first confirms current

    • prose check4posts0tellsnpm run check:prosejust now

      every published post checked against the house writing standard: banned words and patterns fail it, and length and tone measures only warn

  3. Build

    the transform from source into publishable output

    • derived CSP19built pages0failuresnpm run build15h ago

      the policy is derived from the build: 13 directives, 3 script hashes read off the emitted HTML, no 'unsafe-inline' for scripts

    • prelaunch gate91output files0leaksnpm run build15h ago

      every built file searched for the names of 3 unlaunched entries, read from each entry's draft flag

    • copy compliance60output files0violationsnpm run build15h ago

      every built file searched for language this site has committed not to publish: a partner's restricted vocabulary, claims no signed agreement backs up, contact details kept private

  4. Output

    the files that will be served

    • build assertions36assertions0failingnpm run test:build15h ago

      assertions against the files in dist/: the CSP and its hashes, headers, redirects, the feed, the sitemap, OG cards, and that no comment and no orphaned asset ships

  5. Rendered

    what a browser does with them, in two engines

    • visual matrix532combinations0failingnpm run check:visual5d ago

      19 pages × 14 viewports × 2 engines, portrait and landscape, touch emulated on phone and tablet widths, each asserting no horizontal overflow and no page errors

    • interaction harness40behaviors0failingnpm run check:interactions5d ago

      every console command, the grid and its badge, the Konami flip, the input guard, the WebGL mount, the 404 physics, the contact form against a stub, hover stability and the styled feed, under the production CSP, in 2 engines

    • layout audit276page renders0findingsnpm run check:layout5d ago

      23 routes × 6 viewports × 2 engines, inspected for text drawn over text, tap targets under 24×24, contrast below WCAG AA, clipped text, unreadably narrow measures, and in-sentence links drawn like their sentence

  6. Ship

    the deploy, which CI runs only when the first seven checks pass

  7. Deployed

    what the live site serves, compared byte for byte with the build

    • edge drift45comparisons0driftsnpm run check:edge15h ago

      live robots.txt, the CSP and the page elements byte for byte against the build, the security headers and the directives that carry the policy, the one-hostname rule, the build’s own files reachable, the Worker’s routing, the scripts a browser is served, and the certificate’s remaining life