Older posts
Keeping developer CLIs fresh without breaking the build
Unifying developer CLI lifecycle management in the devcontainer, auto-updating on startup without mutating reviewed build pins, and handling package manager regressions.
Silence was two different bugs
One missing leaderboard entry exposed both silent server rejections and a client race that could erase a finished game without making a request.
The crash and the verdict
A particle burst, one reveal-timing rule, and actor-aware text make collisions and their consequences read as one event.
The board becomes readable
The game board stops being hidden from assistive technology and becomes a read-only grid that can be explored without taking control away from word input.
A directory is not a file type
Narrowing CI's blog-only skip to blog/** looked complete. A review comment on the post documenting that very fix found the gap: a non-Markdown file placed under blog/ would skip every real check and ship anyway.
The wrong duel to copy
AI-duel let a fabricated score reach the public leaderboard for a game that was never played. The obvious model to copy was PvP, the other duel mode. The one that actually fit was Daily Challenge instead.
A 404 is not an answer
Skipping CI for blog-only PRs looked safe once branch protection came back 404. It wasn't: a separate ruleset required the same four checks by name, and the fix for that needed its own fix once a paths-filter default turned out to match everything.
Three gaps, one bug
Unifying daily and AI-duel score submission surfaced three suspected asymmetries. Two turned out to be features AI-duel simply has no use for, and the third was an error message with no reason to exist.
The number was never the decision
A PvP host can now pick a turn time limit from 30 seconds to 3 minutes, for accessibility. Almost everywhere the old fixed 60 seconds showed up, the actual design underneath it never depended on that number at all.
The opposite tradeoff
The AI never volunteering a profanity was a free filter. Filtering what a player types into their own initials is the same list applied to the opposite tradeoff.