• fix(controller): stop the controller's own environment from pinning the image
    Release / version (push) Canceled after 0s
    Release / frontend (push) Canceled after 0s
    Release / linux (amd64) (push) Canceled after 0s
    Release / linux (arm64) (push) Canceled after 0s
    Release / windows (push) Canceled after 0s
    Release / macos (push) Canceled after 0s
    Release / release (push) Canceled after 0s
    Build and Push Docker Image / build-and-push (push) Canceled after 0s

    LastSkywalker released this 2026-09-06 11:11:02 +03:00 | 65 commits to main since this release

    A beta node could not leave :latest. Every Update reported "pulled and
    recreated", desired-state asked for :beta, the stack .env said :beta — and
    the container came back on :latest, three generations in a row.

    Compose resolves ${NODE_STATS_IMAGE} from the PROCESS environment before the
    stack .env. Yesterday's 8b0ac17 handed the controller NODE_STATS_IMAGE in its
    compose environment (so helpers could run the node's own image). That value
    is baked in when the controller container is created, and the controller
    runs docker compose from inside itself — so it wrote :beta to .env and
    immediately shadowed it with the :latest it was born with. Only the app
    service is recreated on update, never the controller, so the stale value
    outlived every channel switch: the node was pinned to whatever image it
    first ran.

    Two changes, either of which alone fixes it:

    • the generated compose no longer gives the controller NODE_STATS_IMAGE at
      all; it learns its own image by asking the daemon (selfImage), which is
      always current and needs no variable;
    • the controller strips NODE_STATS_IMAGE from the environment it invokes
      compose with, so the .env it maintains is the single source of truth
      even for a controller created from an older compose.

    The stand did not catch this because .env and the environment carried the
    same local tag — the shadow only shows when the channel changes after the
    controller exists. Reproduced from the affected node's live state.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    Downloads