Numbers in all: 94. Black ones are held by a gate: 69. Red ones are held by a procedure, a tool or manual acceptance: 25.
Every law here was once a mistake on a live site. It was written down, caught with a trap and given a gate, so it cannot pass again. This page shows the mechanism, not a promise.
62 sites in the catalogue, each behind the same gates
Preamble
The pipeline does not trust promises, not even its own. A mistake gets fixed once, and from then on a machine answers for it. Here is what happens to every mistake found on any of the owner's sites.
I
Lesson
An entry in the code: symptom, cause, rule, how we know.
II
Trap
A page on which the check is obliged to fail.
III
Gate
The check learns to catch the trap and closes the release.
IV
Self-test
All traps are caught and the clean page passes.
V
Other sites
The faulty site is fixed and the others are run again.
The log runs from 10 October 2026 to 4 November 2026: 160 releases across 55 projects over 14 days, 90,380 checks at the gates. Among them, 19 releases with an error at the live address. The log does not hide them. Of 63 traps, 42 must fail and 21 must pass.
I
Book I
Layout and devices
On why a tablet is not a phone, and a browser window is not a device screen.
14 laws, 3 articles here
Swipe sideways →
L-0011 / 3
The tablet got a phone
Symptom. An iPad showed the phone layout and a frozen picture instead of a live scene.
Cause. The condition combined touch with widths up to 1180 pixels, so touch decided the layout.
¶A phone is defined by width alone, up to 760 pixels. Touch is a separate axis, and a tablet with touch stays a tablet.
L-1092 / 3
A 525-pixel header
Symptom. On a 375-pixel screen all five landing pages slid sideways. The gates stayed silent.
Cause. The brand would not shrink, a button stretched to full width, and mobile emulation widened the window to fit, so the measurement agreed with itself.
¶In a header the brand shrinks and the button moves into the menu. A check takes width from the emulation, not from the window.
L-0973 / 3
The plan slid onto the next section
Symptom. In a short window the next heading sat right on the plan, and the totals panel lay on the text below it.
Cause. The sticky panel was a direct child of the shared grid and rode through every section. Its height ignored the window.
¶A sticky panel lives in a wrapper with its neighbours, and its height is the window minus the header. Where the minimum does not fit, nothing sticks.
II
Book II
Touch and gestures
On a finger nobody explained anything to, and a cursor a tablet does not have.
6 laws, 3 articles here
Swipe sideways →
L-0201 / 3
On an iPad nothing moves
Symptom. Parallax, the live background and the cursor lens stood perfectly still on a tablet.
Cause. Every effect waited for a cursor that a touch screen does not have.
¶Every cursor effect has a second source: an automatic drift or the scroll.
L-0212 / 3
A rail you cannot swipe
Symptom. The swipe jerked and had no inertia, and with touch-action: pan-y the rail would not move at all under a finger.
Cause. A script intercepted the gesture and argued with the browser. The original rule was wrong too, and the gates themselves showed that.
¶A touch rail is native horizontal scroll with scroll-snap. The gesture belongs to the browser.
L-0233 / 3
The robot falls unless held
Symptom. A press-and-hold action explained nothing, and the robot simply fell under the finger.
Cause. A delay with no visible progress looks like a fault.
¶A hold shows progress, highlights its target and also works with a tap. Vibration is only an extra: iOS has none.
III
Book III
Safari and WebKit
On a browser you cannot see from Chrome, and a black screen after a lost context.
6 laws, 3 articles here
Swipe sideways →
L-0301 / 3
Glass that is not there
Symptom. Safari before version 18 drew no glass, while Chrome was fine.
Cause. The filter value went through a variable, and the minifier also dropped the prefix.
¶A prefixed value is written literally, and the build targets safari15.
L-0342 / 3
The black screen
Symptom. On iOS the 3D scene vanished and left a black patch.
Cause. The system can take away a WebGL context at any moment. Nothing handled that.
¶A lost context is handled: prevent the default, show a stand-in frame, restore the scene.
L-0353 / 3
Chrome is no witness
Symptom. Torn clips, glass and scroll animations broke only in Safari.
Cause. Everything was tested in one engine, and the rest of the world seemed fine.
¶Every site passes WebKit in both iPad orientations. A real device has the last word.
IV
Book IV
Video and media
On clips that will not play and a picture that is not there yet.
7 laws, 4 articles here
Swipe sideways →
L-0401 / 4
The video that never started
Symptom. Safari on iPhone would not play a clip from Worker static hosting.
Cause. Static hosting does not answer partial file requests, and without status 206 Safari refuses to play.
¶Video lives only in storage that speaks Range. There is no video in Worker static files.
L-0422 / 4
A seam at the start
Symptom. A looping clip began on a torn frame.
Cause. The seam was baked into the first frames of the source.
¶Trim the start, cross-fade the end into the beginning, and look at the frames yourself.
L-0453 / 4
The preview that stopped a release
Symptom. The catalogue began loading preview clips on open, and the pipeline refused to release its own portfolio.
Cause. Heavy video sat in the first frame, and the phone measurement missed its budget.
¶Preview clips start after the visitor's first action. Until then they show a still.
L-0464 / 4
A broken frame over the language switch
Symptom. On a slow network a broken frame hung where the character should be, on top of the language switch.
Cause. The picture was shown before it was ready, with no room kept for it.
¶A picture does not appear until ready: a placeholder of the same size, reveal after decode, its own fallback. Nothing covers the controls.
V
Book V
Speed and fonts
On a single character weighing a hundred and thirty kilobytes.
9 laws, 2 articles here
Swipe sideways →
L-0501 / 2
One character, 130 kilobytes
Symptom. The hryvnia sign pulled in extra sets of both fonts.
Cause. The character is missing from the Cyrillic subset, so the browser fetches a whole extra file.
¶A price is written in letters when the subset has no such character.
L-0542 / 2
A false contrast failure
Symptom. The measurement marked down accessibility for text that actually had plenty of contrast.
Cause. The text faded in through opacity, and the measurement caught it half transparent.
¶Reveal text by clipping, not by opacity. This is how the laws on this page appear.
VI
Book VI
Cache and release
On how only committed work goes out, and a hash broken by one character.
18 laws, 6 articles here
Swipe sideways →
L-0601 / 6
Old code in a new house
Symptom. After a release, visitors kept seeing old scripts and styles for hours.
Cause. Long caching sat on files with no fingerprint in the name.
¶Long caching only for files with a hash in the name. HTML and unhashed JSON are always revalidated.
L-0612 / 6
Released, but not in the history
Symptom. Uncommitted work turned up on live sites.
Cause. Releases went out from the working folder.
¶Only a commit is released: archive, clean build, gates. There is no flag to bypass it.
L-0893 / 6
The form that would not hide
Symptom. After sending, the form was hidden with an attribute and stayed on screen. The thank-you slid below it.
Cause. A display: grid rule outweighs the browser's weight for the hidden attribute.
¶In base styles hidden always wins, and the thank-you block scrolls to the centre.
L-0884 / 6
A hash broken by one character
Symptom. At the live address the styles were not applied. Local gates were green.
Cause. Git delivered the files with CRLF. The build hashed the carriage return, while a browser turns CRLF into LF before hashing.
¶Inline code is normalised to LF before hashing, and the site repository pins line endings.
L-0675 / 6
A secret in the release
Symptom. A key could have left along with the static files.
Cause. Everything lying nearby ends up in a build.
¶Build contents are scanned for keys, and secret files stay out of the repository.
L-0926 / 6
An error that no longer exists
Symptom. The live check reported a 404 on a new script. Twenty seconds later everything worked.
Cause. The network edge served new HTML before the new files.
¶A live address is checked up to three times with a pause. An error is what survives the rollout.
VII
Book VII
Languages and text
On a translation that forgot everything that was not the page itself.
6 laws, 3 articles here
Swipe sideways →
L-0701 / 3
Translation, some day
Symptom. A site went out in one language, and the translation was put off.
Cause. Later never comes, and the texts drift apart in the meantime.
¶Two languages from day one, Ukrainian first. The root chooses: saved choice, browser language, Ukrainian.
L-0722 / 3
Cyrillic on the English page
Symptom. The English version kept error messages in another language.
Cause. Engine strings lived apart from the dictionary.
¶Engine and error strings go through the same dictionary.
L-0943 / 3
The page translated, the embeds not
Symptom. The English version kept Ukrainian buttons in the 3D viewer, drawing labels and units.
Cause. A static HTML check cannot see inside a frame, a shadow tree or an SVG.
¶Everything a visitor sees or hears gets translated. An embedded component takes its language from the page.
VIII
Book VIII
Checks on the checks
On gates that were wrong themselves, and a defect no machine can see.
28 laws, 7 articles here
Swipe sideways →
L-0801 / 7
The gate that passed nothing
Symptom. A check cheerfully reported zero places while new variants went unchecked.
Cause. An empty set counted as success.
¶An empty set of pages is a failure.
L-0852 / 7
The lesson that corrupted itself
Symptom. A generator script damaged a special character in a path, and later the text of this very lesson.
Cause. In Windows paths \b becomes a backspace, and a replacement string reads the dollar sign its own way.
¶Code with regexes and paths is edited in an editor or with a replacer function, and then the self-test runs.
L-1063 / 7
A long font stack
Symptom. First paint on a phone wandered between 1.9 and 6.4 seconds.
Cause. The browser walked a long font list while computing styles. A system stack gave a steady 1.2 to 1.4 seconds.
¶A stack is your own font, the system font and a generic family. More than five named foreign families earns a warning.
L-1074 / 7
Drive C: reached zero
Symptom. Agents' screenshots and builds kept failing: 1178 Chrome profile folders piled up in two days.
Cause. A folder could not be deleted while Chrome held its files, and after a crash cleanup never ran.
¶Temporary files live on D:, a profile is deleted with retries, and old ones go on every launch.
L-1135 / 7
The blank document that passed
Symptom. A page went blank at any width, and some gates let it through: nothing was left to overflow.
Cause. A rule hiding markup by attribute also caught the html element itself.
¶Hiding rules apply only inside body. A page with no visible element is an error.
L-1176 / 7
The button that waited for data
Symptom. On a phone the first tap on the request button itself started loading data, and the request failed.
Cause. The button read the wall length from data that arrived after the first action.
¶A request button does not depend on the data having arrived. If it has not, the button uses what the visitor can see.
L-1207 / 7
A rectangle for a saucepan
Symptom. The scenes were complex and there was nothing to look at: a hob as a rectangle, people as circles.
Cause. Technique outran the subject, and gates do not judge that.
¶A subject is recognised without a caption. An abstract stand-in in delivered work is a defect, however strong the technique.
Register
The full list, numbers: 94. The ¶ sign leads to an article. Articles on this page: 31, the rest stay in the original code.
There is no application JavaScript. The page carries 238 bytes that set the layout, and the root another 651 bytes that choose the language.
The page weighs about 16 KB compressed, styles included. There are no web fonts, it is set in a system serif.
The guard sheet is the popover attribute. The active tab, the top bookmark and the laws appearing on tablet and desktop are scroll-driven CSS animations.
You can print this page: separate @page rules compose an A5 booklet with page numbers.
The build counts every number from a snapshot of the log, commit 5317d9b. None is typed by hand. The pipeline holds 1,592 lines of checks and 623 lines of traps.
What is not here
31 articles selected out of 94. An AI retold them from the Russian original of the code into Ukrainian and English, shortened, with figures taken from the lessons.
The active tab and appearing laws need scroll-driven animation. Older browsers show the same text without them.
The gates test WebKit on Windows. Real iPads and phones took no part in this measurement.
Printing has been checked in Chrome only.
The numbers describe the log up to 4 November 2026 and are already out of date by newer releases.
The text, the code and the choice of lessons were written by an AI (Claude) under the direction of the pipeline's owner. No real people appear on this page.
sg.html
Title, description, canonical, hreflang, icon, each language in its folder, a poster for scroll video.
laws: 7 · traps: 4 · places checked: 4,693
sg.csp
Content security policy: hashes of inline code and no foreign CDN, not even through an importmap.
laws: 3 · traps: 3 · places checked: 4,789
sg.cache
Long caching only for files with a fingerprint in the name.
laws: 1 · traps: 1 · places checked: 21,574
sg.safari
Static Safari traps: the glass prefix, width thresholds, rails, 100vh, a long font stack.
laws: 12 · traps: 4 · places checked: 7,120
sg.files
What goes into a release: an allowlist, no keys or video, the weight of 3D models.
laws: 5 · traps: 2 · places checked: 23,767
sg.js
Syntax of every module before a release.
laws: 2 · traps: 1 · places checked: 1,061
sg.i18n
Same dictionary keys, no Cyrillic on Latin versions, Ukrainian letters present in the font.