From 10bbbadcf2c3bfd30811ca52027aa70cc5d9f74e Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 20:28:37 +0100 Subject: [PATCH] artifact-store-tools: require no artifact-store; the sweep reaches the store through the registry seats (issue 1966) The operator's decision of 2026-11-04: the store's clean-up asks the registry seats' verbs and is no consumer of the provision. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig --- modules/artifact-store-tools/README.md | 12 ++++++------ .../cmd/artifact-store-tools/main.go | 7 +++---- .../cmd/artifact-store-tools/store_test.go | 6 ++++++ modules/artifact-store-tools/module.json | 3 --- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/modules/artifact-store-tools/README.md b/modules/artifact-store-tools/README.md index bce43f721..2cfbce8cf 100644 --- a/modules/artifact-store-tools/README.md +++ b/modules/artifact-store-tools/README.md @@ -6,12 +6,12 @@ directory and the file the mesh writes there from its setting `older-store-names ## Why a module beside the store -The store is the `distribution` module. A module that provides the artifact store cannot also build an -artifact: building publishes to the store, so the store would be needed to create itself, and the -controller's module check refuses that manifest. So the store's tools are a second module, as the -controller's refusal says to do. **Assign it to the machine that holds the store**: its tools read the -store's files through the store's own container, and anywhere else they answer that the container is not -on that machine. +The store is the `distribution` module, the registry seats' holder. These tools became a module of their own when the +indexer's judge refused a store holder that builds an artifact; that rule is gone (issue 1966), and the sweep stays its +own module, holding the seat `mesh-artifact-sweep`. It requires no provision: what it holds, releases and removes it +asks the registry seats `oci-artifact-registry` and `container-image-registry` (see *The sweep through the registry +seats*). **Assign it to the machine that holds the store**: its read tools read the store's files through the store's +own container, and anywhere else they answer that the container is not on that machine. ## Tools diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/main.go b/modules/artifact-store-tools/cmd/artifact-store-tools/main.go index c74935ed7..8d53a2088 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/main.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/main.go @@ -3,10 +3,9 @@ // size, and what the mesh keeps of each manifest — read from the store's own files through the store's own container, // and it holds the seat mesh-artifact-sweep: the keep set, the sweep at each build's end, and S25's image-missing. // -// **A module beside the store, not the store's own.** A module that provides the artifact store cannot also build an -// artifact: building publishes to the store, so the store would be needed to create itself. So these tools are a -// second module, assigned to the machine that holds the store. stdout is the protocol; what this bundle says, it says -// on stderr. +// **A module beside the store, not the store's own.** It requires no provision: what it holds and removes it asks the +// registry seats (sweepseats.go), and it is assigned to the machine that holds the store, whose container its read +// tools read through. stdout is the protocol; what this bundle says, it says on stderr. package main import ( diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/store_test.go b/modules/artifact-store-tools/cmd/artifact-store-tools/store_test.go index 1f9b7bec0..3d9c743c4 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/store_test.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/store_test.go @@ -449,6 +449,7 @@ func TestTheToolsServedAreTheToolsTheManifestNames(t *testing.T) { Invokes []string `json:"invokes"` Reads []string `json:"reads"` Consumes []string `json:"consumes"` + Requires []any `json:"requires"` Claims []struct { Name string `json:"name"` Serves []string `json:"serves"` @@ -484,6 +485,11 @@ func TestTheToolsServedAreTheToolsTheManifestNames(t *testing.T) { slices.Contains(m.Reads, WantsRead) || slices.Contains(m.Reads, ManifestsRead) { t.Errorf("consumes %v, reads %v", m.Consumes, m.Reads) } + // The operator, 2026-11-04 (issue 1966): it reaches the store through the registry seats' verbs, and requires no + // provision artifact-store. + if len(m.Requires) != 0 { + t.Errorf("requires %v, want nothing: the store is reached through the registry seats", m.Requires) + } var verbs []string for _, tl := range SeatTools(&Holder{}, &Store{}) { verbs = append(verbs, strings.TrimPrefix(tl.Name, catalogue.ArtifactSweepSeat+".")) diff --git a/modules/artifact-store-tools/module.json b/modules/artifact-store-tools/module.json index 4c0161fe5..35a5e0f35 100644 --- a/modules/artifact-store-tools/module.json +++ b/modules/artifact-store-tools/module.json @@ -14,9 +14,6 @@ ] } ], - "requires": [ - "artifact-store" - ], "invokes": [ "seat:mesh-hand-acts.hand-act", "seat:mesh-catalog.modules",