diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index 5cf96ea3..8caf1284 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -5571,12 +5571,15 @@ var streamsKeptUntilMoved = map[string][]string{ "mesh-delivery-forge-bridge": {"forge"}, } -// PredefinedFormProblems refuses each stream a module declares that streamsKeptUntilMoved does not name for it. +// PredefinedFormProblems refuses each stream a module declares that streamsKeptUntilMoved does not name for it, but a +// foundation part's. func PredefinedFormProblems(m catalogue.Manifest) []string { var out []string for _, s := range m.Streams { // A stream that keeps its history is one of the bus's predefined forms (novox/hq ADR 0592 §6). - if !s.KeepsHistory() && !slices.Contains(streamsKeptUntilMoved[m.Module], s.Name) { + // A foundation part keeps its old sections for good, its streams among them: its findings stream + // `-findings` (design 47 G §529, A-30, A-146). + if !s.KeepsHistory() && !slices.Contains(Foundation, m.Module) && !slices.Contains(streamsKeptUntilMoved[m.Module], s.Name) { out = append(out, fmt.Sprintf("%s keeps the stream %q, outside the bus's predefined forms: keep it as a state, "+ "a log or an object store, which the runtime reads for the module's tools and others read by `reads`", 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 a6420d79..2632de4b 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -5111,6 +5111,11 @@ func caseTwoModulesCannotDeclareOneStream(t *testing.T) { if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-mail", Streams: a.Streams}); len(got) != 0 { t.Fatalf("a stream kept until it moves was refused: %v", got) } + // A foundation part keeps its old sections for good: its findings stream is accepted (design 47 G §529, A-30, A-146). + findings := []catalogue.StreamDeclaration{{Name: "mesh-delivery-indexer-findings", Events: []string{"finding-written.*"}}} + if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-delivery-indexer", Streams: findings}); len(got) != 0 { + t.Fatalf("a foundation part's findings stream was refused: %v", got) + } } // A seat name meaning two protocols is the failure nobody could diagnose afterwards.