From 4a6a4eadeb08a959c4c68e3675f787badf75471c Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 1 Oct 2026 15:41:09 +0200 Subject: [PATCH] A push issues the memberships of the machines it told MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sendTo — the path a roll-out, a rotation and a secret change take — issued memberships after its sends (ADR 0160); the push command, which sends the same declarations through its own loop, did not, so the one command operators run issued none. Said once in the same words after the sends. --- cmd/mesh-controller/push.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/mesh-controller/push.go b/cmd/mesh-controller/push.go index 4449d00..76f56bc 100644 --- a/cmd/mesh-controller/push.go +++ b/cmd/mesh-controller/push.go @@ -384,6 +384,15 @@ func pushCommand(ctx context.Context, args []string) error { } release() fmt.Printf("\n%d node(s) told\n", len(sending)) + // And each machine's memberships, as every other send does (ADR 0160): a push is the one most + // operators run, and on 2026-10-01 it was the one path that issued none. + var told []string + for _, s := range sending { + told = append(told, s.node) + } + if err := issueMemberships(ctx, open, server, told); err != nil { + return err + } // **A named push leaves the mesh consistent, not just the machine it named** (novox/hq // issue 057, ADR 0083). Assigning a cross-node consumer mints a provision, and the PROVIDER's -- 2.54.0