Author's Notes

Two Copies, Forty Seconds Apart

  • process
  • tooling
  • editorial

Drithane has been written with more than one assistant, and it is worth being honest about which did what, because the history of the tooling turns out to rhyme with the premise of the story.

The early version of the site — the first scaffolding, a lot of the initial template and configuration work — leaned on GitHub Copilot and Microsoft 365 Copilot. That work doesn't show up as a distinct hand in the commit history, because a Copilot suggestion lands under my name when I accept it, not under a separate author's. So the git log undercounts it: a good deal of what reads as "me" in those early commits was me accepting and editing suggestions rather than typing from nothing.

Some of the Codex content was drafted and refined a different way, in Sudowrite — the long, in-universe documentary passages that the Codex is built out of, worked over there where a prose tool is genuinely good at that register. And that is where the trouble started, though it took me a while to name it. I was keeping two copies of the same material: the working draft in Sudowrite and the committed file in the repository. For a while I hand-carried edits between them. Then I stopped being able to. A fix would go into one and not the other, a paragraph would get better in the draft and stay worse in the repo, or the reverse, and after enough rounds I genuinely could not tell you which copy was correct. They had drifted.

If that sounds familiar, it should. This entire site is built on a station clock that has shown an impossible reading for eleven years because two chronometers on a wall disagree by forty seconds and nobody has been willing to close the file on why. Drithane is a story about records drifting apart — public record, institutional memory, and eyewitness testimony all reading the same event differently and just staying that way, indefinitely, because reconciling them is harder than living with the gap. I wrote a whole cosmology around that idea and then spent a month living the small, stupid, domestic version of it: two files, same content, forty seconds apart, and no authority on the wall that could say which one was true.

So I did the thing the Star Rangers themselves would eventually have to do. I picked one record and made it the one that counts. The GitHub repository is now the single source of truth — not a draft-of-a-draft, not one of two copies, but the copy — and everything else has to reconcile to it or it doesn't exist. There is no Sudowrite draft living alongside the repo anymore, and there is no version of a Codex page that is "really" somewhere else. If it isn't in src/, it isn't canon.

Holding that line is most of what Claude Code does here now. Working directly against the repository, it edits the Markdown in place, runs the schema validation and the dry-run build before anything is committed, and helps me keep the lore, the glossary, the Codex, and the story bible consistent with each other — which is exactly the discipline I lost when the copies were separate. A fair amount of the recent architecture is its work: the content-schema validation that fails the build on a malformed file, the multi-domain content filtering, the scene-and-POV pipeline. But the part I actually value is duller than any of that. It is that there is now one place to look, one place to change something, and a build that refuses to pass if I've let two records fall out of agreement.

The engineering half of the site had a name for the problem before I did — "one schema, one source of truth" is written into the validation layer on purpose. It took me longer to apply the same rule to the words. The tooling has changed underneath this project more than once, and it will again. What I'm trying not to change is the rule I finally learned the hard way, which is the same rule the story has been about the whole time: keep one record, and don't let the copies drift.

Discussion

Show discussion

Comments are read after they are posted and anything unsuitable is removed. Posting needs a GitHub account; reading needs nothing.