Found live: a keep-reinstall to RC19 booted the RC19 OS (BUILD_COMMIT correct) while the
dashboard container kept running the RC14-era image. The image tag (:v1.14.1) is constant
across RCs, podman's store lives on the preserved /data, and the sha-keyed loader for the baked
archive lives in the FIRSTBOOT path — which keep-reinstalls (and A/B updates) skip entirely.
New slot, stale containers: #790's exact pattern one layer up. The visible symptom was a
dashboard hung at "Connecting…" with every shipped fix mysteriously absent.
This breaks the A/B update story (M7-M9): an OS update that carries a new dashboard would keep
running the old one, indefinitely, on every provisioned machine. Release blocker.
Fix direction (the derived-layer rule again): archive loading belongs in the BOOT path, not the
wizard. pithead-boot (or render) compares the baked archive's sha against the recorded one and
podman-loads on mismatch, then compose up recreates on the image-id change — every boot, both
paths, no wizard involvement. The recorded sha lives beside the store it describes. The manual
recovery that worked live: podman load -i /opt/pithead/images/dashboard.tar.gz, rm the
container, pithead up.
Coverage: the update phase must assert a marker from the NEW dashboard image is served after an
A/B update (not merely that containers run); the install phase's keep leg should assert the
dashboard image id changed after a keep-reinstall from a newer stick.
Found live: a keep-reinstall to RC19 booted the RC19 OS (BUILD_COMMIT correct) while the
dashboard container kept running the RC14-era image. The image tag (:v1.14.1) is constant
across RCs, podman's store lives on the preserved /data, and the sha-keyed loader for the baked
archive lives in the FIRSTBOOT path — which keep-reinstalls (and A/B updates) skip entirely.
New slot, stale containers: #790's exact pattern one layer up. The visible symptom was a
dashboard hung at "Connecting…" with every shipped fix mysteriously absent.
This breaks the A/B update story (M7-M9): an OS update that carries a new dashboard would keep
running the old one, indefinitely, on every provisioned machine. Release blocker.
Fix direction (the derived-layer rule again): archive loading belongs in the BOOT path, not the
wizard. pithead-boot (or render) compares the baked archive's sha against the recorded one and
podman-loads on mismatch, then compose up recreates on the image-id change — every boot, both
paths, no wizard involvement. The recorded sha lives beside the store it describes. The manual
recovery that worked live: podman load -i /opt/pithead/images/dashboard.tar.gz, rm the
container, pithead up.
Coverage: the update phase must assert a marker from the NEW dashboard image is served after an
A/B update (not merely that containers run); the install phase's keep leg should assert the
dashboard image id changed after a keep-reinstall from a newer stick.