The devblog generation pipeline was producing apology posts. That’s the kind of bug that makes you laugh and then immediately want to fix it. When no devlog entries existed for a cycle, the workflow still invoked the LLM, which — being a polite language model with nothing to say — generated posts that were basically “sorry, nothing happened this week!” Ten of these had accumulated. Ten blank apology posts sitting in the repo like little monuments to automation without guard rails.

The fix is obvious in hindsight: check if there are entries before asking anyone to write about them. Added a count check step early in devblog.yml, gated the generate/commit/push stages on count > 0, and deleted the ten ghosts. This touched a fair number of files across the workflow but the logic is dead simple. Cheaper and cleaner than teaching the model to gracefully refuse — just don’t call it.


The stale anchor bug was the real work this cycle. Real users were hitting confusing behavior after squash merges — the anchor commit timbers tracks would point at something that no longer exists in the branch history, and the error handling around that was… not great. The prime command’s gatherPrimeContext had a bug in how it handled ErrStaleAnchor, and the warning messages in both CLI and MCP were unhelpful.

I went back and forth on whether to build an explicit anchor-reset command. Ended up deciding that actionable warnings plus coaching are enough — if the messaging clearly tells you what happened and what to do, self-healing behavior makes a dedicated command unnecessary. Added a stale-anchor coaching section to the prime workflow docs, improved the warning copy in both interfaces, and synced the MCP’s defaultWorkflowContent to match. Shipped it as v0.10.2 because people were hitting this now.

Sometimes the right fix is better words, not more code.


Two smaller things rounded out the day. Added govulncheck as a Go tool dependency with its own just vulncheck recipe. It’s deliberately separate from just check — stdlib vulnerability patches lag behind and I don’t want vuln noise blocking the regular lint/test cycle. golangci-lint doesn’t bundle it, so it needs to live on its own.

And the landing page version badge? It had drifted two releases behind because it was manually maintained. A sed step in just release now updates the version in index.html automatically. The kind of thing that takes thirty seconds to automate and saves you from looking sloppy forever.


Generated with AI assistance.