The SorterPortfolioUK

sitegen · gate self-test

Every mistake drops into its own tray

63 trap pages roll past 24 stations of a site pipeline. 42 must drop exactly where the test says, 21 clean ones must reach the finish. Each marble's route comes from a file, not from chance.

gold marble: a trap, must droppearl marble: clean, must passbrass token: the first of two gates also caught itTap a tray to see what it guards.

Stations

Twenty-four stops for one page: 23 pipeline gates and a zero station that asks whether the site was built at all. The order is the one the pipeline runs them in.

sg.dist

zero station

The site was built at all: the deploy folder has pages. Otherwise every other gate would be staring at nothing.

traps
1

sg.html

The page skeleton: language, hreflang, icon, a poster for scroll video.

traps
4
lessons
7
checks in the log
4 693

sg.csp

The security policy matches what is really embedded in the page, with no foreign hosts.

traps
3
lessons
3
checks in the log
4 789

sg.cache

Long cache only for files with a fingerprint in the name, or visitors get an old version.

traps
1
lessons
1
checks in the log
21 574

sg.safari

What breaks only in Safari: height jumps, glass, picking a phone by touch rather than width.

traps
4
lessons
12
checks in the log
7 120

sg.files

Nothing extra gets deployed: sources, secrets, heavy uncompressed 3D models.

traps
2
lessons
5
checks in the log
23 767

sg.js

Every module is syntactically whole. One broken file switches off the whole site.

traps
1
lessons
2
checks in the log
1 061

sg.i18n

Identical dictionary keys and the right letters in the font, including the Ukrainian ones.

traps
1
lessons
4
checks in the log
1 671

sg.seo

For search: distinct titles, h1, alt, full addresses, an open robots.txt.

traps
3
lessons
2
checks in the log
3 508

sg.geo

For AI search: complete business data, markup that matches visible text, llms.txt pointing at live pages.

traps
2
lessons
2
checks in the log
3 508

sg.layout

Nothing sticks out at any width, the page is not blank, an iPad does not get the phone layout.

traps
4
lessons
10
checks in the log
9 410

sg.console

No errors in the browser console.

traps
1
lessons
1
checks in the log
2 390

sg.motion

With reduced motion on, nothing spins forever.

traps
1
lessons
1
checks in the log
614

sg.touch

A rail swipes under the finger, and a live first screen is alive without a cursor.

traps
2
lessons
4
checks in the log
352

sg.hold

A press-and-hold action shows progress and also fires on a plain tap.

traps
1
lessons
1
checks in the log
680

sg.go

The request button works even if the data has not arrived.

traps
1
lessons
1
checks in the log
13

sg.nogpu

No exceptions without a graphics card, and the page stays whole.

No trap of its own

traps
0
lessons
2
checks in the log
213

sg.sticky

A sticky panel is no taller than the window and does not ride over text outside it.

traps
1
lessons
1
checks in the log
1 476

sg.lang

Everything visible is translated: embedded frames, SVG, labels. No Cyrillic on the English page.

traps
3
lessons
3
checks in the log
664

sg.slow

On a slow network there are no broken images, and a character does not cover the controls.

traps
3
lessons
1
checks in the log
502

sg.webkit

The Safari engine on iPad and iPhone: glass, security policy errors, scroll video states.

traps
3
lessons
6
checks in the log
1 023

sg.media

Video is served in ranges, with no torn seam in the loop.

No trap of its own

traps
0
lessons
2
checks in the log
620

sg.lh

Lighthouse speed on a phone, with compression as on Cloudflare.

No trap of its own

traps
0
lessons
13
checks in the log
732

sg.a11y

WCAG 2.1 AA accessibility: keyboard, contrast, focus. Enabled by the site's contract.

traps
1
lessons
1
checks in the log
0

Marbles

The names are real, from tests/fixtures.mjs. Tap a marble to see what is broken in that page and release it alone.

They drop: broken on purpose 42

sg.dist

sg.html

sg.csp

sg.cache

sg.safari

sg.files

sg.js

sg.i18n

sg.seo

sg.geo

sg.layout

sg.console

sg.motion

sg.touch

sg.hold

sg.go

sg.sticky

sg.lang

sg.slow

sg.webkit

sg.a11y

They pass: look like a mistake, but are legal 21

These pages catch false alarms. If a gate stops one of them, the self-test goes red.

Why a machine

A mistake becomes a part

A bug found on any site is never quietly patched. It becomes a lesson, then a trap page, then a check. There are 94 lessons so far. The trap lives next to the check, so the check cannot forget what it was meant to catch.

Clean marbles matter as much

A gate that stops everything is broken too. So 21 of the 63 pages are legal: a rail that sits off-screen on purpose, a proper name left untranslated. They have to roll through.

The empty trays are real

sg.nogpu, sg.media and sg.lh have no trap of their own in the self-test, though the log shows they ran. The machine does not hide it: the tray stands empty.

What is a model here

The rails, hinges, glass and collisions are drawn for clarity. The real self-test runs each trap only through its own gates, not through all of them in a row. Routes, trays and counters come from the files unchanged.

Pipeline log as of 4 November 2026

160
deployments
55
projects
90 380
gate checks
62
sites in the portfolio

The same on every device

A physics engine written for this page: a step of 1/120 s, nothing but addition, multiplication, division and a square root. At build time the same machine runs on the server and records a signature of its end state. After a full run your browser compares its own. If a marble lands in the wrong tray at build time, the site does not build.

build signature for this layout
2aa4870d
your browser
wait for the run to end

The sites that passed these gates

The portfolio holds 62 sites from the pipeline. Open any of them and check.

Open the portfolio