From 4204afd2400fddf0c92524f1801c2b352ef404dd Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 29 Oct 2026 22:28:45 +0100 Subject: [PATCH] Name mesh-config's compare, take-over and hand-back on its seat, so callers reach the config switch ADR 0565 decides by the seat (issue 1953) --- go/catalogue/seats.go | 14 +++++++++++++- go/catalogue/seats_test.go | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/go/catalogue/seats.go b/go/catalogue/seats.go index 1b70e38..7f39dcf 100644 --- a/go/catalogue/seats.go +++ b/go/catalogue/seats.go @@ -245,13 +245,25 @@ var defaultSeats = append([]Seat{ // The owner of every config value (novox/hq ADR 0348 §9, design 57 K3): its holder alone writes the buckets // mesh-config_values, _resolved, _predefined and _proposals, and serves the one verb `config` (§1, §10). // Optional until the mesh-config that runs serves it (design 33 §7). - {Name: "mesh-config", Scope: ScopeMesh, Decision: "novox/hq ADR 0348", + {Name: "mesh-config", Scope: ScopeMesh, Decision: "novox/hq ADR 0348, ADR 0565", Serves: []Verb{ {Name: "config", Optional: true, Description: "Set, clear, list or read the history of config values: " + "mesh config or node config for a predefined key, or a module's own value on one node, each set " + "with why, validated, and naming each module on each node whose value moves. A trusted value only " + "from the controller's terminal.", Input: configInput()}, + // The switch of config to its own sources (novox/hq ADR 0565 §4): optional until every mesh-config serves it. + {Name: "compare", Optional: true, Description: "Every difference between config's own sources and the " + + "controller's records, each with its reason: a module's declared config against the controller's mirror, " + + "the indexer's predefined list against the mirror's, and each open pull request's config candidate against " + + "what the controller told. The take-over waits for none.", + Input: schema(map[string]string{}, nil)}, + {Name: "take-over", Optional: true, Description: "Ask the operator's Approve to switch config to its own " + + "sources (the indexer); refused while compare shows a difference.", + Input: schema(map[string]string{"why": "why, in a sentence"}, []string{"why"})}, + {Name: "hand-back", Optional: true, Description: "Switch config back to the controller's mirrors, until the " + + "controller hands its lease away; refused after it.", + Input: schema(map[string]string{"why": "why, in a sentence"}, []string{"why"})}, }}, // The provisioner's server (novox/hq ADR 0349 clause 3, design 57 P4): its holder keeps the registry of which // domain answers which kind of placeholder, and the buckets mesh-provisioner_needs, _applied and _collect, diff --git a/go/catalogue/seats_test.go b/go/catalogue/seats_test.go index 0226c15..ad001bb 100644 --- a/go/catalogue/seats_test.go +++ b/go/catalogue/seats_test.go @@ -71,12 +71,14 @@ func TestTheSeatsAreAClosedSetAndEachNamesItsDecision(t *testing.T) { {WatchdogsSeat, "signals,stuck,presence,dead-letters,resync", ""}, {SelfCheckSeat, "doctor,probes", "checked"}, {HealersSeat, "healers,heal,drill", "healer-acted"}, + // And mesh-config's switch (ADR 0565 §4), beside its config. + {"mesh-config", "config,compare,take-over,hand-back", ""}, // And ADR 0565 clause 1's two. {WantsSeat, "upgrade,bus", "policy-changed"}, {HandActsSeat, "hand-act,hand-acts,warranted", "act-recorded"}, } { s, ok := SeatNamed(c.seat) - if !ok || s.Scope != ScopeMesh || s.Replicated || s.Delivers != "" || !strings.HasPrefix(s.Decision, "novox/hq ADR 056") || + if !ok || s.Scope != ScopeMesh || s.Replicated || s.Delivers != "" || !strings.Contains(s.Decision, "ADR 056") || strings.Join(VerbNames(s.Serves), ",") != c.verbs || strings.Join(s.Emits, ",") != c.emits { t.Errorf("the health seat %s is %v, %+v", c.seat, ok, s) }