All entries

A debt paid in full

The local editor nobody used went, and half the technical debt went with it. Checks that stopped nothing began to stop things, the evidence archive became history, the research pipeline moved into git, and the axis takes its records from the data rather than from a list kept by hand.

This entry was written on 26 September, two days after the work it describes. What prompted it was a question from the 6-in-1: why has the log been silent since the 23rd? The answer is not comfortable. For three days every pass ended with a line in the working journal and a green CI run, and none of it reached this page. The working journal is written for the next session; this one is written for a person who wants to know how the atlas was built. Every pass kept the first, and no pass kept the second. This entry and the four after it were put together from the commits, and their dates say so.

An editor nobody used

The plan for 24 September began with teaching the local editor to carry the decade terms through import and export. The 6-in-1 asked what removing the editor would solve instead of repairing it, and chose removal. The reasons were in the folder itself. There was not one backup, which meant not one save of an existing record and not one import on this machine. The first human acceptance of a record was made as a direct edit to the JSON. The RSS inbox had last changed on 17 September. A whole group of items from the debt report went with the editor: twelve copies of the vocabularies, three backup schemes, four browser tests run against live records.

One rule lived only in the editor: rewriting a record’s text raises its contentVersion, because a translation is published only while its version equals the record’s. It is now a check of its own, validate:revisions, which compares every changed event file with its previous state. Replayed over the whole history, 1,070 changes to events, it refused exactly three commits. They are the three rewrites that left the version at 1, and nothing else.

Checks that stopped nothing

The byte budgets lived beside Lighthouse, so only CI ran them, and the host publishes in parallel with CI. On 21 September that let two commits reach production over budget. The budgets are now a script of their own that needs no browser and takes a second or two, and it runs both in the local check and in the Vercel build. A page that has outgrown its bound is no longer published. A budgeted route missing from the build now fails the check instead of being skipped.

The local preview server began reading vercel.json: the security headers, the redirects, a 404 page with a 404 status. That turned up something small that had been there for weeks. Its table of types had no .jpg, so the browser refused the three video stills in every local preview and every browser test. Production showed them, because that server does not run there.

Where each id came from

The research pipeline had been thirty-two scripts in scratch folders. It is now one command, integrate:incoming. Every research package enters the data through it and leaves a map behind: which ids it created. validate:provenance holds every id in data/ to exactly one origin: a package’s map, a stated exception, or a redirect when a record was merged into another. On that day there were 2,617 of them. A trial on a throwaway copy of the repository found a real defect at once. Renumbering wrote src-0981 over src-0982 before the latter had moved, and 28 sources out of 29 were lost.

The evidence archive of 11 September became history. Its hash matched no commit, so it was red on every one, and no gate could refresh it. A revision’s evidence is now its CI run and its Vercel build. While moving the archive I found four logs of the first run that its manifest named and git had never seen: the *.log ignore rule had filtered them out from the start. They existed only on this laptop’s disk. They are in the repository now.

An axis that takes its records from the data

What the axis drew was set by a hand-kept list, meta.seedIds. Every pass added its records to it, one pass once forgot, and by 24 September the list simply named all 657 events. The axis now draws every published record: it is a function of the data. The list is gone, and the schema will refuse it if anyone brings it back.

The rest of the day is less visible to a reader, but it is of the same kind. One function now builds the axis’s address, so the record page no longer loses the search and the mode on the way back. Decades are labelled from the lane’s own bounds, so “1940s” above a record from 1939 reads “1939–1949”. The showcase counts organisations the same way as the list it opens: 287, not 286. Browser tests take their expectations from one data module rather than from literals that went stale with every pass. The decade terms moved into the dataset, and one component draws the record card on every surface.

And a rule for sessions. The scheme of 11 September, a root session with two workers, gave way to a simpler one: at most two chats at once, in parallel only on tasks that share no file, one task in one new chat. The shared checkout is committed by hunk. That same day it kept two commits apart, mine and that of another session editing the same files.

Entry written September 26, 2026

Commits this entry accounts for

  • 5dc2d58
  • 2c2f80a
  • 7eab0a4
  • 4f435aa
  • 6547b00
  • 9ceadb9
  • 57037b6
  • 8976c47
  • 7bc2c79
  • f55f38c
  • 9116d26
  • e093527
  • 68cedf5
  • 6f48396
  • db137ef
  • 0830ea9
  • b21cc30
  • ba2e23c
  • 31524b7