diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index c41edf39..93137c5f 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -7585,9 +7585,9 @@ var defaultSeats = append([]catalogue.Seat{ }}, // Named for its scope since 2026-09-30 (novox/hq ADR 0156); `the-artifact-store` resolves to it as // an alias on a mesh that predates the rename. It serves artifacts of every kind a build makes — - // images and archives, by digest — which is why the provision is the artifact store and not an - // image registry. - {Name: "mesh-artifact-store", Scope: catalogue.ScopeMesh, Delivers: "artifact-store", Decision: "novox/hq ADR 0075"}, + // images and archives, by digest. It delivers nothing since the provision artifact-store retired + // (novox/hq ADR 0632 §2): the store's address is the image seat holder's listen. + {Name: "mesh-artifact-store", Scope: catalogue.ScopeMesh, Decision: "novox/hq ADR 0075"}, // The catalog (novox/hq ADR 0604): the SDK's entry, its four verbs optional while the module that claimed it before stands. {Name: "mesh-catalog", Scope: catalogue.ScopeMesh, Serves: catalogVerbs(), Decision: "novox/hq ADR 0604"}, // The delivery's owner (novox/hq ADR 0239): one commit's journey from its pull request's head to every diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 614b7883..9c82189a 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -4251,6 +4251,28 @@ func TestAStoreHolderThatBuildsIsNotRefusedByItsManifest(t *testing.T) { if err != nil { t.Fatalf("a module that provides the artifact store and builds was refused: %v", err) } + // The provision artifact-store retired (novox/hq ADR 0632 §2): the store's holder holds its three seats providing and + // serving nothing, in the judge's seat copy and the SDK's alike; a module still serving it without providing it is + // refused as any served provision is. + holder := catalogue.Manifest{Module: "registry", Version: "1", + Claims: []catalogue.Claim{{Name: "mesh-artifact-store", Scope: catalogue.ScopeMesh}}, + Listens: []catalogue.Listening{{Name: "registry", Port: 5000, From: catalogue.FromMesh}}} + for _, name := range []string{"container-image-registry", "oci-artifact-registry"} { + s, _ := catalogue.SeatNamed(name) + holder.Claims = append(holder.Claims, catalogue.Claim{Name: name, Scope: catalogue.ScopeMesh, Serves: catalogue.VerbNames(s.Serves)}) + } + for _, s := range append([]catalogue.Seat{}, seats...) { + if s.Delivers == "artifact-store" { + t.Errorf("the judge's %s still delivers the retired artifact-store", s.Name) + } + } + if got := strings.Join(CatalogueProblems(catalogue.Shelf{"registry": holder}), "; "); strings.Contains(got, "artifact-store") { + t.Errorf("the store's holder providing nothing was refused: %s", got) + } + if _, err := ParseManifest([]byte(`{"module":"old","version":"1","serves":{"artifact-store":{"port":5000}}}`)); err == nil || + !strings.Contains(err.Error(), `serves "artifact-store" to whoever requires it, and does not provide it`) { + t.Errorf("a module serving artifact-store it does not provide: %v", err) + } } // The module holding mesh-broker is the bus, and its account is granted the bus's snapshot API and @@ -4914,10 +4936,7 @@ func TestTheSeatsAreAClosedSetAndEachNamesItsDecision(t *testing.T) { if s.Delivers != "" { // Two seats answering for one provision would put the question "which one?" back, // which is the question a seat exists to answer. - // Except artifact-store, which the two registry seats for images and bundles deliver beside the artifact store - // until its old name closes (novox/hq ADR 0613, design 51): a reference's seat says which one answers. - if other, twice := delivered[s.Delivers]; twice && !(s.Delivers == "artifact-store" && - slices.Contains([]string{"container-image-registry", "oci-artifact-registry"}, s.Name)) { + if other, twice := delivered[s.Delivers]; twice { t.Errorf("%s and %s both deliver %q", other, s.Name, s.Delivers) } delivered[s.Delivers] = s.Name