Blog
Go says a constructor either works or it doesn't. That contract stops making sense the moment a client has a dozen optional parts, so I broke it on purpose.
I was a minute from filing a fix for a feature that had shipped the day before. The reason I had not noticed turned out to be a rule of my own, doing precisely what I told it to.
Viper reads a dozen extensions. Mine reads one, and the other formats live somewhere else entirely. Here's what that bought, measured rather than asserted.
yamldoc is the editing half of YAML for Go: change one key and every byte you did not touch comes back exactly as it went in, comments included. It now has an engine of its own, and the numbers to show why.
A spec, a how-to and a README walk into a repo. Only one of them should still be there in six months.
I set out to add a config writer and keep Viper. I ended up keeping the writer and deleting Viper, and I didn't notice until it was already gone.
Four places a config value can come from, and the only question that matters at the wrong end of an incident: which one won, and why. Twenty minutes, one module, no services.
I built a boundary so I wouldn't have to move my config package. Then I moved it anyway, and the boundary is the only reason that didn't hurt.
I built somebody else's idea into a working skill before nine and deleted it by ten. Not-invented-here is the accusation; here's the order I actually work in.
colophon works out the version your commits have earned, opens the release as a merge request, and tags what actually landed. Not what your forge says did.