diff --git a/go/catalogue/engine_seat.go b/go/catalogue/engine_seat.go index a10e9ec..829143f 100644 --- a/go/catalogue/engine_seat.go +++ b/go/catalogue/engine_seat.go @@ -61,6 +61,14 @@ func EngineVerbs() []Verb { Input: schema(map[string]string{"module": "the module, as placed on this machine; node for the node's own", "digest": "a composition's digest (sha256:…), to read that revision rather than the latest", "diff": "\"true\": list the resources that differ from what runs"}, []string{"module"})}, + // The recovery of a composition that failed (issue 774, 2026-10-31: ace kept route-proxy failed for a vault that + // answered again a minute later). Optional until every engine serves it. + {Name: "compose", Optional: true, Description: "Compose this machine's modules now and say how it went, so a " + + "composition that failed, or a module held, recovers without a restart: what the pass refused or held, each " + + "with why, and when the engine composes again on its own after a seat that did not answer (a deadline, no " + + "responders: retried with a growing wait; a refusal never). With module, that module's apply is also tried " + + "again. Changes only what a pass the engine makes on its own would change.", + Input: schema(map[string]string{"module": "a module placed on this machine whose apply is also tried again (optional)"}, nil)}, } } diff --git a/go/catalogue/seats_test.go b/go/catalogue/seats_test.go index d18d35f..1a58ab1 100644 --- a/go/catalogue/seats_test.go +++ b/go/catalogue/seats_test.go @@ -98,7 +98,7 @@ func TestTheSeatsAreAClosedSetAndEachNamesItsDecision(t *testing.T) { if props, _ := engine.Serves[5].Input["properties"].(map[string]any); props["id"] == nil { t.Errorf("acts takes no id: %v", engine.Serves[5].Input) } - if strings.Join(verbs, ",") != "hand-over,access-act,judge-directories,setuid-search,root-free,acts,packages,composition" || + if strings.Join(verbs, ",") != "hand-over,access-act,judge-directories,setuid-search,root-free,acts,packages,composition,compose" || strings.Join(engine.Emits, ",") != "asked,done,refused" { t.Errorf("node-engine serves %v and emits %v", verbs, engine.Emits) }