mesh-config and nats consume the seat mesh-catalog's manifest-accepted, not the indexer's (B7d finding 1; ADR 0634 §1; issue 1966)

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
This commit is contained in:
2026-11-05 15:18:27 +01:00
parent 62bb25675d
commit b0f2441dd3
7 changed files with 13 additions and 10 deletions
+1 -1
View File
@@ -67,7 +67,7 @@ them, newest first; with `proposal`, one read whole, with whether the router's a
- The seat verb `renames` answers the open renames and the nodes holding each open (the checker asks it); the tools
`config_renames` (all, with the closed windows), `config_rename_again` (move by hand after a refusal) and
`config_rename_close` (drop a node by hand, a hand act).
- On the indexer's `manifest-accepted` it asks the indexer's `indexer_config_readers`; an indexer that does not serve
- On the seat mesh-catalog's `manifest-accepted` it asks the indexer's `indexer_config_readers`; an indexer that does not serve
it answers "not known" and nothing retires. A value (or secret) nobody reads is **retiring** once no node runs a
build that reads it: `retiring` is said and the operator is asked once; the value is removed only on the Approve
(a secret through the seat mesh-vault's `retire`, with a hand act naming node, module, name and ask), `retired`
+2 -2
View File
@@ -238,7 +238,7 @@ func hearing(c *Config) {
// hearingDelivery takes the delivery parts' words that close a rename window or retire a value, each asked again until
// the runtime takes the subscription: the status view's `delivered`, the node-engine seat's `manifest-reads-changed`
// (a returning node-engine; design 32) and the indexer's `manifest-accepted`. At its start it judges the windows once,
// (a returning node-engine; design 32) and the seat mesh-catalog's `manifest-accepted`. At its start it judges the windows once,
// since an event said while this module was down is not said again.
func hearingDelivery(c *Config) {
<-stdio.Served()
@@ -258,7 +258,7 @@ func hearingDelivery(c *Config) {
}
return c.Windows(b.Node)
}},
{"mesh-delivery-indexer.manifest-accepted", func(e stdio.Envelope) []string {
{"mesh-catalog.manifest-accepted", func(e stdio.Envelope) []string {
var b struct {
Module string `json:"module"`
}
@@ -775,7 +775,7 @@ func TestConfigWholeRenamesAndRetiresAgainstTheBus(t *testing.T) {
p2.mu.Lock()
p2.readers = []ReaderRow{{Module: "radio", Key: "band", Kind: KindValue, Readers: []string{}}}
p2.mu.Unlock()
p2.event("mesh-delivery-indexer.manifest-accepted", map[string]any{"module": "radio"})
p2.event("mesh-catalog.manifest-accepted", map[string]any{"module": "radio"})
eventually(t, "the retirement waits on g14", func() bool {
raw, ok := p2.get(RetiringState, "radio.band")
return ok && strings.Contains(string(raw), RetireDraining)
+1 -1
View File
@@ -24,7 +24,7 @@
"gitea.forge.pull-request.closed",
"mesh-delivery-view.delivered",
"node-engine.manifest-reads-changed",
"mesh-delivery-indexer.manifest-accepted",
"mesh-catalog.manifest-accepted",
"mesh-delivery-indexer.views.modules",
"mesh-delivery-indexer.views.manifests",
"mesh-delivery-indexer.views.predefined",
+2 -2
View File
@@ -52,8 +52,8 @@ func AcceptedOf(body []byte) (keeper.Accepted, error) {
return keeper.Accepted{Module: a.Module, Digest: a.Digest, Revision: a.Revision, BusState: a.BusState}, nil
}
// AcceptedSubject is the indexer's manifest-accepted on the shared events stream.
var AcceptedSubject = "mesh.mod." + keeper.FirstViewOwner + ".event." + delivery.ManifestAcceptedEvent
// AcceptedSubject is the seat mesh-catalog's manifest-accepted on the shared events stream.
var AcceptedSubject = "mesh.seat.mesh-catalog.event." + delivery.ManifestAcceptedEvent
// The router's records of asks, read under this module's own name (ADR 0259 §3), as the mail sender reads them.
const asksBucket = "messenger_asks"
+5 -2
View File
@@ -184,8 +184,11 @@ func TestTheBussManifestMountsItsProgramsIntoTheUpstreamImage(t *testing.T) {
if len(nm.Claims) != 1 || nm.Claims[0].Name != "mesh-broker" || !slices.Equal(nm.Claims[0].Serves, ReadingVerbs) {
t.Errorf("claims are %+v: mesh-broker, serving its reading verbs %v alone", nm.Claims, ReadingVerbs)
}
if !slices.Equal(nm.Consumes, []string{"mesh-delivery-indexer.manifest-accepted"}) {
t.Errorf("consumes %v: the indexer's manifest-accepted alone (ADR 0595 §4)", nm.Consumes)
if !slices.Equal(nm.Consumes, []string{"mesh-catalog.manifest-accepted"}) {
t.Errorf("consumes %v: the seat mesh-catalog's manifest-accepted alone (ADR 0595 §4)", nm.Consumes)
}
if AcceptedSubject != "mesh.seat.mesh-catalog.event.manifest-accepted" {
t.Errorf("the keeper's durable consumer filters on %s, not on the seat mesh-catalog's event", AcceptedSubject)
}
for _, want := range []string{"mesh-delivery-indexer.indexer_bus_state", "seat:mesh-hand-acts.hand-act"} {
if !slices.Contains(nm.Invokes, want) {
+1 -1
View File
@@ -57,7 +57,7 @@
"mesh-delivery-indexer.indexer_bus_state"
],
"consumes": [
"mesh-delivery-indexer.manifest-accepted"
"mesh-catalog.manifest-accepted"
],
"uses": [
"operator-channel"