So much for the librarian

milestone architecture, go, schema

Ten days ago I wrote that the public door had moved to Go and Nest would stay on as the librarian: TypeORM migrations, seeders, backup-restore. That was honest on the day I wrote it. It was also a hedge, and I think I knew it while typing it.

A process that no longer serves a single request still owns the most dangerous verb in the stack — changing tables. Leave that sitting there and the first time somebody needs a column, you've got a second runtime again. Hedges grow.

So the first week of September went on taking it back.

Schema belongs to Goose now. go/cmd/migrate, hand-written SQL, and nothing auto-migrates on boot. The cluster job still defaults to status rather than up, and that default is load-bearing: a read-only check that quietly turns into a write is how you rewrite a database you only meant to look at.

Goose is slower to type than a decorator. That's the feature. A migration you can read in a diff is a migration you can refuse.

The Nest tree is out of the repository. Not deprecated, not parked in a legacy/ folder — deleted. The good part is that I stop grepping a ghost, and so do the agents. The less good part is that every "the Nest version still does X" line anywhere in the docs became a lie the same afternoon, so those had to go with it.

Seeding moved in two steps rather than one. First a Go CLI that answers to every command name the old seeder answered to, plus demo. Then the cluster image, published as dugout-seeder. Two steps because a big-bang swap leaves staging seeding from a binary nobody has actually run, and I didn't want two seeder images living side by side either — that's how England gets seeded twice and you lose an evening working out why.

The API deployment dropped its v2 suffix, since there's no other API to distinguish it from. And the three things I'd been missing since the cutover — response cache, process version, request metrics — got closed on Go, instead of being used as an argument for keeping Nest warm a while longer.

One HTTP process, one migrator, one seeder, and no TypeORM left anywhere to accidentally synchronize.

Which means I can go back to arguing about the club screens on their own terms, rather than on the question of which process secretly still owns players.

← All entries