All entries

An alpha the atlas can be shown as

The badge that said sources were checked stopped saying it, the last empty year was filled, and the front page stopped carrying a dataset it does not draw.

The badge was telling a small lie

Every record said verified, and the card said “Sources checked”. The check behind all 291 of them was an automated research pass. The data never hid it: the name of the checker says so, and the private note says human acceptance is pending. But a reader does not read a field name. A reader reads that badge as “a person compared this against the source”.

The badge now takes its wording from who did the checking, and says “Sources gathered automatically” until a person signs a record off — at which point it flips by itself, because it reads the record rather than a constant. The footer carries the same sentence, the event page repeats it beside the verification date, and the methodology page opens with it. robots.txt asks search engines to stay away until the records have had a human read.

A link to the site had no preview card. There is one now, drawn as SVG in the site’s own palette and photographed by the browser that already ships for the tests, so no image toolchain joined the project to make one picture.

The last empty years

2024, then 2025, then a 2026 that had a voice other than the vendors’ own launch posts. Every year from 1943 to 2026 now holds at least one record.

Filling 2025 broke a test, in the way you want: the empty-period test had nothing left to deep-link to. It now tries whole years first and then months, deciding emptiness the way the axis decides it. The exhaustive walk that opens every mark on the axis went from three minutes to forty seconds, which is the difference between a check that runs and a check that gets skipped.

Two weaknesses in that batch were recorded rather than smoothed over: one model carries month precision because sources disagree between 28 and 29 April, and one record rests on two same-day reports because the company’s own page for that date could not be found.

The front page stopped carrying the collection

The dataset had been growing inside the document rather than inside the JavaScript, and the performance budget only ever looked at JavaScript. Every record added about 32 bytes gzipped to the page a reader lands on, and nothing was watching.

The island’s props now carry only what draws and names the axis. The reading text of every record is fetched on idle from a separate JSON file, which caches apart from the document.

/uk/            53 995 -> 5 201 B gzip   showcase, no island, no dataset
/uk/timeline/         -> 16 453 B gzip   axis, geometry only
data.json             -> 27 562 B gzip   deferred, cached separately

The title stays in the document, because a mark’s accessible name is what a screen reader and the keyboard read, and an axis that cannot be named on the first frame is not finished. Alongside the split, every record in the collection gained a server-rendered page with no JavaScript at all, replacing a 41 KB <noscript> list that readers with scripting never saw.

A gate the host will actually run

The host publishes on every push, and GitHub Actions runs beside that, not in front of it: a failing workflow never stopped a deploy. The usual answer is a branch rule, and it was not available — this repository is private on a free account, where both branch protection and rulesets answer 403 with an invitation to upgrade.

So the gate went inside the build. The build command is the verification script: types, unit tests, data validation, the build itself, and the public artifact boundary. A failure fails the build, and a failed build publishes nothing, so the site stays on the last version that passed. No token, no plan change, and no race to lose.

It is deliberately not the whole of the local check. Formatting and linting read the entire working directory, and during a deploy that directory is not only ours — the host writes its own files into it. Asking the host’s scratch files to match our code style is both wrong and guaranteed to fail.

Entry written September 20, 2026

Commits this entry accounts for

  • 17437f9
  • b9f6741
  • 7a732fd
  • 92a4ed1
  • 7717ebd
  • 15d63cb
  • 090313f
  • b484788