Listening for a Branch Named Main
Written later and filed to this date, as part of filling in every day of the year.
The second commit in my survivor shooter’s history, on its first day in January, carried a workflow file named “Deploy to GitHub Pages”. It listened for pushes to a branch called main. The repository’s branch is master, and has been from the first commit; there is no main anywhere in its refs, and the word turns up in its log only for the main menu and for the one commit that took it out of the workflow. For seventy-one days every push went to a branch the workflow was not watching, and the game was deployed nowhere.
Nobody noticed, because nobody was waiting for it. The game was a thing I played on my own machine, and a deploy that never fires looks exactly like a deploy you never asked for.
Two days in March
On the nineteenth of March a one-line commit changed main to master in the workflow. That is the whole commit, no body, and it is the moment the game could reach the web. Two days later, on a Saturday afternoon, a commit titled “CNAME” changed two lines: it added a file naming a subdomain of this site’s domain, and it changed the build’s base path from /game/, the shape of a project page tucked under a user’s site, to /, the shape of a site. Five minutes later, a favicon. The game had an address, and an icon to show in the tab.
Twelve days after that, a commit with the hosting platform’s own editor as its committer added the same domain file at the repository root. That is what the platform’s settings page writes when you type a custom domain into it, and it means the address was entered twice, once in the tree and once in the form, which is the kind of redundancy you do not design and do get.
From then until the end of August the game lived on the open web. July added a crash button that copies the last fifty console lines to the clipboard, and the test suite moved into the deploy job so that a red test blocked a deploy instead of a player. A retry was wrapped around a deploy step that failed on its own sometimes. In August the actions in the workflow were pinned to commit hashes. The repository took 511 commits in July and 351 in August, most of them from build agents working through a backlog, and every push to master was a deploy.
Taken down by a finding about the repository
On the twenty-seventh of August my defender flagged the repository as one of two in the workspace that anyone could read. The workspace rule is that this site’s repository is the one public one. I flipped the game’s to private that afternoon.
Making a repository private takes down the pages it was publishing. The commit that records it is a documentation commit: the push gate is retired, the repository is private, and the pages are gone. The workflow was switched off on the host. The rule that had made pushing to this repository a human act, because a push was a deploy, was retired in the same paragraph, because a push was now a backup. And a line was added saying that putting the game back on the web anywhere is still a hard gate, an operator decision followed by deliberately switching the workflow back on.
The finding was never about the game. Nothing in the game was unsafe to serve. The source was unsafe to show, by a rule about repositories, and the game went down as a side effect of the source going dark, the way it had gone up as a side effect of a branch name.
Private web
A month later it came back, elsewhere. A static server of a few dozen lines, bound to loopback on the always-on box behind its private-network front, serving whichever release a symlink points at so that a new build is one swap and no restart. A week after that it went behind the shared gate every private service here sits behind. Then the box got a save slot, and the game learned to carry a run in progress from one device to another through it: start on the phone, finish on the desk.
So the game has been three things. For seventy-one days a repository with a deploy that could not fire. For five months a public site, reached by one branch rename and lost to one visibility toggle, neither of which mentioned it. And since the autumn a private one, reachable from my own devices and no others.
The workflow file is still in the tree. It listens for pushes to master, which arrive most days, and on the host where it used to run it is switched off.