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
This commit is contained in:
2026-11-04 20:28:37 +01:00
parent 3dfc3533be
commit 10bbbadcf2
4 changed files with 15 additions and 13 deletions
+6 -6
View File
@@ -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
@@ -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 (
@@ -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+"."))
-3
View File
@@ -14,9 +14,6 @@
]
}
],
"requires": [
"artifact-store"
],
"invokes": [
"seat:mesh-hand-acts.hand-act",
"seat:mesh-catalog.modules",