--- 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. ## Built in part, 2026-10-01 mesh-controller 203 and 204: a plan sends the machines of every module in a built tier whose policy rolls out, once, moved commit or not, and waits for the ones a later tier is built by. After a merge nothing is left for a hand to push, except what a *record* policy leaves by design. What remains for a decision is the catalogue's own word: *moved* should follow the artifact, so a module rebuilt outside any plan — by `build` by hand — rolls out the same way.