bug-postmortem

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

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

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

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

  5. Breaking a self-referential devcontainer script loop

    Invoking pnpm inside a container startup script re-triggered the pnpm binary wrapper itself. Guarding execution with environment flags broke the infinite loop.

  6. Deriving help text point values from the game engine

    Hardcoded point strings in UI translation dictionaries drifted when fruit values changed. Deriving help copy directly from EDIBLE_POINTS enforced a single source of truth.

  7. Rejected was not final

    A closed draft becomes published after all, exposing one missing transition in the blog registry's state model.

  8. The lock arrived late

    Seventeen blog-registry commits expose the small race between opening a draft and publishing its concurrency lock.

  9. One snake, two renderers

    The live board and canvas share image learn one shared rule for drawing a connected snake without merging a tight coil into a blob.

  10. The fourth status line

    A stale three-tool test turned pnpm support into a devcontainer startup failure, and the repair had to model the new update path properly.