A-238: a run ask whose program reads only its input names no head

The indexer's validation runs its manifest validator over its input alone
(design 47 G §712: heads none); the holder lays an empty MESH_RUN_HEADS.

Builds: design 47 G §712, A-238

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
2026-11-12 09:16:19 +01:00
parent 642a0ad2f9
commit 9e02d6234b
2 changed files with 6 additions and 6 deletions
@@ -59,7 +59,9 @@ func stepAsk() StepAsk {
// The ask the three build seats share is one neutral form: it round-trips, and every ill-formed ask is refused,
// naming what is wrong (the rules of the old delivery.StepAsk, now the shared runner's).
func TestAskCheckAndRoundTrip(t *testing.T) {
for _, a := range []StepAsk{goodBuild(), goodCheck(), runAsk(), stepAsk()} {
headless := runAsk() // a run whose program reads only its input names no head (design 47 G §712, A-238)
headless.Run.Heads = nil
for _, a := range []StepAsk{goodBuild(), goodCheck(), runAsk(), headless, stepAsk()} {
raw, err := EncodeStepAsk(a)
if err != nil {
t.Fatal(err)
@@ -106,7 +108,6 @@ func TestAskCheckAndRoundTrip(t *testing.T) {
{"run at a short commit", func(a *StepAsk) { a.Run.Program.Commit = "0123456" }, "no full commit"},
{"run outside the repository", func(a *StepAsk) { a.Run.Program.Dir = "../x" }, "no clean directory"},
{"run of no package", func(a *StepAsk) { a.Run.Program.Package = "" }, "no package"},
{"run over no head", func(a *StepAsk) { a.Run.Heads = nil }, "no head"},
{"run over a head twice", func(a *StepAsk) { a.Run.Heads = append(a.Run.Heads, a.Run.Heads[0]) }, "twice"},
{"run over a branch", func(a *StepAsk) { a.Run.Heads[1].Commit = "main" }, "novox/mesh-sdk at no full commit"},
{"input on a state", func(a *StepAsk) { a.Run.Input.Verb = "mesh-delivery-checker.inputs" }, "no seat:<seat>.<verb>"},
+3 -4
View File
@@ -31,7 +31,9 @@ type RunJob struct {
// Program is where the program is built: the repository and full commit fetched, the Go module's directory in it and
// the program's import path. The ask's Packages are the mesh package versions it builds against (ADR 0573 §2, §4).
Program RunProgram `json:"program"`
// Heads are the commits the program reads, each laid read-only at its repository's path; a repository at most once.
// Heads are the commits the program reads, each laid read-only at its repository's path; a repository at most once. None
// is a program that reads only its input (the indexer's manifest validator, design 47 G §712, A-238): the directory
// RunHeadsEnv names is then empty.
Heads []RunHead `json:"heads"`
// Input names the program's input, kept by the asker by its digest and served on a verb of its seat.
Input RunInput `json:"input"`
@@ -150,9 +152,6 @@ func (r RunJob) check(id string) error {
if p.Package == "" || strings.ContainsAny(p.Package, " \t\n") {
return fmt.Errorf("buildstep: the run ask %s names no package to build (%q)", id, p.Package)
}
if len(r.Heads) == 0 {
return fmt.Errorf("buildstep: the run ask %s names no head", id)
}
seen := map[string]bool{}
for _, h := range r.Heads {
if err := checkRunRepository(id, "a head of", h.Repository); err != nil {