bug-postmortem

  1. The status that was never written

    The stats page showed zero PvP games because its query filtered on a status the PvP service had never actually written, plus a new high score stat and a tab reorder.

  2. Five fixes, one revert

    An architecture review turns an hour of live firefighting on the PvP presence module into an explicit state machine, then finds the same missing structure on the client side.

  3. Not a bug this time

    Cutting the E2E suite's billed CI cost by fixing an idle CPU core and moving tests to cheaper layers, then chasing down two loose ends, one real and one a false alarm.

  4. The first thing it caught

    Client-side error monitoring finally gives the solo maintainer visibility into what breaks in players' browsers, and catches a real bug within hours of shipping.

  5. Four pixels on the first letter

    The Daily word input jumped four pixels when its first letter appeared because one nested row had no height before it held a letter cell.

  6. The game was still there

    A player replaying the Daily Challenge who switched tabs mid-game came back to the previous attempt's recap instead of the game still running underneath it.

  7. The second watcher that never started

    A silent host-sleep protection gap surfaces when two devcontainers run at once, traced to a lock file scoped by project instead of by workspace, and fixed by mirroring a sibling repository that had already solved it.

  8. No route to the evidence

    A devcontainer firewall gap blocked exactly the two tools needed to diagnose a CI-only failure, and fixing it surfaced a real flaky test hiding behind the same access gap.

  9. Vanished letters, lingering words

    Two independent PvP bugs on the same day: Norwegian letters missing from what the opponent sees, and a crashed word that refused to leave the screen.

  10. A greedy regex that ate the leading major version digit

    A greedy wildcard in version string extraction stripped leading digits from major version numbers, causing pnpm 11.19.0 to be parsed as 1.19.0.