From a732cb0cb2f332fbbb2c518ac1923522db89431d Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 9 Nov 2026 21:01:34 +0100 Subject: [PATCH] The indexer declares no modules or graph state: its view of the trunk is the catalog graph revisions (milestone 47/G W4.3, the manifest) The states modules and graph leave the manifest and the names the indexer keeps; their first views and read tools are answered from the newest revision, whose changes catalog-revision says. The contract keeps the modules type until its readers moved (the lead's ruling). The manifest validator, built at mesh-delivery's trunk, accepts the indexer in both cases, change and trunk, and no verdict differs. Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ --- .../cmd/mesh-delivery-indexer/integration_test.go | 14 +++++++------- .../mesh-delivery-indexer/internal/index/names.go | 6 ------ .../mesh-delivery-indexer/internal/index/views.go | 2 -- modules/mesh-delivery-indexer/manifest_test.go | 12 ++++++------ modules/mesh-delivery-indexer/module.json | 2 -- 5 files changed, 13 insertions(+), 23 deletions(-) diff --git a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go index efafb1e5..16f3ec69 100644 --- a/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go +++ b/modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go @@ -263,7 +263,7 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 named := held.WaitsFor get := func(bucket, key string) ([]byte, bool) { t.Helper() - if bucket == index.ModulesBucket { + if bucket == index.ModulesState { // the view of the trunk, from the newest catalog graph revision e, err := revisionView{js: js}.Get(ctx, key) if err != nil { return nil, false @@ -281,7 +281,7 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 return e.Value(), true } // Only what building and moving the named indexer needs is written. - raw, ok := get(index.ModulesBucket, ix) + raw, ok := get(index.ModulesState, ix) own, err := meshcatalogclient.DecodeModule(raw) if !ok || err != nil || own.Fp2 != named || own.Commit != m1.Merge { t.Fatalf("modules.%s = %+v (%v), want the named build %s at the merge", ix, own, err, named) @@ -293,7 +293,7 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 t.Errorf("the verdict on the indexer's manifest %s is not written", own.Manifest) } repoKey, _ := trunk.RepositoryKey(m1.Repository) - if _, ok := get(index.ModulesBucket, "a"); ok { + if _, ok := get(index.ModulesState, "a"); ok { t.Errorf("modules.a is written while the revision is pending") } if _, ok := get(index.TakenBucket, repoKey); ok { @@ -353,7 +353,7 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 break } } - if raw, ok := get(index.ModulesBucket, "a"); !ok || !strings.Contains(string(raw), m1.Merge) { + if raw, ok := get(index.ModulesState, "a"); !ok || !strings.Contains(string(raw), m1.Merge) { t.Errorf("modules.a = %s after the take-in at the start, want it at the merge %s", raw, m1.Merge) } if _, ok := get(index.TakenBucket, repoKey); !ok { @@ -362,7 +362,7 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 if len(w) != 1 || w[0].Key != groupKey || len(w[0].Keys) != 1 || w[0].Keys[0] != g1Key { t.Fatalf("indexer_pending after the start = %+v, want only the group gathered, its first member %s", w, g1Key) } - if _, ok := get(index.ModulesBucket, "c"); ok { + if _, ok := get(index.ModulesState, "c"); ok { t.Errorf("modules.c is written while its group is gathered") } @@ -381,8 +381,8 @@ func TestIndexerWhole(t *testing.T) { // 1238/AC2, AC10; 1585/T14, T15 } var hasC, hasK bool for deadline := time.Now().Add(20 * time.Second); time.Now().Before(deadline) && !(hasC && hasK && len(w) == 0); time.Sleep(50 * time.Millisecond) { - _, hasC = get(index.ModulesBucket, "c") - _, hasK = get(index.ModulesBucket, "k") + _, hasC = get(index.ModulesState, "c") + _, hasK = get(index.ModulesState, "k") w = waits() } if !hasC || !hasK || len(w) != 0 { diff --git a/modules/mesh-delivery-indexer/internal/index/names.go b/modules/mesh-delivery-indexer/internal/index/names.go index e3d860d9..7a53689a 100644 --- a/modules/mesh-delivery-indexer/internal/index/names.go +++ b/modules/mesh-delivery-indexer/internal/index/names.go @@ -1,7 +1,5 @@ package index -import "git.novox.be/novox/mesh-delivery/sdk/graph" - // The holders, states and buckets the indexer names, taken from its own manifest (module.json: its name, its `state`, its // `reads`) and from the manifests of the holders it reads; a unit row checks them against the manifest // (TestTheNamesAreTheManifests). No contract names a holder (novox/hq ADR 0625 §4, ADR 0634 §1). @@ -14,13 +12,9 @@ const ( CandidatesBucket = Module + "_" + CandidatesState CandidatesHistory = 10 ModulesState = "modules" - ModulesBucket = Module + "_" + ModulesState - ModulesHistory = 20 ManifestsState = "manifests" ManifestsBucket = Module + "_" + ManifestsState ManifestsHistory = 1 - // GraphBucket is the bucket of the state graph (sdk/graph names the state, not its holder). - GraphBucket = Module + "_" + graph.State // VerdictsState and VerdictsBucket are in verdicts.go. VerdictsHistory = 5 PredefinedState = "predefined" diff --git a/modules/mesh-delivery-indexer/internal/index/views.go b/modules/mesh-delivery-indexer/internal/index/views.go index 7bcffe38..88bebe00 100644 --- a/modules/mesh-delivery-indexer/internal/index/views.go +++ b/modules/mesh-delivery-indexer/internal/index/views.go @@ -43,13 +43,11 @@ type ViewedTool struct { // ViewedStates are the states the indexer's views family says, each by its bucket: the ones its readers read. var ViewedStates = map[string]string{ "manifests": ManifestsBucket, - "modules": ModulesBucket, VerdictsState: VerdictsBucket, PredefinedState: PredefinedBucket, ConfigCandidatesState: ConfigCandidatesBucket, "candidates": CandidatesBucket, PackagesState: PackagesBucket, - graph.State: GraphBucket, HeardState: HeardBucket, "taken": TakenBucket, mcc.FindingsState: mcc.FindingsBucket(Module), diff --git a/modules/mesh-delivery-indexer/manifest_test.go b/modules/mesh-delivery-indexer/manifest_test.go index 34b28b91..209bfd62 100644 --- a/modules/mesh-delivery-indexer/manifest_test.go +++ b/modules/mesh-delivery-indexer/manifest_test.go @@ -16,7 +16,6 @@ import ( "git.novox.be/novox/mesh-sdk/go/catalogue" mcc "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" - "git.novox.be/novox/mesh-delivery/sdk/graph" "git.novox.be/novox/mesh-sdk/go/views" "mesh-delivery-indexer/internal/index" @@ -117,8 +116,8 @@ func TestManifestDeclarations(t *testing.T) { // 1238/AC1, 1444 (reads the build t.Errorf("emits = %v, want the two take-in events (the verdict events are the seat mesh-catalog's)", m.Emits) } // 1126 note 76: heard keeps the last 64 FORGE messages the indexer handled, for indexer_heard. - if want := []state{{Name: "candidates", History: 10}, {Name: "heard", History: 64}, {Name: "manifests", History: 1}, {Name: "modules", History: 20}, {Name: "predefined", History: 5}, {Name: "config-candidates", History: 5}, {Name: "taken", History: 1}, {Name: "takeins", History: 1}, {Name: "verdicts", History: 5}, {Name: "oldsections", History: 1}, {Name: "try-recovery", History: 1}, {Name: "own-build", History: 1}, {Name: index.PackagesState, History: index.PackagesHistory}, - {Name: graph.State, History: graph.History}, {Name: views.MarksState, History: 1}, {Name: mcc.FindingsState, History: 5}, {Name: views.StatusState, History: 1}, + if want := []state{{Name: "candidates", History: 10}, {Name: "heard", History: 64}, {Name: "manifests", History: 1}, {Name: "predefined", History: 5}, {Name: "config-candidates", History: 5}, {Name: "taken", History: 1}, {Name: "takeins", History: 1}, {Name: "verdicts", History: 5}, {Name: "oldsections", History: 1}, {Name: "try-recovery", History: 1}, {Name: "own-build", History: 1}, {Name: index.PackagesState, History: index.PackagesHistory}, + {Name: views.MarksState, History: 1}, {Name: mcc.FindingsState, History: 5}, {Name: views.StatusState, History: 1}, {Name: index.RequirementsState, History: 5}, {Name: index.SeatDefinitionsState, History: 5}, {Name: index.HoldsState, History: 5}, {Name: index.EngineReadsState, History: 1}, {Name: index.HoldBoundsState, History: 1, KeyTTL: true}, {Name: index.PendingState, History: 1}, {Name: index.UnjudgedState, History: 1}}; !reflect.DeepEqual(m.State, want) { // DLV-I7, DLV-I17, ADR 0632 §2 t.Errorf("state = %+v, want %+v", m.State, want) @@ -133,8 +132,8 @@ func TestManifestDeclarations(t *testing.T) { // 1238/AC1, 1444 (reads the build if index.Module != m.Module { t.Errorf("the indexer names itself %q, its manifest's module is %q", index.Module, m.Module) } - for bucket, history := range map[string]int{index.CandidatesBucket: index.CandidatesHistory, index.ModulesBucket: index.ModulesHistory, index.ManifestsBucket: index.ManifestsHistory, - index.VerdictsBucket: index.VerdictsHistory, index.PackagesBucket: index.PackagesHistory, index.TakenBucket: 1, index.PredefinedBucket: 5, index.ConfigCandidatesBucket: 5, index.GraphBucket: graph.History} { + for bucket, history := range map[string]int{index.CandidatesBucket: index.CandidatesHistory, index.ManifestsBucket: index.ManifestsHistory, + index.VerdictsBucket: index.VerdictsHistory, index.PackagesBucket: index.PackagesHistory, index.TakenBucket: 1, index.PredefinedBucket: 5, index.ConfigCandidatesBucket: 5} { if !slices.ContainsFunc(m.State, func(st state) bool { return m.Module+"_"+st.Name == bucket && st.History == history }) { t.Errorf("the indexer names its bucket %s with %d revisions, its manifest's states are %+v", bucket, history, m.State) } @@ -177,7 +176,8 @@ func TestManifestDeclarations(t *testing.T) { // 1238/AC1, 1444 (reads the build want := []string{"indexer_take_in", "indexer_old_sections", "indexer_verdicts", "indexer_judge"} for _, v := range append(append([]index.ViewedTool{}, index.FirstViewTools...), index.ReadTools...) { want = append(want, v.Tool) - if _, ok := index.ViewedStates[v.State]; !ok { + // Milestone 47/G: modules and graph are the newest catalog graph revision's, which catalog-revision says the changes of. + if _, ok := index.ViewedStates[v.State]; !ok && v.State != index.ModulesState && v.State != "graph" { t.Errorf("%s answers the state %s, which the views family does not say", v.Tool, v.State) } } diff --git a/modules/mesh-delivery-indexer/module.json b/modules/mesh-delivery-indexer/module.json index b56cb192..c3a0a3c7 100644 --- a/modules/mesh-delivery-indexer/module.json +++ b/modules/mesh-delivery-indexer/module.json @@ -77,7 +77,6 @@ { "name": "candidates", "history": 10 }, { "name": "heard", "history": 64 }, { "name": "manifests", "history": 1 }, - { "name": "modules", "history": 20 }, { "name": "predefined", "history": 5 }, { "name": "config-candidates", "history": 5 }, { "name": "taken", "history": 1 }, @@ -87,7 +86,6 @@ { "name": "try-recovery", "history": 1 }, { "name": "own-build", "history": 1 }, { "name": "packages", "history": 5 }, - { "name": "graph", "history": 5 }, { "name": "view-marks", "history": 1 }, { "name": "findings", "history": 5 }, { "name": "first-views", "history": 1 },