Issue 189: a rebuild from the same commit is not a move, so a packaging module's new image never rolls out #268

Merged
mesh-admin merged 1 commits from issue/189-a-rebuild-from-the-same-commit-is-not-a-move into main 2026-10-01 19:55:21 +00:00
@@ -0,0 +1,35 @@
---
status: located
opened: 2026-10-01
located-in: [mesh-controller internal/inventory/catalogue.go (RegisterModule records the source commit; a moved event follows a commit that changed, not an artifact that did), mesh-controller cmd/mesh-controller/upgrades.go (the roll-out follows the moved event)]
fixed-by:
amended-design: []
---
# 189 — A rebuild from the same commit is not a move, so a packaging module's new image never rolls out
## What was observed
The build machine's definition packages the controller's source. A controller merge rebuilds it, and
the rebuilt image carries the new controller; its own source commit in the catalogue is unchanged.
Registering that build therefore moves nothing the catalogue announces: no *moved* event, no
roll-out, although the module's upgrade policy says roll out and the artifact is new. On 2026-10-01
at 19:45Z the first tiered plan under [ADR 0162](../../02-DECISIONS/0162-a-merge-produces-a-tiered-plan-the-mesh-keeps.md)
built the build machine and waited for the machine running it to apply the new build — a wait
that nothing would end, because nothing had sent it. A push by hand opened the gate.
## Why this is here
A version is what a module *runs*, and that is the artifact. The source commit is how the mesh
knows the artifact's provenance, not what makes it new: a build that reads another repository, or
pulls a base image, produces a different artifact from the same commit. The roll-out followed the
commit, so every module that packages another's source, and every dependent rebuilt because its
base moved, is rebuilt and then left behind on every machine until somebody pushes. The plan now
sends what it waits for (mesh-controller PR `fix/a-plan-sends-what-it-waits-for`), which covers the
gate; the general rule — a new artifact for a module with a roll-out policy is sent, moved commit or
not — is the decision this report asks for, and the catalogue's *moved* event should say what moved:
the artifact.
*How this would be checked:* a controller test registering a build of an unchanged commit with a
new artifact digest for a module whose policy rolls out: the machines are sent; `status` shows no
machine behind afterwards.