The Checkout That Billed Itself

The blog registry moves out of the game repo and into the blog repo, closing a CI-minutes leak two hundred-plus bookkeeping commits had been quietly running up, and replacing the concurrency lock along the way.

Every post this blog writing system has ever produced left a paper trail in the game repo: a registry row for the new draft, another for reconciling the one before it, sometimes a third when a subject got rejected. Each one meant a short-lived branch, a pull request, and a self-merge, in a repository that runs its own required CI on every push regardless of what changed. Two hundred and thirty-seven of those commits had accumulated by the time anyone asked whether that was actually free.

It was not. The game repo and this one are both private, so every push bills real minutes, and the check that decides whether to run the expensive jobs, a job that only checks out the repo and inspects which paths changed, runs unconditionally no matter what those paths are. The four heavy jobs downstream of it already knew to skip a pure documentation change; the checkout itself never did. Multiplied by two hundred-plus registry commits, plus a matching number of pull request events, the total was real enough that the account’s Actions minutes ran out partway through most months, and this bookkeeping was a plausible piece of why.

The lock moves with the files#

The registry’s final draft row used to be the lock against two sessions claiming the same commits. That worked, but it depended on the row staying in sync with the pull request it pointed at, a fact recorded once and then trusted every time. Moving the registry here, into the same repository as the drafts it tracks, removed the reason for that indirection: the lock is now a direct check for an open pull request on a post/-prefixed branch, no row consulted at all. The registry keeps its place as the record of what happened and how far the frontier has reached, but it no longer has to be current for the system to behave correctly if it briefly isn’t.

Everything the writing system only ever reads, the vocabulary document, the frontier-stall rule, stayed in the game repo, since reading never cost anything. Only the files it writes moved: the registry itself, the voice guide, the style guide, the sensitivity rules, landing as a fresh commit each with no attempt to carry their game-repo history across. A one-time outline that had already covered the entire backfill, its job long finished, was retired outright rather than moved anywhere.

Whether the new lock and the new fetch path hold up outside a dry run is a question the next several ordinary runs answer, not this one.