Older posts

  1. Four tabs, one question at a time

    Restructuring the stats page around mode, scope, and language, with prototypes and typed review catching what the first implementation missed.

  2. The fourth tool in the manifest

    Bringing pnpm into the developer-tool update policy, replacing manual version chores while keeping CI reproducible.

  3. One skill, three agents

    Moving the repository-owned skills to one provider-neutral home, restoring the Codex workspace sandbox, and making portability a tested claim.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.