Answer what the records keep, collect on a person's word, and name a machine's images (hq ADR 0251)
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery superseded: a newer delivery to the same trunk took over its walk

The store's tools and a machine's image pruning decide from the records, so
the controller says them: artifacts (every recorded artifact, kept and why,
eligible, collected on request), collect (the after-build sweep on demand,
a dry run unless confirmed with a why, recorded as a hand act) and images
(what a machine's declaration names, now and as last sent). The sweep is one
implementation with two sets of bounds.
This commit is contained in:
jochen
2026-10-08 12:04:42 +02:00
parent 4d337ff897
commit 557b23d43f
12 changed files with 1116 additions and 127 deletions
+36
View File
@@ -573,6 +573,38 @@ func (a *verbArguments) commandLine() ([]string, error) {
return argv, nil
}
return []string{"cleanup", "list", "--json"}, nil
// novox/hq ADR 0251.
case "artifacts":
argv := []string{"artifacts", "--json"}
if r := str("repository"); r != "" {
argv = append(argv, "--repository", r)
}
if on("collected") {
argv = append(argv, "--collected")
}
return argv, nil
case "collect":
argv := []string{"collect", "--json"}
if m := str("most"); m != "" {
argv = append(argv, "--most", m)
}
why := str("why")
if !on("confirm") {
if why != "" {
return nil, errors.New("collect takes why only with confirm: without confirm it is a dry run, " +
"and a reason for nothing would be recorded nowhere. Nothing was done")
}
return argv, nil
}
if err := need("why"); err != nil {
return nil, fmt.Errorf("%w: letting go of artifacts is a hand act, which says why. Nothing was done", err)
}
return append(argv, "--confirm", "--why", why), nil
case "images":
if err := need("node"); err != nil {
return nil, err
}
return []string{"images", str("node"), "--json"}, nil
case "data":
argv := []string{"data", "--json"}
if m := str("machine"); m != "" {
@@ -768,6 +800,8 @@ func (a *verbArguments) commandLine() ([]string, error) {
// jsonVerbs are the verbs whose command speaks JSON, so the answer carries it as data as well.
var jsonVerbs = map[string]bool{"status": true, "seats": true, "plan": true, "collection": true,
"hand-acts": true, "durations": true, "conditions": true, "doctor": true, "retire": true, "cleanup": true, "data": true,
// What the records say the registries may keep (novox/hq ADR 0251).
"artifacts": true, "collect": true, "images": true,
// The delivery's owner's verbs answer JSON where they read (plan, order, check, walks) — novox/hq ADR 0239.
"delivery": true}
@@ -791,6 +825,8 @@ func repairingCommand(argv []string) string {
return "retire " + argv[1]
case argv[0] == "cleanup" && len(argv) > 1 && argv[1] == "delete":
return "cleanup delete"
case argv[0] == "collect" && slices.Contains(argv, "--confirm"):
return "collect"
}
return ""
}