From 9a508701ff48cbe40bdf43cd3e7bf5e6b2127c57 Mon Sep 17 00:00:00 2001 From: jochen Date: Tue, 3 Nov 2026 13:31:42 +0100 Subject: [PATCH] One local name is one form, and the old state says what it accepts: 0 is taken as 1 (issue 1966 D2) --- .../mesh-delivery-indexer/judge/busstate.go | 18 ++++++++++++++++++ modules/mesh-delivery-indexer/judge/rules.go | 2 +- .../mesh-delivery-indexer/judge/rules_test.go | 18 +++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/modules/mesh-delivery-indexer/judge/busstate.go b/modules/mesh-delivery-indexer/judge/busstate.go index 189a43f3..843849e6 100644 --- a/modules/mesh-delivery-indexer/judge/busstate.go +++ b/modules/mesh-delivery-indexer/judge/busstate.go @@ -128,6 +128,19 @@ func BusStateProblems(m catalogue.Manifest) []string { "no dot (novox/hq ADR 0201, ADR 0595 §1)", m.Module)) } storageOf := map[string]string{} + oldSection := map[string]string{} // a local name an old section keeps, to that section (issue 1966 D2) + for _, st := range m.State { + oldSection[st.Name] = "state" + } + for _, l := range m.Logs { + oldSection[l.Name] = "logs" + } + for _, st := range m.Streams { + oldSection[st.Name] = "streams" + } + for _, o := range m.Objects { + oldSection[o.Name] = "objects" + } terminal := catalogue.TerminalKeys(m) for _, e := range m.BusState { at := fmt.Sprintf("%s's bus state %q", m.Module, e.Name) @@ -147,6 +160,11 @@ func BusStateProblems(m catalogue.Manifest) []string { "ADR 0595 §1)", at, first, e.Storage)) } storageOf[e.Name] = e.Storage + if section, kept := oldSection[e.Name]; kept { + problems = append(problems, fmt.Sprintf( + "%s: the name is also kept in the old section %s; one local name is one form, so a module that moves an "+ + "entry removes it from the old section (novox/hq ADR 0595 §11)", at, section)) + } problems = append(problems, busEntryProblems(at, e, terminal)...) } return problems diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index 9315b808..13334227 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -5362,7 +5362,7 @@ func StateProblems(m catalogue.Manifest) []string { seen[s.Name] = true if s.History < 0 || s.History > catalogue.StateMostHistory { problems = append(problems, fmt.Sprintf( - "%s keeps %d values of %q; a key keeps between 1 and %d", m.Module, s.History, s.Name, catalogue.StateMostHistory)) + "%s keeps %d values of %q; a key keeps 0 or 1 to %d (0 is taken as 1)", m.Module, s.History, s.Name, catalogue.StateMostHistory)) } if s.TTLSeconds < 0 { problems = append(problems, fmt.Sprintf("%s gives %q a negative lifetime", m.Module, s.Name)) diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 89e45148..a036e926 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -907,6 +907,12 @@ func TestALogIsNamedLocallyAndCapped(t *testing.T) { {`{"module":"a.b","version":"1","logs":["c"]}`, `no dot`}, } { _, err := ParseManifest([]byte(c.manifest)) + if c.says == "" { + if err != nil { + t.Errorf("%s was refused: %v", c.manifest, err) + } + continue + } if err == nil { t.Errorf("%s was accepted", c.manifest) continue @@ -2877,13 +2883,23 @@ func TestAStateNameIsLocalAndOneToken(t *testing.T) { {`{"module":"a","version":"1","state":["mesh.servers"]}`, `keeps state "mesh.servers": a state is named locally`}, {`{"module":"a","version":"1","state":["my_servers"]}`, `keeps state "my_servers"`}, {`{"module":"a","version":"1","state":["s","s"]}`, `keeps state "s" twice`}, - {`{"module":"a","version":"1","state":[{"name":"s","history":65}]}`, `a key keeps between 1 and 64`}, + {`{"module":"a","version":"1","state":[{"name":"s","history":65}]}`, `a key keeps 0 or 1 to 64 (0 is taken as 1)`}, + {`{"module":"a","version":"1","state":[{"name":"s","history":0}]}`, ``}, // 0 passes, as before (ADR 0579 §1) + // 1966/AC9: one name, one form + {`{"module":"a","version":"1","state":["x"],"requires":[{"name":"x","storage":"key-value","template":"state"}]}`, + `a's bus state "x": the name is also kept in the old section state`}, {`{"module":"a.b","version":"1","state":["s"]}`, `no dot`}, {`{"module":"a","version":"1","reads":["bindings"]}`, `a read is .`}, {`{"module":"a","version":"1","reads":["a.s"]}`, `which is its own state`}, {`{"module":"a","version":"1","state":[{"name":"s","shared":true}]}`, `{name, history, ttl-seconds, per-machine, key-ttl}`}, } { _, err := ParseManifest([]byte(c.manifest)) + if c.says == "" { + if err != nil { + t.Errorf("%s was refused: %v", c.manifest, err) + } + continue + } if err == nil { t.Errorf("%s was accepted", c.manifest) continue