murattunalı.

Don’t say "done" unmeasured: 1645 tests for a personal site.

Murat Tunalı PUBLISHED: READING: 3′ SYSTEM Process

Every claim this site makes has a test: from the contrast table to layout shift while scrolling, from the keyboard tour to text clipping in three languages. The rule is one sentence: a screenshot is not evidence.

The suite runs 1645 measurements today: each of 57 routes passes eight checks, the reduced-motion flow is measured on its own, and so is the counter-proof that motion actually runs. The counter-proof matters: a "calm when motion is off" test also passes when motion was never built — a lying green.

  1. node tools/verify.mjs 4173
  2. …
  3. 1645 passed · 0 failed · total 1645

Why the eye is not enough

Four real cases. One — in an embedded preview the tab always considered itself "hidden"; the animation finished with nobody watching and only the last frame remained on screen. Measurement taught us to bind the choreography to the frame flow, not to visibility. Two — layout shift at load was 0.027 and everyone was comfortable; the first test that measured the scroll phase found 0.74. Three — the verdict "nobody reads this variable" rested on a truncated grep output; a browser measurement showed the chain was very much alive.

Four, and the most instructive: two routes were over the layout-shift budget on mobile, and the blame went straight to the signature effect. The diagnosis was reasonable — the effect does change the width of the text. Measurement disproved it. The shift happened at 2071 ms and the font file finished at 2046 ms: those twenty-five milliseconds were no coincidence. The source was not the effect but the font swap.

The cost of that case is countable. The proposed fix was "freeze the effect on mobile", and had it been applied it would NOT have solved the shift — it would only have killed the signature element on mobile. So measurement here did not correct a mistake; it prevented a wrong correction. However reasonable a diagnosis looks, no verdict is written before the timestamps are laid side by side.

A test’s job is not to pass

A test’s job is to make sure nobody ever has to check by hand again. Every fix leaves a sentry in the suite: if the same fault returns, red appears before a human eye does. The font case left one too — the suite now delays the woff2 file on purpose and measures, on four routes, that the heading’s height does not change at the moment of the swap. What gets tested is not the fault itself but the CONDITION that produced it.

Some sentries work in the opposite direction. In the schema layer the sameAs field is deliberately empty, and there is a test to make sure no fabricated profile slips in. The same for the price field. These measure not that something WORKS but that something was NOT DONE — and over time they turn out to be the most useful ones, because invented information arrives quietly.

Claim drift

This article is tested too. The number 1645 above was not typed by hand: the suite compares the figure in the published HTML with its own real total. Add one more test and this paragraph goes stale and the suite turns red — which makes updating the article mandatory. The friction is deliberate.

Why that sentry exists became visible in this very round. The schema article said "built from five types"; the SEO round took the graph to eleven and the sentence was suddenly false. The llms.txt article said "the file is nine lines"; the file had grown. Both were corrected — but neither caught itself; a human eye found them. The next step is obvious: a sentry for every claim that carries a number.

Proof is the thing that can be run again.

Murat Tunalı

Founder. Twenty years of enterprise IT infrastructure + web development.

All posts →

SOURCES

SCHEMA: BLOGPOSTING + PERSON + BREADCRUMBLIST — AUTHOR, DATE AND READING TIME FEED THE SCHEMA