From 247c422fbfb6a3c9b555d23cf4a73133b1648e27 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 04:56:25 +0100 Subject: [PATCH 01/12] BG9, BN9, BI3: the build seats' steps with drop writes the hand-act log first MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A drop of a kept detected-steps key records the act with the caller the bus proved, then deletes the key; a log that refuses deletes nothing and is answered error; a drop without why is refused; fetch is asked unless drop. Builds: design 47 G §463, §480 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../mesh-build-go/buildstep/dropdetected.go | 35 ++++++++++++++++++ .../cmd/mesh-build-go/handact.go | 13 +++++++ .../mesh-build-go/cmd/mesh-build-go/main.go | 2 + .../mesh-build-go/cmd/mesh-build-go/module.go | 4 ++ .../mesh-build-go/cmd/mesh-build-go/steps.go | 33 +++++++++++++++-- .../cmd/mesh-build-go/steps_test.go | 32 ++++++++++++++++ modules/mesh-build-go/go.mod | 2 + modules/mesh-build-go/module.json | 1 + .../cmd/mesh-build-image/asks.go | 2 +- .../cmd/mesh-build-image/compose_test.go | 2 +- .../cmd/mesh-build-image/handact.go | 13 +++++++ .../cmd/mesh-build-image/main.go | 1 + .../cmd/mesh-build-image/module.go | 2 + .../cmd/mesh-build-image/steps.go | 30 +++++++++++++-- .../cmd/mesh-build-image/steps_test.go | 26 ++++++++++++- modules/mesh-build-image/go.mod | 2 + modules/mesh-build-image/module.json | 1 + .../cmd/mesh-build-node/handact.go | 13 +++++++ .../cmd/mesh-build-node/main.go | 2 + .../cmd/mesh-build-node/module.go | 4 ++ .../cmd/mesh-build-node/steps.go | 37 +++++++++++++++++-- .../cmd/mesh-build-node/steps_test.go | 26 +++++++++++++ modules/mesh-build-node/go.mod | 2 + modules/mesh-build-node/module.json | 1 + 24 files changed, 272 insertions(+), 14 deletions(-) create mode 100644 modules/mesh-build-go/buildstep/dropdetected.go create mode 100644 modules/mesh-build-go/cmd/mesh-build-go/handact.go create mode 100644 modules/mesh-build-image/cmd/mesh-build-image/handact.go create mode 100644 modules/mesh-build-node/cmd/mesh-build-node/handact.go diff --git a/modules/mesh-build-go/buildstep/dropdetected.go b/modules/mesh-build-go/buildstep/dropdetected.go new file mode 100644 index 000000000..986fe78a2 --- /dev/null +++ b/modules/mesh-build-go/buildstep/dropdetected.go @@ -0,0 +1,35 @@ +package buildstep + +import ( + "errors" + "fmt" + "strings" +) + +// DropDetected is the drop of the build seats' `steps` (design 47 G §463, §480): a person's word deletes the kept key of +// an artifact's detected steps. The act is written in the hand-act log first, with the caller the bus proved; a drop +// whose log write fails deletes nothing and is answered by the text it returns, which names the log. A drop with no +// `why`, or whose call the runtime proved no caller for, is refused (an error, nothing recorded). +// +// record writes the act in the hand-act log of the seat mesh-hand-acts; forget deletes the key (nil where the seat keeps +// none, as an image's). +func DropDetected(artifact, why, caller, key string, record func(what, why string) error, forget func(key string) error) (string, error) { + switch { + case strings.TrimSpace(why) == "": + return "", errors.New("steps: a drop says why") + case caller == "" || caller == "unproven": + return "", errors.New("steps: a drop names who drops it, and the runtime proved no caller") + } + if record == nil { + return "the hand-act log is not served here: nothing was deleted", nil + } + if err := record(fmt.Sprintf("dropped the detected steps of %s (by %s)", artifact, caller), why); err != nil { + return fmt.Sprintf("the hand-act log refused the drop of %s, so nothing was deleted: %v", artifact, err), nil + } + if forget != nil { + if err := forget(key); err != nil { + return fmt.Sprintf("the drop of %s was recorded in the hand-act log and the key could not be deleted: %v", artifact, err), nil + } + } + return "", nil +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/handact.go b/modules/mesh-build-go/cmd/mesh-build-go/handact.go new file mode 100644 index 000000000..2903d3b6a --- /dev/null +++ b/modules/mesh-build-go/cmd/mesh-build-go/handact.go @@ -0,0 +1,13 @@ +package main + +import ( + "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" + stdio "git.novox.be/novox/mesh-sdk/go" +) + +// handActRecorder writes an act by hand in the hand-act log of the seat mesh-hand-acts (design 47 G §480); a log that +// does not take it is an error, never a quiet success. +func handActRecorder(what, why string) error { + _, err := meshhandactsclient.Recorder{Ask: stdio.Ask}.Record(meshhandactsclient.Request{What: what, Why: why, Cause: "build-steps-drop", Verb: "steps drop"}) + return err +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/main.go b/modules/mesh-build-go/cmd/mesh-build-go/main.go index 8817fc799..edbf844b3 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/main.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/main.go @@ -44,6 +44,8 @@ func main() { Steps: stdio.State(seat.StateSteps).Put, Detected: stdio.State(seat.StateDetectedSteps).Put, ReadDetected: readOf(stdio.State(seat.StateDetectedSteps)).Get, + ForgetDetected: stdio.State(seat.StateDetectedSteps).Delete, + RecordAct: handActRecorder, ReadSteps: readOf(stdio.State(seat.StateSteps)), Pauses: stdio.State(sdkstep.PausesState).Put, ReadPauses: readOf(stdio.State(sdkstep.PausesState)), diff --git a/modules/mesh-build-go/cmd/mesh-build-go/module.go b/modules/mesh-build-go/cmd/mesh-build-go/module.go index 26632aed3..5f0f36909 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/module.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/module.go @@ -37,6 +37,10 @@ type Module struct { // answer of the verb steps, one key per artifact. Detected buildstep.Put ReadDetected func(key string) (json.RawMessage, error) + // ForgetDetected deletes one key of detected-steps; RecordAct writes an act in the hand-act log of the seat + // mesh-hand-acts (§463, §480): a drop writes it first. + ForgetDetected func(key string) error + RecordAct func(what, why string) error // Pauses is the Put of the pauses state, which keeps the node's pause key without an age; ReadPauses reads it back. Pauses buildstep.Put ReadPauses StateRead diff --git a/modules/mesh-build-go/cmd/mesh-build-go/steps.go b/modules/mesh-build-go/cmd/mesh-build-go/steps.go index 7745cc695..7d9ddde4a 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/steps.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/steps.go @@ -130,6 +130,9 @@ type StepsAnswer struct { Fingerprint string `json:"fingerprint,omitempty"` Steps []DetectedStep `json:"steps"` Kept bool `json:"kept,omitempty"` + // Dropped is the artifact whose key a drop deleted; Error why a drop deleted nothing, naming the hand-act log. + Dropped string `json:"dropped,omitempty"` + Error string `json:"error,omitempty"` } // stepsTool is the seat's verb `steps`: it fetches the artifact's commit into a workspace of its own, only the tree (no @@ -138,26 +141,31 @@ func (m *Module) stepsTool() stdio.Tool { return stdio.Tool{Name: Seat + "." + seat.VerbSteps, Description: "Which pipeline steps a Go artifact can run, found by Go's convention: lint always, unit tests where a package holds a test file, " + "integration tests where one holds a test file built with the tag integration. A level with no test is not answered.", - Input: map[string]any{"type": "object", "required": []string{"module", "artifact", "fetch"}, "properties": map[string]any{ + Input: map[string]any{"type": "object", "required": []string{"module", "artifact"}, "properties": map[string]any{ "module": map[string]any{"type": "string"}, "artifact": map[string]any{"type": "string", "description": "the artifact reference, :"}, "fingerprint": map[string]any{"type": "string"}, "fetch": map[string]any{"type": "object", "description": "what the fetch tool is asked: the repository, the full commit and the module's directory"}, "again": map[string]any{"type": "boolean", "description": "find them anew, not from the kept answer"}, + "drop": map[string]any{"type": "boolean", "description": "delete the artifact's kept key instead of detecting; needs why (written in the hand-act log first)"}, + "why": map[string]any{"type": "string", "description": "with drop, why: a non-empty text"}, }}, Run: m.Short(m.steps)} } func (m *Module) steps(ctx context.Context, args map[string]any) (any, error) { str := func(k string) string { s, _ := args[k].(string); return s } + if str("artifact") == "" || str("module") == "" { + return nil, fmt.Errorf("steps: the module and the artifact are asked") + } + if drop, _ := args["drop"].(bool); drop { + return m.dropDetected(args, stdio.CallerOf(args)) + } fetch, _ := args["fetch"].(map[string]any) req, err := sdkstep.ParseFetchRequest(fetch) if err != nil { return nil, err } - if str("artifact") == "" || str("module") == "" { - return nil, fmt.Errorf("steps: the module and the artifact are asked") - } artifact, fp := str("artifact"), str("fingerprint") key := seat.DetectedStepsByModuleArtifactKey(str("module"), artifactName(artifact)) // The kept answer is the artifact's newest fingerprint's: used for the same fingerprint, replaced by a newer one @@ -181,6 +189,23 @@ func (m *Module) steps(ctx context.Context, args map[string]any) (any, error) { return StepsAnswer{Artifact: artifact, Fingerprint: fp, Steps: steps}, nil } +// dropDetected is `steps` with drop (§463, §480): the act is written in the hand-act log with the caller the bus proved, +// then the kept key is deleted; a log that refuses leaves the key. +func (m *Module) dropDetected(args map[string]any, caller string) (any, error) { + artifact, _ := args["artifact"].(string) + why, _ := args["why"].(string) + module, _ := args["module"].(string) + key := seat.DetectedStepsByModuleArtifactKey(module, artifactName(artifact)) + failed, err := buildstep.DropDetected(artifact, why, caller, key, m.RecordAct, m.ForgetDetected) + if err != nil { + return nil, err + } + if failed != "" { + return StepsAnswer{Artifact: artifact, Error: failed}, nil + } + return StepsAnswer{Artifact: artifact, Dropped: artifact}, nil +} + // artifactName is the artifact of an artifact reference :. func artifactName(ref string) string { if _, name, ok := strings.Cut(ref, ":"); ok { diff --git a/modules/mesh-build-go/cmd/mesh-build-go/steps_test.go b/modules/mesh-build-go/cmd/mesh-build-go/steps_test.go index b60021fff..3113c4efb 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/steps_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/steps_test.go @@ -3,8 +3,10 @@ package main import ( "context" "encoding/json" + "errors" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" "reflect" + "strings" "testing" ) @@ -87,3 +89,33 @@ func TestTheStepsVerbKeepsItsAnswerByFingerprint(t *testing.T) { t.Fatalf("newer fingerprint: %+v", a) } } + +// Design 47 G §463, §480 (BG9): steps with drop writes the hand-act log first, then deletes the key; a log that +// refuses deletes nothing; a drop without why, or with no caller the bus proved, is refused; fetch is not asked. +func TestTheStepsDropWritesTheHandActLogFirst(t *testing.T) { + var order []string + kept := map[string]bool{"mod.prog": true} + m := &Module{ + ForgetDetected: func(key string) error { order = append(order, "delete "+key); delete(kept, key); return nil }, + RecordAct: func(what, why string) error { order = append(order, "log "+why); return nil }, + } + drop := func(why, caller string) (any, error) { + return m.dropDetected(map[string]any{"module": "mod", "artifact": "mod:prog", "drop": true, "why": why}, caller) + } + got, err := drop("a stale answer", "shanks.person") + if a, _ := got.(StepsAnswer); err != nil || a.Dropped != "mod:prog" || kept["mod.prog"] || !reflect.DeepEqual(order, []string{"log a stale answer", "delete mod.prog"}) { + t.Fatalf("drop = %+v, %v, order %v, kept %v", got, err, order, kept) + } + if _, err := drop("", "shanks.person"); err == nil { + t.Error("a drop without why was taken") + } + if _, err := drop("why", "unproven"); err == nil { + t.Error("a drop with no proven caller was taken") + } + kept["mod.prog"], order = true, nil + m.RecordAct = func(string, string) error { return errors.New("log down") } + got, err = drop("again", "shanks.person") + if a, _ := got.(StepsAnswer); err != nil || a.Dropped != "" || !strings.Contains(a.Error, "hand-act log") || !kept["mod.prog"] || len(order) != 0 { + t.Fatalf("a refusing log: %+v, %v, kept %v, order %v", got, err, kept, order) + } +} diff --git a/modules/mesh-build-go/go.mod b/modules/mesh-build-go/go.mod index a3591514d..13a7cc1a1 100644 --- a/modules/mesh-build-go/go.mod +++ b/modules/mesh-build-go/go.mod @@ -3,6 +3,8 @@ module meshbuildgo go 1.26.0 require ( + git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-build-go/module.json b/modules/mesh-build-go/module.json index 19c0890ae..fa30c8470 100644 --- a/modules/mesh-build-go/module.json +++ b/modules/mesh-build-go/module.json @@ -39,6 +39,7 @@ "mesh-conditions.findings-asked" ], "invokes": [ + "seat:mesh-hand-acts.hand-act", "mesh-delivery-indexer.indexer_read_manifests", "seat:oci-artifact-registry.publish", "seat:oci-artifact-registry.publish-part", diff --git a/modules/mesh-build-image/cmd/mesh-build-image/asks.go b/modules/mesh-build-image/cmd/mesh-build-image/asks.go index 38a1bda81..141c550b2 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/asks.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/asks.go @@ -77,7 +77,7 @@ func (m *Module) Puller(steps []StepTool, source buildstep.AskSource) *buildstep // SeatTools are the seat's verbs on this node (ADR 0525 §10). func (m *Module) SeatTools(p *buildstep.Puller) []stdio.Tool { - return append(buildstep.SeatTools(Seat, "image", p), stepsTool(), m.keptArtifactVerb()) + return append(buildstep.SeatTools(Seat, "image", p), m.stepsTool(), m.keptArtifactVerb()) } // StepEndTool ends one step left running (issue 1890); the module's steps state is the one it reads and writes. diff --git a/modules/mesh-build-image/cmd/mesh-build-image/compose_test.go b/modules/mesh-build-image/cmd/mesh-build-image/compose_test.go index e952b09b5..72a70ec14 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/compose_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/compose_test.go @@ -23,7 +23,7 @@ func TestTheModuleInvokesTheImageSeatAndHoldsNoRegistry(t *testing.T) { if err != nil || json.Unmarshal(raw, &m) != nil { t.Fatal(err) } - if want := []string{"seat:container-image-registry.publish", "seat:container-image-registry.publish-part", + if want := []string{"seat:mesh-hand-acts.hand-act", "seat:container-image-registry.publish", "seat:container-image-registry.publish-part", "seat:container-image-registry.mirror", "seat:mesh-module-assigner.assignments", "seat:mesh-catalog.module"}; !slices.Equal(m.Invokes, want) { t.Errorf("invokes = %v, want %v", m.Invokes, want) } diff --git a/modules/mesh-build-image/cmd/mesh-build-image/handact.go b/modules/mesh-build-image/cmd/mesh-build-image/handact.go new file mode 100644 index 000000000..2903d3b6a --- /dev/null +++ b/modules/mesh-build-image/cmd/mesh-build-image/handact.go @@ -0,0 +1,13 @@ +package main + +import ( + "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" + stdio "git.novox.be/novox/mesh-sdk/go" +) + +// handActRecorder writes an act by hand in the hand-act log of the seat mesh-hand-acts (design 47 G §480); a log that +// does not take it is an error, never a quiet success. +func handActRecorder(what, why string) error { + _, err := meshhandactsclient.Recorder{Ask: stdio.Ask}.Record(meshhandactsclient.Request{What: what, Why: why, Cause: "build-steps-drop", Verb: "steps drop"}) + return err +} diff --git a/modules/mesh-build-image/cmd/mesh-build-image/main.go b/modules/mesh-build-image/cmd/mesh-build-image/main.go index 13224f1b2..f8b4c2e9c 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/main.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/main.go @@ -33,6 +33,7 @@ func main() { ctx := context.Background() m := &Module{ Node: strings.TrimSpace(os.Getenv("MESH_NODE")), + RecordAct: handActRecorder, Steps: stdio.State(seat.StateSteps).Put, ReadSteps: readOf(stdio.State(seat.StateSteps)), Pauses: stdio.State(sdkstep.PausesState).Put, diff --git a/modules/mesh-build-image/cmd/mesh-build-image/module.go b/modules/mesh-build-image/cmd/mesh-build-image/module.go index 73558e4e1..3392d7ff6 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/module.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/module.go @@ -21,6 +21,8 @@ const CheckRound = 10 * time.Minute // Module is the image build module's one running state. type Module struct { Node string + // RecordAct writes an act in the hand-act log of the seat mesh-hand-acts (§463, §480): a drop writes it first. + RecordAct func(what, why string) error // Account and UID are the account the module runs as; Home is its home. Account, UID, Home string // Steps is the Put of the steps state; ReadSteps reads it back for the read tools. diff --git a/modules/mesh-build-image/cmd/mesh-build-image/steps.go b/modules/mesh-build-image/cmd/mesh-build-image/steps.go index e62ff9364..555b5ea6f 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/steps.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/steps.go @@ -7,6 +7,7 @@ package main import ( "fmt" + "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage" stdio "git.novox.be/novox/mesh-sdk/go" ) @@ -16,10 +17,13 @@ type StepsAnswer struct { Artifact string `json:"artifact"` Fingerprint string `json:"fingerprint,omitempty"` Steps []seat.DetectedStep `json:"steps"` + // Dropped is the artifact a drop was recorded for; Error why a drop deleted nothing, naming the hand-act log. + Dropped string `json:"dropped,omitempty"` + Error string `json:"error,omitempty"` } // stepsTool is the seat's verb `steps`. -func stepsTool() stdio.Tool { +func (m *Module) stepsTool() stdio.Tool { return stdio.Tool{Name: Seat + "." + seat.VerbSteps, Description: "Which pipeline steps an image artifact can run: none (an image has no lint, unit or integration test step).", Input: map[string]any{"type": "object", "required": []string{"module", "artifact"}, "properties": map[string]any{ @@ -28,14 +32,34 @@ func stepsTool() stdio.Tool { "fingerprint": map[string]any{"type": "string"}, "fetch": map[string]any{"type": "object", "description": "not read: an image's steps need no tree"}, "again": map[string]any{"type": "boolean", "description": "not read: the answer is the same anew"}, + "drop": map[string]any{"type": "boolean", "description": "delete the artifact's kept key instead (an image keeps none); needs why, written in the hand-act log first"}, + "why": map[string]any{"type": "string", "description": "with drop, why: a non-empty text"}, }}, - Run: steps} + Run: m.steps} } -func steps(args map[string]any) (any, error) { +func (m *Module) steps(args map[string]any) (any, error) { str := func(k string) string { s, _ := args[k].(string); return s } if str("artifact") == "" || str("module") == "" { return nil, fmt.Errorf("steps: the module and the artifact are asked") } + if drop, _ := args["drop"].(bool); drop { + return m.dropDetected(args, stdio.CallerOf(args)) + } return StepsAnswer{Artifact: str("artifact"), Fingerprint: str("fingerprint"), Steps: []seat.DetectedStep{}}, nil } + +// dropDetected is `steps` with drop (§463, §480): the act is written in the hand-act log with the caller the bus proved; +// an image keeps no detected steps, so there is no key to delete. +func (m *Module) dropDetected(args map[string]any, caller string) (any, error) { + artifact, _ := args["artifact"].(string) + why, _ := args["why"].(string) + failed, err := buildstep.DropDetected(artifact, why, caller, "", m.RecordAct, nil) + if err != nil { + return nil, err + } + if failed != "" { + return StepsAnswer{Artifact: artifact, Error: failed}, nil + } + return StepsAnswer{Artifact: artifact, Dropped: artifact}, nil +} diff --git a/modules/mesh-build-image/cmd/mesh-build-image/steps_test.go b/modules/mesh-build-image/cmd/mesh-build-image/steps_test.go index b24fea3e4..3c1f6dc65 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/steps_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/steps_test.go @@ -1,6 +1,10 @@ package main -import "testing" +import ( + "errors" + "strings" + "testing" +) // Design 47 G §22, §328 (BLD8): the verb steps is served and answers none for an image. func TestTheStepsVerbAnswersNoStepForAnImage(t *testing.T) { @@ -22,3 +26,23 @@ func TestTheStepsVerbAnswersNoStepForAnImage(t *testing.T) { t.Fatal("the module serves no verb steps") } } + +// Design 47 G §463, §480 (BI3): steps with drop writes the hand-act log; a log that refuses answers error; a drop +// without why is refused. +func TestTheStepsDropWritesTheHandActLog(t *testing.T) { + var logged []string + m := &Module{RecordAct: func(what, why string) error { logged = append(logged, why); return nil }} + args := map[string]any{"module": "m", "artifact": "m:server", "drop": true, "why": "stale"} + got, err := m.dropDetected(args, "shanks.person") + if a, _ := got.(StepsAnswer); err != nil || a.Dropped != "m:server" || len(logged) != 1 { + t.Fatalf("drop = %+v, %v, logged %v", got, err, logged) + } + if _, err := m.dropDetected(map[string]any{"module": "m", "artifact": "m:server", "drop": true}, "shanks.person"); err == nil { + t.Error("a drop without why was taken") + } + m.RecordAct = func(string, string) error { return errors.New("log down") } + got, _ = m.dropDetected(args, "shanks.person") + if a, _ := got.(StepsAnswer); !strings.Contains(a.Error, "hand-act log") || a.Dropped != "" { + t.Fatalf("a refusing log: %+v", got) + } +} diff --git a/modules/mesh-build-image/go.mod b/modules/mesh-build-image/go.mod index bdd7b9dea..2779db400 100644 --- a/modules/mesh-build-image/go.mod +++ b/modules/mesh-build-image/go.mod @@ -3,6 +3,8 @@ module meshbuildimage go 1.26.0 require ( + git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-build-image/module.json b/modules/mesh-build-image/module.json index 4cfac839a..7fefa26e9 100644 --- a/modules/mesh-build-image/module.json +++ b/modules/mesh-build-image/module.json @@ -62,6 +62,7 @@ "node-tools" ], "invokes": [ + "seat:mesh-hand-acts.hand-act", "seat:container-image-registry.publish", "seat:container-image-registry.publish-part", "seat:container-image-registry.mirror", diff --git a/modules/mesh-build-node/cmd/mesh-build-node/handact.go b/modules/mesh-build-node/cmd/mesh-build-node/handact.go new file mode 100644 index 000000000..2903d3b6a --- /dev/null +++ b/modules/mesh-build-node/cmd/mesh-build-node/handact.go @@ -0,0 +1,13 @@ +package main + +import ( + "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" + stdio "git.novox.be/novox/mesh-sdk/go" +) + +// handActRecorder writes an act by hand in the hand-act log of the seat mesh-hand-acts (design 47 G §480); a log that +// does not take it is an error, never a quiet success. +func handActRecorder(what, why string) error { + _, err := meshhandactsclient.Recorder{Ask: stdio.Ask}.Record(meshhandactsclient.Request{What: what, Why: why, Cause: "build-steps-drop", Verb: "steps drop"}) + return err +} diff --git a/modules/mesh-build-node/cmd/mesh-build-node/main.go b/modules/mesh-build-node/cmd/mesh-build-node/main.go index ad83cc12f..c1abbf75f 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/main.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/main.go @@ -50,6 +50,8 @@ func main() { ReadSteps: readOf(stdio.State(seat.StateSteps)), Detected: stdio.State(seat.StateDetectedSteps).Put, ReadDetected: readOf(stdio.State(seat.StateDetectedSteps)).Get, + ForgetDetected: stdio.State(seat.StateDetectedSteps).Delete, + RecordAct: handActRecorder, Pauses: stdio.State(sdkstep.PausesState).Put, ReadPauses: readOf(stdio.State(sdkstep.PausesState)), ForgetPause: stdio.State(sdkstep.PausesState).Delete, diff --git a/modules/mesh-build-node/cmd/mesh-build-node/module.go b/modules/mesh-build-node/cmd/mesh-build-node/module.go index f87c17b98..8f1aea066 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/module.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/module.go @@ -51,6 +51,10 @@ type Module struct { // Detected and ReadDetected are the Put and the read of the state detected-steps (design 47 G §326, §414). Detected buildstep.Put ReadDetected func(key string) (json.RawMessage, error) + // ForgetDetected deletes one key of detected-steps; RecordAct writes an act in the hand-act log of the seat + // mesh-hand-acts (§463, §480): a drop writes it first. + ForgetDetected func(key string) error + RecordAct func(what, why string) error // Pauses is the Put of the pauses state, which keeps the node's pause key without an age; ReadPauses reads it back. Pauses buildstep.Put ReadPauses StateRead diff --git a/modules/mesh-build-node/cmd/mesh-build-node/steps.go b/modules/mesh-build-node/cmd/mesh-build-node/steps.go index 0f109953f..ca51adb3c 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/steps.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/steps.go @@ -38,6 +38,9 @@ type StepsAnswer struct { Fingerprint string `json:"fingerprint,omitempty"` Steps []DetectedStep `json:"steps"` Kept bool `json:"kept,omitempty"` + // Dropped is the artifact whose key a drop deleted; Error why a drop deleted nothing, naming the hand-act log. + Dropped string `json:"dropped,omitempty"` + Error string `json:"error,omitempty"` } // detectSteps finds the steps of the package directories under dir. @@ -77,26 +80,31 @@ func (m *Module) stepsTool() stdio.Tool { return stdio.Tool{Name: Seat + "." + seat.VerbSteps, Description: "Which pipeline steps a TypeScript artifact can run: the type-check as lint, always; unit tests where a package has a test script; " + "integration tests where one has a test:integration script. A level with no test is not answered.", - Input: map[string]any{"type": "object", "required": []string{"module", "artifact", "fetch"}, "properties": map[string]any{ + Input: map[string]any{"type": "object", "required": []string{"module", "artifact"}, "properties": map[string]any{ "module": map[string]any{"type": "string"}, "artifact": map[string]any{"type": "string", "description": "the artifact reference, :"}, "fingerprint": map[string]any{"type": "string"}, "fetch": map[string]any{"type": "object", "description": "what the fetch tool is asked: the repository, the full commit and the module's directory"}, "again": map[string]any{"type": "boolean", "description": "find them anew, not from the kept answer"}, + "drop": map[string]any{"type": "boolean", "description": "delete the artifact's kept key instead of detecting; needs why (written in the hand-act log first)"}, + "why": map[string]any{"type": "string", "description": "with drop, why: a non-empty text"}, }}, Run: m.Short(m.steps)} } func (m *Module) steps(ctx context.Context, args map[string]any) (any, error) { str := func(k string) string { s, _ := args[k].(string); return s } + if str("artifact") == "" || str("module") == "" { + return nil, fmt.Errorf("steps: the module and the artifact are asked") + } + if drop, _ := args["drop"].(bool); drop { + return m.dropDetected(args, stdio.CallerOf(args)) + } fetch, _ := args["fetch"].(map[string]any) req, err := sdkstep.ParseFetchRequest(fetch) if err != nil { return nil, err } - if str("artifact") == "" || str("module") == "" { - return nil, fmt.Errorf("steps: the module and the artifact are asked") - } artifact, fp := str("artifact"), str("fingerprint") name := artifact if _, n, ok := strings.Cut(artifact, ":"); ok { @@ -126,6 +134,27 @@ func (m *Module) steps(ctx context.Context, args map[string]any) (any, error) { return StepsAnswer{Artifact: artifact, Fingerprint: fp, Steps: steps}, nil } +// dropDetected is `steps` with drop (§463, §480): the act is written in the hand-act log with the caller the bus proved, +// then the kept key is deleted; a log that refuses leaves the key. +func (m *Module) dropDetected(args map[string]any, caller string) (any, error) { + artifact, _ := args["artifact"].(string) + why, _ := args["why"].(string) + module, _ := args["module"].(string) + name := artifact + if _, n, ok := strings.Cut(artifact, ":"); ok { + name = n + } + key := seat.DetectedStepsByModuleArtifactKey(module, name) + failed, err := buildstep.DropDetected(artifact, why, caller, key, m.RecordAct, m.ForgetDetected) + if err != nil { + return nil, err + } + if failed != "" { + return StepsAnswer{Artifact: artifact, Error: failed}, nil + } + return StepsAnswer{Artifact: artifact, Dropped: artifact}, nil +} + // stepsOfTree fetches the commit alone (nothing installed) into a workspace removed at the end. func (m *Module) stepsOfTree(ctx context.Context, req sdkstep.FetchRequest) ([]DetectedStep, error) { if err := os.MkdirAll(m.Work, 0o700); err != nil { diff --git a/modules/mesh-build-node/cmd/mesh-build-node/steps_test.go b/modules/mesh-build-node/cmd/mesh-build-node/steps_test.go index 0e7accaaa..3593c2d65 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/steps_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/steps_test.go @@ -2,9 +2,11 @@ package main import ( "context" + "errors" "os" "path/filepath" "reflect" + "strings" "testing" ) @@ -51,3 +53,27 @@ func TestTheStepsVerbIsServedAndRefusesAnAskWithoutAnArtifact(t *testing.T) { t.Error("an ask with no artifact was answered") } } + +// Design 47 G §463, §480 (BN9): steps with drop writes the hand-act log first, then deletes the key; a log that +// refuses deletes nothing; a drop without why is refused. +func TestTheStepsDropWritesTheHandActLogFirst(t *testing.T) { + var order []string + m := &Module{ + ForgetDetected: func(key string) error { order = append(order, "delete "+key); return nil }, + RecordAct: func(what, why string) error { order = append(order, "log "+why); return nil }, + } + args := map[string]any{"module": "mod", "artifact": "mod:web", "drop": true, "why": "stale"} + got, err := m.dropDetected(args, "shanks.person") + if a, _ := got.(StepsAnswer); err != nil || a.Dropped != "mod:web" || !reflect.DeepEqual(order, []string{"log stale", "delete mod.web"}) { + t.Fatalf("drop = %+v, %v, order %v", got, err, order) + } + if _, err := m.dropDetected(map[string]any{"module": "mod", "artifact": "mod:web", "drop": true}, "shanks.person"); err == nil { + t.Error("a drop without why was taken") + } + order = nil + m.RecordAct = func(string, string) error { return errors.New("log down") } + got, err = m.dropDetected(args, "shanks.person") + if a, _ := got.(StepsAnswer); err != nil || !strings.Contains(a.Error, "hand-act log") || len(order) != 0 { + t.Fatalf("a refusing log: %+v, %v, order %v", got, err, order) + } +} diff --git a/modules/mesh-build-node/go.mod b/modules/mesh-build-node/go.mod index af385b3dd..cb074bd3b 100644 --- a/modules/mesh-build-node/go.mod +++ b/modules/mesh-build-node/go.mod @@ -3,6 +3,8 @@ module meshbuildnode go 1.26.0 require ( + git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-build-node/module.json b/modules/mesh-build-node/module.json index 1afa7b1a6..a056ac734 100644 --- a/modules/mesh-build-node/module.json +++ b/modules/mesh-build-node/module.json @@ -75,6 +75,7 @@ "npm-package-registry": "${dir:state}/package-registry.json" }, "invokes": [ + "seat:mesh-hand-acts.hand-act", "seat:oci-artifact-registry.publish", "seat:oci-artifact-registry.publish-part", "seat:npm-package-registry.publish", From 904b8aedd43b27f9ec13c05adfbd7f4ec8f0e94d Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 05:00:48 +0100 Subject: [PATCH 02/12] BG7, BN7: a fetch naming builds reads each package member from the artifact store MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each member's build is read at /v2///blobs/ through the required provision artifact-store (bound to a file), checked against its digest and laid as the package it names: a Go module zip replaced in the temporary modfile, an npm tarball in node_modules. A mismatch or a store that does not answer fails the step naming the member. Builds: design 47 G §465, §373, §466 (lead answer A-151) Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../mesh-build-go/buildstep/storedbuilds.go | 116 ++++++++++++++++++ .../mesh-build-go/cmd/mesh-build-go/builds.go | 110 +++++++++++++++++ .../cmd/mesh-build-go/builds_test.go | 75 +++++++++++ .../mesh-build-go/cmd/mesh-build-go/fetch.go | 17 ++- .../cmd/mesh-build-go/forge_test.go | 3 +- .../mesh-build-go/cmd/mesh-build-go/main.go | 1 + .../cmd/mesh-build-go/manifest_test.go | 9 +- .../mesh-build-go/cmd/mesh-build-go/module.go | 2 + modules/mesh-build-go/module.json | 2 + .../cmd/mesh-build-node/builds.go | 70 +++++++++++ .../cmd/mesh-build-node/builds_test.go | 57 +++++++++ .../cmd/mesh-build-node/fetch.go | 30 ++++- .../cmd/mesh-build-node/main.go | 1 + .../cmd/mesh-build-node/manifest_test.go | 5 +- .../cmd/mesh-build-node/module.go | 2 + modules/mesh-build-node/module.json | 2 + 16 files changed, 489 insertions(+), 13 deletions(-) create mode 100644 modules/mesh-build-go/buildstep/storedbuilds.go create mode 100644 modules/mesh-build-go/cmd/mesh-build-go/builds.go create mode 100644 modules/mesh-build-go/cmd/mesh-build-go/builds_test.go create mode 100644 modules/mesh-build-node/cmd/mesh-build-node/builds.go create mode 100644 modules/mesh-build-node/cmd/mesh-build-node/builds_test.go diff --git a/modules/mesh-build-go/buildstep/storedbuilds.go b/modules/mesh-build-go/buildstep/storedbuilds.go new file mode 100644 index 000000000..f10101295 --- /dev/null +++ b/modules/mesh-build-go/buildstep/storedbuilds.go @@ -0,0 +1,116 @@ +package buildstep + +// **A group run's package members, read from the artifact store** (design 47 G §465, §373): the ask's fetch names each +// member's build by its digest; the build module reads it from the artifact store, through the provision it requires +// (`artifact-store`, bound to a file holding `at` and `serves.port`), at +// `artifact-store:////blobs/`, that is GET `/v2///blobs/`, and checks +// the bytes against the digest. It only reads: nothing writes into the store but its holder (ADR 0614 §2). + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "regexp" + "strings" + + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// MaxStoredBuild is the most bytes of one member's build the module reads. +const MaxStoredBuild = 512 << 20 + +var blobDigest = regexp.MustCompile(`^sha256:[0-9a-f]{64}$`) + +// BuildsArg reads a fetch's `builds` argument (the part build-step's Fetch.builds): a list of {package, module, +// artifact, digest}, as JSON gives it or as the ask's own form. nil for none. +func BuildsArg(v any) ([]sdkstep.FetchBuild, error) { + switch v := v.(type) { + case nil: + return nil, nil + case []sdkstep.FetchBuild: + return append([]sdkstep.FetchBuild(nil), v...), check(v) + case []any: + raw, err := json.Marshal(v) + if err != nil { + return nil, err + } + var out []sdkstep.FetchBuild + if err := json.Unmarshal(raw, &out); err != nil { + return nil, fmt.Errorf("builds is a list of {package, module, artifact, digest}: %w", err) + } + return out, check(out) + } + return nil, fmt.Errorf("builds is a list of {package, module, artifact, digest}") +} + +func check(bs []sdkstep.FetchBuild) error { + for _, b := range bs { + if b.Package == "" || b.Module == "" || b.Artifact == "" || !blobDigest.MatchString(b.Digest) { + return fmt.Errorf("builds: %+v names no package, module, artifact or sha256: digest", b) + } + } + return nil +} + +// StoreURL is the artifact store's base URL from its binding file (`at`, and `serves` scheme and port), as the Go +// seat's binding reads; an error naming the file when it is not bound. +func StoreURL(bindFile string) (string, error) { + raw, err := os.ReadFile(bindFile) + if err != nil { + return "", fmt.Errorf("the artifact store is not bound (%v)", err) + } + var b struct { + At string `json:"at"` + Serves struct { + Scheme string `json:"scheme"` + Port int `json:"port"` + } `json:"serves"` + } + if json.Unmarshal(raw, &b) != nil || b.At == "" { + return "", fmt.Errorf("the artifact store's binding %s names no address", bindFile) + } + scheme := b.Serves.Scheme + if scheme == "" { + scheme = "http" + } + if b.Serves.Port == 0 { + return fmt.Sprintf("%s://%s", scheme, b.At), nil + } + return fmt.Sprintf("%s://%s:%d", scheme, b.At, b.Serves.Port), nil +} + +// ReadStoredBuild reads one member's build from the store at base and checks its bytes against its digest; a failure +// names the member. +func ReadStoredBuild(ctx context.Context, client *http.Client, base string, b sdkstep.FetchBuild) ([]byte, error) { + member := fmt.Sprintf("the build of %s (%s %s at %s)", b.Package, b.Module, b.Artifact, b.Digest) + url := strings.TrimRight(base, "/") + "/v2/" + b.Module + "/" + b.Artifact + "/blobs/" + b.Digest + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("%s: %w", member, err) + } + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("%s: the artifact store did not answer: %w", member, err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("%s: the artifact store answered %s", member, resp.Status) + } + data, err := io.ReadAll(io.LimitReader(resp.Body, MaxStoredBuild+1)) + if err != nil { + return nil, fmt.Errorf("%s: reading it: %w", member, err) + } + if len(data) > MaxStoredBuild { + return nil, fmt.Errorf("%s: larger than %d bytes", member, MaxStoredBuild) + } + sum := sha256.Sum256(data) + if got := "sha256:" + hex.EncodeToString(sum[:]); got != b.Digest { + return nil, fmt.Errorf("%s: the bytes read are %s, not the digest asked", member, got) + } + return data, nil +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/builds.go b/modules/mesh-build-go/cmd/mesh-build-go/builds.go new file mode 100644 index 000000000..23ff24ac5 --- /dev/null +++ b/modules/mesh-build-go/cmd/mesh-build-go/builds.go @@ -0,0 +1,110 @@ +package main + +// **A group run's package members, laid from their builds** (design 47 G §465, §373): a fetch naming `builds` reads each +// member's build (a Go module zip, every file under @/, gopackage.go) from the artifact store by +// its digest, checks it, unpacks it beside the workspace and replaces the package by that directory in each module +// directory's temporary modfile: nothing is fetched by a version, and no version is reserved. A member that does not +// match its digest, or a store that does not answer, fails the step naming the member. + +import ( + "archive/zip" + "bytes" + "context" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strings" + + "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// layBuilds lays each of builds as the package it names in every module directory dirs (relative to tree) of the +// workspace root; a directory that vendors resolves nothing and is left. +func (m *Module) layBuilds(ctx context.Context, root string, dirs []string, builds []sdkstep.FetchBuild) error { + if len(builds) == 0 { + return nil + } + base, err := buildstep.StoreURL(m.ArtifactStoreFile) + if err != nil { + return fmt.Errorf("a group run's members are read from the artifact store: %w", err) + } + tree := filepath.Join(root, "tree") + for i, b := range builds { + data, err := buildstep.ReadStoredBuild(ctx, m.httpClient(), base, b) + if err != nil { + return err + } + where := filepath.Join(root, "builds", fmt.Sprintf("%d", i)) + if err := unzipBuild(data, where); err != nil { + return fmt.Errorf("the build of %s (%s %s at %s): %w", b.Package, b.Module, b.Artifact, b.Digest, err) + } + for _, d := range dirs { + dir := filepath.Join(tree, d) + if _, err := os.Stat(filepath.Join(dir, "vendor", "modules.txt")); err == nil { + continue + } + if err := m.replaceInModfile(dir, b.Package, where); err != nil { + return err + } + } + if m.Say != nil { + m.Say("laid %s from its build %s (%s %s)", b.Package, b.Digest, b.Module, b.Artifact) + } + } + return nil +} + +// unzipBuild unpacks a Go module zip into dir, the first path element (@) taken off; a name that +// leaves dir is refused. +func unzipBuild(data []byte, dir string) error { + zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data))) + if err != nil { + return fmt.Errorf("it is not a module zip: %w", err) + } + if err := os.MkdirAll(dir, 0o700); err != nil { + return err + } + var total int64 + for _, f := range zr.File { + if f.FileInfo().IsDir() { + continue + } + _, rest, ok := strings.Cut(f.Name, "@") + if !ok { + return fmt.Errorf("the entry %q is outside @/", f.Name) + } + _, rest, ok = strings.Cut(rest, "/") + clean := path.Clean("/" + rest) + if !ok || clean == "/" || strings.Contains(rest, "..") { + return fmt.Errorf("the entry %q is not a file of the module", f.Name) + } + target := filepath.Join(dir, filepath.FromSlash(clean)) + if err := os.MkdirAll(filepath.Dir(target), 0o700); err != nil { + return err + } + rc, err := f.Open() + if err != nil { + return err + } + out, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o600) + if err != nil { + rc.Close() + return err + } + n, err := io.Copy(out, io.LimitReader(rc, buildstep.MaxStoredBuild)) + rc.Close() + if cerr := out.Close(); err == nil { + err = cerr + } + if err != nil { + return err + } + if total += n; total > buildstep.MaxStoredBuild { + return fmt.Errorf("it unpacks to more than %d bytes", buildstep.MaxStoredBuild) + } + } + return nil +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/builds_test.go b/modules/mesh-build-go/cmd/mesh-build-go/builds_test.go new file mode 100644 index 000000000..21656f5bd --- /dev/null +++ b/modules/mesh-build-go/cmd/mesh-build-go/builds_test.go @@ -0,0 +1,75 @@ +package main + +import ( + "archive/zip" + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strings" + "testing" + + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// Design 47 G §465, §373 (BG7): a fetch naming builds reads each member from the artifact store by its digest, checks the +// bytes and lays them as the package named; a mismatch, or a store that does not answer, fails naming the member. +func TestAFetchLaysAGroupMembersBuildFromTheArtifactStore(t *testing.T) { + var zbuf bytes.Buffer + zw := zip.NewWriter(&zbuf) + w, _ := zw.Create("example.test/lib@v0.0.0/go.mod") + w.Write([]byte("module example.test/lib\n")) + w, _ = zw.Create("example.test/lib@v0.0.0/sub/a.go") + w.Write([]byte("package sub\n")) + zw.Close() + sum := sha256.Sum256(zbuf.Bytes()) + digest := "sha256:" + hex.EncodeToString(sum[:]) + var asked []string + store := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + asked = append(asked, r.URL.Path) + if r.URL.Path != "/v2/lib/pkg/blobs/"+digest { + http.NotFound(rw, r) + return + } + rw.Write(zbuf.Bytes()) + })) + defer store.Close() + + m := &Module{Work: t.TempDir(), Home: t.TempDir()} + root := filepath.Join(m.Work, "ws1") + if err := os.MkdirAll(filepath.Join(root, "tree"), 0o700); err != nil { + t.Fatal(err) + } + os.WriteFile(filepath.Join(root, "tree", "go.mod"), []byte("module example.test/app\n\nrequire example.test/lib v0.0.0-00010101000000-000000000000\n"), 0o600) + m.ArtifactStoreFile = filepath.Join(m.Home, "artifact-store.json") + os.WriteFile(m.ArtifactStoreFile, []byte(`{"at":"`+strings.TrimPrefix(store.URL, "http://")+`"}`), 0o600) + member := sdkstep.FetchBuild{Package: "example.test/lib", Module: "lib", Artifact: "pkg", Digest: digest} + + if err := m.layBuilds(context.Background(), root, []string{"."}, []sdkstep.FetchBuild{member}); err != nil { + t.Fatal(err) + } + if b, err := os.ReadFile(filepath.Join(root, "builds", "0", "sub", "a.go")); err != nil || string(b) != "package sub\n" { + t.Fatalf("the member was not unpacked: %q, %v", b, err) + } + mod, _ := os.ReadFile(filepath.Join(root, "pins", "root", "go.mod")) + if want := "replace example.test/lib => " + filepath.Join(root, "builds", "0"); !strings.Contains(string(mod), want) { + t.Errorf("the temporary modfile lacks %q:\n%s", want, mod) + } + // A member whose bytes are not its digest, and a store that answers nothing, fail naming the member. + bad := member + bad.Digest = "sha256:" + strings.Repeat("0", 64) + for _, c := range []sdkstep.FetchBuild{bad, {Package: "example.test/lib", Module: "lib", Artifact: "missing", Digest: digest}} { + err := m.layBuilds(context.Background(), root, []string{"."}, []sdkstep.FetchBuild{c}) + if err == nil || !strings.Contains(err.Error(), "example.test/lib") { + t.Errorf("member %+v: error %v", c, err) + } + } + store.Close() + if err := m.layBuilds(context.Background(), root, []string{"."}, []sdkstep.FetchBuild{member}); err == nil || !strings.Contains(err.Error(), "example.test/lib") { + t.Errorf("a store that does not answer: %v", err) + } +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/fetch.go b/modules/mesh-build-go/cmd/mesh-build-go/fetch.go index 8e76eb0f6..9802ff224 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/fetch.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/fetch.go @@ -77,6 +77,11 @@ func (m *Module) fetchTool() StepTool { "dir": sdkstep.FetchRequestProperties()["dir"], "paths": sdkstep.FetchRequestProperties()["paths"], "packages": sdkstep.FetchRequestProperties()["packages"], + "builds": map[string]any{"type": "array", "description": "optional: a group run's package members, each by its build's digest, read from the artifact store and laid as the package it names (design 47 G §465)", + "items": map[string]any{"type": "object", "properties": map[string]any{ + "package": map[string]any{"type": "string"}, "module": map[string]any{"type": "string"}, + "artifact": map[string]any{"type": "string"}, "digest": map[string]any{"type": "string"}, + }, "required": []string{"package", "module", "artifact", "digest"}}}, "beside": map[string]any{"type": "array", "description": "optional sibling repositories the tests read, each placed as a plain directory (no symlink) under the workspace's beside/, which build_go_test gives the tests as MESH_CHECK_BESIDE", "items": map[string]any{"type": "object", "properties": map[string]any{ "repository": map[string]any{"type": "string", "description": "/ on the forge"}, @@ -104,6 +109,10 @@ func (m *Module) fetch(ctx context.Context, args map[string]any) (res any, err e if err != nil { return nil, err } + builds, err := buildstep.BuildsArg(args["builds"]) + if err != nil { + return nil, err + } m.CleanWorkspaces(m.now()) id := sdkstep.NewID() done := m.spaces().Hold(id) @@ -115,10 +124,10 @@ func (m *Module) fetch(ctx context.Context, args map[string]any) (res any, err e } } }() - return m.fetchInto(ctx, req, id, siblings) + return m.fetchInto(ctx, req, id, siblings, builds) } -func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, id string, siblings []siblingArg) (any, error) { +func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, id string, siblings []siblingArg, builds []sdkstep.FetchBuild) (any, error) { repository, commit, ref, base := req.Repository, req.Commit, req.Ref, req.Base var err error root := filepath.Join(m.Work, id) @@ -159,6 +168,10 @@ func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, id str if base != "" && res.Merge == "" { return res, nil // a conflict: the tree is at the trunk, nothing of the head is built or tested } + // A group run's package members are laid from their builds, never fetched by a version (builds.go, §465). + if err := m.layBuilds(ctx, root, dirs, builds); err != nil { + return nil, err + } // The directories download side by side, up to the bound (ADR 0536 §2); the first failure in directory order is the // step's. Resolving a pin places a repository beside the workspace, which two directories may share: one at a time. var pins sync.Mutex diff --git a/modules/mesh-build-go/cmd/mesh-build-go/forge_test.go b/modules/mesh-build-go/cmd/mesh-build-go/forge_test.go index a3fdf7dc9..2acdce793 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/forge_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/forge_test.go @@ -146,6 +146,7 @@ func TestForgeFilesRenderFromTheBoundValuesInTheModulesOwnHome(t *testing.T) { func TestManifestRequiresForgeAccountKeepsKeysAndTakesFilesFromTemplates(t *testing.T) { m := readForgeManifest(t) // node-tools: the module pulls its asks through the tool runner's seat pull (1911). + // artifact-store: a group run's members are read from it (design 47 G §465). // go-package-registry: the Go seat's read side, the fetch's first source (design 51, CAT-BG3, E2). // detected-steps: the state of the verb steps (design 47 G §326, §414), asked by the template state. // kept-builds: the builds kept for the artifact store's holder (keptbuilds.go), by the template objects (W12.5). @@ -155,7 +156,7 @@ func TestManifestRequiresForgeAccountKeepsKeysAndTakesFilesFromTemplates(t *test findings := map[string]any{"name": "findings", "storage": "key-value", "template": "state"} findingEvents := map[string]any{"name": "finding-events", "storage": "stream", "template": "events", "options": map[string]any{ "events": []any{"finding-written.*", "finding-cleared.*", "findings-stated.*"}, "max-age-days": float64(7), "max-mib": float64(16)}} - if want := []any{detected, kept, "forge-account", "go-toolchain", "go-package-registry", "node-tools", findings, findingEvents}; !reflect.DeepEqual(m.Requires, want) { + if want := []any{detected, kept, "artifact-store", "forge-account", "go-toolchain", "go-package-registry", "node-tools", findings, findingEvents}; !reflect.DeepEqual(m.Requires, want) { t.Errorf("requires = %v, want %v", m.Requires, want) } keeps := false diff --git a/modules/mesh-build-go/cmd/mesh-build-go/main.go b/modules/mesh-build-go/cmd/mesh-build-go/main.go index edbf844b3..fa75df4c1 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/main.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/main.go @@ -63,6 +63,7 @@ func main() { } m.Run = StepRunner(m.Home) m.GoSeatFile = m.Home + "/go-package-registry.json" + m.ArtifactStoreFile = m.Home + "/artifact-store.json" m.Settings = m.Home + "/settings.json" m.ReadManifest = askManifest m.AskInput = stdio.Ask diff --git a/modules/mesh-build-go/cmd/mesh-build-go/manifest_test.go b/modules/mesh-build-go/cmd/mesh-build-go/manifest_test.go index 99e7eb34e..c59075693 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/manifest_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/manifest_test.go @@ -172,12 +172,13 @@ func TestTheModuleDeclaresBubblewrapAndTheCapabilityItNeeds(t *testing.T) { } // 1587-S1, CAT-BG1 (design 51 *Publishing*, ADR 0614 §2): the module publishes a done archive through the seat -// oci-artifact-registry's verbs, which it invokes (the served-verb edge orders it after the holder), and no longer -// requires the artifact store or is told its address: nothing writes into the store but its holder. +// oci-artifact-registry's verbs, which it invokes (the served-verb edge orders it after the holder), and only reads +// the artifact store (§465): nothing writes into the store but its holder. func TestTheModuleInvokesTheArtifactSeatsVerbsAndWritesNoStore(t *testing.T) { m := readManifest(t) - if slices.Contains(m.Requires, "artifact-store") { - t.Errorf("requires %v still name artifact-store", m.Requires) + // It requires the provision to read a group run's package members' builds (design 47 G §465), never to write. + if !slices.Contains(m.Requires, "artifact-store") { + t.Errorf("requires %v lack artifact-store, which a group run's members are read from", m.Requires) } for _, seat := range []string{ArtifactSeat, GoPackageSeat} { // a Go package's too (CAT-BG2) for _, verb := range []string{"publish", "publish-part"} { diff --git a/modules/mesh-build-go/cmd/mesh-build-go/module.go b/modules/mesh-build-go/cmd/mesh-build-go/module.go index 5f0f36909..e6e00fd9a 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/module.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/module.go @@ -84,6 +84,8 @@ type Module struct { // packages*): bound, the mesh's Go modules are fetched through it first, Go's public proxy second, and the forge's // git over the account's ssh last (Go's direct, kept for this milestone only); unbound, as before, directly. GoSeatFile string + // ArtifactStoreFile is the binding of the provision artifact-store, read for a group run's package members (§465). + ArtifactStoreFile string // Call asks a seat's verb over the bus: the publish of a done archive (publish.go). stdio.Ask when nil; a test's // fake holder. Call callFunc diff --git a/modules/mesh-build-go/module.json b/modules/mesh-build-go/module.json index fa30c8470..b4a1eb975 100644 --- a/modules/mesh-build-go/module.json +++ b/modules/mesh-build-go/module.json @@ -112,6 +112,7 @@ "max-mib": 1024 } }, + "artifact-store", "forge-account", "go-toolchain", "go-package-registry", @@ -137,6 +138,7 @@ } ], "binds": { + "artifact-store": "${dir:state}/artifact-store.json", "go-package-registry": "${dir:state}/go-package-registry.json" }, "own-secrets": { diff --git a/modules/mesh-build-node/cmd/mesh-build-node/builds.go b/modules/mesh-build-node/cmd/mesh-build-node/builds.go new file mode 100644 index 000000000..0945353f8 --- /dev/null +++ b/modules/mesh-build-node/cmd/mesh-build-node/builds.go @@ -0,0 +1,70 @@ +package main + +// **A group run's package members, laid from their builds** (design 47 G §465, §373): a fetch naming `builds` reads each +// member's build (the npm package's packed tarball, package.go's packed) from the artifact store by its digest, checks +// it and places it as the local package it names in each TypeScript module's node_modules: nothing is fetched by a +// version, and none is reserved. A member that does not match its digest, or a store that does not answer, fails the +// step naming the member. + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// storedBuild is one member's build, read and checked. +type storedBuild struct { + member sdkstep.FetchBuild + tgz []byte +} + +// readBuilds reads every member of builds from the artifact store. +func (m *Module) readBuilds(ctx context.Context, builds []sdkstep.FetchBuild) ([]storedBuild, error) { + if len(builds) == 0 { + return nil, nil + } + base, err := buildstep.StoreURL(m.ArtifactStoreFile) + if err != nil { + return nil, fmt.Errorf("a group run's members are read from the artifact store: %w", err) + } + var out []storedBuild + for _, b := range builds { + data, err := buildstep.ReadStoredBuild(ctx, m.httpClient(), base, b) + if err != nil { + return nil, err + } + out = append(out, storedBuild{b, data}) + } + return out, nil +} + +// names says whether a member of the builds is the package pkg. +func namesPackage(builds []storedBuild, pkg string) bool { + for _, b := range builds { + if b.member.Package == pkg { + return true + } + } + return false +} + +// layBuilds places each member in dir's node_modules as the package it names, in place of any other. +func (m *Module) layBuilds(dir string, builds []storedBuild) error { + for _, b := range builds { + into := filepath.Join(dir, "node_modules", filepath.FromSlash(b.member.Package)) + if err := os.RemoveAll(into); err != nil { + return err + } + if err := unpackPackage(b.tgz, into); err != nil { + return fmt.Errorf("the build of %s (%s %s at %s): %w", b.member.Package, b.member.Module, b.member.Artifact, b.member.Digest, err) + } + if m.Say != nil { + m.Say("laid %s from its build %s (%s %s)", b.member.Package, b.member.Digest, b.member.Module, b.member.Artifact) + } + } + return nil +} diff --git a/modules/mesh-build-node/cmd/mesh-build-node/builds_test.go b/modules/mesh-build-node/cmd/mesh-build-node/builds_test.go new file mode 100644 index 000000000..0d63bbcc7 --- /dev/null +++ b/modules/mesh-build-node/cmd/mesh-build-node/builds_test.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strings" + "testing" + + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// Design 47 G §465, §373 (BN7): a fetch naming builds reads each member from the artifact store by its digest, checks the +// bytes and lays it in node_modules as the package named; a mismatch, or a store that does not answer, fails naming it. +func TestAFetchLaysAGroupMembersBuildFromTheArtifactStore(t *testing.T) { + tgz := tgzOf(t, "@novox/lib", "0.0.0") + digest := digestOf(tgz) + store := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/v2/lib/pkg/blobs/"+digest { + http.NotFound(w, r) + return + } + w.Write(tgz) + })) + defer store.Close() + m := &Module{ArtifactStoreFile: filepath.Join(t.TempDir(), "artifact-store.json")} + os.WriteFile(m.ArtifactStoreFile, []byte(`{"at":"`+strings.TrimPrefix(store.URL, "http://")+`"}`), 0o600) + member := sdkstep.FetchBuild{Package: "@novox/lib", Module: "lib", Artifact: "pkg", Digest: digest} + + got, err := m.readBuilds(context.Background(), []sdkstep.FetchBuild{member}) + if err != nil { + t.Fatal(err) + } + dir := t.TempDir() + if err := m.layBuilds(dir, got); err != nil { + t.Fatal(err) + } + if b, err := os.ReadFile(filepath.Join(dir, "node_modules", "@novox", "lib", "dist", "index.js")); err != nil || !strings.Contains(string(b), "0.0.0") { + t.Fatalf("the member was not laid: %q, %v", b, err) + } + if !namesPackage(got, "@novox/lib") || namesPackage(got, "@novox/other") { + t.Error("namesPackage is wrong") + } + bad := member + bad.Digest = "sha256:" + strings.Repeat("0", 64) + for _, c := range []sdkstep.FetchBuild{bad, {Package: "@novox/lib", Module: "lib", Artifact: "missing", Digest: digest}} { + if _, err := m.readBuilds(context.Background(), []sdkstep.FetchBuild{c}); err == nil || !strings.Contains(err.Error(), "@novox/lib") { + t.Errorf("member %+v: error %v", c, err) + } + } + store.Close() + if _, err := m.readBuilds(context.Background(), []sdkstep.FetchBuild{member}); err == nil || !strings.Contains(err.Error(), "@novox/lib") { + t.Errorf("a store that does not answer: %v", err) + } +} diff --git a/modules/mesh-build-node/cmd/mesh-build-node/fetch.go b/modules/mesh-build-node/cmd/mesh-build-node/fetch.go index 962076296..1b5d1049f 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/fetch.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/fetch.go @@ -102,6 +102,11 @@ func (m *Module) fetchTool() StepTool { "package": map[string]any{"type": "object", "description": "optional: the group's tagged version of the SDK, {name, version}, placed from the registry in each TypeScript member whatever its lock names (ADR 0607 §3); or the group's package member, {repository, commit, ref} (ADR 0500 §5), packed here, publishing nothing, and served to each TypeScript member whose lock names its version, in place of the registry's", "properties": map[string]any{"name": map[string]any{"type": "string"}, "version": map[string]any{"type": "string"}, "repository": map[string]any{"type": "string"}, "commit": map[string]any{"type": "string"}, "ref": map[string]any{"type": "string"}}}, + "builds": map[string]any{"type": "array", "description": "optional: a group run's package members, each by its build's digest, read from the artifact store and laid as the package it names in each module's node_modules (design 47 G §465)", + "items": map[string]any{"type": "object", "properties": map[string]any{ + "package": map[string]any{"type": "string"}, "module": map[string]any{"type": "string"}, + "artifact": map[string]any{"type": "string"}, "digest": map[string]any{"type": "string"}, + }, "required": []string{"package", "module", "artifact", "digest"}}}, "base": map[string]any{"type": "string", "description": "optional trunk commit, 40 hex digits: the head is merged onto it as the forge's merge would, and the answer carries the merge commit, the files in conflict (an answer, the workspace is then left at the trunk commit), the changed paths and the tree of each module directory"}, }, "required": []string{"repository", "commit"}, @@ -124,6 +129,10 @@ func (m *Module) fetch(ctx context.Context, args map[string]any) (res any, err e if err != nil { return nil, err } + buildsAsked, err := buildstep.BuildsArg(args["builds"]) + if err != nil { + return nil, err + } m.CleanWorkspaces(m.now()) id := sdkstep.NewID() done := m.spaces().Hold(id) @@ -135,10 +144,10 @@ func (m *Module) fetch(ctx context.Context, args map[string]any) (res any, err e } } }() - return m.fetchInto(ctx, req, group, id) + return m.fetchInto(ctx, req, group, id, buildsAsked) } -func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, group *groupPackage, id string) (any, error) { +func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, group *groupPackage, id string, buildsAsked []sdkstep.FetchBuild) (any, error) { repository, commit, ref, base := req.Repository, req.Commit, req.Ref, req.Base var err error root := filepath.Join(m.Work, id) @@ -181,6 +190,11 @@ func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, group } served, res.Group = &p, p.Name+"@"+p.Version+" "+p.Integrity } + // A group run's package members, each read from the artifact store by its build's digest (builds.go, §465). + members, err := m.readBuilds(ctx, buildsAsked) + if err != nil { + return nil, err + } dirs, packages, err := m.typeScriptModules(ctx, tree) if err != nil { return nil, err @@ -193,6 +207,9 @@ func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, group if err := m.installDev(ctx, root, dir, d); err != nil { return nil, err } + if err := m.layBuilds(dir, members); err != nil { + return nil, err + } res.Installed = append(res.Installed, d) continue } @@ -201,8 +218,13 @@ func (m *Module) fetchInto(ctx context.Context, req sdkstep.FetchRequest, group return nil, err } if refused == "" { - // The latest published SDK, or the group's (ADR 0573 §2, ADR 0607 §3). - if err := m.placeSDK(ctx, dir, d, served, group); err != nil { + // The latest published SDK, or the group's (ADR 0573 §2, ADR 0607 §3); the SDK as a member's build is laid from it. + if !namesPackage(members, sdkPackage) { + if err := m.placeSDK(ctx, dir, d, served, group); err != nil { + return nil, err + } + } + if err := m.layBuilds(dir, members); err != nil { return nil, err } if res.SDK == nil { diff --git a/modules/mesh-build-node/cmd/mesh-build-node/main.go b/modules/mesh-build-node/cmd/mesh-build-node/main.go index c1abbf75f..eb037cd9e 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/main.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/main.go @@ -65,6 +65,7 @@ func main() { } m.Floor = floorOf(m.Node) m.Settings = filepath.Join(home, "settings.json") + m.ArtifactStoreFile = filepath.Join(home, "artifact-store.json") // Outside a launch by the runtime — a build, a check — there is no node and no state to write. if m.Node != "" { go m.Start(ctx) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/manifest_test.go b/modules/mesh-build-node/cmd/mesh-build-node/manifest_test.go index 3d28b5550..32b9b6681 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/manifest_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/manifest_test.go @@ -238,8 +238,9 @@ func TestTheModuleInvokesTheRegistrySeatsAndHoldsNoWriteCredential(t *testing.T) } } } - if slices.Contains(m.Requires, "artifact-store") { - t.Errorf("requires %v still name artifact-store", m.Requires) + // It requires the provision to read a group run's package members' builds (design 47 G §465), never to write. + if !slices.Contains(m.Requires, "artifact-store") { + t.Errorf("requires %v lack artifact-store, which a group run's members are read from", m.Requires) } for _, r := range m.Resources { if r["id"] == "registry" { diff --git a/modules/mesh-build-node/cmd/mesh-build-node/module.go b/modules/mesh-build-node/cmd/mesh-build-node/module.go index 8f1aea066..f51485aff 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/module.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/module.go @@ -51,6 +51,8 @@ type Module struct { // Detected and ReadDetected are the Put and the read of the state detected-steps (design 47 G §326, §414). Detected buildstep.Put ReadDetected func(key string) (json.RawMessage, error) + // ArtifactStoreFile is the binding of the provision artifact-store, read for a group run's package members (§465). + ArtifactStoreFile string // ForgetDetected deletes one key of detected-steps; RecordAct writes an act in the hand-act log of the seat // mesh-hand-acts (§463, §480): a drop writes it first. ForgetDetected func(key string) error diff --git a/modules/mesh-build-node/module.json b/modules/mesh-build-node/module.json index a056ac734..4678e794e 100644 --- a/modules/mesh-build-node/module.json +++ b/modules/mesh-build-node/module.json @@ -66,12 +66,14 @@ ], "requires": [ {"name": "detected-steps", "storage": "key-value", "template": "state", "options": {"history": 1}}, + "artifact-store", "forge-account", "npm-package-registry", "node-toolchain", "node-tools" ], "binds": { + "artifact-store": "${dir:state}/artifact-store.json", "npm-package-registry": "${dir:state}/package-registry.json" }, "invokes": [ From e4ef67adcdcad6c2bfe11f1b1323209ca5b92a9e Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 05:09:56 +0100 Subject: [PATCH 03/12] MV1: move contracts and sdk under modules/, importers follow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The delivery repository's contracts and SDK live under modules/ as mesh-delivery-contracts and mesh-delivery-sdk, their Go module paths renamed to match the folders (the TypeScript names already did), and every importer in mesh-delivery, mesh-catalog, mesh-host, mesh-tools and mesh-sdk follows in the same group: a design as it should be, one path per module, checked by the group's check building every importer. Builds: design 47 G §427, §88 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../cmd/artifact-store-tools/gone.go | 2 +- .../cmd/artifact-store-tools/holder.go | 8 +++--- .../cmd/artifact-store-tools/holder_test.go | 12 ++++---- .../cmd/artifact-store-tools/listed.go | 4 +-- .../cmd/artifact-store-tools/seat.go | 2 +- .../cmd/artifact-store-tools/store_test.go | 4 +-- .../cmd/artifact-store-tools/sweepseats.go | 6 ++-- modules/artifact-store-tools/go.mod | 16 +++++------ .../cmd/claude-code/catalogfeed.go | 2 +- .../cmd/claude-code/catalogfeed_test.go | 6 ++-- .../cmd/claude-code/insteadof_test.go | 2 +- modules/claude-code/cmd/claude-code/main.go | 2 +- modules/claude-code/go.mod | 6 ++-- .../cmd/distribution-tools/contract.go | 2 +- .../cmd/distribution-tools/contract_test.go | 2 +- .../cmd/distribution-tools/main.go | 4 +-- modules/distribution/go.mod | 14 +++++----- .../internal/holder/holder_test.go | 2 +- modules/distribution/internal/holder/list.go | 2 +- .../distribution/internal/holder/list_test.go | 2 +- .../distribution/internal/holder/reserved.go | 2 +- .../distribution/internal/holder/transfer.go | 2 +- modules/distribution/internal/holder/verbs.go | 2 +- .../distribution/internal/holder/window.go | 2 +- .../gitea/cmd/package-registry/incoming.go | 2 +- modules/gitea/cmd/package-registry/seats.go | 6 ++-- modules/gitea/go.mod | 18 ++++++------ modules/gitea/internal/packageseats/holder.go | 2 +- .../internal/packageseats/holder_test.go | 2 +- .../gitea/internal/packageseats/reserved.go | 2 +- modules/mesh-build-go/buildstep/askrun.go | 4 +-- .../mesh-build-go/buildstep/askrun_test.go | 6 ++-- modules/mesh-build-go/buildstep/capacity.go | 2 +- .../mesh-build-go/buildstep/capacity_cpu.go | 2 +- .../buildstep/conformance/conformance.go | 2 +- .../buildstep/conformance/conformance_test.go | 4 +-- .../buildstep/conformance/leftrunning.go | 4 +-- .../buildstep/digestshape_test.go | 2 +- modules/mesh-build-go/buildstep/fetch.go | 4 +-- modules/mesh-build-go/buildstep/fetch_test.go | 2 +- .../mesh-build-go/buildstep/generated_test.go | 2 +- modules/mesh-build-go/buildstep/go.mod | 26 ++++++++--------- modules/mesh-build-go/buildstep/gotest.go | 2 +- modules/mesh-build-go/buildstep/guard.go | 2 +- modules/mesh-build-go/buildstep/guard_test.go | 2 +- modules/mesh-build-go/buildstep/merge.go | 2 +- .../mesh-build-go/buildstep/narrate_test.go | 4 +-- modules/mesh-build-go/buildstep/narrow.go | 2 +- .../mesh-build-go/buildstep/narrow_test.go | 2 +- modules/mesh-build-go/buildstep/phase.go | 2 +- modules/mesh-build-go/buildstep/publish.go | 20 ++++++------- modules/mesh-build-go/buildstep/pull.go | 4 +-- modules/mesh-build-go/buildstep/pull_bus.go | 2 +- modules/mesh-build-go/buildstep/pull_drop.go | 6 ++-- modules/mesh-build-go/buildstep/pull_fake.go | 2 +- .../buildstep/pull_integration_test.go | 2 +- modules/mesh-build-go/buildstep/pull_seat.go | 2 +- .../mesh-build-go/buildstep/pull_seat_test.go | 4 +-- modules/mesh-build-go/buildstep/pull_test.go | 4 +-- .../buildstep/seat_tools_test.go | 2 +- modules/mesh-build-go/buildstep/step.go | 4 +-- modules/mesh-build-go/buildstep/step_test.go | 4 +-- modules/mesh-build-go/buildstep/steprun.go | 2 +- modules/mesh-build-go/buildstep/steptool.go | 2 +- modules/mesh-build-go/buildstep/tap.go | 2 +- modules/mesh-build-go/buildstep/transport.go | 2 +- modules/mesh-build-go/buildstep/trees.go | 4 +-- .../buildstep/trees_integration_test.go | 2 +- modules/mesh-build-go/buildstep/trees_test.go | 2 +- .../cmd/mesh-build-go/archive.go | 2 +- .../cmd/mesh-build-go/archive_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/asks.go | 6 ++-- .../mesh-build-go/asks_integration_test.go | 2 +- .../cmd/mesh-build-go/asks_test.go | 2 +- .../cmd/mesh-build-go/beside_digest_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/build.go | 4 +-- .../cmd/mesh-build-go/build_test.go | 2 +- .../cmd/mesh-build-go/candidate.go | 2 +- .../cmd/mesh-build-go/candidate_test.go | 2 +- .../cmd/mesh-build-go/compose.go | 6 ++-- .../mesh-build-go/compose_integration_test.go | 6 ++-- .../cmd/mesh-build-go/compose_test.go | 8 +++--- .../mesh-build-go/cmd/mesh-build-go/digest.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/fetch.go | 4 +-- .../cmd/mesh-build-go/fetch_test.go | 4 +-- .../cmd/mesh-build-go/imports.go | 2 +- .../mesh-build-go/installed_toolchain_test.go | 2 +- .../cmd/mesh-build-go/integration.go | 2 +- .../mesh-build-go/integration_level_test.go | 2 +- .../cmd/mesh-build-go/isolate.go | 2 +- .../cmd/mesh-build-go/isolate_test.go | 2 +- .../cmd/mesh-build-go/keptbuilds.go | 6 ++-- .../cmd/mesh-build-go/keptbuilds_test.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/keys.go | 2 +- .../cmd/mesh-build-go/kit_test.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/level.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/levels.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/lint.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/main.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/mirror.go | 2 +- .../cmd/mesh-build-go/mirror_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/module.go | 4 +-- .../cmd/mesh-build-go/module_test.go | 2 +- .../mesh-build-go/narrow_integration_test.go | 2 +- .../cmd/mesh-build-go/needtools_test.go | 2 +- .../cmd/mesh-build-go/node_toolchains_test.go | 2 +- .../cmd/mesh-build-go/packages_shape_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/pins.go | 4 +-- .../mesh-build-go/pins_integration_test.go | 2 +- .../cmd/mesh-build-go/pins_test.go | 2 +- .../mesh-build-go/preview_integration_test.go | 2 +- .../cmd/mesh-build-go/preview_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/probe.go | 2 +- .../cmd/mesh-build-go/publish_test.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/read.go | 2 +- .../cmd/mesh-build-go/read_test.go | 2 +- .../cmd/mesh-build-go/room_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/run.go | 4 +-- .../cmd/mesh-build-go/run_integration_test.go | 6 ++-- .../cmd/mesh-build-go/run_test.go | 8 +++--- .../mesh-build-go/cmd/mesh-build-go/runner.go | 2 +- .../cmd/mesh-build-go/selected_dirs_test.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/steps.go | 4 +-- .../mesh-build-go/store_integration_test.go | 4 +-- .../mesh-build-go/cmd/mesh-build-go/test.go | 2 +- .../cmd/mesh-build-go/test_test.go | 2 +- .../cmd/mesh-build-go/versions.go | 2 +- .../cmd/mesh-build-go/versions_test.go | 2 +- .../cmd/mesh-build-go/xz_test.go | 2 +- modules/mesh-build-go/go.mod | 28 +++++++++---------- .../cmd/mesh-build-image/asks.go | 6 ++-- .../cmd/mesh-build-image/asks_test.go | 2 +- .../cmd/mesh-build-image/build_test.go | 2 +- .../mesh-build-image/bus_integration_test.go | 2 +- .../cmd/mesh-build-image/capture_test.go | 2 +- .../cmd/mesh-build-image/copy.go | 4 +-- .../cmd/mesh-build-image/copy_test.go | 4 +-- .../cmd/mesh-build-image/fetch.go | 2 +- .../cmd/mesh-build-image/fetch_test.go | 2 +- .../cmd/mesh-build-image/helpers_test.go | 4 +-- .../cmd/mesh-build-image/integration_test.go | 2 +- .../cmd/mesh-build-image/keptartifact.go | 4 +-- .../cmd/mesh-build-image/keys.go | 2 +- .../cmd/mesh-build-image/kit_test.go | 4 +-- .../cmd/mesh-build-image/main.go | 6 ++-- .../cmd/mesh-build-image/module.go | 4 +-- .../cmd/mesh-build-image/module_test.go | 2 +- .../cmd/mesh-build-image/publish.go | 4 +-- .../cmd/mesh-build-image/publish_test.go | 4 +-- .../cmd/mesh-build-image/read.go | 2 +- .../cmd/mesh-build-image/read_test.go | 2 +- .../cmd/mesh-build-image/room_test.go | 2 +- .../cmd/mesh-build-image/runner.go | 2 +- .../cmd/mesh-build-image/steps.go | 2 +- modules/mesh-build-image/go.mod | 26 ++++++++--------- .../cmd/mesh-build-node/asks.go | 6 ++-- .../cmd/mesh-build-node/asks_test.go | 2 +- .../cmd/mesh-build-node/build.go | 4 +-- .../cmd/mesh-build-node/build_test.go | 2 +- .../cmd/mesh-build-node/check.go | 2 +- .../cmd/mesh-build-node/fetch.go | 4 +-- .../cmd/mesh-build-node/fetch_test.go | 2 +- .../cmd/mesh-build-node/isolate.go | 2 +- .../cmd/mesh-build-node/keptartifact.go | 4 +-- .../cmd/mesh-build-node/keys.go | 2 +- .../cmd/mesh-build-node/kit_test.go | 4 +-- .../cmd/mesh-build-node/main.go | 6 ++-- .../cmd/mesh-build-node/module.go | 4 +-- .../cmd/mesh-build-node/module_test.go | 2 +- .../cmd/mesh-build-node/push_test.go | 4 +-- .../cmd/mesh-build-node/read.go | 2 +- .../cmd/mesh-build-node/read_test.go | 2 +- .../cmd/mesh-build-node/room_test.go | 2 +- .../cmd/mesh-build-node/steps.go | 4 +-- .../mesh-build-node/store_integration_test.go | 4 +-- .../cmd/mesh-build-node/toolchain_test.go | 2 +- modules/mesh-build-node/go.mod | 26 ++++++++--------- .../cmd/mesh-conditions/branches.go | 4 +-- .../cmd/mesh-conditions/branches_test.go | 2 +- .../cmd/mesh-conditions/catalog.go | 4 +-- .../cmd/mesh-conditions/hold.go | 2 +- .../cmd/mesh-conditions/hold_test.go | 2 +- .../cmd/mesh-conditions/keeper.go | 2 +- .../cmd/mesh-conditions/keeper_test.go | 4 +-- .../cmd/mesh-conditions/main.go | 8 +++--- modules/mesh-conditions/go.mod | 8 +++--- .../cmd/mesh-config/catalogfeed.go | 4 +-- .../cmd/mesh-config/catalogfeed_test.go | 6 ++-- .../cmd/mesh-config/config_test.go | 4 +-- modules/mesh-config/cmd/mesh-config/main.go | 2 +- .../cmd/mesh-config/manifest_test.go | 2 +- .../mesh-config/cmd/mesh-config/ownerviews.go | 2 +- .../mesh-config/cmd/mesh-config/readers.go | 2 +- .../mesh-config/cmd/mesh-config/sources.go | 4 +-- .../mesh-config/cmd/mesh-config/takeover.go | 2 +- .../cmd/mesh-config/takeover_test.go | 2 +- .../cmd/mesh-config/whole_integration_test.go | 6 ++-- modules/mesh-config/go.mod | 16 +++++------ .../cmd/mesh-delivery-gate/catalogue_test.go | 2 +- .../cmd/mesh-delivery-gate/findings.go | 2 +- .../cmd/mesh-delivery-gate/findings_test.go | 2 +- .../cmd/mesh-delivery-gate/merges.go | 4 +-- .../cmd/mesh-delivery-gate/owed.go | 4 +-- .../cmd/mesh-delivery-gate/owedacts.go | 2 +- .../cmd/mesh-delivery-gate/owedacts_test.go | 2 +- .../cmd/mesh-delivery-gate/owedended.go | 2 +- .../cmd/mesh-delivery-gate/record.go | 2 +- .../cmd/mesh-delivery-gate/record_test.go | 2 +- .../cmd/mesh-delivery-gate/recordevents.go | 2 +- .../cmd/mesh-delivery-gate/recordfill.go | 2 +- .../cmd/mesh-delivery-gate/recovery.go | 2 +- .../cmd/mesh-delivery-gate/switch.go | 4 +-- .../cmd/mesh-delivery-gate/takenin.go | 6 ++-- .../mesh-delivery-gate/takenin_bus_test.go | 2 +- .../cmd/mesh-delivery-gate/values.go | 4 +-- .../cmd/mesh-delivery-gate/values_test.go | 2 +- .../cmd/mesh-delivery-gate/verbs.go | 2 +- modules/mesh-delivery-gate/go.mod | 22 +++++++-------- .../cmd/mesh-provisioner/catalogfake_test.go | 4 +-- .../cmd/mesh-provisioner/catalogfeed.go | 4 +-- .../cmd/mesh-provisioner/catalogfeed_test.go | 6 ++-- .../cmd/mesh-provisioner/composed_test.go | 2 +- .../cmd/mesh-provisioner/holder.go | 4 +-- .../cmd/mesh-provisioner/main.go | 2 +- .../cmd/mesh-provisioner/provisioner_test.go | 2 +- .../cmd/mesh-provisioner/readers.go | 2 +- modules/mesh-provisioner/go.mod | 16 +++++------ .../mesh-recovery/cmd/mesh-recovery/seats.go | 2 +- modules/mesh-recovery/go.mod | 2 +- .../cmd/mesh-self-check/catalogfeed.go | 4 +-- .../cmd/mesh-self-check/catalogfeed_test.go | 6 ++-- .../cmd/mesh-self-check/main.go | 2 +- .../cmd/mesh-self-check/probes_test.go | 2 +- .../cmd/mesh-self-check/selfcheck_test.go | 2 +- modules/mesh-self-check/go.mod | 6 ++-- modules/mesh-vault/go.mod | 12 ++++---- modules/nats/cmd/nats-tools/catalogview.go | 2 +- .../nats/cmd/nats-tools/catalogview_test.go | 2 +- modules/nats/cmd/nats-tools/keep.go | 2 +- modules/nats/go.mod | 2 +- modules/ssh-client/go.mod | 2 +- modules/ssh-client/sshkeys/go.mod | 2 +- modules/ssh-client/sshkeys/keeper.go | 2 +- 243 files changed, 470 insertions(+), 470 deletions(-) diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/gone.go b/modules/artifact-store-tools/cmd/artifact-store-tools/gone.go index cca4a96df..36cd52286 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/gone.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/gone.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - sweep "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshartifactsweep" + sweep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshartifactsweep" ) // The holders whose states this module reads, one constant each (a reader names its holder once; ADR 0634 §4). diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/holder.go b/modules/artifact-store-tools/cmd/artifact-store-tools/holder.go index 309d4248a..3490e8f4f 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/holder.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/holder.go @@ -20,10 +20,10 @@ import ( "fmt" engineclient "git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient" nodeengine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" "sort" "strings" "sync" @@ -31,7 +31,7 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" meshconditions "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/keys" diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/holder_test.go b/modules/artifact-store-tools/cmd/artifact-store-tools/holder_test.go index 0c1a05d98..72374209f 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/holder_test.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/holder_test.go @@ -6,10 +6,10 @@ import ( "errors" "fmt" nodeengine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" "slices" "sort" "strings" @@ -22,9 +22,9 @@ import ( stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - ociseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + ociseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry" ) // memBus is the holder's bus in memory: states by name, each key's history, and what was published. diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/listed.go b/modules/artifact-store-tools/cmd/artifact-store-tools/listed.go index 062427320..e83e881ea 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/listed.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/listed.go @@ -11,9 +11,9 @@ import ( "fmt" "sort" - ociseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry" + ociseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // Repo is one repository as the seats' list answers it. diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/seat.go b/modules/artifact-store-tools/cmd/artifact-store-tools/seat.go index 67d33e2c2..53b89085d 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/seat.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/seat.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - sweep "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshartifactsweep" + sweep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshartifactsweep" stdio "git.novox.be/novox/mesh-sdk/go" ) 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 e7e183262..3af7f16e7 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 @@ -1,8 +1,8 @@ package main import ( - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - sweep "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshartifactsweep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sweep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshartifactsweep" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/seatlist/seatlisttest" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/artifact-store-tools/cmd/artifact-store-tools/sweepseats.go b/modules/artifact-store-tools/cmd/artifact-store-tools/sweepseats.go index b106f1cf7..538783e31 100644 --- a/modules/artifact-store-tools/cmd/artifact-store-tools/sweepseats.go +++ b/modules/artifact-store-tools/cmd/artifact-store-tools/sweepseats.go @@ -16,12 +16,12 @@ import ( "strings" meshconditions "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" - ociseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + ociseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/keys" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // SweepRefused is the sweep's finding: a seat refused a hold or a remove the sweep asked. diff --git a/modules/artifact-store-tools/go.mod b/modules/artifact-store-tools/go.mod index 8b71604f0..055e1fbc4 100644 --- a/modules/artifact-store-tools/go.mod +++ b/modules/artifact-store-tools/go.mod @@ -8,13 +8,13 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshartifactsweep v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshartifactsweep v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 @@ -34,4 +34,4 @@ require ( golang.org/x/time v0.16.0 // indirect ) -require git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 // indirect +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 // indirect diff --git a/modules/claude-code/cmd/claude-code/catalogfeed.go b/modules/claude-code/cmd/claude-code/catalogfeed.go index cd4114c5f..9bc070e5c 100644 --- a/modules/claude-code/cmd/claude-code/catalogfeed.go +++ b/modules/claude-code/cmd/claude-code/catalogfeed.go @@ -6,7 +6,7 @@ package main // `manifests`. import ( - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // CatalogHalf is what this module reads of the catalog half. diff --git a/modules/claude-code/cmd/claude-code/catalogfeed_test.go b/modules/claude-code/cmd/claude-code/catalogfeed_test.go index 6597f6693..6c1edee7e 100644 --- a/modules/claude-code/cmd/claude-code/catalogfeed_test.go +++ b/modules/claude-code/cmd/claude-code/catalogfeed_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - delivery "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + delivery "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/claude-code/cmd/claude-code/insteadof_test.go b/modules/claude-code/cmd/claude-code/insteadof_test.go index eeec9e608..a403dddf0 100644 --- a/modules/claude-code/cmd/claude-code/insteadof_test.go +++ b/modules/claude-code/cmd/claude-code/insteadof_test.go @@ -13,7 +13,7 @@ import ( assignerclient "git.novox.be/novox/mesh-contracts/go/clients/meshmoduleassignerclient" mesh "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-sdk/go/seatdef" "git.novox.be/novox/mesh-sdk/go/seatlist" diff --git a/modules/claude-code/cmd/claude-code/main.go b/modules/claude-code/cmd/claude-code/main.go index 6243323be..407b94b61 100644 --- a/modules/claude-code/cmd/claude-code/main.go +++ b/modules/claude-code/cmd/claude-code/main.go @@ -26,7 +26,7 @@ import ( condseat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" occ "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient" oc "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/seatlist" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/claude-code/go.mod b/modules/claude-code/go.mod index 0995e6e52..b8a6dad8c 100644 --- a/modules/claude-code/go.mod +++ b/modules/claude-code/go.mod @@ -10,8 +10,8 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 gopkg.in/yaml.v3 v3.0.1 ) @@ -29,4 +29,4 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 // indirect ) -require git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 diff --git a/modules/distribution/cmd/distribution-tools/contract.go b/modules/distribution/cmd/distribution-tools/contract.go index c16ada558..4fe26822a 100644 --- a/modules/distribution/cmd/distribution-tools/contract.go +++ b/modules/distribution/cmd/distribution-tools/contract.go @@ -10,7 +10,7 @@ import ( "fmt" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" "distribution/internal/holder" ) diff --git a/modules/distribution/cmd/distribution-tools/contract_test.go b/modules/distribution/cmd/distribution-tools/contract_test.go index 7bd5c1e22..f6c1f3df1 100644 --- a/modules/distribution/cmd/distribution-tools/contract_test.go +++ b/modules/distribution/cmd/distribution-tools/contract_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" "distribution/internal/holder" ) diff --git a/modules/distribution/cmd/distribution-tools/main.go b/modules/distribution/cmd/distribution-tools/main.go index 352dea76f..57d02f016 100644 --- a/modules/distribution/cmd/distribution-tools/main.go +++ b/modules/distribution/cmd/distribution-tools/main.go @@ -20,8 +20,8 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" meshconditions "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - "git.novox.be/novox/mesh-delivery/sdk/parts" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/distribution/go.mod b/modules/distribution/go.mod index d5b6b1f8d..54e2485b1 100644 --- a/modules/distribution/go.mod +++ b/modules/distribution/go.mod @@ -5,10 +5,10 @@ go 1.26.0 require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshbuilds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshbuilds v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) @@ -29,7 +29,7 @@ require ( require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/distribution/internal/holder/holder_test.go b/modules/distribution/internal/holder/holder_test.go index 615fc0ff4..5acaef85a 100644 --- a/modules/distribution/internal/holder/holder_test.go +++ b/modules/distribution/internal/holder/holder_test.go @@ -17,7 +17,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" ) type memObjects map[string][]byte diff --git a/modules/distribution/internal/holder/list.go b/modules/distribution/internal/holder/list.go index 9361c35df..7e1780cc1 100644 --- a/modules/distribution/internal/holder/list.go +++ b/modules/distribution/internal/holder/list.go @@ -13,7 +13,7 @@ import ( "fmt" "sort" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // VerbList is the seats' verb list. diff --git a/modules/distribution/internal/holder/list_test.go b/modules/distribution/internal/holder/list_test.go index a29eaf391..cb5239a6c 100644 --- a/modules/distribution/internal/holder/list_test.go +++ b/modules/distribution/internal/holder/list_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // dg is a digest made from a short name, so a test reads as names. diff --git a/modules/distribution/internal/holder/reserved.go b/modules/distribution/internal/holder/reserved.go index 89ebd9ae2..b649431d5 100644 --- a/modules/distribution/internal/holder/reserved.go +++ b/modules/distribution/internal/holder/reserved.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshbuilds" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshbuilds" ) // Reserved is the holder's check of a publish against the builder's reservation (novox/hq design 47 §381, §478, §504): it asks the diff --git a/modules/distribution/internal/holder/transfer.go b/modules/distribution/internal/holder/transfer.go index e07812af9..960890786 100644 --- a/modules/distribution/internal/holder/transfer.go +++ b/modules/distribution/internal/holder/transfer.go @@ -10,7 +10,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - "git.novox.be/novox/mesh-delivery/sdk/parts" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" ) // The bounds of incoming (design 51 *Publishing*, ADR 0611): a part is at most 1 MiB, a transfer with no part for 24 diff --git a/modules/distribution/internal/holder/verbs.go b/modules/distribution/internal/holder/verbs.go index bf4b5f0b6..bf27e37d5 100644 --- a/modules/distribution/internal/holder/verbs.go +++ b/modules/distribution/internal/holder/verbs.go @@ -10,7 +10,7 @@ import ( "strings" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // Catalog is what the store answers of what it holds. diff --git a/modules/distribution/internal/holder/window.go b/modules/distribution/internal/holder/window.go index 4ba0971e8..785b29646 100644 --- a/modules/distribution/internal/holder/window.go +++ b/modules/distribution/internal/holder/window.go @@ -3,7 +3,7 @@ package holder import ( "fmt" - "git.novox.be/novox/mesh-delivery/sdk/window" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/window" "slices" "sort" "time" diff --git a/modules/gitea/cmd/package-registry/incoming.go b/modules/gitea/cmd/package-registry/incoming.go index fb0984bde..ce8add7b7 100644 --- a/modules/gitea/cmd/package-registry/incoming.go +++ b/modules/gitea/cmd/package-registry/incoming.go @@ -10,7 +10,7 @@ import ( "os" "strings" - "git.novox.be/novox/mesh-delivery/sdk/parts" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" stdio "git.novox.be/novox/mesh-sdk/go" "gitea/internal/packageseats" diff --git a/modules/gitea/cmd/package-registry/seats.go b/modules/gitea/cmd/package-registry/seats.go index 336e473c7..246da7580 100644 --- a/modules/gitea/cmd/package-registry/seats.go +++ b/modules/gitea/cmd/package-registry/seats.go @@ -26,9 +26,9 @@ import ( "strings" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - goreg "git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry" - npmreg "git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry" - "git.novox.be/novox/mesh-delivery/sdk/parts" + goreg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry" + npmreg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" stdio "git.novox.be/novox/mesh-sdk/go" "gitea/internal/packageseats" diff --git a/modules/gitea/go.mod b/modules/gitea/go.mod index 11e94c655..c1b3a1ce4 100644 --- a/modules/gitea/go.mod +++ b/modules/gitea/go.mod @@ -6,10 +6,10 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/provisioning/go/clients/meshprovisionerclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshbuilds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshbuilds v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 @@ -30,9 +30,9 @@ require ( require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/gitea/internal/packageseats/holder.go b/modules/gitea/internal/packageseats/holder.go index 10f05af16..f16b8a8f3 100644 --- a/modules/gitea/internal/packageseats/holder.go +++ b/modules/gitea/internal/packageseats/holder.go @@ -13,7 +13,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - "git.novox.be/novox/mesh-delivery/sdk/parts" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" ) // The seats the forge module holds. diff --git a/modules/gitea/internal/packageseats/holder_test.go b/modules/gitea/internal/packageseats/holder_test.go index 029810f47..9fd27c9b2 100644 --- a/modules/gitea/internal/packageseats/holder_test.go +++ b/modules/gitea/internal/packageseats/holder_test.go @@ -9,7 +9,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - "git.novox.be/novox/mesh-delivery/sdk/parts" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" ) type memObjects map[string][]byte diff --git a/modules/gitea/internal/packageseats/reserved.go b/modules/gitea/internal/packageseats/reserved.go index ef5228a84..15da4fad9 100644 --- a/modules/gitea/internal/packageseats/reserved.go +++ b/modules/gitea/internal/packageseats/reserved.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshbuilds" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshbuilds" ) // Reserved is the holder's check of a publish against the builder's reservation (novox/hq design 47 §381, §478, §504): it asks the diff --git a/modules/mesh-build-go/buildstep/askrun.go b/modules/mesh-build-go/buildstep/askrun.go index 49859b27a..4bcb19ae7 100644 --- a/modules/mesh-build-go/buildstep/askrun.go +++ b/modules/mesh-build-go/buildstep/askrun.go @@ -10,8 +10,8 @@ import ( "sort" "strings" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - trunk "git.novox.be/novox/mesh-delivery/sdk/trunk" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + trunk "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/trunk" ) // **One ask, one whole job** (novox/hq ADR 0525 §3). A build module runs a pulled ask with its own step tools' bodies, diff --git a/modules/mesh-build-go/buildstep/askrun_test.go b/modules/mesh-build-go/buildstep/askrun_test.go index 173813ff0..a8fbed2b2 100644 --- a/modules/mesh-build-go/buildstep/askrun_test.go +++ b/modules/mesh-build-go/buildstep/askrun_test.go @@ -10,9 +10,9 @@ import ( "testing" "time" - nodebuildgo "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - nodebuildnode "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + nodebuildnode "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) const runCommit = "0123456789abcdef0123456789abcdef01234567" diff --git a/modules/mesh-build-go/buildstep/capacity.go b/modules/mesh-build-go/buildstep/capacity.go index 14fa874d0..0552bdbd2 100644 --- a/modules/mesh-build-go/buildstep/capacity.go +++ b/modules/mesh-build-go/buildstep/capacity.go @@ -1,7 +1,7 @@ package buildstep import ( - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "encoding/json" "fmt" diff --git a/modules/mesh-build-go/buildstep/capacity_cpu.go b/modules/mesh-build-go/buildstep/capacity_cpu.go index ff9e3c829..61f2c1356 100644 --- a/modules/mesh-build-go/buildstep/capacity_cpu.go +++ b/modules/mesh-build-go/buildstep/capacity_cpu.go @@ -10,7 +10,7 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/buildcpu" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // **A build seat's capacity follows the CPU its node gives builds** (issue 1806's follow-up; issue 1890, 2026-10-26 diff --git a/modules/mesh-build-go/buildstep/conformance/conformance.go b/modules/mesh-build-go/buildstep/conformance/conformance.go index 2a5225416..f04eadbbe 100644 --- a/modules/mesh-build-go/buildstep/conformance/conformance.go +++ b/modules/mesh-build-go/buildstep/conformance/conformance.go @@ -16,7 +16,7 @@ import ( "strings" "testing" - "git.novox.be/novox/mesh-delivery/sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // The runners the kit holds output of. diff --git a/modules/mesh-build-go/buildstep/conformance/conformance_test.go b/modules/mesh-build-go/buildstep/conformance/conformance_test.go index 06ab998b6..f9acdf774 100644 --- a/modules/mesh-build-go/buildstep/conformance/conformance_test.go +++ b/modules/mesh-build-go/buildstep/conformance/conformance_test.go @@ -9,8 +9,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // The failure contract (issue 1901): the SDK's own parsers keep it on every captured case of the kit (1901/AC6); the diff --git a/modules/mesh-build-go/buildstep/conformance/leftrunning.go b/modules/mesh-build-go/buildstep/conformance/leftrunning.go index 5e5bfa303..50c58f90b 100644 --- a/modules/mesh-build-go/buildstep/conformance/leftrunning.go +++ b/modules/mesh-build-go/buildstep/conformance/leftrunning.go @@ -10,8 +10,8 @@ import ( "testing" "time" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/digestshape_test.go b/modules/mesh-build-go/buildstep/digestshape_test.go index af9511d0d..55807bbf0 100644 --- a/modules/mesh-build-go/buildstep/digestshape_test.go +++ b/modules/mesh-build-go/buildstep/digestshape_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // credentialField is the node runtime's rule for a state value (mesh-tools node-tools/internal/bus/state.go, novox/hq diff --git a/modules/mesh-build-go/buildstep/fetch.go b/modules/mesh-build-go/buildstep/fetch.go index fb8d53a6f..4c74474cb 100644 --- a/modules/mesh-build-go/buildstep/fetch.go +++ b/modules/mesh-build-go/buildstep/fetch.go @@ -9,8 +9,8 @@ import ( "regexp" "strings" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/buildstep/fetch_test.go b/modules/mesh-build-go/buildstep/fetch_test.go index eb2b916c1..3b00f19de 100644 --- a/modules/mesh-build-go/buildstep/fetch_test.go +++ b/modules/mesh-build-go/buildstep/fetch_test.go @@ -2,7 +2,7 @@ package buildstep import ( "context" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "strings" "testing" diff --git a/modules/mesh-build-go/buildstep/generated_test.go b/modules/mesh-build-go/buildstep/generated_test.go index a1eb3efcf..e77906136 100644 --- a/modules/mesh-build-go/buildstep/generated_test.go +++ b/modules/mesh-build-go/buildstep/generated_test.go @@ -11,7 +11,7 @@ import ( "testing" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/seatgen" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // contracts writes a contracts module of one seat, its generated files as the generator writes them, and answers its diff --git a/modules/mesh-build-go/buildstep/go.mod b/modules/mesh-build-go/buildstep/go.mod index 77b28476c..6739d8699 100644 --- a/modules/mesh-build-go/buildstep/go.mod +++ b/modules/mesh-build-go/buildstep/go.mod @@ -4,18 +4,18 @@ go 1.26.0 require ( git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) @@ -35,6 +35,6 @@ require ( ) require ( - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/mesh-build-go/buildstep/gotest.go b/modules/mesh-build-go/buildstep/gotest.go index 9c15d72c2..a75f59b35 100644 --- a/modules/mesh-build-go/buildstep/gotest.go +++ b/modules/mesh-build-go/buildstep/gotest.go @@ -8,7 +8,7 @@ import ( "bufio" "encoding/json" "fmt" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "regexp" "slices" "strings" diff --git a/modules/mesh-build-go/buildstep/guard.go b/modules/mesh-build-go/buildstep/guard.go index 59f844c9b..84bd05f5d 100644 --- a/modules/mesh-build-go/buildstep/guard.go +++ b/modules/mesh-build-go/buildstep/guard.go @@ -5,7 +5,7 @@ import ( "encoding/json" "fmt" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // Guard is a build module's check that the toolchain installed on its node is the one its recipe builds with diff --git a/modules/mesh-build-go/buildstep/guard_test.go b/modules/mesh-build-go/buildstep/guard_test.go index fe8bad19e..e39e7149c 100644 --- a/modules/mesh-build-go/buildstep/guard_test.go +++ b/modules/mesh-build-go/buildstep/guard_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) type toolchainKeys map[string]sdkstep.Toolchain diff --git a/modules/mesh-build-go/buildstep/merge.go b/modules/mesh-build-go/buildstep/merge.go index 93fb6b6f9..35819aaed 100644 --- a/modules/mesh-build-go/buildstep/merge.go +++ b/modules/mesh-build-go/buildstep/merge.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/buildstep/narrate_test.go b/modules/mesh-build-go/buildstep/narrate_test.go index 5b27e9b60..e15a6fbdb 100644 --- a/modules/mesh-build-go/buildstep/narrate_test.go +++ b/modules/mesh-build-go/buildstep/narrate_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // CAT-NR1: a build's publish on a seat says asked, waiting on the seat (on every tick of NarrateEvery while the holder diff --git a/modules/mesh-build-go/buildstep/narrow.go b/modules/mesh-build-go/buildstep/narrow.go index 02066491f..80e5d6426 100644 --- a/modules/mesh-build-go/buildstep/narrow.go +++ b/modules/mesh-build-go/buildstep/narrow.go @@ -2,7 +2,7 @@ package buildstep import ( "fmt" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "os" "path" "path/filepath" diff --git a/modules/mesh-build-go/buildstep/narrow_test.go b/modules/mesh-build-go/buildstep/narrow_test.go index 621debfbc..001163e43 100644 --- a/modules/mesh-build-go/buildstep/narrow_test.go +++ b/modules/mesh-build-go/buildstep/narrow_test.go @@ -1,7 +1,7 @@ package buildstep import ( - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "os" "path/filepath" "sort" diff --git a/modules/mesh-build-go/buildstep/phase.go b/modules/mesh-build-go/buildstep/phase.go index ffb0168fc..89b8a6bd1 100644 --- a/modules/mesh-build-go/buildstep/phase.go +++ b/modules/mesh-build-go/buildstep/phase.go @@ -6,7 +6,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // **A running ask says its phases** (issue 1890, 2026-10-26 19:09: a mesh-catalog try's step on the workstation ran 30 minutes diff --git a/modules/mesh-build-go/buildstep/publish.go b/modules/mesh-build-go/buildstep/publish.go index a83de94df..9ce5d8334 100644 --- a/modules/mesh-build-go/buildstep/publish.go +++ b/modules/mesh-build-go/buildstep/publish.go @@ -16,16 +16,16 @@ import ( "strings" assigner "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" - imageclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient" - goclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/gopackageregistryclient" - npmclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/npmpackageregistryclient" - ociclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/ociartifactregistryclient" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - goseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry" - npmseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry" - ociseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - "git.novox.be/novox/mesh-delivery/sdk/parts" + imageclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient" + goclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient" + npmclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient" + ociclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + goseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry" + npmseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry" + ociseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/parts" ) // The registry seats a build module publishes on. diff --git a/modules/mesh-build-go/buildstep/pull.go b/modules/mesh-build-go/buildstep/pull.go index d9bec6b3e..35447e9af 100644 --- a/modules/mesh-build-go/buildstep/pull.go +++ b/modules/mesh-build-go/buildstep/pull.go @@ -10,8 +10,8 @@ import ( "sync" "time" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/pull_bus.go b/modules/mesh-build-go/buildstep/pull_bus.go index 20c0528be..7a35ed627 100644 --- a/modules/mesh-build-go/buildstep/pull_bus.go +++ b/modules/mesh-build-go/buildstep/pull_bus.go @@ -6,7 +6,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "github.com/nats-io/nats.go/jetstream" ) diff --git a/modules/mesh-build-go/buildstep/pull_drop.go b/modules/mesh-build-go/buildstep/pull_drop.go index 6ec70787d..654d1c561 100644 --- a/modules/mesh-build-go/buildstep/pull_drop.go +++ b/modules/mesh-build-go/buildstep/pull_drop.go @@ -8,9 +8,9 @@ import ( "strings" "time" - nodebuildgo "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/pull_fake.go b/modules/mesh-build-go/buildstep/pull_fake.go index 84ed06d18..55ef7c524 100644 --- a/modules/mesh-build-go/buildstep/pull_fake.go +++ b/modules/mesh-build-go/buildstep/pull_fake.go @@ -5,7 +5,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // FakeAsks is a test double of a seat's workers for the build modules' unit tests: Publish puts an ask on a kind's diff --git a/modules/mesh-build-go/buildstep/pull_integration_test.go b/modules/mesh-build-go/buildstep/pull_integration_test.go index d6f043a6f..a05430df2 100644 --- a/modules/mesh-build-go/buildstep/pull_integration_test.go +++ b/modules/mesh-build-go/buildstep/pull_integration_test.go @@ -13,7 +13,7 @@ import ( "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/testbus" ) diff --git a/modules/mesh-build-go/buildstep/pull_seat.go b/modules/mesh-build-go/buildstep/pull_seat.go index 105f410c3..7b7bb088b 100644 --- a/modules/mesh-build-go/buildstep/pull_seat.go +++ b/modules/mesh-build-go/buildstep/pull_seat.go @@ -4,7 +4,7 @@ import ( "context" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/pull_seat_test.go b/modules/mesh-build-go/buildstep/pull_seat_test.go index 01ab907a5..61ef55a45 100644 --- a/modules/mesh-build-go/buildstep/pull_seat_test.go +++ b/modules/mesh-build-go/buildstep/pull_seat_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - nodebuildgo "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/pull_test.go b/modules/mesh-build-go/buildstep/pull_test.go index d30cd77c4..ede29462f 100644 --- a/modules/mesh-build-go/buildstep/pull_test.go +++ b/modules/mesh-build-go/buildstep/pull_test.go @@ -13,8 +13,8 @@ import ( "testing" "time" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/seat_tools_test.go b/modules/mesh-build-go/buildstep/seat_tools_test.go index 5d04a5862..662d309e7 100644 --- a/modules/mesh-build-go/buildstep/seat_tools_test.go +++ b/modules/mesh-build-go/buildstep/seat_tools_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1887/A9a, ADR 0525 §10: a build seat's verbs are .current, .pause and .resume; current names the ask running, diff --git a/modules/mesh-build-go/buildstep/step.go b/modules/mesh-build-go/buildstep/step.go index 47403fdfb..3722473ff 100644 --- a/modules/mesh-build-go/buildstep/step.go +++ b/modules/mesh-build-go/buildstep/step.go @@ -12,8 +12,8 @@ import ( "log" "time" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // Put writes one key of a state: the steps state.Put's shape (go/state.go). diff --git a/modules/mesh-build-go/buildstep/step_test.go b/modules/mesh-build-go/buildstep/step_test.go index a2a19cd2c..066f80780 100644 --- a/modules/mesh-build-go/buildstep/step_test.go +++ b/modules/mesh-build-go/buildstep/step_test.go @@ -8,8 +8,8 @@ import ( "testing" "time" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // keys is a steps state in memory: every value put, in order, per key, and a signal for each end. diff --git a/modules/mesh-build-go/buildstep/steprun.go b/modules/mesh-build-go/buildstep/steprun.go index 3549c170b..1b5473c7d 100644 --- a/modules/mesh-build-go/buildstep/steprun.go +++ b/modules/mesh-build-go/buildstep/steprun.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // **A pipeline step, run and said** (novox/hq ADR 0666 §7, §8, §17, §21; design 47 *Pipeline steps and the policy*, diff --git a/modules/mesh-build-go/buildstep/steptool.go b/modules/mesh-build-go/buildstep/steptool.go index 92e8eef02..a1978624e 100644 --- a/modules/mesh-build-go/buildstep/steptool.go +++ b/modules/mesh-build-go/buildstep/steptool.go @@ -1,7 +1,7 @@ package buildstep import ( - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/buildstep/tap.go b/modules/mesh-build-go/buildstep/tap.go index 2c3d5e488..d684e1a37 100644 --- a/modules/mesh-build-go/buildstep/tap.go +++ b/modules/mesh-build-go/buildstep/tap.go @@ -5,7 +5,7 @@ package buildstep // earlier file, which is what node's default reporter left the first fifteen lines of. import ( - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "regexp" "strings" ) diff --git a/modules/mesh-build-go/buildstep/transport.go b/modules/mesh-build-go/buildstep/transport.go index c5610fa5f..785e81362 100644 --- a/modules/mesh-build-go/buildstep/transport.go +++ b/modules/mesh-build-go/buildstep/transport.go @@ -1,6 +1,6 @@ package buildstep -import sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +import sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" // Transport is err as a sdkstep.Passing when its words are those of a network that did not answer (a lookup, a timeout, a // reset connection; sdkstep.PassingCause), so the build module's ask is given again after a delay instead of failing diff --git a/modules/mesh-build-go/buildstep/trees.go b/modules/mesh-build-go/buildstep/trees.go index 1b9b0b910..141ea7998 100644 --- a/modules/mesh-build-go/buildstep/trees.go +++ b/modules/mesh-build-go/buildstep/trees.go @@ -10,8 +10,8 @@ import ( "path/filepath" "strings" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/buildstep/trees_integration_test.go b/modules/mesh-build-go/buildstep/trees_integration_test.go index 0cbc52f6b..10b68a77b 100644 --- a/modules/mesh-build-go/buildstep/trees_integration_test.go +++ b/modules/mesh-build-go/buildstep/trees_integration_test.go @@ -4,7 +4,7 @@ package buildstep import ( "context" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "reflect" "strings" "testing" diff --git a/modules/mesh-build-go/buildstep/trees_test.go b/modules/mesh-build-go/buildstep/trees_test.go index 6b83536cf..6fe002eb2 100644 --- a/modules/mesh-build-go/buildstep/trees_test.go +++ b/modules/mesh-build-go/buildstep/trees_test.go @@ -4,7 +4,7 @@ import ( "context" "crypto/sha256" "encoding/hex" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "os" "path/filepath" "reflect" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/archive.go b/modules/mesh-build-go/cmd/mesh-build-go/archive.go index 819b6b839..0fc973868 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/archive.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/archive.go @@ -24,7 +24,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/catalogue" "github.com/therootcompany/xz" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/archive_test.go b/modules/mesh-build-go/cmd/mesh-build-go/archive_test.go index e4752429c..e7506cba0 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/archive_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/archive_test.go @@ -17,7 +17,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // Issue 1589: the build step packs an archive artifact (novox/hq ADR 0478 §1), as the build agent packs it diff --git a/modules/mesh-build-go/cmd/mesh-build-go/asks.go b/modules/mesh-build-go/cmd/mesh-build-go/asks.go index b49bd7d1b..6f57b0ee4 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/asks.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/asks.go @@ -6,9 +6,9 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go index 6272dbfb8..402177bf1 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/asks_integration_test.go @@ -12,7 +12,7 @@ import ( "github.com/nats-io/nats.go/jetstream" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/testbus" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/asks_test.go b/modules/mesh-build-go/cmd/mesh-build-go/asks_test.go index d72afeaab..aefd332d7 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/asks_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/asks_test.go @@ -12,7 +12,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) const askCommit = "0123456789abcdef0123456789abcdef01234567" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go b/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go index 0bd255931..026a8f414 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // writeSiblings records the siblings the fetch placed, as the fetch does. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/build.go b/modules/mesh-build-go/cmd/mesh-build-go/build.go index d42fd7dbf..351f62321 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/build.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/build.go @@ -14,9 +14,9 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/catalogue" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/build_test.go b/modules/mesh-build-go/cmd/mesh-build-go/build_test.go index 29dda3fbc..6989b19b2 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/build_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/build_test.go @@ -14,7 +14,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/candidate.go b/modules/mesh-build-go/cmd/mesh-build-go/candidate.go index 71a6f287a..ff20d0dad 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/candidate.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/candidate.go @@ -14,7 +14,7 @@ import ( "strings" "sync" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" ) // The runners of a digest or test step: this installed program, or the candidate's compiled from the workspace. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/candidate_test.go b/modules/mesh-build-go/cmd/mesh-build-go/candidate_test.go index c18ea5452..b2b0c44dd 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/candidate_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/candidate_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/compose.go b/modules/mesh-build-go/cmd/mesh-build-go/compose.go index 35afca719..c27ce81fc 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/compose.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/compose.go @@ -26,9 +26,9 @@ import ( "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - "git.novox.be/novox/mesh-delivery/sdk/composer" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/composer" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/keys" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/compose_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/compose_integration_test.go index 3310fdea5..9493e4ac1 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/compose_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/compose_integration_test.go @@ -17,9 +17,9 @@ import ( "github.com/nats-io/nats.go/jetstream" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - "git.novox.be/novox/mesh-delivery/sdk/composer" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/composer" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/testbus" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/compose_test.go b/modules/mesh-build-go/cmd/mesh-build-go/compose_test.go index 332f60d72..95ba6a006 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/compose_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/compose_test.go @@ -12,10 +12,10 @@ import ( "time" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - meshcat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - "git.novox.be/novox/mesh-delivery/sdk/composer" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + meshcat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/composer" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/digest.go b/modules/mesh-build-go/cmd/mesh-build-go/digest.go index 6a85a7ae6..8447d636d 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/digest.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/digest.go @@ -22,8 +22,8 @@ import ( "strconv" "strings" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - trunk "git.novox.be/novox/mesh-delivery/sdk/trunk" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + trunk "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/trunk" ) // DigestVersion is the form of the digest's text: changed whenever what the digest hashes changes in kind. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/fetch.go b/modules/mesh-build-go/cmd/mesh-build-go/fetch.go index 8e76eb0f6..f39c6d008 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/fetch.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/fetch.go @@ -20,8 +20,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" ) var commitOK = regexp.MustCompile(`^[0-9a-f]{40}$`) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/fetch_test.go b/modules/mesh-build-go/cmd/mesh-build-go/fetch_test.go index 73bde7449..f98cdfee6 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/fetch_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/fetch_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) @@ -212,7 +212,7 @@ func TestNoCommandOfTheStepSeesAPasswordOrAToken(t *testing.T) { // 1485/AC3: go mod verify failing ends the step failed naming the directory and the first line of its output. func TestAVerifyThatFailsEndsTheStepNamingTheDirectoryAndTheLine(t *testing.T) { - const seatPkg = "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" + const seatPkg = "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" for _, c := range []struct { name, ran, out string fatal bool diff --git a/modules/mesh-build-go/cmd/mesh-build-go/imports.go b/modules/mesh-build-go/cmd/mesh-build-go/imports.go index e9ea32a9a..f7d7aa10b 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/imports.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/imports.go @@ -14,7 +14,7 @@ import ( "slices" "strings" - trunk "git.novox.be/novox/mesh-delivery/sdk/trunk" + trunk "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/trunk" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/installed_toolchain_test.go b/modules/mesh-build-go/cmd/mesh-build-go/installed_toolchain_test.go index 218e34a4d..7be02f884 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/installed_toolchain_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/installed_toolchain_test.go @@ -12,7 +12,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/buildcpu" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/integration.go b/modules/mesh-build-go/cmd/mesh-build-go/integration.go index f71b6a562..fb406f660 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/integration.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/integration.go @@ -14,7 +14,7 @@ import ( "strings" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // The integration level's bounds (ADR 0445 §3). diff --git a/modules/mesh-build-go/cmd/mesh-build-go/integration_level_test.go b/modules/mesh-build-go/cmd/mesh-build-go/integration_level_test.go index e2cf5bad1..49889ee94 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/integration_level_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/integration_level_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/isolate.go b/modules/mesh-build-go/cmd/mesh-build-go/isolate.go index 946fab4eb..e54d8224f 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/isolate.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/isolate.go @@ -16,7 +16,7 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/isolate_test.go b/modules/mesh-build-go/cmd/mesh-build-go/isolate_test.go index 190224d77..0127c9e55 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/isolate_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/isolate_test.go @@ -11,7 +11,7 @@ import ( "testing" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds.go b/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds.go index bdb9800d9..2dcee97e8 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds.go @@ -16,9 +16,9 @@ import ( "slices" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - ociseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + ociseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/buscalls" "git.novox.be/novox/mesh-sdk/go/catalogue" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds_test.go b/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds_test.go index aff556c19..22d926e3c 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/keptbuilds_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/buscalls" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/keys.go b/modules/mesh-build-go/cmd/mesh-build-go/keys.go index ba3baff9a..802b45ae4 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/keys.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/keys.go @@ -14,7 +14,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/kit_test.go b/modules/mesh-build-go/cmd/mesh-build-go/kit_test.go index 8e942ca0b..c5dacdb23 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/kit_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/kit_test.go @@ -10,8 +10,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1901/AC7: the module's own parse path (readGoTest, then the level's judging) keeps the failure contract on every captured diff --git a/modules/mesh-build-go/cmd/mesh-build-go/level.go b/modules/mesh-build-go/cmd/mesh-build-go/level.go index d61907753..7b5805169 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/level.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/level.go @@ -17,7 +17,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // levelArg is the first argument that makes this binary a step's shut-off process: the integration level's, and, when diff --git a/modules/mesh-build-go/cmd/mesh-build-go/levels.go b/modules/mesh-build-go/cmd/mesh-build-go/levels.go index 903636356..6476ac7ba 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/levels.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/levels.go @@ -12,7 +12,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // The two levels (ADR 0445 §2). diff --git a/modules/mesh-build-go/cmd/mesh-build-go/lint.go b/modules/mesh-build-go/cmd/mesh-build-go/lint.go index 90138afad..c388bbaa3 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/lint.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/lint.go @@ -15,7 +15,7 @@ import ( "sync" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/main.go b/modules/mesh-build-go/cmd/mesh-build-go/main.go index 8817fc799..9cf9701ce 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/main.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/main.go @@ -13,8 +13,8 @@ import ( "strings" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/busstate" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/mirror.go b/modules/mesh-build-go/cmd/mesh-build-go/mirror.go index 7c3ab5633..b7145f4ec 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/mirror.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/mirror.go @@ -9,7 +9,7 @@ import ( "syscall" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" ) // mirrorLocks hold one mutex per mirror of this process; the lock file beside the mirror holds off another process. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/mirror_test.go b/modules/mesh-build-go/cmd/mesh-build-go/mirror_test.go index 6b5c39202..53c5466e9 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/mirror_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/mirror_test.go @@ -12,7 +12,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) func fetchOnce(t *testing.T, m *Module, states *keptStates, args map[string]any) FetchResult { diff --git a/modules/mesh-build-go/cmd/mesh-build-go/module.go b/modules/mesh-build-go/cmd/mesh-build-go/module.go index 26632aed3..f36894ff4 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/module.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/module.go @@ -10,8 +10,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/module_test.go b/modules/mesh-build-go/cmd/mesh-build-go/module_test.go index 7ff90d395..79cf2d756 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/module_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/module_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/narrow_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/narrow_integration_test.go index d7e684fed..2ce32371e 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/narrow_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/narrow_integration_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // ADR 0499 §4 (issue 1758): a fetch asked with the module's directory and its named paths leaves the workspace holding diff --git a/modules/mesh-build-go/cmd/mesh-build-go/needtools_test.go b/modules/mesh-build-go/cmd/mesh-build-go/needtools_test.go index e39595e3c..b25ff05e6 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/needtools_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/needtools_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // Issue 1309: a test that runs a step in bubblewrap is proof only where it runs. Where a build module judges (it hands diff --git a/modules/mesh-build-go/cmd/mesh-build-go/node_toolchains_test.go b/modules/mesh-build-go/cmd/mesh-build-go/node_toolchains_test.go index a1f37d054..be305844d 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/node_toolchains_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/node_toolchains_test.go @@ -9,7 +9,7 @@ import ( "strconv" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/packages_shape_test.go b/modules/mesh-build-go/cmd/mesh-build-go/packages_shape_test.go index 0490b6568..a6ec8b7f6 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/packages_shape_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/packages_shape_test.go @@ -8,7 +8,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1925/AC1: packagesArg takes the list as the bus's JSON shape ([]any) and as the typed list an ask hands in process diff --git a/modules/mesh-build-go/cmd/mesh-build-go/pins.go b/modules/mesh-build-go/cmd/mesh-build-go/pins.go index 19c1ec08a..bcff198c2 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/pins.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/pins.go @@ -21,8 +21,8 @@ import ( "strings" "sync" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" ) const forgePrefix = "git.novox.be/novox/" diff --git a/modules/mesh-build-go/cmd/mesh-build-go/pins_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/pins_integration_test.go index d19157869..6337ed1f8 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/pins_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/pins_integration_test.go @@ -13,7 +13,7 @@ import ( "path/filepath" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1148/AC2 as issue 1585 S15 has it (novox/hq ADR 0573 §4): given a forge with a mesh-sdk-like pull request whose branch diff --git a/modules/mesh-build-go/cmd/mesh-build-go/pins_test.go b/modules/mesh-build-go/cmd/mesh-build-go/pins_test.go index 9ce00ffea..17b5f20e8 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/pins_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/pins_test.go @@ -10,7 +10,7 @@ import ( "sync" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/preview_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/preview_integration_test.go index 95cccd6c7..cbefd58aa 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/preview_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/preview_integration_test.go @@ -15,7 +15,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) func git(t *testing.T, dir string, args ...string) string { diff --git a/modules/mesh-build-go/cmd/mesh-build-go/preview_test.go b/modules/mesh-build-go/cmd/mesh-build-go/preview_test.go index 87ff97f0c..dca5fddba 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/preview_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/preview_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/probe.go b/modules/mesh-build-go/cmd/mesh-build-go/probe.go index 13be6f6bd..b5b313827 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/probe.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/probe.go @@ -7,7 +7,7 @@ import ( "strings" "time" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/publish_test.go b/modules/mesh-build-go/cmd/mesh-build-go/publish_test.go index 0892e16b2..ed850e63f 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/publish_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/publish_test.go @@ -15,9 +15,9 @@ import ( "testing" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - registry "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + registry "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // pushed are the blobs the fake artifact store took, by digest, for the tests that read an archive back. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/read.go b/modules/mesh-build-go/cmd/mesh-build-go/read.go index 1938479bb..fc53441a6 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/read.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/read.go @@ -14,7 +14,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/read_test.go b/modules/mesh-build-go/cmd/mesh-build-go/read_test.go index 0ff1eba1f..880fa8962 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/read_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/read_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // fakeState is a state as stored: key to raw value. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/room_test.go b/modules/mesh-build-go/cmd/mesh-build-go/room_test.go index 3e65c8686..e7aff218c 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/room_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/room_test.go @@ -9,7 +9,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/run.go b/modules/mesh-build-go/cmd/mesh-build-go/run.go index 06aa9979c..3a17e3485 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/run.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/run.go @@ -19,8 +19,8 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - checkerclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + checkerclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliverycheckerclient" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // run runs a run ask: the program of its commit, built once, over its heads and its input. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/run_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/run_integration_test.go index 946928f02..83830ef48 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/run_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/run_integration_test.go @@ -17,9 +17,9 @@ import ( "github.com/nats-io/nats.go/jetstream" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - checkerclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient" - checker "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + checkerclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliverycheckerclient" + checker "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdeliverychecker" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/testbus" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/run_test.go b/modules/mesh-build-go/cmd/mesh-build-go/run_test.go index 09c98d6b7..a1a2dec24 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/run_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/run_test.go @@ -16,10 +16,10 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - checkerclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient" - checker "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - "git.novox.be/novox/mesh-delivery/sdk/composer" + checkerclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliverycheckerclient" + checker "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdeliverychecker" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/composer" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/runner.go b/modules/mesh-build-go/cmd/mesh-build-go/runner.go index 215204e9a..b8e7d1f43 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/runner.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/runner.go @@ -4,7 +4,7 @@ import ( "context" "os" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/selected_dirs_test.go b/modules/mesh-build-go/cmd/mesh-build-go/selected_dirs_test.go index 77e8915e9..e636ae445 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/selected_dirs_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/selected_dirs_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // threeModules gives the workspace three go.mod directories, a, b and c, whose modules are fixture/a, fixture/b and diff --git a/modules/mesh-build-go/cmd/mesh-build-go/steps.go b/modules/mesh-build-go/cmd/mesh-build-go/steps.go index 7745cc695..63ef1d396 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/steps.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/steps.go @@ -17,8 +17,8 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/store_integration_test.go b/modules/mesh-build-go/cmd/mesh-build-go/store_integration_test.go index f7434ad9a..951166035 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/store_integration_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/store_integration_test.go @@ -24,9 +24,9 @@ import ( _ "github.com/distribution/distribution/v3/registry/storage/driver/inmemory" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" - registry "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + registry "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // realStore starts the artifact store's own program (the distribution registry, modules/distribution) inside this diff --git a/modules/mesh-build-go/cmd/mesh-build-go/test.go b/modules/mesh-build-go/cmd/mesh-build-go/test.go index 3ca5d79be..f106a55e7 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/test.go @@ -16,7 +16,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/test_test.go b/modules/mesh-build-go/cmd/mesh-build-go/test_test.go index bd241bb20..0931f3dcd 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/test_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/test_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/versions.go b/modules/mesh-build-go/cmd/mesh-build-go/versions.go index 8dbd79c6d..aa51c4f82 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/versions.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/versions.go @@ -31,7 +31,7 @@ import ( "strings" "sync" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/versions_test.go b/modules/mesh-build-go/cmd/mesh-build-go/versions_test.go index f2e54402b..40f799197 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/versions_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/versions_test.go @@ -9,7 +9,7 @@ import ( "testing" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/xz_test.go b/modules/mesh-build-go/cmd/mesh-build-go/xz_test.go index 35ca8107b..431b77430 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/xz_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/xz_test.go @@ -9,7 +9,7 @@ import ( "path/filepath" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // releaseXzSHA256 is the sha256 of testdata/upstream-release.tar.xz: the tar stream of upstream-release.tar.gz, diff --git a/modules/mesh-build-go/go.mod b/modules/mesh-build-go/go.mod index a3591514d..c3dc4189d 100644 --- a/modules/mesh-build-go/go.mod +++ b/modules/mesh-build-go/go.mod @@ -5,15 +5,15 @@ go 1.26.0 require ( git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliverycheckerclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdeliverychecker v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/distribution/distribution/v3 v3.1.2 github.com/nats-io/nats-server/v2 v2.11.17 @@ -103,10 +103,10 @@ replace git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys => ../ssh-cli require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/asks.go b/modules/mesh-build-image/cmd/mesh-build-image/asks.go index 38a1bda81..d5214dbe3 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/asks.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/asks.go @@ -5,9 +5,9 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/asks_test.go b/modules/mesh-build-image/cmd/mesh-build-image/asks_test.go index ebdece6a1..f4119a9a7 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/asks_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/asks_test.go @@ -8,7 +8,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/build_test.go b/modules/mesh-build-image/cmd/mesh-build-image/build_test.go index 7bbb850c4..682a81417 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/build_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/build_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/bus_integration_test.go b/modules/mesh-build-image/cmd/mesh-build-image/bus_integration_test.go index f5167f7c3..3be020be5 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/bus_integration_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/bus_integration_test.go @@ -16,7 +16,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "github.com/nats-io/nats-server/v2/server" "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" diff --git a/modules/mesh-build-image/cmd/mesh-build-image/capture_test.go b/modules/mesh-build-image/cmd/mesh-build-image/capture_test.go index ddbc1389f..5bb14a04c 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/capture_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/capture_test.go @@ -17,7 +17,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) const capturedDir = "testdata/captured" diff --git a/modules/mesh-build-image/cmd/mesh-build-image/copy.go b/modules/mesh-build-image/cmd/mesh-build-image/copy.go index f9e8038de..02f329476 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/copy.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/copy.go @@ -21,12 +21,12 @@ import ( "sync" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // CopyTool is the copy step's tool. diff --git a/modules/mesh-build-image/cmd/mesh-build-image/copy_test.go b/modules/mesh-build-image/cmd/mesh-build-image/copy_test.go index bd5624766..b7134ef90 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/copy_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/copy_test.go @@ -6,8 +6,8 @@ import ( "testing" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) func runCopy(t *testing.T, m *Module, states *keptStates, args map[string]any) (CopyResult, sdkstep.Step) { diff --git a/modules/mesh-build-image/cmd/mesh-build-image/fetch.go b/modules/mesh-build-image/cmd/mesh-build-image/fetch.go index 92ecb60c5..4f15a5ff3 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/fetch.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/fetch.go @@ -14,7 +14,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) var ( diff --git a/modules/mesh-build-image/cmd/mesh-build-image/fetch_test.go b/modules/mesh-build-image/cmd/mesh-build-image/fetch_test.go index 8625c88fa..4cf6011dd 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/fetch_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/fetch_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1703b: the fetch step asks git, through the SDK's FetchCommit, for the ssh remote of the forge as the account, makes diff --git a/modules/mesh-build-image/cmd/mesh-build-image/helpers_test.go b/modules/mesh-build-image/cmd/mesh-build-image/helpers_test.go index 4e01d5282..f450400fd 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/helpers_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/helpers_test.go @@ -15,8 +15,8 @@ import ( stdio "git.novox.be/novox/mesh-sdk/go" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/integration_test.go b/modules/mesh-build-image/cmd/mesh-build-image/integration_test.go index 7bc292767..f9c964280 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/integration_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/integration_test.go @@ -19,7 +19,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) func needTools(t *testing.T, what string, tools ...string) { diff --git a/modules/mesh-build-image/cmd/mesh-build-image/keptartifact.go b/modules/mesh-build-image/cmd/mesh-build-image/keptartifact.go index 27dd10a30..76b73217f 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/keptartifact.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/keptartifact.go @@ -8,8 +8,8 @@ package main // seat definition's (the node-engines alone), granted by the grants part (ADR 0666 §20): this module checks no caller. import ( - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/keys.go b/modules/mesh-build-image/cmd/mesh-build-image/keys.go index 5793fab67..dd4363db5 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/keys.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/keys.go @@ -14,7 +14,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/kit_test.go b/modules/mesh-build-image/cmd/mesh-build-image/kit_test.go index ec46c4f62..5e8b454ee 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/kit_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/kit_test.go @@ -4,14 +4,14 @@ import ( "context" "errors" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "strings" "testing" "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" ) // 1890/AC7: the module's own start sweep (endLeftRunning, as main runs it) keeps the conformance kit's left-running diff --git a/modules/mesh-build-image/cmd/mesh-build-image/main.go b/modules/mesh-build-image/cmd/mesh-build-image/main.go index 13224f1b2..0ea243aff 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/main.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/main.go @@ -14,9 +14,9 @@ import ( "strings" "time" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/module.go b/modules/mesh-build-image/cmd/mesh-build-image/module.go index 73558e4e1..809885958 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/module.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/module.go @@ -9,8 +9,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/module_test.go b/modules/mesh-build-image/cmd/mesh-build-image/module_test.go index 5ac356a5c..ed022b0d9 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/module_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/module_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/publish.go b/modules/mesh-build-image/cmd/mesh-build-image/publish.go index 7295fc11f..c06a99f2b 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/publish.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/publish.go @@ -16,8 +16,8 @@ import ( "path/filepath" "strings" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" diff --git a/modules/mesh-build-image/cmd/mesh-build-image/publish_test.go b/modules/mesh-build-image/cmd/mesh-build-image/publish_test.go index 554635c50..316493437 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/publish_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/publish_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - reg "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + reg "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // 1703d/AC (ADR 0487 §5): a candidate's build leaves the image seat unchanged: nothing is written, nothing is asked. diff --git a/modules/mesh-build-image/cmd/mesh-build-image/read.go b/modules/mesh-build-image/cmd/mesh-build-image/read.go index bea8a7ac5..d37522613 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/read.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/read.go @@ -14,7 +14,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/read_test.go b/modules/mesh-build-image/cmd/mesh-build-image/read_test.go index 773e9b9b1..9776771ce 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/read_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/read_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // The read tools answer what the steps state holds: a finished build's result is there, read by the step's id. diff --git a/modules/mesh-build-image/cmd/mesh-build-image/room_test.go b/modules/mesh-build-image/cmd/mesh-build-image/room_test.go index 216f0636f..6b85f41a9 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/room_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/room_test.go @@ -9,7 +9,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/runner.go b/modules/mesh-build-image/cmd/mesh-build-image/runner.go index d11857687..9aee3b3b5 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/runner.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/runner.go @@ -4,7 +4,7 @@ import ( "context" "os" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-image/cmd/mesh-build-image/steps.go b/modules/mesh-build-image/cmd/mesh-build-image/steps.go index e62ff9364..decde3219 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/steps.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/steps.go @@ -7,7 +7,7 @@ package main import ( "fmt" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-image/go.mod b/modules/mesh-build-image/go.mod index bdd7b9dea..8b67098cf 100644 --- a/modules/mesh-build-image/go.mod +++ b/modules/mesh-build-image/go.mod @@ -4,11 +4,11 @@ go 1.26.0 require ( git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildimage v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 @@ -35,13 +35,13 @@ replace git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys => ../ssh-cli require ( git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/asks.go b/modules/mesh-build-node/cmd/mesh-build-node/asks.go index da739e18a..9e71ae80e 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/asks.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/asks.go @@ -6,9 +6,9 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/asks_test.go b/modules/mesh-build-node/cmd/mesh-build-node/asks_test.go index 56546c5be..c6f2e26e8 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/asks_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/asks_test.go @@ -11,7 +11,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/build.go b/modules/mesh-build-node/cmd/mesh-build-node/build.go index 4147c76c5..ec3f18cac 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/build.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/build.go @@ -19,9 +19,9 @@ import ( "strings" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // Out is where a bundle's compiled files go in the module's directory (builder toolchain.go:118). diff --git a/modules/mesh-build-node/cmd/mesh-build-node/build_test.go b/modules/mesh-build-node/cmd/mesh-build-node/build_test.go index 469482168..4bcb8388f 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/build_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/build_test.go @@ -13,7 +13,7 @@ import ( "strings" "testing" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/check.go b/modules/mesh-build-node/cmd/mesh-build-node/check.go index 9d068230e..c1a6b4ed4 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/check.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/check.go @@ -22,7 +22,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/fetch.go b/modules/mesh-build-node/cmd/mesh-build-node/fetch.go index 962076296..ba5a85ca4 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/fetch.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/fetch.go @@ -26,8 +26,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/fetch_test.go b/modules/mesh-build-node/cmd/mesh-build-node/fetch_test.go index 572ba47e9..fc8251c1e 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/fetch_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/fetch_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/isolate.go b/modules/mesh-build-node/cmd/mesh-build-node/isolate.go index 86d012bff..308d634ad 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/isolate.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/isolate.go @@ -18,7 +18,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/keptartifact.go b/modules/mesh-build-node/cmd/mesh-build-node/keptartifact.go index 30dd76998..15b13fdc7 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/keptartifact.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/keptartifact.go @@ -8,8 +8,8 @@ package main // seat definition's (the node-engines alone), granted by the grants part (ADR 0666 §20): this module checks no caller. import ( - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/keys.go b/modules/mesh-build-node/cmd/mesh-build-node/keys.go index fa4aaa1a1..b7f4c7205 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/keys.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/keys.go @@ -14,7 +14,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/kit_test.go b/modules/mesh-build-node/cmd/mesh-build-node/kit_test.go index fa8c34508..d44fe9aaf 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/kit_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/kit_test.go @@ -8,8 +8,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/main.go b/modules/mesh-build-node/cmd/mesh-build-node/main.go index ad83cc12f..b1a3696b2 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/main.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/main.go @@ -15,9 +15,9 @@ import ( "strings" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/sdk/forgekey" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/module.go b/modules/mesh-build-node/cmd/mesh-build-node/module.go index f87c17b98..6277ba0e5 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/module.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/module.go @@ -11,8 +11,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - buildrun "git.novox.be/novox/mesh-delivery/sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/module_test.go b/modules/mesh-build-node/cmd/mesh-build-node/module_test.go index c4c0e93f0..c733a82ec 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/module_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/module_test.go @@ -11,7 +11,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/push_test.go b/modules/mesh-build-node/cmd/mesh-build-node/push_test.go index 4e526e139..72bd9b6eb 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/push_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/push_test.go @@ -13,11 +13,11 @@ import ( "sync" "testing" - registry "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" + registry "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // pushed are the blobs the fake holder took, by digest, for the tests that read an archive back. diff --git a/modules/mesh-build-node/cmd/mesh-build-node/read.go b/modules/mesh-build-node/cmd/mesh-build-node/read.go index 102b28082..ec7b2d2a8 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/read.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/read.go @@ -14,7 +14,7 @@ import ( "sync" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/read_test.go b/modules/mesh-build-node/cmd/mesh-build-node/read_test.go index 194d94d5e..70be8af51 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/read_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/read_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" ) // fakeState is a state as stored: key to raw value. diff --git a/modules/mesh-build-node/cmd/mesh-build-node/room_test.go b/modules/mesh-build-node/cmd/mesh-build-node/room_test.go index ae0266872..02d131c63 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/room_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/room_test.go @@ -9,7 +9,7 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/forgekey" "git.novox.be/novox/mesh-sdk/go/health" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/steps.go b/modules/mesh-build-node/cmd/mesh-build-node/steps.go index 0f109953f..b0c805bed 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/steps.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/steps.go @@ -16,8 +16,8 @@ import ( "time" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/forgekey" ) diff --git a/modules/mesh-build-node/cmd/mesh-build-node/store_integration_test.go b/modules/mesh-build-node/cmd/mesh-build-node/store_integration_test.go index 7776637c6..4cd5b9628 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/store_integration_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/store_integration_test.go @@ -21,9 +21,9 @@ import ( _ "github.com/distribution/distribution/v3/registry/storage/driver/inmemory" "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - artifactref "git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient/reference" - registry "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry" builds "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds" + artifactref "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient/reference" + registry "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry" ) // realStore starts the artifact store's own program (the distribution registry, modules/distribution) inside this diff --git a/modules/mesh-build-node/cmd/mesh-build-node/toolchain_test.go b/modules/mesh-build-node/cmd/mesh-build-node/toolchain_test.go index 0c1a02038..a412e52e0 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/toolchain_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/toolchain_test.go @@ -3,7 +3,7 @@ package main import ( "context" "errors" - sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "os" "path/filepath" "strings" diff --git a/modules/mesh-build-node/go.mod b/modules/mesh-build-node/go.mod index af385b3dd..446ece46e 100644 --- a/modules/mesh-build-node/go.mod +++ b/modules/mesh-build-node/go.mod @@ -4,11 +4,11 @@ go 1.26.0 require ( git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildnode v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/distribution/distribution/v3 v3.1.2 github.com/nats-io/nats.go v1.54.0 @@ -95,13 +95,13 @@ replace git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys => ../ssh-cli require ( git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/mesh-conditions/cmd/mesh-conditions/branches.go b/modules/mesh-conditions/cmd/mesh-conditions/branches.go index f65d63ec8..efeb307d5 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/branches.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/branches.go @@ -10,8 +10,8 @@ import ( "sync" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-sdk/go/keys" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-conditions/cmd/mesh-conditions/branches_test.go b/modules/mesh-conditions/cmd/mesh-conditions/branches_test.go index f7bbd1d8f..6a568e018 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/branches_test.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/branches_test.go @@ -4,7 +4,7 @@ import ( "slices" "testing" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // Design 47 G §532: the keeper adopts a branch a registration adds while it runs, and drops one no registration names. diff --git a/modules/mesh-conditions/cmd/mesh-conditions/catalog.go b/modules/mesh-conditions/cmd/mesh-conditions/catalog.go index e8b6b2fcd..b88981380 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/catalog.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/catalog.go @@ -15,8 +15,8 @@ import ( "time" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - wants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + wants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" stdio "git.novox.be/novox/mesh-sdk/go" engine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" diff --git a/modules/mesh-conditions/cmd/mesh-conditions/hold.go b/modules/mesh-conditions/cmd/mesh-conditions/hold.go index 22b026b8b..cbf90c8e5 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/hold.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/hold.go @@ -18,7 +18,7 @@ import ( "strings" "time" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/motion" diff --git a/modules/mesh-conditions/cmd/mesh-conditions/hold_test.go b/modules/mesh-conditions/cmd/mesh-conditions/hold_test.go index b9e7a82c4..6850411c6 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/hold_test.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/hold_test.go @@ -13,7 +13,7 @@ import ( mesh "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" nodeengine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" cc "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" "git.novox.be/novox/mesh-sdk/go/motion" ) diff --git a/modules/mesh-conditions/cmd/mesh-conditions/keeper.go b/modules/mesh-conditions/cmd/mesh-conditions/keeper.go index 179e30b70..a5f80a719 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/keeper.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/keeper.go @@ -26,7 +26,7 @@ import ( cc "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" meshhealers "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhealers" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // The modules whose states the keeper reads by name: the holders of the health seats (their seats' names are the diff --git a/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go b/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go index 2c69ba789..cc872b464 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go @@ -5,8 +5,8 @@ import ( "encoding/json" "fmt" nodeengine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" "slices" "sort" "strings" diff --git a/modules/mesh-conditions/cmd/mesh-conditions/main.go b/modules/mesh-conditions/cmd/mesh-conditions/main.go index 859732bdc..d18b8535f 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/main.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/main.go @@ -19,10 +19,10 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshwantsclient" - catseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshwantsclient" + catseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-conditions/go.mod b/modules/mesh-conditions/go.mod index 2fc0911c5..717e56e1e 100644 --- a/modules/mesh-conditions/go.mod +++ b/modules/mesh-conditions/go.mod @@ -13,10 +13,10 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhealers v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshwatchdogs v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshwantsclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshwantsclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-config/cmd/mesh-config/catalogfeed.go b/modules/mesh-config/cmd/mesh-config/catalogfeed.go index 86b2619ce..f544c247d 100644 --- a/modules/mesh-config/cmd/mesh-config/catalogfeed.go +++ b/modules/mesh-config/cmd/mesh-config/catalogfeed.go @@ -8,8 +8,8 @@ package main import ( "context" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // CatalogHalf is what the holder reads of the catalog half. diff --git a/modules/mesh-config/cmd/mesh-config/catalogfeed_test.go b/modules/mesh-config/cmd/mesh-config/catalogfeed_test.go index 6597f6693..6c1edee7e 100644 --- a/modules/mesh-config/cmd/mesh-config/catalogfeed_test.go +++ b/modules/mesh-config/cmd/mesh-config/catalogfeed_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - delivery "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + delivery "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-config/cmd/mesh-config/config_test.go b/modules/mesh-config/cmd/mesh-config/config_test.go index cc28d31ed..ad29c9d56 100644 --- a/modules/mesh-config/cmd/mesh-config/config_test.go +++ b/modules/mesh-config/cmd/mesh-config/config_test.go @@ -13,8 +13,8 @@ import ( assignerclient "git.novox.be/novox/mesh-contracts/go/clients/meshmoduleassignerclient" meshseat "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // memStore is the bus as mesh-config reaches it, in memory: its states and the mirrors it reads, its history log, diff --git a/modules/mesh-config/cmd/mesh-config/main.go b/modules/mesh-config/cmd/mesh-config/main.go index b3848f0ca..9d7e424bc 100644 --- a/modules/mesh-config/cmd/mesh-config/main.go +++ b/modules/mesh-config/cmd/mesh-config/main.go @@ -21,7 +21,7 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" meshconditions "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" oc "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-config/cmd/mesh-config/manifest_test.go b/modules/mesh-config/cmd/mesh-config/manifest_test.go index 0780921c0..e561cba26 100644 --- a/modules/mesh-config/cmd/mesh-config/manifest_test.go +++ b/modules/mesh-config/cmd/mesh-config/manifest_test.go @@ -2,7 +2,7 @@ package main import ( "encoding/json" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" "os" "path/filepath" "slices" diff --git a/modules/mesh-config/cmd/mesh-config/ownerviews.go b/modules/mesh-config/cmd/mesh-config/ownerviews.go index 8c201b241..a677a0e8c 100644 --- a/modules/mesh-config/cmd/mesh-config/ownerviews.go +++ b/modules/mesh-config/cmd/mesh-config/ownerviews.go @@ -19,7 +19,7 @@ import ( "sort" "strings" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/mesh-config/cmd/mesh-config/readers.go b/modules/mesh-config/cmd/mesh-config/readers.go index e5510a65f..b344de43b 100644 --- a/modules/mesh-config/cmd/mesh-config/readers.go +++ b/modules/mesh-config/cmd/mesh-config/readers.go @@ -3,7 +3,7 @@ package main import ( "fmt" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" ) // The holders whose states this module reads, one constant each (a reader names its holder once; ADR 0634 §4). diff --git a/modules/mesh-config/cmd/mesh-config/sources.go b/modules/mesh-config/cmd/mesh-config/sources.go index 32769638e..6a05643c7 100644 --- a/modules/mesh-config/cmd/mesh-config/sources.go +++ b/modules/mesh-config/cmd/mesh-config/sources.go @@ -9,8 +9,8 @@ import ( "strings" assignerclient "git.novox.be/novox/mesh-contracts/go/clients/meshmoduleassignerclient" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // Reading the sources, writing the resolved values, and publishing the list of predefined keys. diff --git a/modules/mesh-config/cmd/mesh-config/takeover.go b/modules/mesh-config/cmd/mesh-config/takeover.go index 0c30f80fe..cc22ce6d4 100644 --- a/modules/mesh-config/cmd/mesh-config/takeover.go +++ b/modules/mesh-config/cmd/mesh-config/takeover.go @@ -15,7 +15,7 @@ import ( "fmt" "time" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // The states and reads. diff --git a/modules/mesh-config/cmd/mesh-config/takeover_test.go b/modules/mesh-config/cmd/mesh-config/takeover_test.go index 5b934337b..4f5d6bd62 100644 --- a/modules/mesh-config/cmd/mesh-config/takeover_test.go +++ b/modules/mesh-config/cmd/mesh-config/takeover_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // The trunk's manifests aMesh declares. diff --git a/modules/mesh-config/cmd/mesh-config/whole_integration_test.go b/modules/mesh-config/cmd/mesh-config/whole_integration_test.go index a40159190..9cc30a578 100644 --- a/modules/mesh-config/cmd/mesh-config/whole_integration_test.go +++ b/modules/mesh-config/cmd/mesh-config/whole_integration_test.go @@ -33,9 +33,9 @@ import ( engineclient "git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient" meshseat "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" nodeengine "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - delivery "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + delivery "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" diff --git a/modules/mesh-config/go.mod b/modules/mesh-config/go.mod index 88d76d8eb..7c48b3524 100644 --- a/modules/mesh-config/go.mod +++ b/modules/mesh-config/go.mod @@ -13,9 +13,9 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) @@ -36,10 +36,10 @@ require ( require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 // indirect ) -require git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/catalogue_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/catalogue_test.go index 917e77ac8..d3e93cdf5 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/catalogue_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/catalogue_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // **The gate is the only claimant of the seat `mesh-delivery` in the catalogue** (novox/hq ADR 0437 §1, ADR 0449 §4, ADR 0454, diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings.go index da2826bbc..a38acdc97 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings.go @@ -7,7 +7,7 @@ import ( "strconv" "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - gitseat "git.novox.be/novox/mesh-delivery/contracts/go/seats/git" + gitseat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/git" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/keys" "git.novox.be/novox/mesh-sdk/go/views" diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings_test.go index 959b0f9b0..20a6418a0 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/findings_test.go @@ -9,7 +9,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/merges.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/merges.go index cf42260d3..dd42ac7e2 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/merges.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/merges.go @@ -6,8 +6,8 @@ import ( "fmt" "sort" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/keys" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owed.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owed.go index 0cb858385..938dd0466 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owed.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owed.go @@ -6,8 +6,8 @@ import ( "strconv" "time" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/keys" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts.go index ed86d74b1..e27918d7d 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts.go @@ -7,7 +7,7 @@ import ( "strconv" "strings" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // What the gate owes the forge for a change of a delivery record (design 47 G A-39, A-35, §158, §161 to §167): every change of diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts_test.go index a4699ff1f..7e8a04cb5 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedacts_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) type sayerFake struct{ said []seat.Owed } diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedended.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedended.go index 38c934f6b..009902462 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedended.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/owedended.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-forge-bridge/forgemsg" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record.go index 41347b64b..c68d2b82c 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record.go @@ -21,7 +21,7 @@ import ( "sync" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/buscalls" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record_test.go index ad3d32934..283f035ca 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/record_test.go @@ -13,7 +13,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/buscalls" "git.novox.be/novox/mesh-sdk/go/catalogue" diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordevents.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordevents.go index 0551093e7..58488069a 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordevents.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordevents.go @@ -13,7 +13,7 @@ import ( "strings" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // The halves of the revision view a record pins (design 47 *Two graphs, one source of truth*). diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordfill.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordfill.go index 204f35740..00a9bd0b1 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordfill.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recordfill.go @@ -14,7 +14,7 @@ import ( "fmt" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/buscalls" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recovery.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recovery.go index 2c7764c25..3cc8944a5 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recovery.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/recovery.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // Recovery names a merge a recovery (design 47 G §81, A-23): the delivery record that holds the commit is marked through its diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/switch.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/switch.go index ad1fc0a42..a152ccedf 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/switch.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/switch.go @@ -13,8 +13,8 @@ import ( "sort" "strings" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/keys" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin.go index e72e45a44..0a15263af 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin.go @@ -6,9 +6,9 @@ import ( "sort" "strconv" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" - meshcatalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" + meshcatalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/keys" ) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin_bus_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin_bus_test.go index 528e42ea9..a34bf2ef8 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin_bus_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/takenin_bus_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" ) // The gate whole, over a real bus (design 47 G A-33, A-34): a take-in.taken the indexer says opens a delivery record in the diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values.go index 7b3b2247d..b3883cfc8 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values.go @@ -4,8 +4,8 @@ import ( "encoding/json" "reflect" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // The holders the gate reads or hears, by the names their modules go by (the gate's own constants, one per reader: the diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values_test.go index 3187afaf9..d1b22ce26 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values_test.go @@ -5,7 +5,7 @@ import ( "reflect" "testing" - mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" + mdc "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient" ) // What go/delivery wrote into the seat's states, key order and all, must decode as it did and encode to the same diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/verbs.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/verbs.go index a5d6b0051..0878b79ed 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/verbs.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/verbs.go @@ -6,7 +6,7 @@ import ( "strings" "time" - seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + seat "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" ) // The seat's verbs that read (novox/hq ADR 0239; design 47 G §431, §172, A-24): from G's delivery the gate keeps no merge diff --git a/modules/mesh-delivery-gate/go.mod b/modules/mesh-delivery-gate/go.mod index e0e0f73d1..3bf41633a 100644 --- a/modules/mesh-delivery-gate/go.mod +++ b/modules/mesh-delivery-gate/go.mod @@ -7,14 +7,14 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/git v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliverycheckerclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshdeliveryclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/git v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-forge-bridge/forgemsg v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-indexer/takein v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-delivery-view/viewstate v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 @@ -39,12 +39,12 @@ require ( git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-contracts/go/seats/nodeengine v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdeliverychecker v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-delivery/modules/mesh-delivery-assigner/asks v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 // indirect ) diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfake_test.go b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfake_test.go index f4bf1b0ec..2a7148696 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfake_test.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfake_test.go @@ -5,8 +5,8 @@ import ( "encoding/json" "sync" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // fakeCatalog is the catalog half as the tests give it: each module's trunk entry, and the entries a fingerprint names. diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed.go b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed.go index 513ed0be2..b4bc2e8a3 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed.go @@ -8,8 +8,8 @@ package main import ( "context" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // CatalogHalf is what the holder reads of the catalog half. diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed_test.go b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed_test.go index 6597f6693..6c1edee7e 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed_test.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/catalogfeed_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - delivery "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + delivery "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/composed_test.go b/modules/mesh-provisioner/cmd/mesh-provisioner/composed_test.go index 2f6179c43..1678b1f2b 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/composed_test.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/composed_test.go @@ -21,7 +21,7 @@ import ( assignerclient "git.novox.be/novox/mesh-contracts/go/clients/meshmoduleassignerclient" engineclient "git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient" meshseat "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" - "git.novox.be/novox/mesh-delivery/sdk/catalogkey" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/catalogkey" "git.novox.be/novox/mesh-sdk/go/catalogue" ) diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/holder.go b/modules/mesh-provisioner/cmd/mesh-provisioner/holder.go index 1bfd1e3c8..a9f3d1d6f 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/holder.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/holder.go @@ -40,8 +40,8 @@ import ( assignerclient "git.novox.be/novox/mesh-contracts/go/clients/meshmoduleassignerclient" engineclient "git.novox.be/novox/mesh-contracts/go/clients/nodeengineclient" meshseat "git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - "git.novox.be/novox/mesh-delivery/sdk/catalogkey" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/catalogkey" occ "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient" oc "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel" diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/main.go b/modules/mesh-provisioner/cmd/mesh-provisioner/main.go index 517ce4126..6a53f4d3b 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/main.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/main.go @@ -16,7 +16,7 @@ import ( "sync/atomic" "time" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" seat "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" oc "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel" diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/provisioner_test.go b/modules/mesh-provisioner/cmd/mesh-provisioner/provisioner_test.go index 71328c5a8..d96b251f6 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/provisioner_test.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/provisioner_test.go @@ -3,7 +3,7 @@ package main import ( "encoding/json" "fmt" - catalogclient "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + catalogclient "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" "os" "regexp" "slices" diff --git a/modules/mesh-provisioner/cmd/mesh-provisioner/readers.go b/modules/mesh-provisioner/cmd/mesh-provisioner/readers.go index 166ef2135..4278e9b00 100644 --- a/modules/mesh-provisioner/cmd/mesh-provisioner/readers.go +++ b/modules/mesh-provisioner/cmd/mesh-provisioner/readers.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - meshwants "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants" + meshwants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" ) // The holders whose states this module reads, one constant each (a reader names its holder once; ADR 0634 §4). diff --git a/modules/mesh-provisioner/go.mod b/modules/mesh-provisioner/go.mod index 08c2906d9..5b1dfed6a 100644 --- a/modules/mesh-provisioner/go.mod +++ b/modules/mesh-provisioner/go.mod @@ -10,9 +10,9 @@ require ( git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/provisioning/go/clients/meshprovisionerclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) @@ -35,10 +35,10 @@ require ( git.novox.be/novox/mesh-contracts/go/seats/nodeengine v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshhandacts v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 ) -require git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-recovery/cmd/mesh-recovery/seats.go b/modules/mesh-recovery/cmd/mesh-recovery/seats.go index 688c596fb..207054251 100644 --- a/modules/mesh-recovery/cmd/mesh-recovery/seats.go +++ b/modules/mesh-recovery/cmd/mesh-recovery/seats.go @@ -14,7 +14,7 @@ import ( "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" - "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-sdk/go/buscompose" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/keys" diff --git a/modules/mesh-recovery/go.mod b/modules/mesh-recovery/go.mod index 87e7e287a..b6223cce6 100644 --- a/modules/mesh-recovery/go.mod +++ b/modules/mesh-recovery/go.mod @@ -8,7 +8,7 @@ require ( git.novox.be/novox/mesh-contracts/go/seats/nodeengine v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed.go b/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed.go index 719845716..fb0afe427 100644 --- a/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed.go +++ b/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed.go @@ -5,8 +5,8 @@ package main // catalog graph entry carries whole (§443), never the indexer's state `modules` or `manifests`. import ( - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) // CatalogHalf is every module's entry in the catalog half, as the self-check holds it. diff --git a/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed_test.go b/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed_test.go index d045883d8..59c9d0f58 100644 --- a/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed_test.go +++ b/modules/mesh-self-check/cmd/mesh-self-check/catalogfeed_test.go @@ -9,9 +9,9 @@ import ( "testing" "time" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" - delivery "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" + delivery "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-self-check/cmd/mesh-self-check/main.go b/modules/mesh-self-check/cmd/mesh-self-check/main.go index fb0ba73f1..a0c8c8d70 100644 --- a/modules/mesh-self-check/cmd/mesh-self-check/main.go +++ b/modules/mesh-self-check/cmd/mesh-self-check/main.go @@ -18,7 +18,7 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient" meshconditions "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" - "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-self-check/cmd/mesh-self-check/probes_test.go b/modules/mesh-self-check/cmd/mesh-self-check/probes_test.go index 8fd8d6906..7a369328d 100644 --- a/modules/mesh-self-check/cmd/mesh-self-check/probes_test.go +++ b/modules/mesh-self-check/cmd/mesh-self-check/probes_test.go @@ -15,7 +15,7 @@ import ( nodeseat "git.novox.be/novox/mesh-contracts/go/seats/nodeengine" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" watchdogsclient "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshwatchdogsclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-catalog/modules/disk-load/diskreadings" "git.novox.be/novox/mesh-catalog/modules/restic/backupgood" diff --git a/modules/mesh-self-check/cmd/mesh-self-check/selfcheck_test.go b/modules/mesh-self-check/cmd/mesh-self-check/selfcheck_test.go index 4f53afb12..3bebddc7b 100644 --- a/modules/mesh-self-check/cmd/mesh-self-check/selfcheck_test.go +++ b/modules/mesh-self-check/cmd/mesh-self-check/selfcheck_test.go @@ -13,7 +13,7 @@ import ( "time" "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/views" ) diff --git a/modules/mesh-self-check/go.mod b/modules/mesh-self-check/go.mod index 24d877108..52accdc37 100644 --- a/modules/mesh-self-check/go.mod +++ b/modules/mesh-self-check/go.mod @@ -10,8 +10,8 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshhandactsclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshwatchdogsclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats.go v1.54.0 ) @@ -47,4 +47,4 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshwatchdogs v0.0.0-00010101000000-000000000000 // indirect ) -require git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshdelivery v0.0.0-00010101000000-000000000000 diff --git a/modules/mesh-vault/go.mod b/modules/mesh-vault/go.mod index b9bd08189..b51608fd8 100644 --- a/modules/mesh-vault/go.mod +++ b/modules/mesh-vault/go.mod @@ -11,14 +11,14 @@ require ( git.novox.be/novox/mesh-contracts/identity-and-access/go/clients/meshvaultclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/identity-and-access/go/seats/meshvault v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/provisioning/go/clients/meshprovisionerclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-delivery/modules/mesh-grants/grantsstate v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 // indirect + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 // indirect git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 diff --git a/modules/nats/cmd/nats-tools/catalogview.go b/modules/nats/cmd/nats-tools/catalogview.go index ee8fb77fe..fb3947d89 100644 --- a/modules/nats/cmd/nats-tools/catalogview.go +++ b/modules/nats/cmd/nats-tools/catalogview.go @@ -6,7 +6,7 @@ import ( "encoding/json" "fmt" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "git.novox.be/novox/mesh-sdk/go/catalogue" "nats-tools/internal/keeper" diff --git a/modules/nats/cmd/nats-tools/catalogview_test.go b/modules/nats/cmd/nats-tools/catalogview_test.go index b49659993..bffa977c4 100644 --- a/modules/nats/cmd/nats-tools/catalogview_test.go +++ b/modules/nats/cmd/nats-tools/catalogview_test.go @@ -3,7 +3,7 @@ package main import ( "testing" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" ) func TestAsksOf(t *testing.T) { diff --git a/modules/nats/cmd/nats-tools/keep.go b/modules/nats/cmd/nats-tools/keep.go index 2547bf5b1..a26447540 100644 --- a/modules/nats/cmd/nats-tools/keep.go +++ b/modules/nats/cmd/nats-tools/keep.go @@ -22,7 +22,7 @@ import ( "git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions" occ "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient" oc "git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel" - catalog "git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog" + catalog "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" stdio "git.novox.be/novox/mesh-sdk/go" "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/process" diff --git a/modules/nats/go.mod b/modules/nats/go.mod index 2bc42e0f8..6ec5811b7 100644 --- a/modules/nats/go.mod +++ b/modules/nats/go.mod @@ -8,7 +8,7 @@ require ( git.novox.be/novox/mesh-contracts/health-and-repair/go/seats/meshconditions v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/clients/operatorchannelclient v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-contracts/operator-and-conversation/go/seats/operatorchannel v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-delivery/modules/mesh-grants/busgrants v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 github.com/klauspost/compress v1.20.1 diff --git a/modules/ssh-client/go.mod b/modules/ssh-client/go.mod index 96ec4d953..8c1d11ad4 100644 --- a/modules/ssh-client/go.mod +++ b/modules/ssh-client/go.mod @@ -25,4 +25,4 @@ require git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys v0.0.0-000101 replace git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys => ./sshkeys -require git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 // indirect +require git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 // indirect diff --git a/modules/ssh-client/sshkeys/go.mod b/modules/ssh-client/sshkeys/go.mod index 61d3f0cdd..3fa234579 100644 --- a/modules/ssh-client/sshkeys/go.mod +++ b/modules/ssh-client/sshkeys/go.mod @@ -3,6 +3,6 @@ module git.novox.be/novox/mesh-catalog/modules/ssh-client/sshkeys go 1.26.0 require ( - git.novox.be/novox/mesh-delivery/sdk v0.0.0-00010101000000-000000000000 + git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 ) diff --git a/modules/ssh-client/sshkeys/keeper.go b/modules/ssh-client/sshkeys/keeper.go index 21194a78b..f77bcda55 100644 --- a/modules/ssh-client/sshkeys/keeper.go +++ b/modules/ssh-client/sshkeys/keeper.go @@ -18,7 +18,7 @@ import ( "strings" "time" - "git.novox.be/novox/mesh-delivery/sdk/forgekey" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" sdk "git.novox.be/novox/mesh-sdk/go/forgekey" ) From f339ea5936d667b1b7d37e4947fe040d09ff0d7d Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 05:14:21 +0100 Subject: [PATCH 04/12] BG5, BN5, BG6, BN6 (toolchain part): toolchain-reported on the seat's subject, with the toolchain program's digest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The guard's toolchains value carries the sha256 of the go or node program found on the path (read again when the version changes); toolchain-reported is said on the build seat's subject of the node at start and on each change of version, recipe or digest; a build's ToolchainUsed names the digest. The legacy toolchain.reported emit and its stream go: nobody consumes them. Builds: design 47 G §492, §472, §466 (lead answer A-152) Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../mesh-build-go/cmd/mesh-build-go/asks.go | 2 +- .../cmd/mesh-build-go/emit_test.go | 54 +++++++---- .../mesh-build-go/cmd/mesh-build-go/main.go | 2 +- .../mesh-build-go/cmd/mesh-build-go/module.go | 61 ++++++++---- .../cmd/mesh-build-go/toolchainreport.go | 94 +++++++++++++++++++ modules/mesh-build-go/module.json | 8 -- .../cmd/mesh-build-node/asks.go | 2 +- .../cmd/mesh-build-node/emit_test.go | 54 +++++++---- .../cmd/mesh-build-node/main.go | 2 +- .../cmd/mesh-build-node/module.go | 57 +++++++---- .../cmd/mesh-build-node/toolchainreport.go | 94 +++++++++++++++++++ modules/mesh-build-node/module.json | 8 -- 12 files changed, 348 insertions(+), 90 deletions(-) create mode 100644 modules/mesh-build-go/cmd/mesh-build-go/toolchainreport.go create mode 100644 modules/mesh-build-node/cmd/mesh-build-node/toolchainreport.go diff --git a/modules/mesh-build-go/cmd/mesh-build-go/asks.go b/modules/mesh-build-go/cmd/mesh-build-go/asks.go index b49bd7d1b..30d9e74a2 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/asks.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/asks.go @@ -40,7 +40,7 @@ func (m *Module) askSteps(steps []StepTool) buildstep.AskSteps { if err != nil { return sdkstep.ToolchainUsed{}, err } - return sdkstep.ToolchainUsed{Version: installed, Recipe: m.Recipe.Version()}, nil + return sdkstep.ToolchainUsed{Version: installed, Recipe: m.Recipe.Version(), Digest: m.programDigest(installed)}, nil }, // The kept results reach a test step in its ask (design 47 *Carried, not run*, line 593 at b229f5c4; issue 1966 // K1): this module reads no other part's kept state. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/emit_test.go b/modules/mesh-build-go/cmd/mesh-build-go/emit_test.go index 46112afd6..fe43817da 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/emit_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/emit_test.go @@ -5,51 +5,69 @@ import ( "encoding/json" "os" "path/filepath" - "slices" "testing" ) -// Issues 1483 and 1488 (for the indexer, issue 1444): the guard emits toolchain.reported after each write of the -// toolchains key, with the node and the language. -func TestTheGuardEmitsToolchainReportedAfterEachWrite(t *testing.T) { - m := moduleWith(newStates(), "go1.27.1") +// Design 47 G §492, §472, §466 (BG5, BG6): the guard says toolchain-reported on the Go build seat's subject of its node, +// with the version, the recipe and the digest of the go program, at the first write and again only when one of them +// changed; the toolchains key and a build's toolchain carry the digest. +func TestTheGuardSaysToolchainReportedOnAChangeWithTheProgramDigest(t *testing.T) { + states := newStates() + m := moduleWith(states, "go1.27.1") + prog := filepath.Join(t.TempDir(), "go") + os.WriteFile(prog, []byte("go program"), 0o755) + m.ToolchainProgram = func() (string, error) { return prog, nil } type event struct { - typ string - body map[string]string + subject string + body map[string]string + id string } var got []event - m.Emit = func(typ string, body any) error { + m.SayToolchain = func(subject string, body any, id string) error { raw, _ := json.Marshal(body) var b map[string]string json.Unmarshal(raw, &b) - got = append(got, event{typ, b}) + got = append(got, event{subject, b, id}) return nil } if err := m.Check(context.Background()); err != nil { t.Fatal(err) } - if len(got) != 1 || got[0].typ != "toolchain.reported" || got[0].body["node"] != "ace" || got[0].body["language"] != "go" || len(got[0].body) != 2 { - t.Errorf("events = %+v, want one toolchain.reported for ace, go", got) + if len(got) != 1 || got[0].subject != "mesh.seat.node-build-go.event.toolchain-reported.ace" || got[0].body["node"] != "ace" || got[0].body["language"] != "go" || + got[0].body["version"] != "go1.27.1" || got[0].body["recipe"] != m.Recipe.Version() || len(got[0].body["digest"]) != len("sha256:")+64 { + t.Fatalf("events = %+v, want one toolchain-reported for ace, go with the program's digest", got) + } + if tc, _ := states.toolchain("ace.go"); tc.Digest != got[0].body["digest"] { + t.Errorf("the toolchains key's digest is %q, the event's %q", tc.Digest, got[0].body["digest"]) } m.Check(context.Background()) - if len(got) != 2 { - t.Errorf("a second guard pass emitted %d events in all, want 2", len(got)) + if len(got) != 1 { + t.Errorf("a second pass that changed nothing said %d events in all, want 1", len(got)) + } + // A build's toolchain names the same digest (§466). + if used, err := m.askSteps(nil).Toolchain(context.Background()); err != nil || used.Digest != got[0].body["digest"] || used.Version != "go1.27.1" { + t.Errorf("a build's toolchain = %+v (%v), want the digest %s", used, err, got[0].body["digest"]) + } + os.WriteFile(prog, []byte("another go program"), 0o755) + m.Probe = func(context.Context) (string, error) { return "go1.27.2", nil } + m.Check(context.Background()) + if len(got) != 2 || got[1].body["version"] != "go1.27.2" || got[1].body["digest"] == got[0].body["digest"] { + t.Errorf("a new version said %+v, want a second event with another digest", got) } } -// The event is carried by the module's stream, not named in emits (ADR 0363: one place); the validator checks that. -func TestTheManifestDeclaresTheToolchainsStream(t *testing.T) { +// The seat's events are its definition's: the module declares no stream of its own for the toolchain (§492). +func TestTheManifestDeclaresNoToolchainStream(t *testing.T) { raw, err := os.ReadFile(filepath.Join("..", "..", "module.json")) if err != nil { t.Fatal(err) } var m struct { Streams []struct { - Name string `json:"name"` - Events []string `json:"events"` + Name string `json:"name"` } `json:"streams"` } - if err := json.Unmarshal(raw, &m); err != nil || len(m.Streams) < 1 || m.Streams[0].Name != "toolchains-go" || !slices.Equal(m.Streams[0].Events, []string{"toolchain.**"}) { + if err := json.Unmarshal(raw, &m); err != nil || len(m.Streams) != 0 { t.Errorf("streams = %+v (%v)", m.Streams, err) } } diff --git a/modules/mesh-build-go/cmd/mesh-build-go/main.go b/modules/mesh-build-go/cmd/mesh-build-go/main.go index fa75df4c1..f5727ac0e 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/main.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/main.go @@ -40,7 +40,7 @@ func main() { Node: strings.TrimSpace(os.Getenv("MESH_NODE")), Recipe: Current(), Toolchains: stdio.State(seat.StateToolchains).Put, - Emit: func(t string, b any) error { return stdio.Emit(t, b) }, + SayToolchain: stdio.SeatPublish, Steps: stdio.State(seat.StateSteps).Put, Detected: stdio.State(seat.StateDetectedSteps).Put, ReadDetected: readOf(stdio.State(seat.StateDetectedSteps)).Get, diff --git a/modules/mesh-build-go/cmd/mesh-build-go/module.go b/modules/mesh-build-go/cmd/mesh-build-go/module.go index e6e00fd9a..a300f93be 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/module.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/module.go @@ -6,6 +6,7 @@ import ( "fmt" stdio "git.novox.be/novox/mesh-sdk/go" "net/http" + "os/exec" "sync" "time" @@ -48,9 +49,6 @@ type Module struct { ForgetPause func(key string) error // WatchPauses follows the drops other holders write in the shared pauses state (stdio.State(...).Watch). WatchPauses func(key string, handle func(stdio.StateChange) error) error - // Emit tells the bus an event (stdio.Emit); nil emits nothing. The guard emits toolchain.reported after each write of - // the toolchains key, so the indexer, which holds no timer, learns that the bucket exists (issue 1444). - Emit func(eventType string, body any) error // Ctx is the process's context, which a step runs under (the tool call's is cut at 30 s, the step's is not). Ctx context.Context Say func(format string, a ...any) @@ -123,8 +121,17 @@ type Module struct { KeptBuilds KeptObjects Self string - spacesOnce sync.Once - workspaces *buildstep.Workspaces + // SayToolchain says an event on a seat's subject (stdio.SeatPublish; nil says none, a test's); ToolchainProgram finds the go + // program whose digest the toolchain's is (exec.LookPath when nil). + SayToolchain func(subject string, body any, id string) error + ToolchainProgram func() (string, error) + + reporterOnce sync.Once + reporter *toolchainReporter + digestMu sync.Mutex + digestFor, progDigest string + spacesOnce sync.Once + workspaces *buildstep.Workspaces } // guard is the SDK guard for the version the probe just read: the module names no Go version (ADR 0477 §2), so the @@ -243,20 +250,38 @@ func (m *Module) Status(ctx context.Context) map[string]any { return out } -// ToolchainReported is the event the guard emits after it writes the toolchains key. -const ToolchainReported = "toolchain.reported" - -// reportingPut is the toolchains Put that then emits toolchain.reported with the node and the language. A write that -// failed emits nothing; an emit that failed is said and does not refuse the step. +// reportingPut is the toolchains Put that then says toolchain-reported on the Go build seat's subject of this node when +// the toolchain changed (design 47 G §492): at the module's start and on each change of the key. A write that failed +// says nothing; an event that failed is said and does not refuse the step. func (m *Module) reportingPut() buildstep.Put { - return func(key string, value any) (uint64, error) { - rev, err := m.Toolchains(key, value) - if err != nil || m.Emit == nil { - return rev, err + m.reporterOnce.Do(func() { + m.reporter = &toolchainReporter{AskLanguage: sdkstep.AskGo, Node: m.Node, Publish: m.SayToolchain} + }) + return putReporting(m.Toolchains, m.reporter, m.programDigest, m.Say) +} + +// programDigest is the digest of the Go program this node's go-toolchain provides, the `go` found on the path: read again +// only when the installed version changed (design 47 G §472; the lead's answer A-152). +func (m *Module) programDigest(version string) string { + m.digestMu.Lock() + defer m.digestMu.Unlock() + if m.digestFor == version && m.progDigest != "" { + return m.progDigest + } + find := m.ToolchainProgram + if find == nil { + find = func() (string, error) { return exec.LookPath("go") } + } + path, err := find() + if err == nil { + var d string + if d, err = programFileDigest(path); err == nil { + m.digestFor, m.progDigest = version, d + return d } - if eerr := m.Emit(ToolchainReported, map[string]string{"node": m.Node, "language": "go"}); eerr != nil && m.Say != nil { - m.Say("the event %s could not be emitted: %v", ToolchainReported, eerr) - } - return rev, nil + } + if m.Say != nil { + m.Say("the digest of the go toolchain program could not be read: %v", err) } + return "" } diff --git a/modules/mesh-build-go/cmd/mesh-build-go/toolchainreport.go b/modules/mesh-build-go/cmd/mesh-build-go/toolchainreport.go new file mode 100644 index 000000000..d0c609a74 --- /dev/null +++ b/modules/mesh-build-go/cmd/mesh-build-go/toolchainreport.go @@ -0,0 +1,94 @@ +package main + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" + "io" + "os" + "sync" + + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// toolchainReporter says `toolchain-reported` on the build seat's subject of its node (design 47 G §492): once at the +// module's start and each time its toolchains key of the language changes (a write that changes nothing says nothing). +// Language is the seat's ask language (go, node, image). +type toolchainReporter struct { + AskLanguage, Node string + // Publish is stdio.SeatPublish: the event is de-duplicated by its id. + Publish func(subject string, body any, id string) error + + mu sync.Mutex + last map[string]sdkstep.Toolchain +} + +// Report says the toolchain written under key at revision rev when it differs from the last one said for the key. +func (r *toolchainReporter) Report(key string, rev uint64, t sdkstep.Toolchain) error { + r.mu.Lock() + defer r.mu.Unlock() + if prev, ok := r.last[key]; ok && prev.Version == t.Version && prev.Recipe == t.Recipe && prev.Digest == t.Digest && prev.Language == t.Language { + return nil + } + seat, err := sdkstep.BuildSeat(r.AskLanguage) + if err != nil { + return err + } + if _, err := sdkstep.ToolchainKey(r.Node, t.Language); err != nil { + return err + } + body := map[string]string{"node": r.Node, "language": t.Language, "version": t.Version, "recipe": t.Recipe, "digest": t.Digest} + subject := "mesh.seat." + seat + ".event.toolchain-reported." + r.Node + if err := r.Publish(subject, body, fmt.Sprintf("toolchain-reported.%s.%d", key, rev)); err != nil { + return err + } + if r.last == nil { + r.last = map[string]sdkstep.Toolchain{} + } + r.last[key] = t + return nil +} + +// putReporting wraps a toolchains Put so each write that changes the toolchain is then said by r. A write that failed +// says nothing; an event that failed is passed to say and does not refuse the write. +func putReporting(put buildstep.Put, r *toolchainReporter, digest func(version string) string, say func(format string, a ...any)) buildstep.Put { + return func(key string, value any) (uint64, error) { + raw, merr := json.Marshal(value) + var t sdkstep.Toolchain + if merr != nil || json.Unmarshal(raw, &t) != nil { + return put(key, value) // not a toolchain value: written as it is + } + // The value carries the digest of the toolchain program beside the version and the recipe (design 47 G §472). + if t.Digest == "" && digest != nil { + t.Digest = digest(t.Version) + } + enc, eerr := sdkstep.EncodeToolchain(t) + if eerr != nil { + return put(key, value) + } + rev, err := put(key, json.RawMessage(enc)) + if err != nil || r == nil || r.Publish == nil { + return rev, err + } + if eerr := r.Report(key, rev, t); eerr != nil && say != nil { + say("toolchain-reported could not be said: %v", eerr) + } + return rev, nil + } +} + +// ProgramDigest is the sha256: digest of the file at path, a toolchain program (design 47 G §472). +func programFileDigest(path string) (string, error) { + f, err := os.Open(path) + if err != nil { + return "", err + } + defer f.Close() + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + return "", err + } + return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil +} diff --git a/modules/mesh-build-go/module.json b/modules/mesh-build-go/module.json index b4a1eb975..f70fc1b91 100644 --- a/modules/mesh-build-go/module.json +++ b/modules/mesh-build-go/module.json @@ -87,14 +87,6 @@ "build_go_status", "build_go_health" ], - "streams": [ - { - "name": "toolchains-go", - "events": [ - "toolchain.**" - ] - } - ], "requires": [ { "name": "detected-steps", diff --git a/modules/mesh-build-node/cmd/mesh-build-node/asks.go b/modules/mesh-build-node/cmd/mesh-build-node/asks.go index da739e18a..d0381878d 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/asks.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/asks.go @@ -37,7 +37,7 @@ func (m *Module) askSteps(steps []StepTool) buildstep.AskSteps { if err != nil { return sdkstep.ToolchainUsed{}, err } - return sdkstep.ToolchainUsed{Version: installed, Recipe: m.recipe().Version()}, nil + return sdkstep.ToolchainUsed{Version: installed, Recipe: m.recipe().Version(), Digest: m.programDigest(installed)}, nil }, Release: func(ws string) error { return m.spaces().Release(ws) }, Logf: m.Say, diff --git a/modules/mesh-build-node/cmd/mesh-build-node/emit_test.go b/modules/mesh-build-node/cmd/mesh-build-node/emit_test.go index 5d98c2395..4be2ed41e 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/emit_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/emit_test.go @@ -5,51 +5,69 @@ import ( "encoding/json" "os" "path/filepath" - "slices" "testing" ) -// Issues 1483 and 1488 (for the indexer, issue 1444): the guard emits toolchain.reported after each write of the -// toolchains key, with the node and the language. -func TestTheGuardEmitsToolchainReportedAfterEachWrite(t *testing.T) { - m := moduleWith(newStates(), "v26.10.0") +// Design 47 G §492, §472, §466 (BG5, BG6): the guard says toolchain-reported on the Node build seat's subject of its node, +// with the version, the recipe and the digest of the node program, at the first write and again only when one of them +// changed; the toolchains key and a build's toolchain carry the digest. +func TestTheGuardSaysToolchainReportedOnAChangeWithTheProgramDigest(t *testing.T) { + states := newStates() + m := moduleWith(states, "v26.10.0") + prog := filepath.Join(t.TempDir(), "node") + os.WriteFile(prog, []byte("node program"), 0o755) + m.ToolchainProgram = func() (string, error) { return prog, nil } type event struct { - typ string - body map[string]string + subject string + body map[string]string + id string } var got []event - m.Emit = func(typ string, body any) error { + m.SayToolchain = func(subject string, body any, id string) error { raw, _ := json.Marshal(body) var b map[string]string json.Unmarshal(raw, &b) - got = append(got, event{typ, b}) + got = append(got, event{subject, b, id}) return nil } if err := m.Check(context.Background()); err != nil { t.Fatal(err) } - if len(got) != 1 || got[0].typ != "toolchain.reported" || got[0].body["node"] != "ace" || got[0].body["language"] != "typescript" || len(got[0].body) != 2 { - t.Errorf("events = %+v, want one toolchain.reported for ace, typescript", got) + if len(got) != 1 || got[0].subject != "mesh.seat.node-build-node.event.toolchain-reported.ace" || got[0].body["node"] != "ace" || got[0].body["language"] != "typescript" || + got[0].body["version"] != "v26.10.0" || got[0].body["recipe"] != m.Recipe.Version() || len(got[0].body["digest"]) != len("sha256:")+64 { + t.Fatalf("events = %+v, want one toolchain-reported for ace, go with the program's digest", got) + } + if tc, _ := states.toolchain("ace.typescript"); tc.Digest != got[0].body["digest"] { + t.Errorf("the toolchains key's digest is %q, the event's %q", tc.Digest, got[0].body["digest"]) } m.Check(context.Background()) - if len(got) != 2 { - t.Errorf("a second guard pass emitted %d events in all, want 2", len(got)) + if len(got) != 1 { + t.Errorf("a second pass that changed nothing said %d events in all, want 1", len(got)) + } + // A build's toolchain names the same digest (§466). + if used, err := m.askSteps(nil).Toolchain(context.Background()); err != nil || used.Digest != got[0].body["digest"] || used.Version != "v26.10.0" { + t.Errorf("a build's toolchain = %+v (%v), want the digest %s", used, err, got[0].body["digest"]) + } + os.WriteFile(prog, []byte("another node program"), 0o755) + m.Probe = func(context.Context) (string, error) { return "v26.11.0", nil } + m.Check(context.Background()) + if len(got) != 2 || got[1].body["version"] != "v26.11.0" || got[1].body["digest"] == got[0].body["digest"] { + t.Errorf("a new version said %+v, want a second event with another digest", got) } } -// The event is carried by the module's stream, not named in emits (ADR 0363: one place); the validator checks that. -func TestTheManifestDeclaresTheToolchainsStream(t *testing.T) { +// The seat's events are its definition's: the module declares no stream of its own for the toolchain (§492). +func TestTheManifestDeclaresNoToolchainStream(t *testing.T) { raw, err := os.ReadFile(filepath.Join("..", "..", "module.json")) if err != nil { t.Fatal(err) } var m struct { Streams []struct { - Name string `json:"name"` - Events []string `json:"events"` + Name string `json:"name"` } `json:"streams"` } - if err := json.Unmarshal(raw, &m); err != nil || len(m.Streams) != 1 || m.Streams[0].Name != "toolchains-node" || !slices.Equal(m.Streams[0].Events, []string{"toolchain.**"}) { + if err := json.Unmarshal(raw, &m); err != nil || len(m.Streams) != 0 { t.Errorf("streams = %+v (%v)", m.Streams, err) } } diff --git a/modules/mesh-build-node/cmd/mesh-build-node/main.go b/modules/mesh-build-node/cmd/mesh-build-node/main.go index eb037cd9e..e8ff97ff1 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/main.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/main.go @@ -45,7 +45,7 @@ func main() { Probe: ProbeNode, Toolchain: &Toolchain{Paths: paths, Run: dforgekey.ExecRunnerClean(0), Registry: registry}, Toolchains: stdio.State(seat.StateToolchains).Put, - Emit: func(t string, b any) error { return stdio.Emit(t, b) }, + SayToolchain: stdio.SeatPublish, Steps: stdio.State(seat.StateSteps).Put, ReadSteps: readOf(stdio.State(seat.StateSteps)), Detected: stdio.State(seat.StateDetectedSteps).Put, diff --git a/modules/mesh-build-node/cmd/mesh-build-node/module.go b/modules/mesh-build-node/cmd/mesh-build-node/module.go index f51485aff..1d93108f7 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/module.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/module.go @@ -7,6 +7,7 @@ import ( stdio "git.novox.be/novox/mesh-sdk/go" "net/http" "os" + "os/exec" "sync" "time" @@ -64,9 +65,15 @@ type Module struct { ForgetPause func(key string) error // WatchPauses follows the drops other holders write in the shared pauses state (stdio.State(...).Watch). WatchPauses func(key string, handle func(stdio.StateChange) error) error - // Emit tells the bus an event (stdio.Emit); nil emits nothing. The guard emits toolchain.reported after each write of - // the toolchains key, so the indexer, which holds no timer, learns that the bucket exists (issue 1444). - Emit func(eventType string, body any) error + // SayToolchain says an event on a seat's subject (stdio.SeatPublish; nil says none, a test's); ToolchainProgram finds the + // node program whose digest the toolchain's is (exec.LookPath when nil). + SayToolchain func(subject string, body any, id string) error + ToolchainProgram func() (string, error) + reporterOnce sync.Once + reporter *toolchainReporter + digestMu sync.Mutex + digestFor string + progDigest string // Ctx is the process's context, which a step runs under (the tool call's is cut at 30 s, the step's is not). Ctx context.Context Say func(format string, a ...any) @@ -266,20 +273,38 @@ func pathOrDefault() string { return defaultPath } -// ToolchainReported is the event the guard emits after it writes the toolchains key. -const ToolchainReported = "toolchain.reported" - -// reportingPut is the toolchains Put that then emits toolchain.reported with the node and the language. A write that -// failed emits nothing; an emit that failed is said and does not refuse the step. +// reportingPut is the toolchains Put that then says toolchain-reported on the Node build seat's subject of this node when +// the toolchain changed (design 47 G §492): at the module's start and on each change of the key. A write that failed +// says nothing; an event that failed is said and does not refuse the step. func (m *Module) reportingPut() buildstep.Put { - return func(key string, value any) (uint64, error) { - rev, err := m.Toolchains(key, value) - if err != nil || m.Emit == nil { - return rev, err + m.reporterOnce.Do(func() { + m.reporter = &toolchainReporter{AskLanguage: sdkstep.AskNode, Node: m.Node, Publish: m.SayToolchain} + }) + return putReporting(m.Toolchains, m.reporter, m.programDigest, m.Say) +} + +// programDigest is the digest of the node program this node's node-toolchain provides, the `node` found on the path: read +// again only when the installed version changed (design 47 G §472; the lead's answer A-152). +func (m *Module) programDigest(version string) string { + m.digestMu.Lock() + defer m.digestMu.Unlock() + if m.digestFor == version && m.progDigest != "" { + return m.progDigest + } + find := m.ToolchainProgram + if find == nil { + find = func() (string, error) { return exec.LookPath("node") } + } + path, err := find() + if err == nil { + var d string + if d, err = programFileDigest(path); err == nil { + m.digestFor, m.progDigest = version, d + return d } - if eerr := m.Emit(ToolchainReported, map[string]string{"node": m.Node, "language": "typescript"}); eerr != nil && m.Say != nil { - m.Say("the event %s could not be emitted: %v", ToolchainReported, eerr) - } - return rev, nil + } + if m.Say != nil { + m.Say("the digest of the node toolchain program could not be read: %v", err) } + return "" } diff --git a/modules/mesh-build-node/cmd/mesh-build-node/toolchainreport.go b/modules/mesh-build-node/cmd/mesh-build-node/toolchainreport.go new file mode 100644 index 000000000..d0c609a74 --- /dev/null +++ b/modules/mesh-build-node/cmd/mesh-build-node/toolchainreport.go @@ -0,0 +1,94 @@ +package main + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" + "io" + "os" + "sync" + + sdkstep "git.novox.be/novox/mesh-delivery/sdk/buildstep" +) + +// toolchainReporter says `toolchain-reported` on the build seat's subject of its node (design 47 G §492): once at the +// module's start and each time its toolchains key of the language changes (a write that changes nothing says nothing). +// Language is the seat's ask language (go, node, image). +type toolchainReporter struct { + AskLanguage, Node string + // Publish is stdio.SeatPublish: the event is de-duplicated by its id. + Publish func(subject string, body any, id string) error + + mu sync.Mutex + last map[string]sdkstep.Toolchain +} + +// Report says the toolchain written under key at revision rev when it differs from the last one said for the key. +func (r *toolchainReporter) Report(key string, rev uint64, t sdkstep.Toolchain) error { + r.mu.Lock() + defer r.mu.Unlock() + if prev, ok := r.last[key]; ok && prev.Version == t.Version && prev.Recipe == t.Recipe && prev.Digest == t.Digest && prev.Language == t.Language { + return nil + } + seat, err := sdkstep.BuildSeat(r.AskLanguage) + if err != nil { + return err + } + if _, err := sdkstep.ToolchainKey(r.Node, t.Language); err != nil { + return err + } + body := map[string]string{"node": r.Node, "language": t.Language, "version": t.Version, "recipe": t.Recipe, "digest": t.Digest} + subject := "mesh.seat." + seat + ".event.toolchain-reported." + r.Node + if err := r.Publish(subject, body, fmt.Sprintf("toolchain-reported.%s.%d", key, rev)); err != nil { + return err + } + if r.last == nil { + r.last = map[string]sdkstep.Toolchain{} + } + r.last[key] = t + return nil +} + +// putReporting wraps a toolchains Put so each write that changes the toolchain is then said by r. A write that failed +// says nothing; an event that failed is passed to say and does not refuse the write. +func putReporting(put buildstep.Put, r *toolchainReporter, digest func(version string) string, say func(format string, a ...any)) buildstep.Put { + return func(key string, value any) (uint64, error) { + raw, merr := json.Marshal(value) + var t sdkstep.Toolchain + if merr != nil || json.Unmarshal(raw, &t) != nil { + return put(key, value) // not a toolchain value: written as it is + } + // The value carries the digest of the toolchain program beside the version and the recipe (design 47 G §472). + if t.Digest == "" && digest != nil { + t.Digest = digest(t.Version) + } + enc, eerr := sdkstep.EncodeToolchain(t) + if eerr != nil { + return put(key, value) + } + rev, err := put(key, json.RawMessage(enc)) + if err != nil || r == nil || r.Publish == nil { + return rev, err + } + if eerr := r.Report(key, rev, t); eerr != nil && say != nil { + say("toolchain-reported could not be said: %v", eerr) + } + return rev, nil + } +} + +// ProgramDigest is the sha256: digest of the file at path, a toolchain program (design 47 G §472). +func programFileDigest(path string) (string, error) { + f, err := os.Open(path) + if err != nil { + return "", err + } + defer f.Close() + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + return "", err + } + return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil +} diff --git a/modules/mesh-build-node/module.json b/modules/mesh-build-node/module.json index 4678e794e..99da70e35 100644 --- a/modules/mesh-build-node/module.json +++ b/modules/mesh-build-node/module.json @@ -56,14 +56,6 @@ "build_node_status", "build_node_health" ], - "streams": [ - { - "name": "toolchains-node", - "events": [ - "toolchain.**" - ] - } - ], "requires": [ {"name": "detected-steps", "storage": "key-value", "template": "state", "options": {"history": 1}}, "artifact-store", From 48ad5ce947f5c0de60f5e0e2ae3ac05c47f21cc2 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 05:15:43 +0100 Subject: [PATCH 05/12] BG8, BN8, BI2: each artifact carries the version the ask names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A Go program is linked with -X main.meshVersion beside main.builtFor, a Node program's package.json version is set, an image is labelled org.opencontainers.image.version; a build with no version stamps none. Builds: design 47 G §458, §573 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../mesh-build-go/cmd/mesh-build-go/build.go | 6 ++++++ .../cmd/mesh-build-go/build_test.go | 7 +++++++ .../cmd/mesh-build-image/build.go | 2 +- .../cmd/mesh-build-image/build_test.go | 4 ++-- .../cmd/mesh-build-node/build.go | 8 +++++++ .../cmd/mesh-build-node/build_test.go | 21 +++++++++++++++++++ 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/modules/mesh-build-go/cmd/mesh-build-go/build.go b/modules/mesh-build-go/cmd/mesh-build-go/build.go index d42fd7dbf..26f007085 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/build.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/build.go @@ -26,6 +26,8 @@ const ( recipeFlags = "-trimpath -buildvcs=false" recipeLinkerFlags = "-s -w" recipeSystemStamp = "main.builtFor" + // versionStamp is the Go variable a program carries its version in (design 47 G §458). + versionStamp = "main.meshVersion" // outDir is where a build leaves an artifact in the module's directory (builder.Out). outDir = ".mesh-build" ) @@ -153,6 +155,10 @@ func (m *Module) build(ctx context.Context, args map[string]any) (any, error) { if system := strings.TrimSpace(art.System); system != "" { linker += " -X " + recipeSystemStamp + "=" + system } + // A build asked with a version carries it in main.meshVersion beside main.builtFor; one with none stamps none (§458). + if version != "" { + linker += " -X " + versionStamp + "=" + version + } cmd := []string{"-C", dir, "build", "-ldflags", linker, "-o", filepath.Join(out, binary), "./" + strings.Trim(art.From, "./")} // Shut off (ADR 0448): the shared caches are written by a trunk build alone (publish), a candidate's go build writes // beneath a throwaway layer. diff --git a/modules/mesh-build-go/cmd/mesh-build-go/build_test.go b/modules/mesh-build-go/cmd/mesh-build-go/build_test.go index 29dda3fbc..0c3f6a989 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/build_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/build_test.go @@ -273,6 +273,13 @@ func TestTheBuildGetsTheVersionTheAskCarriesAsMeshVersion(t *testing.T) { } got := "" for _, r := range *calls { + // §458: the program is linked with main.meshVersion beside main.builtFor, and with no version none is stamped. + if strings.Contains(r.line, " build ") && strings.Contains(r.line, "-X main.meshVersion=") != (version != "") { + t.Errorf("ask version %q: the go build line is %q", version, r.line) + } + if version != "" && strings.Contains(r.line, " build ") && !strings.Contains(r.line, "-X main.meshVersion="+version) { + t.Errorf("ask version %q: the go build line lacks main.meshVersion: %q", version, r.line) + } if strings.HasPrefix(r.line, "go ") { for _, e := range r.env { if strings.HasPrefix(e, "MESH_VERSION=") { diff --git a/modules/mesh-build-image/cmd/mesh-build-image/build.go b/modules/mesh-build-image/cmd/mesh-build-image/build.go index 79b582095..14ebe5482 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/build.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/build.go @@ -172,7 +172,7 @@ func (m *Module) build(ctx context.Context, args map[string]any) (any, error) { argv = append(argv, imageArgs(manifest)...) // The version the build ask carries is the build argument MESH_VERSION (design 47 G §370). if version != "" { - argv = append(argv, "--build-arg", "MESH_VERSION="+version) + argv = append(argv, "--build-arg", "MESH_VERSION="+version, "--label", "org.opencontainers.image.version="+version) // the label of §458 } argv = append(argv, contextDir) if r := m.Run(ctx, m.env(), "buildah", argv...); r.Status != 0 || r.Err != "" { diff --git a/modules/mesh-build-image/cmd/mesh-build-image/build_test.go b/modules/mesh-build-image/cmd/mesh-build-image/build_test.go index 7bbb850c4..1a533a77a 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/build_test.go +++ b/modules/mesh-build-image/cmd/mesh-build-image/build_test.go @@ -338,12 +338,12 @@ func TestTheImageBuildGetsTheVersionTheAskCarriesAsMeshVersion(t *testing.T) { t.Fatalf("step = %+v", st) } bud := f.called("bud") - if len(bud) != 1 || !strings.Contains(bud[0].line, "--build-arg MESH_VERSION=1.4.3") { + if len(bud) != 1 || !strings.Contains(bud[0].line, "--build-arg MESH_VERSION=1.4.3") || !strings.Contains(bud[0].line, "--label org.opencontainers.image.version=1.4.3") { t.Fatalf("bud = %+v", bud) } m, f, states = setup(t, same) runBuild(t, m, states, nil) - if bud := f.called("bud"); len(bud) != 1 || strings.Contains(bud[0].line, "MESH_VERSION") { + if bud := f.called("bud"); len(bud) != 1 || (strings.Contains(bud[0].line, "MESH_VERSION") || strings.Contains(bud[0].line, "image.version")) { t.Fatalf("a build with no version: %+v", bud) } } diff --git a/modules/mesh-build-node/cmd/mesh-build-node/build.go b/modules/mesh-build-node/cmd/mesh-build-node/build.go index 4147c76c5..b14f72172 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/build.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/build.go @@ -137,6 +137,14 @@ func (m *Module) build(ctx context.Context, args map[string]any) (any, error) { if err := copyPackages(filepath.Join(m.toolchainDir(), "node_modules"), filepath.Join(stage, "node_modules")); err != nil { return nil, fmt.Errorf("providing the toolchain's packages to the build: %w", err) } + // A program reads its own version from its package.json `version`, which is the version the ask carries (§458); the + // staged copy is the build's own, so nothing is restored. A build with no version, or a module with no package.json, + // keeps what it carries. + if _, err := os.Stat(filepath.Join(dir, "package.json")); err == nil && version != "" { + if _, err := setPackageVersion(dir, version); err != nil { + return nil, err + } + } out, final := Out(a.Name), Out(a.Name)+".bundled" if err := os.MkdirAll(filepath.Join(dir, out), 0o755); err != nil { return nil, err diff --git a/modules/mesh-build-node/cmd/mesh-build-node/build_test.go b/modules/mesh-build-node/cmd/mesh-build-node/build_test.go index 469482168..7c899578c 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/build_test.go +++ b/modules/mesh-build-node/cmd/mesh-build-node/build_test.go @@ -328,3 +328,24 @@ func TestTheBundleBuildGetsTheVersionTheAskCarriesAsMeshVersion(t *testing.T) { } } } + +// Design 47 G §458 (BN8): a Node program reads its version from its package.json `version`, which is the version the +// ask carries; a build with no version keeps what the package.json carries. +func TestTheBundleCarriesTheAsksVersionInItsPackageJSON(t *testing.T) { + for _, c := range []struct{ version, want string }{{"1.4.3", "1.4.3"}, {"", "0.0.0"}} { + m, f, work := builtMachine(t, "") + workspaceWith(t, work, map[string]string{"modules/m/package.json": `{"name":"m","version":"0.0.0"}`}) + args := buildArgs() + if c.version != "" { + args["version"] = c.version + } + if _, err := m.build(context.Background(), args); err != nil { + t.Fatal(err) + } + _ = f + raw, err := os.ReadFile(filepath.Join(work, "w1", "stage-tools", "modules", "module", "package.json")) + if err != nil || !strings.Contains(string(raw), `"version": "`+c.want+`"`) && !strings.Contains(string(raw), `"version":"`+c.want+`"`) { + t.Errorf("ask version %q: the staged package.json is %q (%v), want version %s", c.version, raw, err, c.want) + } + } +} From ff6a8928d6931d8632e35a367aa4898a8c32279c Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 12 Nov 2026 05:18:34 +0100 Subject: [PATCH 06/12] SD5, BG11, BLD10: the build modules' shared code moves into the delivery SDK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All of mesh-build-go's buildstep Go module leaves mesh-catalog for modules/mesh-delivery-sdk: the step run, fetch and release and the regenerate-and-compare step as the package steprun, the CPU share as steprun/buildcpu, the conformance kit as steprun/conformance, the seat generator as seatgen with cmd/seatgen, and cmd/mesh-pack. The three build modules and the builder's and checker's tests import the SDK and keep no copy; the SDK requires nothing of mesh-catalog. Code the build modules share is the delivery domain's SDK, not one module's package. It carries the build-module round's two new files of that package (dropdetected.go 247c422f, storedbuilds.go 904b8aed). Builds: design 47 G §464, §680, §327, §420, §495 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .gitignore | 3 - checks/failurekit/failurekit.go | 2 +- checks/failurekit/failurekit_test.go | 2 +- checks/removedpackages/main.go | 12 +- checks/removedpackages/main_test.go | 4 +- modules/mesh-build-go/README.md | 26 +- modules/mesh-build-go/buildstep/askrun.go | 565 ----------- .../mesh-build-go/buildstep/askrun_test.go | 470 ---------- .../buildstep/buildcpu/buildcpu.go | 215 ----- .../buildstep/buildcpu/buildcpu_agree_test.go | 14 - .../buildstep/buildcpu/buildcpu_test.go | 90 -- modules/mesh-build-go/buildstep/buildhours.go | 129 --- modules/mesh-build-go/buildstep/capacity.go | 57 -- .../mesh-build-go/buildstep/capacity_cpu.go | 141 --- .../mesh-build-go/buildstep/capacity_test.go | 135 --- .../buildstep/cmd/mesh-pack/main.go | 111 --- .../buildstep/cmd/mesh-pack/main_test.go | 52 - .../buildstep/cmd/seatgen/main.go | 80 -- .../buildstep/conformance/captured/README.md | 81 -- .../conformance/captured/go/buildfail.jsonl | 6 - .../conformance/captured/go/deeptimeout.jsonl | 417 --------- .../conformance/captured/go/exiting.jsonl | 10 - .../conformance/captured/go/killed.jsonl | 7 - .../captured/go/logthenfatal.jsonl | 13 - .../conformance/captured/go/mainexit.jsonl | 8 - .../conformance/captured/go/panicking.jsonl | 27 - .../conformance/captured/go/passfirst.jsonl | 22 - .../captured/go/passthenfail.jsonl | 15 - .../conformance/captured/go/race.jsonl | 53 -- .../conformance/captured/go/racemain.jsonl | 27 - .../conformance/captured/go/subpanic.jsonl | 30 - .../conformance/captured/go/subtests.jsonl | 17 - .../conformance/captured/go/timeout.jsonl | 43 - .../conformance/captured/node/crash.console | 2 - .../conformance/captured/node/crash.tap | 41 - .../captured/node/logcrash.console | 2 - .../conformance/captured/node/logcrash.tap | 42 - .../conformance/captured/node/suite.console | 2 - .../conformance/captured/node/suite.tap | 61 -- .../conformance/captured/node/syntax.console | 2 - .../conformance/captured/node/syntax.tap | 47 - .../conformance/captured/node/timeout.console | 2 - .../conformance/captured/node/timeout.tap | 26 - .../captured/node/two-files.console | 2 - .../conformance/captured/node/two-files.tap | 49 - .../captured/passing/buildah-bud-run.txt | 1 - .../captured/passing/buildah-bud-timeout.txt | 1 - .../captured/passing/git-fetch-closed.txt | 2 - .../captured/passing/git-fetch-kex.txt | 6 - .../captured/passing/git-fetch-noref.txt | 1 - .../captured/passing/git-fetch-resolve.txt | 2 - .../captured/passing/go-download-checksum.txt | 1 - .../captured/passing/go-download-dial.txt | 1 - .../captured/passing/go-download-lookup.txt | 1 - .../captured/passing/go-download-unknown.txt | 1 - .../captured/passing/npm-ci-404.txt | 2 - .../captured/passing/npm-ci-eaiagain.txt | 3 - .../captured/passing/npm-ci-econnreset.txt | 4 - .../captured/tsc/typeerror.console | 1 - .../buildstep/conformance/conformance.go | 279 ------ .../buildstep/conformance/conformance_test.go | 183 ---- .../buildstep/conformance/leftrunning.go | 212 ----- modules/mesh-build-go/buildstep/cpu.go | 14 - .../buildstep/digestshape_test.go | 234 ----- modules/mesh-build-go/buildstep/fetch.go | 208 ---- .../buildstep/fetch_integration_test.go | 59 -- modules/mesh-build-go/buildstep/fetch_test.go | 160 ---- modules/mesh-build-go/buildstep/generated.go | 164 ---- .../mesh-build-go/buildstep/generated_test.go | 133 --- modules/mesh-build-go/buildstep/go.mod | 40 - modules/mesh-build-go/buildstep/go.sum | 25 - modules/mesh-build-go/buildstep/gotest.go | 410 -------- modules/mesh-build-go/buildstep/guard.go | 52 - modules/mesh-build-go/buildstep/guard_test.go | 79 -- modules/mesh-build-go/buildstep/isolate.go | 181 ---- .../buildstep/isolate_caches_test.go | 30 - .../buildstep/isolate_integration_test.go | 66 -- .../mesh-build-go/buildstep/isolate_test.go | 115 --- modules/mesh-build-go/buildstep/merge.go | 129 --- .../buildstep/merge_integration_test.go | 199 ---- modules/mesh-build-go/buildstep/merge_test.go | 74 -- .../buildstep/mirror_integration_test.go | 65 -- .../mesh-build-go/buildstep/mirror_test.go | 124 --- modules/mesh-build-go/buildstep/narrate.go | 106 --- .../mesh-build-go/buildstep/narrate_test.go | 107 --- modules/mesh-build-go/buildstep/narrow.go | 72 -- .../mesh-build-go/buildstep/narrow_test.go | 83 -- modules/mesh-build-go/buildstep/pack.go | 100 -- modules/mesh-build-go/buildstep/pack_test.go | 84 -- .../mesh-build-go/buildstep/pack_unix_test.go | 25 - modules/mesh-build-go/buildstep/phase.go | 67 -- modules/mesh-build-go/buildstep/programs.go | 115 --- .../mesh-build-go/buildstep/programs_test.go | 72 -- modules/mesh-build-go/buildstep/publish.go | 153 --- modules/mesh-build-go/buildstep/pull.go | 886 ------------------ modules/mesh-build-go/buildstep/pull_bus.go | 103 -- .../buildstep/pull_capacity_test.go | 39 - modules/mesh-build-go/buildstep/pull_drop.go | 183 ---- modules/mesh-build-go/buildstep/pull_fake.go | 122 --- .../buildstep/pull_integration_test.go | 227 ----- modules/mesh-build-go/buildstep/pull_seat.go | 51 - .../mesh-build-go/buildstep/pull_seat_test.go | 148 --- modules/mesh-build-go/buildstep/pull_test.go | 600 ------------ modules/mesh-build-go/buildstep/refusal.go | 35 - modules/mesh-build-go/buildstep/seat_tools.go | 52 - .../buildstep/seat_tools_test.go | 52 - .../buildstep/seatgen/callers.go | 72 -- .../buildstep/seatgen/clients.go | 214 ----- .../buildstep/seatgen/clients_test.go | 164 ---- .../mesh-build-go/buildstep/seatgen/gogen.go | 553 ----------- .../buildstep/seatgen/layout_test.go | 379 -------- .../mesh-build-go/buildstep/seatgen/load.go | 207 ---- .../mesh-build-go/buildstep/seatgen/states.go | 264 ------ .../buildstep/seatgen/states_test.go | 124 --- .../testdata/contracts/parts/registry.json | 3 - .../seats/a-registry/fixtures/states.json | 3 - .../contracts/seats/a-registry/seat.json | 23 - .../contracts/seats/b-registry/seat.json | 3 - .../contracts/seats/one-store/seat.json | 1 - .../mesh-build-go/buildstep/seatgen/tsgen.go | 260 ----- .../mesh-build-go/buildstep/seatgen/types.go | 192 ---- modules/mesh-build-go/buildstep/step.go | 159 ---- modules/mesh-build-go/buildstep/step_test.go | 156 --- modules/mesh-build-go/buildstep/steprun.go | 252 ----- modules/mesh-build-go/buildstep/steptool.go | 36 - modules/mesh-build-go/buildstep/tap.go | 193 ---- .../buildstep/testdata/isolated-probe/main.go | 49 - .../buildstep/testdata/pack-golden.tar | Bin 4096 -> 0 bytes modules/mesh-build-go/buildstep/transport.go | 14 - modules/mesh-build-go/buildstep/trees.go | 143 --- .../buildstep/trees_integration_test.go | 118 --- .../buildstep/trees_named_test.go | 107 --- modules/mesh-build-go/buildstep/trees_test.go | 95 -- .../buildstep/watch_settings_linux.go | 112 --- .../buildstep/watch_settings_other.go | 8 - modules/mesh-build-go/buildstep/workspaces.go | 160 ---- .../buildstep/workspaces_test.go | 113 --- .../cmd/mesh-build-go/archive.go | 6 +- .../mesh-build-go/cmd/mesh-build-go/asks.go | 36 +- .../mesh-build-go/asks_integration_test.go | 6 +- .../cmd/mesh-build-go/asks_test.go | 24 +- .../mesh-build-go/cmd/mesh-build-go/build.go | 4 +- .../cmd/mesh-build-go/compose.go | 18 +- .../mesh-build-go/compose_integration_test.go | 6 +- .../mesh-build-go/cmd/mesh-build-go/cpu.go | 10 +- .../mesh-build-go/cmd/mesh-build-go/fetch.go | 16 +- .../cmd/mesh-build-go/imports_test.go | 4 +- .../mesh-build-go/installed_toolchain_test.go | 2 +- .../cmd/mesh-build-go/isolate.go | 20 +- .../cmd/mesh-build-go/isolate_test.go | 6 +- .../cmd/mesh-build-go/kit_test.go | 6 +- .../mesh-build-go/cmd/mesh-build-go/level.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/levels.go | 10 +- .../mesh-build-go/cmd/mesh-build-go/lint.go | 12 +- .../cmd/mesh-build-go/lint_test.go | 4 +- .../cmd/mesh-build-go/manifest_test.go | 30 + .../mesh-build-go/cmd/mesh-build-go/mirror.go | 8 +- .../cmd/mesh-build-go/mirror_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/module.go | 30 +- .../cmd/mesh-build-go/packages_shape_test.go | 6 +- .../mesh-build-go/cmd/mesh-build-go/pins.go | 4 +- .../cmd/mesh-build-go/preview.go | 10 +- .../mesh-build-go/preview_integration_test.go | 4 +- .../cmd/mesh-build-go/publish.go | 14 +- .../cmd/mesh-build-go/publish_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/room.go | 14 +- .../cmd/mesh-build-go/room_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/run.go | 12 +- .../cmd/mesh-build-go/run_integration_test.go | 6 +- .../cmd/mesh-build-go/run_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/steps.go | 6 +- .../cmd/mesh-build-go/steps_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/store.go | 6 +- .../mesh-build-go/store_integration_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/test.go | 8 +- .../test_real_integration_test.go | 4 +- .../mesh-build-go/cmd/mesh-build-go/tools.go | 4 +- modules/mesh-build-go/go.mod | 2 - .../cmd/mesh-build-image/asks.go | 30 +- .../cmd/mesh-build-image/asks_test.go | 4 +- .../cmd/mesh-build-image/build.go | 10 +- .../cmd/mesh-build-image/copy.go | 18 +- .../cmd/mesh-build-image/cpu.go | 10 +- .../cmd/mesh-build-image/fetch.go | 16 +- .../cmd/mesh-build-image/integration_test.go | 4 +- .../cmd/mesh-build-image/kit_test.go | 6 +- .../cmd/mesh-build-image/module.go | 38 +- .../cmd/mesh-build-image/publish.go | 26 +- .../cmd/mesh-build-image/room.go | 14 +- .../cmd/mesh-build-image/room_test.go | 4 +- .../cmd/mesh-build-image/tools.go | 4 +- modules/mesh-build-image/go.mod | 2 - modules/mesh-build-node/README.md | 6 +- .../cmd/mesh-build-node/asks.go | 32 +- .../cmd/mesh-build-node/asks_test.go | 20 +- .../cmd/mesh-build-node/build.go | 10 +- .../cmd/mesh-build-node/check.go | 10 +- .../cmd/mesh-build-node/check_test.go | 4 +- .../cmd/mesh-build-node/cpu.go | 10 +- .../cmd/mesh-build-node/fetch.go | 18 +- .../mesh-build-node/generated_package_test.go | 2 +- .../cmd/mesh-build-node/isolate.go | 20 +- .../cmd/mesh-build-node/isolate_test.go | 6 +- .../cmd/mesh-build-node/kit_test.go | 6 +- .../cmd/mesh-build-node/module.go | 32 +- .../cmd/mesh-build-node/package.go | 14 +- .../package_integration_test.go | 6 +- .../cmd/mesh-build-node/preview.go | 8 +- .../preview_integration_test.go | 4 +- .../cmd/mesh-build-node/publish.go | 6 +- .../cmd/mesh-build-node/push_test.go | 12 +- .../cmd/mesh-build-node/room.go | 14 +- .../cmd/mesh-build-node/room_test.go | 4 +- .../cmd/mesh-build-node/steps.go | 6 +- .../mesh-build-node/store_integration_test.go | 4 +- .../cmd/mesh-build-node/toolchain.go | 4 +- .../cmd/mesh-build-node/tools.go | 4 +- modules/mesh-build-node/go.mod | 2 - 218 files changed, 452 insertions(+), 14467 deletions(-) delete mode 100644 modules/mesh-build-go/buildstep/askrun.go delete mode 100644 modules/mesh-build-go/buildstep/askrun_test.go delete mode 100644 modules/mesh-build-go/buildstep/buildcpu/buildcpu.go delete mode 100644 modules/mesh-build-go/buildstep/buildcpu/buildcpu_agree_test.go delete mode 100644 modules/mesh-build-go/buildstep/buildcpu/buildcpu_test.go delete mode 100644 modules/mesh-build-go/buildstep/buildhours.go delete mode 100644 modules/mesh-build-go/buildstep/capacity.go delete mode 100644 modules/mesh-build-go/buildstep/capacity_cpu.go delete mode 100644 modules/mesh-build-go/buildstep/capacity_test.go delete mode 100644 modules/mesh-build-go/buildstep/cmd/mesh-pack/main.go delete mode 100644 modules/mesh-build-go/buildstep/cmd/mesh-pack/main_test.go delete mode 100644 modules/mesh-build-go/buildstep/cmd/seatgen/main.go delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/README.md delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/buildfail.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/deeptimeout.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/exiting.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/killed.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/logthenfatal.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/mainexit.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/panicking.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/passfirst.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/passthenfail.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/race.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/racemain.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/subpanic.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/subtests.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/go/timeout.jsonl delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/crash.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/crash.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/suite.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/suite.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/syntax.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/syntax.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/timeout.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/timeout.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/two-files.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/node/two-files.tap delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-run.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-timeout.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-closed.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-kex.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-noref.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-resolve.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-checksum.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-dial.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-lookup.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-unknown.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-404.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-eaiagain.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-econnreset.txt delete mode 100644 modules/mesh-build-go/buildstep/conformance/captured/tsc/typeerror.console delete mode 100644 modules/mesh-build-go/buildstep/conformance/conformance.go delete mode 100644 modules/mesh-build-go/buildstep/conformance/conformance_test.go delete mode 100644 modules/mesh-build-go/buildstep/conformance/leftrunning.go delete mode 100644 modules/mesh-build-go/buildstep/cpu.go delete mode 100644 modules/mesh-build-go/buildstep/digestshape_test.go delete mode 100644 modules/mesh-build-go/buildstep/fetch.go delete mode 100644 modules/mesh-build-go/buildstep/fetch_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/fetch_test.go delete mode 100644 modules/mesh-build-go/buildstep/generated.go delete mode 100644 modules/mesh-build-go/buildstep/generated_test.go delete mode 100644 modules/mesh-build-go/buildstep/go.mod delete mode 100644 modules/mesh-build-go/buildstep/go.sum delete mode 100644 modules/mesh-build-go/buildstep/gotest.go delete mode 100644 modules/mesh-build-go/buildstep/guard.go delete mode 100644 modules/mesh-build-go/buildstep/guard_test.go delete mode 100644 modules/mesh-build-go/buildstep/isolate.go delete mode 100644 modules/mesh-build-go/buildstep/isolate_caches_test.go delete mode 100644 modules/mesh-build-go/buildstep/isolate_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/isolate_test.go delete mode 100644 modules/mesh-build-go/buildstep/merge.go delete mode 100644 modules/mesh-build-go/buildstep/merge_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/merge_test.go delete mode 100644 modules/mesh-build-go/buildstep/mirror_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/mirror_test.go delete mode 100644 modules/mesh-build-go/buildstep/narrate.go delete mode 100644 modules/mesh-build-go/buildstep/narrate_test.go delete mode 100644 modules/mesh-build-go/buildstep/narrow.go delete mode 100644 modules/mesh-build-go/buildstep/narrow_test.go delete mode 100644 modules/mesh-build-go/buildstep/pack.go delete mode 100644 modules/mesh-build-go/buildstep/pack_test.go delete mode 100644 modules/mesh-build-go/buildstep/pack_unix_test.go delete mode 100644 modules/mesh-build-go/buildstep/phase.go delete mode 100644 modules/mesh-build-go/buildstep/programs.go delete mode 100644 modules/mesh-build-go/buildstep/programs_test.go delete mode 100644 modules/mesh-build-go/buildstep/publish.go delete mode 100644 modules/mesh-build-go/buildstep/pull.go delete mode 100644 modules/mesh-build-go/buildstep/pull_bus.go delete mode 100644 modules/mesh-build-go/buildstep/pull_capacity_test.go delete mode 100644 modules/mesh-build-go/buildstep/pull_drop.go delete mode 100644 modules/mesh-build-go/buildstep/pull_fake.go delete mode 100644 modules/mesh-build-go/buildstep/pull_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/pull_seat.go delete mode 100644 modules/mesh-build-go/buildstep/pull_seat_test.go delete mode 100644 modules/mesh-build-go/buildstep/pull_test.go delete mode 100644 modules/mesh-build-go/buildstep/refusal.go delete mode 100644 modules/mesh-build-go/buildstep/seat_tools.go delete mode 100644 modules/mesh-build-go/buildstep/seat_tools_test.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/callers.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/clients.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/clients_test.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/gogen.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/layout_test.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/load.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/states.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/states_test.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/testdata/contracts/parts/registry.json delete mode 100644 modules/mesh-build-go/buildstep/seatgen/testdata/contracts/seats/a-registry/fixtures/states.json delete mode 100644 modules/mesh-build-go/buildstep/seatgen/testdata/contracts/seats/a-registry/seat.json delete mode 100644 modules/mesh-build-go/buildstep/seatgen/testdata/contracts/seats/b-registry/seat.json delete mode 100644 modules/mesh-build-go/buildstep/seatgen/testdata/contracts/seats/one-store/seat.json delete mode 100644 modules/mesh-build-go/buildstep/seatgen/tsgen.go delete mode 100644 modules/mesh-build-go/buildstep/seatgen/types.go delete mode 100644 modules/mesh-build-go/buildstep/step.go delete mode 100644 modules/mesh-build-go/buildstep/step_test.go delete mode 100644 modules/mesh-build-go/buildstep/steprun.go delete mode 100644 modules/mesh-build-go/buildstep/steptool.go delete mode 100644 modules/mesh-build-go/buildstep/tap.go delete mode 100644 modules/mesh-build-go/buildstep/testdata/isolated-probe/main.go delete mode 100644 modules/mesh-build-go/buildstep/testdata/pack-golden.tar delete mode 100644 modules/mesh-build-go/buildstep/transport.go delete mode 100644 modules/mesh-build-go/buildstep/trees.go delete mode 100644 modules/mesh-build-go/buildstep/trees_integration_test.go delete mode 100644 modules/mesh-build-go/buildstep/trees_named_test.go delete mode 100644 modules/mesh-build-go/buildstep/trees_test.go delete mode 100644 modules/mesh-build-go/buildstep/watch_settings_linux.go delete mode 100644 modules/mesh-build-go/buildstep/watch_settings_other.go delete mode 100644 modules/mesh-build-go/buildstep/workspaces.go delete mode 100644 modules/mesh-build-go/buildstep/workspaces_test.go diff --git a/.gitignore b/.gitignore index 3c486ed48..cdd737795 100644 --- a/.gitignore +++ b/.gitignore @@ -112,9 +112,6 @@ dist/ /modules/mailu/cmd/automx/automx /modules/memory-pressure/cmd/memory-pressure/memory-pressure /modules/memory-pressure/memory-pressure -/modules/mesh-build-go/buildstep/cmd/mesh-pack/mesh-pack -/modules/mesh-build-go/buildstep/cmd/seatgen/seatgen -/modules/mesh-build-go/buildstep/mesh-pack /modules/mesh-build-go/cmd/mesh-build-go/mesh-build-go /modules/mesh-build-go/mesh-build-go /modules/mesh-build-image/cmd/mesh-build-image/mesh-build-image diff --git a/checks/failurekit/failurekit.go b/checks/failurekit/failurekit.go index c5b7a7a45..e46f8cad7 100644 --- a/checks/failurekit/failurekit.go +++ b/checks/failurekit/failurekit.go @@ -145,7 +145,7 @@ func runsTheKit(dir, call string) (bool, error) { return err } found = strings.Contains(string(raw), call) && - strings.Contains(string(raw), `"git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance"`) + strings.Contains(string(raw), `"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun/conformance"`) return nil }) return found, err diff --git a/checks/failurekit/failurekit_test.go b/checks/failurekit/failurekit_test.go index f4467c85e..42049e0ef 100644 --- a/checks/failurekit/failurekit_test.go +++ b/checks/failurekit/failurekit_test.go @@ -12,7 +12,7 @@ import ( // claims no node-build-* seat is not judged. func TestABuildModuleWithATestStepMustRunTheKit(t *testing.T) { root := t.TempDir() - const imp = "package main\n\nimport \"git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance\"\n\n" + const imp = "package main\n\nimport \"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun/conformance\"\n\n" const sweep = "func TestSweep(t *testing.T) { conformance.LeftRunning(t, nil) }\nfunc TestPassing(t *testing.T) { conformance.Passing(t, nil, nil) }\n" kit := imp + "func TestKit(t *testing.T) { conformance.Run(t, conformance.GoTest, nil) }\n" + sweep for path, body := range map[string]string{ diff --git a/checks/removedpackages/main.go b/checks/removedpackages/main.go index d77f0d08b..9b8915da5 100644 --- a/checks/removedpackages/main.go +++ b/checks/removedpackages/main.go @@ -1,6 +1,6 @@ // Command removedpackages refuses a Go source of the catalogue that imports what mesh-sdk gave up in the release that // narrowed it (novox/hq ADR 0593 §1): a package that left for its owner, and the build runner's names that left -// mesh-sdk's buildstep for mesh-build-go's package. +// mesh-sdk's buildstep for the build runner's package (now the delivery SDK's steprun). // // A module compiles against the mesh-sdk version it pins, so a source that still names a removed package builds until the // pin moves, and then breaks in a delivery of its own; and a later change could bring the import back with the old pin. @@ -8,8 +8,8 @@ // // - an import of a package in Removed (or one under it); // - in a file importing mesh-sdk's buildstep (under any name), a selector naming anything that is not in -// BuildstepContract: what is left of that package is what the delivery parts read, and the runner is -// mesh-build-go's package (git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep). +// BuildstepContract: what is left of that package is what the delivery parts read, and the runner is the +// delivery SDK's package steprun (git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun). // // It reads the non-test and test Go files under modules/ and checks/ (testdata, vendor and node_modules left out). // @@ -35,8 +35,8 @@ const sdk = "git.novox.be/novox/mesh-sdk/go" // Removed are the packages of mesh-sdk that left it, each with where its logic is now. var Removed = map[string]string{ - "buildcpu": "the build runner's package, git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/buildcpu", - "buildstep/conformance": "the build runner's package, git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/conformance", + "buildcpu": "the build runner's package, git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun/buildcpu", + "buildstep/conformance": "the build runner's package, git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun/conformance", "delivery/buildrun": "the builder's package (mesh-delivery-builder), imported by its repository's modules", "compose": "the node-engine, which alone composes (ADR 0593 §6)", "compose/frombus": "the node-engine, which alone composes (ADR 0593 §6)", @@ -140,7 +140,7 @@ func fileFindings(path, rel string) ([]string, error) { return true } seen[sel.Sel.Name] = true - out = append(out, fmt.Sprintf("%s: uses %s.%s, which is the build runner's, no longer mesh-sdk's buildstep; import git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep (novox/hq ADR 0593 §1)", rel, buildstep, sel.Sel.Name)) + out = append(out, fmt.Sprintf("%s: uses %s.%s, which is the build runner's, no longer mesh-sdk's buildstep; import git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun (novox/hq ADR 0593 §1)", rel, buildstep, sel.Sel.Name)) return true }) return out, nil diff --git a/checks/removedpackages/main_test.go b/checks/removedpackages/main_test.go index c5c403c4e..5b4bb4dc7 100644 --- a/checks/removedpackages/main_test.go +++ b/checks/removedpackages/main_test.go @@ -18,11 +18,11 @@ func TestFindingsRefuseWhatMeshSDKGaveUp(t *testing.T) { {"clean", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/delivery\"\n)\n\nvar _ = delivery.StepsState\n", ""}, {"a removed package", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/compose\"\n)\n\nvar _ = compose.Resolve\n", "imports git.novox.be/novox/mesh-sdk/go/compose, which left mesh-sdk; it is the node-engine"}, {"under a removed package", "modules/a/x_test.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/compose/frombus\"\n)\n", "the node-engine"}, - {"buildcpu", "checks/c/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/buildcpu\"\n)\n", "buildstep/buildcpu"}, + {"buildcpu", "checks/c/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/buildcpu\"\n)\n", "steprun/buildcpu"}, {"the runner through mesh-sdk's buildstep", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/buildstep\"\n)\n\nvar _ = buildstep.RunAsk\n", "uses buildstep.RunAsk, which is the build runner's"}, {"the runner through an alias", "modules/a/x.go", head + "\tsdkstep \"git.novox.be/novox/mesh-sdk/go/buildstep\"\n)\n\nvar _ = sdkstep.Puller{}\n", "uses sdkstep.Puller"}, {"the contract of buildstep", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/buildstep\"\n)\n\nvar _ = buildstep.NewID\nvar _ buildstep.Failure\n", ""}, - {"the runner's own package", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep\"\n)\n\nvar _ = buildstep.RunAsk\n", ""}, + {"the runner's own package", "modules/a/x.go", head + "\t\"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun\"\n)\n\nvar _ = steprun.RunAsk\n", ""}, {"a copy in testdata", "modules/a/testdata/x.go", head + "\t\"git.novox.be/novox/mesh-sdk/go/compose\"\n)\n", ""}, } { t.Run(row.name, func(t *testing.T) { diff --git a/modules/mesh-build-go/README.md b/modules/mesh-build-go/README.md index d62555dd2..ceee31df6 100644 --- a/modules/mesh-build-go/README.md +++ b/modules/mesh-build-go/README.md @@ -149,11 +149,11 @@ seat nothing holds, fails the step `not stored: : A build the builder numbers later is published late: the module consumes the builder's `version.numbered` and, for a bundle or an archive with a digest, publishes that held digest under its version, naming its one part by digest and sending nothing (`latepublish.go`); a holder that no longer holds the digest fails the event, which is offered again. Every -ask of a seat a build module makes (a publish, a late publish, an image's copy) is narrated by `buildstep/narrate.go`: +ask of a seat a build module makes (a publish, a late publish, an image's copy) is narrated by the delivery SDK's `steprun/narrate.go`: asked, waiting on the seat every five minutes while it has not answered, stored or refused, each the ask's phase on its running step key (logged outside an ask). A contracts module (a package artifact naming `generated-from`) has its generated Go files regenerated with the seat -generator this module is built with and compared (`buildstep/generated.go`): the unit level of `build_go_test` fails +generator this module is built with and compared (the delivery SDK's `steprun/generated.go`): the unit level of `build_go_test` fails naming each file that differs, is missing or was not written by the generator (its `out-of-step`), and a build ask answers the same files in its answer's `out-of-step`, a failed build's too, so a trunk build's end can raise `generated-types-out-of-step` where no test step runs. Its TypeScript files are mesh-build-node's to compare. @@ -174,19 +174,17 @@ and xz, read in Go as the build agent reads it, issue 1590); it runs no command ## The runner's package, and what a build says at its end (ADR 0593) -- The build runner (the pull of asks, the step lifecycle, the toolchain guard, the fetch, the parsers of `go test -json` and - `node --test`, `Pack`, the conformance kit and the `mesh-pack` command) is this module's package - `git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep`, a Go module of its own in `buildstep/`. mesh-build-node - and mesh-build-image require it and replace it to the sibling directory, since it is the same repository. It is declared - as this module's Go package artifact `buildstep`, series `0.1` (ADR 0606): a user in another repository accepts its - series, never a commit. What the delivery - parts read of a step (the failure contract, the fetch request, the stale-step sweep, the step id) stays in mesh-sdk's - `buildstep`. -- The seat generator (design 26 *Contracts modules*) is the package `buildstep/seatgen` and the command `buildstep/cmd/seatgen`, +- The build runner (the pull of asks, the step lifecycle, the toolchain guard, the fetch and release, the regenerate-and-compare + step, the parsers of `go test -json` and `node --test`, `Pack`) is the delivery SDK's package `steprun` + (`git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/steprun`), with the per-node CPU share `steprun/buildcpu` and + the conformance kit `steprun/conformance` (design 47 G §464, §680). mesh-build-go, mesh-build-node and mesh-build-image + require the delivery SDK at the zero version and keep no copy of it. What every delivery part reads of a step (the + failure contract, the fetch request, the stale-step sweep, the step id) is the delivery SDK's `buildstep`. +- The seat generator (design 26 *Contracts modules*) is the delivery SDK's package `seatgen` and its command `cmd/seatgen`, one program writing a contracts module's Go and TypeScript (`seatgen `; `seatgen -check ` names every path out of - step and runs the client and artifact checks). Its version is buildstep's, so the build input of a compare is the - mesh-build-go (or mesh-build-node) build itself: a new generator is a new build module and a new fingerprint. A contracts - repository runs it as `go run git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/cmd/seatgen@ -check .`. + step and runs the client and artifact checks); `mesh-pack` is the delivery SDK's `cmd/mesh-pack`. The build input of a + compare is the build module's build, which takes the delivery SDK it was built against. A contracts repository runs it + as `go run git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/cmd/seatgen@ -check .`. - `build_go_imports` (a tool, and the last step of a build ask that built an artifact) answers the mesh packages the module's Go programs import: `go list -deps` of each Go bundle's program, tests left out, the packages of the forge outside the module's own directory (a sibling package of its own repository counts), sorted and each once. A build ask carries them as diff --git a/modules/mesh-build-go/buildstep/askrun.go b/modules/mesh-build-go/buildstep/askrun.go deleted file mode 100644 index 4bcb19ae7..000000000 --- a/modules/mesh-build-go/buildstep/askrun.go +++ /dev/null @@ -1,565 +0,0 @@ -package buildstep - -import ( - "context" - "encoding/json" - "fmt" - "maps" - "path" - "slices" - "sort" - "strings" - - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - trunk "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/trunk" -) - -// **One ask, one whole job** (novox/hq ADR 0525 §3). A build module runs a pulled ask with its own step tools' bodies, -// the same ones its request and reply tools run (ADR 0525 §8), in the order the job names: a build ask fetches, then -// builds or copies each artifact; a check ask fetches, digests the level, takes the kept verdicts and tests the rest, -// the packages whose tests the change touches first. The answers are the tools' own, whole, so the asker judges them as -// it judged the tools' answers. - -// StepFunc is one step tool's body: its arguments in, its answer out. -type StepFunc func(ctx context.Context, args map[string]any) (any, error) - -// AskSteps are the step tools a build module runs an ask with. Copy is the image module's alone; Digest the Go module's. -type AskSteps struct { - Fetch, Build, Copy, Digest, Test StepFunc - // Imports reads the mesh packages the built programs import (the Go module's alone, ADR 0593 §2): it answers - // {"imports": [...]}, sorted, from the workspace the build ran in. A build that built an artifact asks it once, at - // its end; nil reports none. - Imports StepFunc - // Compare regenerates a contracts module's generated files (a package artifact naming generated-from) and answers - // {"out-of-step": [...]} (CompareStep): a build ask runs it once on the fetched workspace and answers the paths in - // its out-of-step, a failed build's too, so a trunk build's end names them where no test step runs. Nil compares none. - Compare StepFunc - // Toolchain is the toolchain the module builds with now; a build ask naming another is declined (Declining). Nil checks nothing - // (an image or an archive names none). - Toolchain func(ctx context.Context) (sdkstep.ToolchainUsed, error) - // Kept looks up a kept verdict by level and digest (the checker's kept bucket, the checker seat's kept key): whether one is - // kept and how many tests it counted. Nil takes none. - Kept func(ctx context.Context, level, digest string) (tests int, found bool, err error) - // Release removes a workspace once the ask's steps on it ended (the module's release tool's body); nil leaves it to - // the module's sweep. - Release func(workspace string) error - Logf func(format string, args ...any) - // Has says whether this node has a need a package's tests declare (sdkstep.AskNeeds, issue 890); a package needing - // what it lacks is not tested here but named in the level's Unmet, for the asker to place. Nil has nothing. - Has func(need string) bool - // Lint is the module's lint body for a pipeline step lint (novox/hq ADR 0666 §7): it takes the workspace and the - // module's directory and answers a LintAnswer. Nil ends every lint step as nothing to run. - Lint StepFunc - // Node is the node this holder runs on, which a step's end names; SayStep says a pipeline step's end as the seat's - // event step-ended on that node's subject (sdkstep.StepEndedSubject), under the ask's id. Nil runs no step ask. - Node string - SayStep func(end sdkstep.StepEnded) error -} - -// RunAsk runs ask's job with steps and answers a sdkstep.BuildAnswer or a sdkstep.CheckAnswer. -func RunAsk(ctx context.Context, steps AskSteps, ask sdkstep.StepAsk) (any, error) { - if ask.Build != nil { - job := *ask.Build - job.Fetch = withPackages(job.Fetch, ask.Packages) - return steps.build(ctx, job) - } - if ask.Step != nil { - return steps.runStep(ctx, ask) - } - if ask.Check != nil { - job := *ask.Check - job.Fetch = *withPackages(&job.Fetch, ask.Packages) - return steps.check(ctx, job) - } - return nil, Refuse("the ask %s holds no job", ask.ID) -} - -// withPackages is the fetch's arguments with the ask's package versions (novox/hq ADR 0573 §2), which the build module -// writes into the workspace it fetches; a copy, so the ask is left as it was. An ask with none, or a copy alone that -// fetches nothing, is left as it is. -func withPackages(fetch *sdkstep.Fetch, packages sdkstep.PackageVersions) *sdkstep.Fetch { - if len(packages) == 0 || fetch == nil { - return fetch - } - out := *fetch - out.Packages = maps.Clone(packages) - return &out -} - -// FetchArgs is a fetch as the fetch tool takes it (sdkstep.FetchRequest's Args and the build module's own, beside): the -// ask's fetch through the one JSON form, without the layout version, which no tool takes. -func FetchArgs(f sdkstep.Fetch) (map[string]any, error) { - b, err := json.Marshal(f) - if err != nil { - return nil, err - } - args := map[string]any{} - if err := json.Unmarshal(b, &args); err != nil { - return nil, err - } - delete(args, "v") - return args, nil -} - -func raw(v any) (json.RawMessage, error) { - if r, ok := v.(json.RawMessage); ok { - return r, nil - } - return json.Marshal(v) -} - -// fetched is what an ask reads of a fetch's answer. -type fetched struct { - Workspace string `json:"workspace"` - Merge string `json:"merge"` - Conflicts []string `json:"conflicts"` - Changed []string `json:"changed"` - Modules []string `json:"modules"` -} - -func (s AskSteps) fetch(ctx context.Context, fetch *sdkstep.Fetch) (json.RawMessage, fetched, error) { - if s.Fetch == nil { - return nil, fetched{}, Refuse("this build module fetches nothing") - } - if fetch == nil { - return nil, fetched{}, Refuse("the ask names no fetch") - } - args, err := FetchArgs(*fetch) - if err != nil { - return nil, fetched{}, err - } - if fetch.Base != "" { - Phase(ctx, "fetch and merge") - } else { - Phase(ctx, "fetch") - } - out, err := s.Fetch(ctx, args) - if err != nil { - return nil, fetched{}, err - } - r, err := raw(out) - if err != nil { - return nil, fetched{}, err - } - var f fetched - if err := json.Unmarshal(r, &f); err != nil || f.Workspace == "" { - return r, f, fmt.Errorf("the fetch answered no workspace: %s", r) - } - return r, f, nil -} - -// onToolchain is the toolchain this node builds with when the ask names one and this module reports its own, nil when -// either is absent. A node on another toolchain than the ask names answers a Declining: it is not on the agreed one and -// sits out, for a node that is to take the ask (novox/hq ADR 0584 clause 2). -func (s AskSteps) onToolchain(ctx context.Context, want *sdkstep.ToolchainUsed) (*sdkstep.ToolchainUsed, error) { - if want == nil || s.Toolchain == nil { - return nil, nil - } - tc, err := s.Toolchain(ctx) - if err != nil { - return nil, err - } - if tc.Version != want.Version || tc.Recipe != want.Recipe { - return nil, &Declining{Lacks: []string{fmt.Sprintf("the agreed toolchain %s (recipe %s)", want.Version, want.Recipe)}, - Text: fmt.Sprintf("the ask is for %s (recipe %s) and this node builds with %s (recipe %s): it sits out, and the ask is left to a node on the agreed toolchain", - want.Version, want.Recipe, tc.Version, tc.Recipe)} - } - return &tc, nil -} - -func (s AskSteps) build(ctx context.Context, job sdkstep.BuildJob) (any, error) { - answer := sdkstep.BuildAnswer{} - tc, err := s.onToolchain(ctx, job.Toolchain) - if err != nil { - return nil, err - } - answer.Toolchain = tc - var f fetched - defer func() { s.release(f.Workspace) }() - for _, a := range job.Artifacts { - if a.From == "" && f.Workspace == "" { - r, got, err := s.fetch(ctx, job.Fetch) - if err != nil { - return nil, err - } - if job.Fetch.Base != "" { - // A candidate is built from its head merged onto the trunk; a head that does not merge leaves the tree at the - // trunk, and building that would store the trunk's build under the candidate's fingerprint. - if len(got.Conflicts) > 0 { - return nil, fmt.Errorf("the head does not merge into the trunk: files in conflict: %s", strings.Join(got.Conflicts, ", ")) - } - if got.Merge == "" { - return nil, fmt.Errorf("the fetch with a base answered no merge: %s", r) - } - } - f = got - if s.Compare != nil { - Phase(ctx, "compare the generated files") - out, err := s.Compare(ctx, map[string]any{"workspace": f.Workspace, "module": job.Path}) - if err != nil { - return nil, fmt.Errorf("the generated files of %s: %w", job.Module, err) - } - r, err := raw(out) - if err != nil { - return nil, err - } - var read struct { - OutOfStep []string `json:"out-of-step"` - } - if err := json.Unmarshal(r, &read); err != nil { - return nil, fmt.Errorf("the compare of %s answered what is not a list: %s", job.Module, r) - } - answer.OutOfStep = read.OutOfStep - } - } - var ( - out any - err error - ) - if a.From != "" { - if s.Copy == nil { - return nil, Refuse("this build module copies no artifact (%s)", a.Artifact) - } - Phase(ctx, "copy "+a.Artifact) - out, err = s.Copy(ctx, map[string]any{"module": job.Module, "artifact": a.Artifact, "from": a.From}) - } else { - if s.Build == nil { - return nil, Refuse("this build module builds no artifact (%s)", a.Artifact) - } - args := map[string]any{"workspace": f.Workspace, "module": job.Path, "artifact": a.Artifact} - if job.Publish { - args["publish"] = true - } - // The fingerprint a build kept for the artifact store's holder is asked by (kept-artifact, milestone 47/G W12.5). - if job.Fp != "" { - args["fp"] = job.Fp - } - // The seat it is published through and the version the builder gave it (design 51 *Publishing*, CAT-BG2). - if a.Seat != "" { - args["seat"] = a.Seat - } - if a.Version != "" { - args["version"] = a.Version - } - Phase(ctx, "build "+a.Artifact) - out, err = s.Build(ctx, args) - } - if err != nil { - // The compare's out-of-step is answered with the failure, so the build's end still names it. - if len(answer.OutOfStep) > 0 { - return answer, fmt.Errorf("%s: %w", a.Artifact, err) - } - return nil, fmt.Errorf("%s: %w", a.Artifact, err) - } - r, err := raw(out) - if err != nil { - return nil, err - } - var built struct { - Digest string `json:"digest"` - Reference string `json:"reference"` - Kept string `json:"kept"` - } - if err := json.Unmarshal(r, &built); err != nil || built.Digest == "" { - return nil, fmt.Errorf("the build of %s answered no digest: %s", a.Artifact, r) - } - answer.Artifacts = append(answer.Artifacts, sdkstep.AskBuilt{Artifact: a.Artifact, Digest: built.Digest, Reference: built.Reference}) - if built.Kept != "" { - answer.Kept = strings.TrimPrefix(built.Kept, "sha256:") - } - } - if s.Imports != nil && f.Workspace != "" { - out, err := s.Imports(ctx, map[string]any{"workspace": f.Workspace, "module": job.Path}) - if err != nil { - return nil, fmt.Errorf("the imports of %s: %w", job.Module, err) - } - r, err := raw(out) - if err != nil { - return nil, err - } - var read struct { - Imports []string `json:"imports"` - } - if err := json.Unmarshal(r, &read); err != nil { - return nil, fmt.Errorf("the imports of %s answered what is not a list: %s", job.Module, r) - } - if err := trunk.CheckImports(read.Imports); err != nil { - return nil, err - } - answer.Imports = read.Imports - } - return answer, nil -} - -func (s AskSteps) check(ctx context.Context, job sdkstep.CheckJob) (any, error) { - if _, err := s.onToolchain(ctx, job.Toolchain); err != nil { - return nil, err - } - r, f, err := s.fetch(ctx, &job.Fetch) - if err != nil { - return nil, err - } - defer s.release(f.Workspace) - answer := sdkstep.CheckAnswer{} - if err := json.Unmarshal(r, &answer.Fetch); err != nil { - return nil, fmt.Errorf("the fetch answered what is not a fetch answer: %s: %w", r, err) - } - if len(f.Conflicts) > 0 { - return answer, nil // the asker reads the conflict from the fetch's answer: a verdict, not an error - } - if s.Test == nil { - return nil, Refuse("this build module tests nothing") - } - runner := "" - if job.Runner != "" && (job.RunnerWhen == "" || changesUnder(f.Changed, job.RunnerWhen)) { - runner = job.Runner - } - // Every level runs, also after one that did not pass: one check names every failure, not only the first (the operator, - // 2026-11-02: "A failed check shows only its first fault"). - for _, level := range job.Levels { - la := sdkstep.LevelAnswer{Level: level} - _, err := s.level(ctx, job, level, f, runner, &la) - answer.Levels = append(answer.Levels, la) - if err != nil { - return nil, err - } - } - return answer, nil -} - -// level runs one level of a check ask and says whether it passed. -func (s AskSteps) level(ctx context.Context, job sdkstep.CheckJob, level string, f fetched, runner string, la *sdkstep.LevelAnswer) (bool, error) { - withRunner := func(args map[string]any) map[string]any { - if runner != "" { - args["runner"] = runner - } - if len(job.NodeNames) > 0 { - args[sdkstep.NodeNamesArg] = job.NodeNames // the names check's (ADR 0567 §12) - } - return args - } - test := func(args map[string]any) (bool, error) { - what := "the whole level" - if dir, _ := args["module"].(string); dir != "" { - what = dir - } else if pkgs, _ := args["packages"].([]string); len(pkgs) > 0 { - what = fmt.Sprintf("%d packages", len(pkgs)) - } - Phase(ctx, fmt.Sprintf("%s: tests of %s", level, what)) - out, err := s.Test(ctx, args) - if err != nil { - return false, err - } - r, err := raw(out) - if err != nil { - return false, err - } - la.Tests = append(la.Tests, r) - var t struct { - Passed bool `json:"passed"` - } - _ = json.Unmarshal(r, &t) - return t.Passed, nil - } - // The packages (or Node directories) whose tests the change touches run first (issue 1289; ADR 0444), and then every - // other test step of the level, also after one that did not pass, so one check names every failing test of the level - // and not only the first (issue 1921; the operator, 2026-11-02); the level passes only when each of its steps did. - all := true - if s.Digest == nil { - // A module with no digest (Node) tests each module directory of the tree, those whose tests changed first. - for _, priority := range []bool{true, false} { - for _, dir := range f.Modules { - if changesTestIn(f.Changed, dir) != priority { - continue - } - passed, err := test(withRunner(map[string]any{"workspace": f.Workspace, "module": dir, "level": level})) - if err != nil { - return false, fmt.Errorf("the %s level of %s: %w", level, dir, err) - } - all = all && passed - } - } - return all, nil - } - todo, whole, keepRunner := s.plan(ctx, job, level, f, runner, withRunner, la) - if !keepRunner { - runner = "" // an installed module that ignores the runner judges the level as it judges any other (ADR 0535 §2) - } - if whole && len(job.Packages) > 0 { - todo, whole = job.Packages, false // a placed ask tests its packages alone, whatever the digest said (ADR 0552 §4) - } - for _, priority := range []bool{true, false} { - args := withRunner(map[string]any{"workspace": f.Workspace, "level": level}) - if job.Run != "" { - args["run"] = job.Run - } - if whole { - if priority { - continue // nothing to put first: the level runs whole after - } - } else { - var run []string - for _, p := range todo { - if changesTestOf(f.Changed, p) == priority { - run = append(run, p) - } - } - if len(run) == 0 { - continue - } - args["packages"] = run - } - passed, err := test(args) - if err != nil { - return false, fmt.Errorf("the %s level: %w", level, err) - } - all = all && passed // the others still run after a failure (issue 1921) - } - return all, nil -} - -// release removes an ask's workspace, saying a failure: the module's sweep removes it later. -func (s AskSteps) release(workspace string) { - if workspace == "" || s.Release == nil { - return - } - if err := s.Release(workspace); err != nil && s.Logf != nil { - s.Logf("the workspace %s is left to the sweep: %v", workspace, err) - } -} - -// plan digests the level and takes the kept verdicts: the packages left to test, or all when the level runs whole, and -// whether the runner stays. A try of some tests runs whole, digesting nothing (a partial run proves no package). Under the -// candidate's runner the digest is asked as the candidate: when the candidate answers it, every package runs and nothing -// is digested for keeping (ADR 0535 §4); when the installed module answers it (it does not take the runner), the level is -// planned as any other and the runner is dropped. The level runs whole and takes nothing when the digest names no package -// or does not cover the siblings the fetch placed (ADR 0444, L5). -func (s AskSteps) plan(ctx context.Context, job sdkstep.CheckJob, level string, f fetched, runner string, withRunner func(map[string]any) map[string]any, la *sdkstep.LevelAnswer) ([]string, bool, bool) { - if job.Run != "" { - return nil, true, true - } - Phase(ctx, level+": digest") - out, err := s.Digest(ctx, withRunner(map[string]any{"workspace": f.Workspace, "level": level})) - if err != nil { - if s.Logf != nil { - s.Logf("no digest of the %s level, so it runs whole: %v", level, err) - } - return nil, true, true - } - r, err := raw(out) - if err != nil { - return nil, true, true - } - var d sdkstep.LevelDigest // packages kept as a sorted list, never keyed by a package path (issue 1930) - if err := json.Unmarshal(r, &d); err != nil { - return nil, true, true - } - if runner != "" { - if strings.HasPrefix(d.JudgedBy, "candidate ") { - la.Judged = d.JudgedBy - return nil, true, true // the candidate decides which verdicts would be taken: all run, nothing kept - } - runner = "" - } - if len(d.Packages) == 0 || !slices.Equal(d.Beside, besideOf(job.Fetch)) { - return nil, true, runner != "" // a digest that names nothing or not the siblings keys no verdict: the level runs whole - } - la.Digest = &d - only := map[string]bool{} - for _, p := range job.Packages { - only[p] = true - } - var todo []string - for _, pd := range d.Packages { - p := pd.Package - if len(only) > 0 && !only[p] { - continue // a placed ask's other packages were judged by the first ask (ADR 0552 §4) - } - if job.Kept && s.Kept != nil { - tests, found, err := s.Kept(ctx, level, pd.Digest) - if err != nil && s.Logf != nil { - s.Logf("the kept verdict of %s at %s cannot be read, so it runs: %v", p, level, err) - } - if err == nil && found { - la.Kept = append(la.Kept, sdkstep.KeptTaken{Package: p, Digest: pd.Digest, Tests: tests}) - continue - } - } - if needs := d.NeedsOf(p); len(sdkstep.Lacks(needs, s.Has)) > 0 { - // Its tests would only skip here (issue 890): it is left for a node that has what they need. - la.Unmet = append(la.Unmet, sdkstep.PackageNeeds{Package: p, Needs: needs}) - if s.Logf != nil { - s.Logf("the %s level of %s is left to a node with %s: this node lacks %s", level, p, - strings.Join(needs, ", "), strings.Join(sdkstep.Lacks(needs, s.Has), ", ")) - } - continue - } - todo = append(todo, p) - } - return todo, false, false -} - -// besideOf are the siblings a fetch's arguments place, as a digest echoes them: ` `, sorted. -func besideOf(fetch sdkstep.Fetch) []string { - var out []string - for _, r := range fetch.Beside { - out = append(out, r.Repository+" "+r.Commit) - } - sort.Strings(out) - return out -} - -// changesUnder says whether a path the merge changes is under prefix. -func changesUnder(changed []string, prefix string) bool { - for _, p := range changed { - if strings.HasPrefix(p, prefix) { - return true - } - } - return false -} - -// isTestFile says whether a repository-relative path is a test file: Go's _test.go, and a TypeScript module's .test. -// and .spec. files and test directories. -func isTestFile(p string) bool { - switch { - case strings.HasSuffix(p, "_test.go"): - return true - case strings.Contains(p, ".test.") || strings.Contains(p, ".spec."): - return true - } - for _, seg := range strings.Split(path.Dir(p), "/") { - if seg == "__tests__" || seg == "test" || seg == "tests" { - return true - } - } - return false -} - -// changesTestOf says whether the merge changes a test file of the Go package with the import path pkg: the file's -// directory and the import path agree on their last segments. -func changesTestOf(changed []string, pkg string) bool { - for _, f := range changed { - if !strings.HasSuffix(f, "_test.go") { - continue - } - dir := path.Dir(f) - if dir == pkg || strings.HasSuffix(pkg, "/"+dir) || strings.HasSuffix(dir, "/"+pkg) { - return true - } - } - return false -} - -// changesTestIn says whether the merge changes a test file inside the directory of a Node module. -func changesTestIn(changed []string, dir string) bool { - for _, f := range changed { - if !isTestFile(f) || strings.HasSuffix(f, "_test.go") { - continue - } - if dir == "." || dir == "" || strings.HasPrefix(f, strings.TrimSuffix(dir, "/")+"/") { - return true - } - } - return false -} diff --git a/modules/mesh-build-go/buildstep/askrun_test.go b/modules/mesh-build-go/buildstep/askrun_test.go deleted file mode 100644 index a8fbed2b2..000000000 --- a/modules/mesh-build-go/buildstep/askrun_test.go +++ /dev/null @@ -1,470 +0,0 @@ -package buildstep - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "slices" - "strings" - "testing" - "time" - - nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" - nodebuildnode "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -const runCommit = "0123456789abcdef0123456789abcdef01234567" - -// recorder is a build module's step tools that record each call. -type recorder struct { - calls []string - fetch map[string]any - tests map[string]bool // package or module directory -> passed - digests map[string]string - needs []sdkstep.PackageNeeds -} - -func (r *recorder) steps() AskSteps { - call := func(name string, answer func(args map[string]any) any) StepFunc { - return func(ctx context.Context, args map[string]any) (any, error) { - b, _ := json.Marshal(args) - r.calls = append(r.calls, name+" "+string(b)) - return answer(args), nil - } - } - return AskSteps{ - Fetch: call("fetch", func(map[string]any) any { return r.fetch }), - Build: call("build", func(args map[string]any) any { - return map[string]any{"digest": "sha256:" + args["artifact"].(string), "reference": "artifact-store://" + args["artifact"].(string)} - }), - Copy: call("copy", func(args map[string]any) any { return map[string]any{"digest": "sha256:copied"} }), - Digest: call("digest", func(map[string]any) any { - return map[string]any{"level": "unit", "packages": r.digests, "needs": r.needs} - }), - Test: call("test", func(args map[string]any) any { - passed := true - if pkgs, ok := args["packages"].([]string); ok { - for _, p := range pkgs { - passed = passed && r.tests[p] - } - } - if dir, ok := args["module"].(string); ok { - passed = r.tests[dir] - } - return map[string]any{"passed": passed, "tests": 1} - }), - Kept: func(ctx context.Context, level, digest string) (int, bool, error) { return 7, digest == "d-kept", nil }, - } -} - -func ask(job any) sdkstep.StepAsk { - a := sdkstep.StepAsk{ID: sdkstep.NewID(), Kind: sdkstep.AskCheck, Language: sdkstep.AskGo, Asker: "t", At: time.Now()} - switch j := job.(type) { - case sdkstep.BuildJob: - a.Build = &j - case sdkstep.CheckJob: - a.Check = &j - } - return a -} - -// 1887/A3: a build ask fetches once, builds each artifact from the workspace with publish, copies a pinned one without a -// fetch, and answers each artifact's digest and reference; an artifact's seat and the version the builder gave it reach -// its build (CAT-BG2). -func TestRunAskBuilds(t *testing.T) { - r := &recorder{fetch: map[string]any{"workspace": "/w/1"}} - steps := r.steps() - var released []string - steps.Release = func(ws string) error { released = append(released, ws); return nil } - // ADR 0593 §2: a Go module's build ends by saying which mesh packages its programs import. - steps.Imports = func(ctx context.Context, args map[string]any) (any, error) { - b, _ := json.Marshal(args) - r.calls = append(r.calls, "imports "+string(b)) - return map[string]any{"imports": []string{"git.novox.be/novox/mesh-sdk/go/announce", "git.novox.be/novox/mesh-sdk/go/health"}}, nil - } - // Issue 1585: the ask's package versions reach the fetch, and the ask's own fetch arguments stay as they were. - a := ask(sdkstep.BuildJob{Module: "m", Path: "modules/m", Publish: true, - Fetch: &sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}, - Artifacts: []sdkstep.AskArtifact{{Artifact: "base", From: "registry/b@sha256:00"}, {Artifact: "bundle"}, {Artifact: "lib", Seat: "go-package-registry", Version: "v0.1.15"}}}) - a.Packages = sdkstep.PackageVersions{"git.novox.be/novox/mesh-sdk/go": runCommit} - out, err := RunAsk(context.Background(), steps, a) - if err != nil { - t.Fatal(err) - } - if len(a.Build.Fetch.Packages) != 0 { - t.Error("the ask's fetch arguments were changed") - } - got := strings.Join(r.calls, "\n") - want := `copy {"artifact":"base","from":"registry/b@sha256:00","module":"m"} -fetch {"commit":"` + runCommit + `","packages":{"git.novox.be/novox/mesh-sdk/go":"` + runCommit + `"},"repository":"novox/x"} -build {"artifact":"bundle","module":"modules/m","publish":true,"workspace":"/w/1"} -build {"artifact":"lib","module":"modules/m","publish":true,"seat":"go-package-registry","version":"v0.1.15","workspace":"/w/1"} -imports {"module":"modules/m","workspace":"/w/1"}` - if got != want { - t.Fatalf("calls:\n%s\nwant:\n%s", got, want) - } - if len(released) != 1 || released[0] != "/w/1" { - t.Errorf("released %v, want the one workspace", released) - } - answer := out.(sdkstep.BuildAnswer) - if len(answer.Artifacts) != 3 || answer.Artifacts[1].Reference != "artifact-store://bundle" { - t.Fatalf("answer %+v", answer) - } - if !slices.Equal(answer.Imports, []string{"git.novox.be/novox/mesh-sdk/go/announce", "git.novox.be/novox/mesh-sdk/go/health"}) { - t.Errorf("the answer's imports are %v", answer.Imports) - } -} - -// A build ask for another toolchain is declined (ADR 0584 clause 2), so the node sits out and the asker puts it again. -func TestRunAskRefusesAnotherToolchain(t *testing.T) { - r := &recorder{fetch: map[string]any{"workspace": "/w"}} - s := r.steps() - s.Toolchain = func(context.Context) (sdkstep.ToolchainUsed, error) { - return sdkstep.ToolchainUsed{Version: "go1.27", Recipe: "3"}, nil - } - _, err := RunAsk(context.Background(), s, ask(sdkstep.BuildJob{Module: "m", Path: ".", Fetch: &sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}, - Artifacts: []sdkstep.AskArtifact{{Artifact: "bundle"}}, Toolchain: &sdkstep.ToolchainUsed{Version: "go1.26", Recipe: "3"}})) - var dec *Declining - if !errors.As(err, &dec) || len(dec.Lacks) != 1 || len(r.calls) != 0 { - t.Fatalf("err %v, calls %v", err, r.calls) - } - // A check ask names the toolchain too (ADR 0584 clause 2), and a node on another declines it before it fetches. - check := ask(sdkstep.CheckJob{Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}, Levels: []string{sdkstep.LevelUnit}, - Toolchain: &sdkstep.ToolchainUsed{Version: "go1.26", Recipe: "3"}}) - _, err = RunAsk(context.Background(), s, check) - if !errors.As(err, &dec) || len(r.calls) != 0 { - t.Fatalf("a check ask: err %v, calls %v", err, r.calls) - } -} - -// 1887/A3, A5a: a check ask runs the levels of one check after one fetch: it digests the unit level, takes the kept -// verdicts, tests the packages whose tests changed first and then the others, also after one of them failed, and runs -// every level, also after one that did not pass, so one check names every failure (the operator, 2026-11-02). -func TestRunAskChecksTheLevelsOfOneCheck(t *testing.T) { - r := &recorder{ - fetch: map[string]any{"workspace": "/w", "changed": []string{"pkg/b/b_test.go"}}, - digests: map[string]string{"x/pkg/a": "d-a", "x/pkg/b": "d-b", "x/pkg/k": "d-kept"}, - tests: map[string]bool{"x/pkg/a": true, "x/pkg/b": false}, - } - out, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit, sdkstep.LevelIntegration}, Kept: true, - Runner: "workspace", RunnerWhen: "modules/mesh-build-go/", Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit, Base: runCommit}})) - if err != nil { - t.Fatal(err) - } - got := strings.Join(r.calls, "\n") - want := `fetch {"base":"` + runCommit + `","commit":"` + runCommit + `","repository":"novox/x"} -digest {"level":"unit","workspace":"/w"} -test {"level":"unit","packages":["x/pkg/b"],"workspace":"/w"} -test {"level":"unit","packages":["x/pkg/a"],"workspace":"/w"} -digest {"level":"integration","workspace":"/w"} -test {"level":"integration","packages":["x/pkg/b"],"workspace":"/w"} -test {"level":"integration","packages":["x/pkg/a"],"workspace":"/w"}` - if got != want { - t.Fatalf("calls:\n%s\nwant:\n%s", got, want) - } - a := out.(sdkstep.CheckAnswer) - if a.Fetch.Workspace != "/w" || !slices.Equal(a.Fetch.Changed, []string{"pkg/b/b_test.go"}) { - t.Fatalf("the answer's fetch is the tool's whole answer, typed: %+v", a.Fetch) - } - if len(a.Levels) != 2 { - t.Fatalf("levels %+v, want both levels", a.Levels) - } - u := a.Levels[0] - if u.Level != sdkstep.LevelUnit || len(u.Kept) != 1 || u.Kept[0].Package != "x/pkg/k" || u.Kept[0].Tests != 7 || len(u.Tests) != 2 || u.Digest == nil { - t.Fatalf("the unit level %+v", u) - } - - // ADR 0567 §12: a check's node names reach the digest and test tools, for the names check (a kept verdict misses when - // they change). - r.calls = nil - if _, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, NodeNames: []string{"anchor"}, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})); err != nil || !strings.Contains(strings.Join(r.calls, "\n"), `digest {"level":"unit","node-names":["anchor"]`) || - !strings.Contains(strings.Join(r.calls, "\n"), `test {"level":"unit","node-names":["anchor"]`) { - t.Fatalf("the node names are not handed to the digest and test tools: %v, %v", r.calls, err) - } - - // Issue 890/AC2: a package declaring node-build-node is not tested on a node that lacks it but named unmet, and is - // tested on a node that has it. - for _, has := range []bool{false, true} { - r.calls, r.tests["x/pkg/b"] = nil, true - r.needs = []sdkstep.PackageNeeds{{Package: "x/pkg/a", Needs: []string{sdkstep.NeedNodeBuildNode}}} - steps := r.steps() - if has { - steps.Has = func(n string) bool { return n == sdkstep.NeedNodeBuildNode } - } - out, err := RunAsk(context.Background(), steps, ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Kept: true, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - u := out.(sdkstep.CheckAnswer).Levels[0] - tested := strings.Contains(strings.Join(r.calls, "\n"), `"x/pkg/a"`) - if tested != has || (len(u.Unmet) == 0) == !has || (!has && (u.Unmet[0].Package != "x/pkg/a" || sdkstep.UnmetNeeds([]sdkstep.LevelAnswer{u})[0] != sdkstep.NeedNodeBuildNode)) { - t.Fatalf("has %v: tested x/pkg/a %v, unmet %+v, calls %v", has, tested, u.Unmet, r.calls) - } - } - // A placed ask naming its packages tests those alone and takes no other's kept verdict, also when the level would - // run whole (ADR 0552 §4). - for _, digests := range []map[string]string{r.digests, nil} { - r.calls, r.digests = nil, digests - steps := r.steps() - steps.Has = func(string) bool { return true } - out, err := RunAsk(context.Background(), steps, ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Kept: true, Packages: []string{"x/pkg/a"}, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - u := out.(sdkstep.CheckAnswer).Levels[0] - if last := r.calls[len(r.calls)-1]; !strings.HasSuffix(last, `"packages":["x/pkg/a"],"workspace":"/w"}`) || len(u.Kept) != 0 || len(u.Tests) != 1 { - t.Fatalf("digests %v: calls %v, kept %+v: want x/pkg/a alone tested, nothing taken kept", digests != nil, r.calls, u.Kept) - } - } -} - -// ADR 0535 §2, §4: a merge that changes the build module's own code is judged by the candidate's runner: its digest says -// the candidate ran, and every package runs with nothing kept; an installed module that ignores the runner is planned as -// any other, the runner dropped. A digest that does not cover the fetch's siblings runs the level whole too. -func TestRunAskRunsWholeUnderTheRunnerOrWithoutTheSiblings(t *testing.T) { - for _, tc := range []struct{ judged, want string }{ - {"candidate 999", `digest {"level":"unit","runner":"workspace","workspace":"/w"} -test {"level":"unit","runner":"workspace","workspace":"/w"}`}, - {"installed", `digest {"level":"unit","runner":"workspace","workspace":"/w"}`}, - } { - r := &recorder{fetch: map[string]any{"workspace": "/w", "changed": []string{"modules/mesh-build-go/x.go"}}, - digests: map[string]string{"x/pkg/a": "d-kept"}, tests: map[string]bool{}} - steps := r.steps() - digest := steps.Digest - steps.Digest = func(ctx context.Context, args map[string]any) (any, error) { - _, _ = digest(ctx, args) - return map[string]any{"level": "unit", "packages": r.digests, "judged_by": tc.judged}, nil - } - out, err := RunAsk(context.Background(), steps, ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Kept: true, - Runner: "workspace", RunnerWhen: "modules/mesh-build-go/", Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - if got := strings.Join(r.calls[1:], "\n"); got != tc.want { - t.Errorf("judged by %s: calls\n%s\nwant\n%s", tc.judged, got, tc.want) - } - l := out.(sdkstep.CheckAnswer).Levels[0] - if tc.judged == "installed" && (len(l.Kept) != 1 || l.Judged != "") { - t.Errorf("an installed module's level %+v, want the kept verdict taken", l) - } - if tc.judged != "installed" && (len(l.Kept) != 0 || l.Digest != nil || l.Judged != tc.judged) { - t.Errorf("the candidate's level %+v, want nothing kept and the program named", l) - } - } - r := &recorder{fetch: map[string]any{"workspace": "/w"}, digests: map[string]string{"x/pkg/a": "d-kept"}, tests: map[string]bool{}} - out, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Kept: true, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit, Beside: []sdkstep.FetchBeside{{Repository: "novox/mesh-sdk", Commit: runCommit}}}})) - if err != nil { - t.Fatal(err) - } - if l := out.(sdkstep.CheckAnswer).Levels[0]; len(l.Kept) != 0 || l.Digest != nil { - t.Fatalf("a digest without the siblings kept %+v", l) - } -} - -// A Node check tests each module directory, the one whose tests changed first; a conflict ends the ask with the fetch -// alone, a verdict for the asker. -func TestRunAskChecksNodeModulesAndConflicts(t *testing.T) { - r := &recorder{fetch: map[string]any{"workspace": "/w", "modules": []string{"a", "b"}, "changed": []string{"b/test/x.test.ts"}}, - tests: map[string]bool{"a": true, "b": true}} - s := r.steps() - s.Digest = nil - if _, err := RunAsk(context.Background(), s, ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})); err != nil { - t.Fatal(err) - } - if fmt.Sprint(r.calls[1:]) != `[test {"level":"unit","module":"b","workspace":"/w"} test {"level":"unit","module":"a","workspace":"/w"}]` { - t.Fatalf("calls %v", r.calls) - } - r = &recorder{fetch: map[string]any{"workspace": "/w", "conflicts": []string{"go.mod"}}} - out, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil || len(r.calls) != 1 || len(out.(sdkstep.CheckAnswer).Levels) != 0 { - t.Fatalf("a conflict: %v %v", err, r.calls) - } -} - -// Issue 1289: the packages whose tests changed run first. Since 2026-11-02 (the operator: "A failed check shows only its -// first fault") a failure among them ends nothing: every package of the level and every level still runs, so one check -// names every failing test (issue 1921). A Node check does the same with its module directories. -func TestRunAskRunsEveryPackageAndLevelAfterAFailure(t *testing.T) { - for _, row := range []struct { - name string - changed []string - tests map[string]bool - want []string // the packages tested at each level, in order - }{ - {"the change's own test fails: the rest still runs", []string{"pkg/b/b_test.go"}, map[string]bool{"x/pkg/a": false, "x/pkg/b": false}, []string{"x/pkg/b", "x/pkg/a"}}, - {"the change's own test passes: the rest runs, also after a failure", []string{"pkg/b/b_test.go"}, map[string]bool{"x/pkg/a": false, "x/pkg/b": true, "x/pkg/c": false}, []string{"x/pkg/b", "x/pkg/a x/pkg/c"}}, - {"no test changed: every failure is named", nil, map[string]bool{"x/pkg/a": false, "x/pkg/b": false}, []string{"x/pkg/a x/pkg/b"}}, - } { - r := &recorder{fetch: map[string]any{"workspace": "/w", "changed": row.changed}, tests: row.tests, - digests: map[string]string{"x/pkg/a": "d-a", "x/pkg/b": "d-b"}} - if _, ok := row.tests["x/pkg/c"]; ok { - r.digests["x/pkg/c"] = "d-c" - } - out, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit, sdkstep.LevelIntegration}, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - var got []string - for _, c := range r.calls[1:] { - if strings.HasPrefix(c, "test ") { - var a struct{ Packages []string } - _ = json.Unmarshal([]byte(strings.TrimPrefix(c, "test ")), &a) - got = append(got, strings.Join(a.Packages, " ")) - } - } - if want := append(slices.Clone(row.want), row.want...); fmt.Sprint(got) != fmt.Sprint(want) { - t.Errorf("%s: tested %v, want %v", row.name, got, want) - } - if a := out.(sdkstep.CheckAnswer); len(a.Levels) != 2 || len(a.Levels[0].Tests) != len(row.want) { - t.Errorf("%s: levels %+v, want both, each with every test result", row.name, a.Levels) - } - } - - r := &recorder{fetch: map[string]any{"workspace": "/w", "modules": []string{"a", "b"}, "changed": []string{"b/test/x.test.ts"}}, - tests: map[string]bool{"a": true, "b": false}} - s := r.steps() - s.Digest = nil - out, err := RunAsk(context.Background(), s, ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit, sdkstep.LevelIntegration}, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - if a := out.(sdkstep.CheckAnswer); len(r.calls) != 5 || len(a.Levels) != 2 || len(a.Levels[0].Tests) != 2 { - t.Fatalf("calls %v, levels %+v: want b then a at each of the two levels", r.calls, a.Levels) - } -} - -// A seat's own ask type (the generated one of any of the three build seats) is the neutral ask through the form's one -// conversion (sdkstep.AskOf), reads for its step description through the same conversion (askRead), and reaches the -// fetch tool as the fetch's arguments alone: no layout version, nothing of the ask's. -func TestASeatsAskTypeRunsAsTheNeutralAsk(t *testing.T) { - at := time.Now().UTC() - fetch := &nodebuildgo.Fetch{Commit: runCommit, Repository: "novox/x", Dir: "modules/m", Paths: []string{"src"}} - goAsk := nodebuildgo.StepAsk{V: sdkstep.StepAskVersion, ID: sdkstep.NewID(), Kind: sdkstep.AskDelivery, Language: sdkstep.AskGo, Asker: "mesh-delivery-builder", At: &at, - Build: &nodebuildgo.StepAskBuild{Module: "m", Path: "modules/m", Fetch: fetch, Artifacts: []nodebuildgo.AskArtifact{{Artifact: "bundle"}}}, - Packages: map[string]string{"git.novox.be/novox/mesh-sdk/go": runCommit}} - a, err := sdkstep.AskOf(goAsk) - if err != nil { - t.Fatal(err) - } - if read := askRead(a); read.Kind != sdkstep.AskDelivery || read.Build == nil || read.Build.Module != "m" { - t.Errorf("the step description reads %+v", read) - } - r := &recorder{fetch: map[string]any{"workspace": "/w"}} - if _, err := RunAsk(context.Background(), r.steps(), a); err != nil { - t.Fatal(err) - } - want := `fetch {"commit":"` + runCommit + `","dir":"modules/m","packages":{"git.novox.be/novox/mesh-sdk/go":"` + runCommit + `"},"paths":["src"],"repository":"novox/x"}` - if len(r.calls) == 0 || r.calls[0] != want { - t.Errorf("the fetch tool was called with %v, want %s", r.calls, want) - } - if back, err := sdkstep.AskAs[nodebuildnode.StepAsk](a); err != nil || back.Build == nil || back.Build.Module != "m" { - t.Errorf("the ask as another seat's type: %+v, %v", back, err) - } -} - -// 086 A-C2 (ADR 0666 §7, §8, §21; design 47 *Asked on a work queue, ended by an event*, test 65): a pipeline step ask -// runs its one level as a check of it, carries the packages the runner kept at their digest, keeps what it passed, says -// its counts, and says its end once on its own node; a level with no tests ends nothing to run, a fault of the source -// could not run, and a transport fault or an end that could not be said is handed back unsaid, to be given again. -func TestRunAskRunsAPipelineStepAndSaysItsEnd(t *testing.T) { - type said struct{ ends []sdkstep.StepEnded } - stepOf := func(step string, kept ...sdkstep.KeptResult) sdkstep.StepAsk { - return sdkstep.StepAsk{ID: sdkstep.NewID(), Kind: sdkstep.AskStep, Language: sdkstep.AskGo, Asker: "mesh-delivery-pipeline", At: time.Now(), - Step: &sdkstep.StepRun{Pipeline: "main.12.m", Step: step, Module: "m", Artifact: "m:program", Commit: runCommit, Fingerprint: "fp-1", - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit, Dir: "modules/m"}, Kept: kept}} - } - for _, row := range []struct { - name string - ask sdkstep.StepAsk - digests map[string]string - tests map[string]bool - lint StepFunc - fetchErr error - sayErr error - outcome string // "" when nothing is said - counts int - carried []string - kept []string - passing bool // the error is a transport fault - noTests bool // the level holds no test, as the test body says it - }{ - {name: "unit: the kept package carried, the other tested and kept", ask: stepOf(sdkstep.StepUnit, sdkstep.KeptResult{Package: "x/a", Digest: "d-a", Level: "unit"}), - digests: map[string]string{"x/a": "d-a", "x/b": "d-b"}, tests: map[string]bool{"x/b": true}, outcome: sdkstep.OutcomePassed, counts: 1, carried: []string{"x/a"}, kept: []string{"x/b"}}, - {name: "unit failed: said with why, nothing kept", ask: stepOf(sdkstep.StepUnit), digests: map[string]string{"x/b": "d-b"}, tests: map[string]bool{"x/b": false}, - outcome: sdkstep.OutcomeFailed, counts: 1}, - {name: "integration with no tests: nothing to run", ask: stepOf(sdkstep.StepIntegration), digests: map[string]string{}, noTests: true, outcome: sdkstep.OutcomeNothingToRun}, - {name: "lint failed", ask: stepOf(sdkstep.StepLint), lint: func(context.Context, map[string]any) (any, error) { - return LintAnswer{Failed: []sdkstep.Failure{{Package: "modules/m", Test: "gofmt", Cause: "not as gofmt writes them"}}}, nil - }, outcome: sdkstep.OutcomeFailed}, - {name: "lint passed", ask: stepOf(sdkstep.StepLint), lint: func(context.Context, map[string]any) (any, error) { return LintAnswer{}, nil }, outcome: sdkstep.OutcomePassed}, - {name: "no lint body: nothing to run", ask: stepOf(sdkstep.StepLint), outcome: sdkstep.OutcomeNothingToRun}, - {name: "the source cannot be fetched: could not run", ask: stepOf(sdkstep.StepUnit), fetchErr: Refuse("no commit %s", runCommit), outcome: sdkstep.OutcomeCouldNotRun}, - {name: "a transport fault: unsaid, given again", ask: stepOf(sdkstep.StepUnit), fetchErr: &sdkstep.Passing{Err: errors.New("no responders")}, passing: true}, - {name: "the end cannot be said: given again", ask: stepOf(sdkstep.StepLint), sayErr: errors.New("bus down"), passing: true}, - } { - r := &recorder{fetch: map[string]any{"workspace": "/w"}, tests: row.tests, digests: row.digests} - s := r.steps() - if row.fetchErr != nil { - s.Fetch = func(context.Context, map[string]any) (any, error) { return nil, row.fetchErr } - } - s.Lint, s.Node = row.lint, "ace" - if row.noTests { - s.Test = func(context.Context, map[string]any) (any, error) { - return map[string]any{"passed": true, "tests": 0, "no_tests": true}, nil - } - } - var got said - s.SayStep = func(e sdkstep.StepEnded) error { - if row.sayErr != nil { - return row.sayErr - } - got.ends = append(got.ends, e) - return nil - } - out, err := RunAsk(context.Background(), s, row.ask) - if row.passing { - if !sdkstep.IsPassing(err) || len(got.ends) != 0 { - t.Errorf("%s: %v, said %+v; want a transport fault, nothing said", row.name, err, got.ends) - } - continue - } - if err != nil || len(got.ends) != 1 { - t.Fatalf("%s: %v, said %+v; want one end", row.name, err, got.ends) - } - e := got.ends[0] - if e.Outcome != row.outcome || e.Node != "ace" || e.ID != row.ask.ID || e.Fingerprint != "fp-1" || out.(StepAnswer).Ended.Outcome != row.outcome { - t.Errorf("%s: said %+v, want %s on ace for the ask", row.name, e, row.outcome) - } - if (row.outcome == sdkstep.OutcomeFailed || row.outcome == sdkstep.OutcomeCouldNotRun) && e.Said == "" { - t.Errorf("%s: %s and not why", row.name, row.outcome) - } - if n := 0; e.Tests != nil { - n = e.Tests.Unit + e.Tests.Integration - if n != row.counts { - t.Errorf("%s: counts %+v, want %d", row.name, e.Tests, row.counts) - } - } else if row.counts != 0 { - t.Errorf("%s: no counts, want %d", row.name, row.counts) - } - pkgs := func(ks []sdkstep.KeptResult) (out []string) { - for _, k := range ks { - out = append(out, k.Package) - } - return out - } - if !slices.Equal(pkgs(e.Carried), row.carried) || !slices.Equal(pkgs(e.Kept), row.kept) { - t.Errorf("%s: carried %v kept %v, want %v and %v", row.name, pkgs(e.Carried), pkgs(e.Kept), row.carried, row.kept) - } - if _, err := sdkstep.EncodeStepEnded(e); err != nil { - t.Errorf("%s: the end does not encode: %v", row.name, err) - } - } -} diff --git a/modules/mesh-build-go/buildstep/buildcpu/buildcpu.go b/modules/mesh-build-go/buildstep/buildcpu/buildcpu.go deleted file mode 100644 index dcd2f364b..000000000 --- a/modules/mesh-build-go/buildstep/buildcpu/buildcpu.go +++ /dev/null @@ -1,215 +0,0 @@ -// Package buildcpu is how much of a build node's processors its builds may take, and how they yield to everything else -// there (novox/hq ADR 0553, issue 1806; the operator, 2026-10-26: "limit CPU usage on our build nodes so the total cpu -// usage never impacts the normal workings of our nodes ... We have 3 build agents so they should share the cpu power"). -// -// Three parts, each with one owner: -// -// - **Priority.** A build seat's holder (catalogue.Seat.Yields) runs at the lowest priority there is: the composer -// gives its runtime process declaration.Yields, and the node-engine places every yielding process of the node in -// one slice (declaration.YieldSlice) whose CPU weight is idle, with Nice=19 for every process it starts. -// Interactive and service work always comes first; builds take the cycles nothing else wants. -// - **One cap per node, shared.** The node's share of its processors is one value, the node-engine's own config -// `build-cpu-share` (ShareSetting), set per node through the node's settings layer. The node-engine writes it as the -// slice's CPUQuota: one bound the kernel holds for all the node's build modules together, never one per module. -// - **Threads.** The quota bounds the total; threads only size each step. A step gets the share divided by its own -// module's capacity (Threads), from the share the composer hands as a word (ShareWord): GOMAXPROCS sets every go -// command's -p, the compiler's concurrency, a test binary's processors and -parallel. A module given no word sets -// no thread limit at all: without the slice there is nothing to size a step to, and a limit then would only slow -// builds. -package buildcpu - -import ( - "os" - "runtime" - "strconv" - "strings" -) - -// ShareSetting is the node-engine's config value of the node's processor share for its builds, in percent of the -// machine's processors, 1 to 100: one value per node, set through the node's settings layer (novox/hq ADR 0553 §3). -const ShareSetting = "build-cpu-share" - -// DefaultPercent is the share where nothing sets one: half the machine, so a desktop keeps half its processors for -// itself whatever builds. -const DefaultPercent = 50 - -// ShareWord is the word the composer gives every yielding module (novox/hq ADR 0553 §4): the node's share, in percent. -const ShareWord = "MESH_BUILD_CPU_SHARE" - -// Quota is a CPUQuota for a share of a machine with cores processors: systemd counts a quota in percent of one -// processor, so half of 24 is 1200%. At least 100%, one processor, so a share on a small machine never stops a step. -func Quota(percent, cores int) int { - q := percent * cores - if q < 100 { - q = 100 - } - return q -} - -// Threads is how many threads one step may run at once: its part of the share when its own module runs slots steps at -// once, at least one. The slice's quota bounds the steps of all the node's build modules together; this only sizes one. -func Threads(percent, cores, slots int) int { - if slots < 1 { - slots = 1 - } - if percent < 1 || percent > 100 { - percent = DefaultPercent - } - t := cores * percent / 100 / slots - if t < 1 { - t = 1 - } - return t -} - -// Limits is what one step is held to on this node, as a status tool says it. -type Limits struct { - // Percent is the node's share in percent of its processors, and From where it was read: ShareWord, or "none" when - // the composer gave no share and a step runs without a thread limit. - Percent int `json:"share-percent,omitempty"` - From string `json:"share-from"` - // Cores is the machine's processor count. - Cores int `json:"cores"` - // Slots is this module's own capacity on the node: steps at once. - Slots int `json:"slots"` - // Threads is what each step is given (Threads); 0 is no limit. - Threads int `json:"threads-per-step"` -} - -// FromWords is the limits of a step from the share the composer gave this process (ShareWord) and the module's own -// capacity. Without a usable share there is no limit: Threads is 0. -func FromWords(getenv func(string) string, own int) Limits { - if own < 1 { - own = 1 - } - l := Limits{From: "none", Cores: runtime.NumCPU(), Slots: own} - if n, err := strconv.Atoi(strings.TrimSpace(getenv(ShareWord))); err == nil && n >= 1 && n <= 100 { - l.Percent, l.From = n, ShareWord - l.Threads = Threads(n, l.Cores, own) - } - return l -} - -// Env is the environment a step's commands are given so they start no more threads than they may: GOMAXPROCS for every -// Go program (the compiler, a test binary, esbuild, buildah), UV_THREADPOOL_SIZE for Node's worker pool. Returned as -// KEY=value words to append to a command's environment; nothing for 0 threads, no limit. -func Env(threads int) []string { - if threads < 1 { - return nil - } - t := strconv.Itoa(threads) - return []string{"GOMAXPROCS=" + t, "UV_THREADPOOL_SIZE=" + t} -} - -// InForce is what the kernel holds this process to, read rather than assumed (evidence over assertion): its nice -// level, its cgroup (the unit) and the cgroup's parent (the slice the node-engine placed it in), each one's CPU weight, -// idle mark and quota. A field the machine does not answer is left empty and Unread says which. -// -// The IO weight is read but binds only where the disk's scheduler honours it (bfq, or the io.cost controller); under -// the scheduler `none`, the usual one for NVMe, it does nothing, and the CPU bound is what holds. -type InForce struct { - Nice int `json:"nice"` - Cgroup string `json:"cgroup,omitempty"` - Unit Group `json:"unit"` - Slice Group `json:"slice"` - // Quota is the tighter of the two groups' cpu.max as a percent of one processor, 0 with none. - Quota int `json:"quota-percent,omitempty"` - Unread []string `json:"unread,omitempty"` -} - -// Group is one cgroup's controls. -type Group struct { - Path string `json:"path,omitempty"` - CPUIdle string `json:"cpu-idle,omitempty"` - CPUWeight string `json:"cpu-weight,omitempty"` - // CPUMax is the cgroup's cpu.max: " ", or "max" with no quota. - CPUMax string `json:"cpu-max,omitempty"` - IOWeight string `json:"io-weight,omitempty"` -} - -// cgroupRoot is where the unified hierarchy is mounted. A variable so a test can point it elsewhere. -var cgroupRoot = "/sys/fs/cgroup" - -// procSelfCgroup is this process's cgroup file. A variable so a test can point it elsewhere. -var procSelfCgroup = "/proc/self/cgroup" - -// procSelfStat is this process's stat file. A variable so a test can point it elsewhere. -var procSelfStat = "/proc/self/stat" - -// ReadInForce reads what the kernel holds this process to. -func ReadInForce() InForce { - var f InForce - f.Nice = nice() - raw, err := os.ReadFile(procSelfCgroup) - if err != nil { - f.Unread = append(f.Unread, "cgroup: "+err.Error()) - return f - } - for _, line := range strings.Split(strings.TrimSpace(string(raw)), "\n") { - if strings.HasPrefix(line, "0::") { - f.Cgroup = strings.TrimPrefix(line, "0::") - } - } - if f.Cgroup == "" { - f.Unread = append(f.Unread, "cgroup: not on the unified hierarchy") - return f - } - read := func(path string) Group { - g := Group{Path: path} - value := func(name string) string { - b, err := os.ReadFile(cgroupRoot + path + "/" + name) - if err != nil { - f.Unread = append(f.Unread, path+"/"+name+": "+err.Error()) - return "" - } - return strings.TrimSpace(string(b)) - } - g.CPUIdle, g.CPUWeight, g.CPUMax, g.IOWeight = value("cpu.idle"), value("cpu.weight"), value("cpu.max"), value("io.weight") - return g - } - f.Unit = read(f.Cgroup) - if i := strings.LastIndex(f.Cgroup, "/"); i > 0 { - f.Slice = read(f.Cgroup[:i]) - } - for _, q := range []int{quotaOf(f.Unit.CPUMax), quotaOf(f.Slice.CPUMax)} { - if q > 0 && (f.Quota == 0 || q < f.Quota) { - f.Quota = q - } - } - return f -} - -// quotaOf is a cpu.max value as a percent of one processor: "1200000 100000" is 1200; "max ..." or nothing is 0. -func quotaOf(cpuMax string) int { - fields := strings.Fields(cpuMax) - if len(fields) != 2 || fields[0] == "max" { - return 0 - } - q, err1 := strconv.Atoi(fields[0]) - p, err2 := strconv.Atoi(fields[1]) - if err1 != nil || err2 != nil || p <= 0 { - return 0 - } - return q * 100 / p -} - -// nice is this process's nice level from its stat file (the 19th field, counted after the command's closing -// parenthesis, which may itself hold spaces); 0 when it cannot be read. -func nice() int { - raw, err := os.ReadFile(procSelfStat) - if err != nil { - return 0 - } - s := string(raw) - i := strings.LastIndex(s, ")") - if i < 0 { - return 0 - } - fields := strings.Fields(s[i+1:]) - // After the command: state is field 3, so nice (field 19) is index 16. - if len(fields) < 17 { - return 0 - } - n, _ := strconv.Atoi(fields[16]) - return n -} diff --git a/modules/mesh-build-go/buildstep/buildcpu/buildcpu_agree_test.go b/modules/mesh-build-go/buildstep/buildcpu/buildcpu_agree_test.go deleted file mode 100644 index bf61988df..000000000 --- a/modules/mesh-build-go/buildstep/buildcpu/buildcpu_agree_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package buildcpu - -import ( - "testing" - - "git.novox.be/novox/mesh-sdk/go/catalogue" -) - -// The share's names the composer gives are the build modules' (catalogue writes them too, so it does not import this). -func TestTheShareNamesAgreeWithTheCatalogues(t *testing.T) { - if ShareSetting != catalogue.BuildCPUShareSetting || ShareWord != catalogue.BuildCPUShareWord || DefaultPercent != catalogue.BuildCPUDefaultPercent { - t.Fatal("buildcpu's share names differ from catalogue's") - } -} diff --git a/modules/mesh-build-go/buildstep/buildcpu/buildcpu_test.go b/modules/mesh-build-go/buildstep/buildcpu/buildcpu_test.go deleted file mode 100644 index 674068706..000000000 --- a/modules/mesh-build-go/buildstep/buildcpu/buildcpu_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package buildcpu - -import ( - "os" - "path/filepath" - "reflect" - "runtime" - "testing" -) - -// The node's share as a quota, the threads one step is given for its own module's capacity, and the word the composer -// hands, in one table (ADR 0553, issue 1806). -func TestShareQuotaAndThreads(t *testing.T) { - for _, c := range []struct { - name string - percent, cores, slots int - quota, threads int - }{ - {"shanks: half of 24, three slots", 50, 24, 3, 1200, 4}, - {"ace: three quarters of 24, two slots", 75, 24, 2, 1800, 9}, - {"g14: half of 16, one slot", 50, 16, 1, 800, 8}, - {"one processor at least", 10, 2, 4, 100, 1}, - {"no slots counts as one", 100, 4, 0, 400, 4}, - {"a share out of range is the default", 0, 8, 1, 0, 4}, - } { - if c.quota != 0 { - if q := Quota(c.percent, c.cores); q != c.quota { - t.Errorf("%s: Quota = %d, want %d", c.name, q, c.quota) - } - } - if th := Threads(c.percent, c.cores, c.slots); th != c.threads { - t.Errorf("%s: Threads = %d, want %d", c.name, th, c.threads) - } - } - l := FromWords(func(k string) string { return map[string]string{ShareWord: "75"}[k] }, 2) - if l.Percent != 75 || l.From != ShareWord || l.Slots != 2 || l.Threads != Threads(75, runtime.NumCPU(), 2) { - t.Errorf("from the word: %+v", l) - } - // Told nothing usable, a step has no thread limit: nothing in its environment. - for _, word := range []string{"", "250", "lots"} { - l := FromWords(func(string) string { return word }, 3) - if l.Threads != 0 || l.From != "none" || Env(l.Threads) != nil { - t.Errorf("share %q: %+v, env %v", word, l, Env(l.Threads)) - } - } - if got := Env(3); !reflect.DeepEqual(got, []string{"GOMAXPROCS=3", "UV_THREADPOOL_SIZE=3"}) { - t.Errorf("Env = %q", got) - } -} - -// What the kernel holds a process to is read from its unit's and its slice's cgroup and its stat file, not assumed. -func TestReadInForce(t *testing.T) { - dir := t.TempDir() - cg := filepath.Join(dir, "cg") - slice := filepath.Join(cg, "meshyield.slice") - unit := filepath.Join(slice, "mesh-build-go-runtime.service") - if err := os.MkdirAll(unit, 0o755); err != nil { - t.Fatal(err) - } - for at, files := range map[string]map[string]string{ - slice: {"cpu.idle": "1\n", "cpu.weight": "0\n", "cpu.max": "1200000 100000\n", "io.weight": "default 1\n"}, - unit: {"cpu.idle": "0\n", "cpu.weight": "100\n", "cpu.max": "max 100000\n", "io.weight": "default 100\n"}, - } { - for name, v := range files { - if err := os.WriteFile(filepath.Join(at, name), []byte(v), 0o644); err != nil { - t.Fatal(err) - } - } - } - self := filepath.Join(dir, "cgroup") - stat := filepath.Join(dir, "stat") - _ = os.WriteFile(self, []byte("0::/meshyield.slice/mesh-build-go-runtime.service\n"), 0o644) - // A command with a space and a parenthesis in it, then nice 19 in field 19. - _ = os.WriteFile(stat, []byte("42 (mesh (build) go) S 1 42 42 0 -1 4194560 1 0 0 0 0 0 0 0 39 19 8 0 1 2 3\n"), 0o644) - cgroupRoot, procSelfCgroup, procSelfStat = cg, self, stat - t.Cleanup(func() { - cgroupRoot, procSelfCgroup, procSelfStat = "/sys/fs/cgroup", "/proc/self/cgroup", "/proc/self/stat" - }) - - got := ReadInForce() - want := InForce{Nice: 19, Cgroup: "/meshyield.slice/mesh-build-go-runtime.service", - Unit: Group{Path: "/meshyield.slice/mesh-build-go-runtime.service", CPUIdle: "0", CPUWeight: "100", - CPUMax: "max 100000", IOWeight: "default 100"}, - Slice: Group{Path: "/meshyield.slice", CPUIdle: "1", CPUWeight: "0", CPUMax: "1200000 100000", - IOWeight: "default 1"}, - Quota: 1200} - if !reflect.DeepEqual(got, want) { - t.Fatalf("ReadInForce = %+v\nwant %+v", got, want) - } -} diff --git a/modules/mesh-build-go/buildstep/buildhours.go b/modules/mesh-build-go/buildstep/buildhours.go deleted file mode 100644 index 6e3dee470..000000000 --- a/modules/mesh-build-go/buildstep/buildhours.go +++ /dev/null @@ -1,129 +0,0 @@ -package buildstep - -import ( - "encoding/json" - "fmt" - "os" - "strings" - "time" -) - -// **A node may build only within its build hours** (the operator, 2026-10-26 21:18: the laptop builds only outside -// office hours, "from 18 o'clock until 6 in the morning"). A build module's `build-hours` setting is the node's window -// in its local time, a config value set on each node's layer of mesh-config (ADR 0567 §12: no repository names a node); -// outside it the capacity judged by is 0: steps running finish, no new one is taken. An empty value builds at any hour. -// The puller judges it at every judgement and wakes on one timer to the window's next edge (a clock edge, not a poll of -// another part). - -// BuildHoursSetting is the build modules' setting of the node's build window: HH:MM-HH:MM in the node's local time; an -// end before its start crosses midnight (18:00-06:00). -const BuildHoursSetting = "build-hours" - -// BuildWindow is one node's build hours: minutes after local midnight, Start inclusive, End exclusive. -type BuildWindow struct { - Start, End int -} - -// String is the window as the setting writes it. -func (w BuildWindow) String() string { - return fmt.Sprintf("%02d:%02d-%02d:%02d", w.Start/60, w.Start%60, w.End/60, w.End%60) -} - -// Open says whether t, in its own location, falls in the window. -func (w BuildWindow) Open(t time.Time) bool { - m := t.Hour()*60 + t.Minute() - if w.Start < w.End { - return m >= w.Start && m < w.End - } - return m >= w.Start || m < w.End -} - -// NextEdge is the first time after t, in t's location, at which the window opens or closes. -func (w BuildWindow) NextEdge(t time.Time) time.Time { - var next time.Time - for day := 0; day <= 1; day++ { - for _, m := range []int{w.Start, w.End} { - e := time.Date(t.Year(), t.Month(), t.Day()+day, m/60, m%60, 0, 0, t.Location()) - if e.After(t) && (next.IsZero() || e.Before(next)) { - next = e - } - } - } - return next -} - -// ParseBuildWindow reads a build-hours value, HH:MM-HH:MM: nil when it is empty. -func ParseBuildWindow(setting string) (*BuildWindow, error) { - setting = strings.TrimSpace(setting) - if setting == "" { - return nil, nil - } - from, to, ok := strings.Cut(setting, "-") - if !ok { - return nil, fmt.Errorf("the build hours %q are not HH:MM-HH:MM", setting) - } - start, err := minuteOf(from) - if err != nil { - return nil, fmt.Errorf("the build hours %q: %v", setting, err) - } - end, err := minuteOf(to) - if err != nil { - return nil, fmt.Errorf("the build hours %q: %v", setting, err) - } - if start == end { - return nil, fmt.Errorf("the build hours %q open and close at the same minute", setting) - } - return &BuildWindow{Start: start, End: end}, nil -} - -// minuteOf reads HH:MM as minutes after midnight. -func minuteOf(s string) (int, error) { - var h, m int - s = strings.TrimSpace(s) - if n, err := fmt.Sscanf(s, "%d:%d", &h, &m); err != nil || n != 2 || h < 0 || h > 23 || m < 0 || m > 59 || len(s) != 5 { - return 0, fmt.Errorf("%q is not a time HH:MM", s) - } - return h*60 + m, nil -} - -// NodeBuildHours is the node's build window, read from the module's settings file at path at every call, and why it is -// none when the value cannot be read. No path, no file value or an empty one is no window and no fault. A value that -// cannot be read is no window too, so the node builds at any hour; the setting is a preference of hours, not a safety -// bound (a node that must never build has capacity 0). It is loud: the fault is said once per distinct fault through -// logf, and the puller writes it in the capacity record that build_usage shows. -func NodeBuildHours(path, node string, logf func(string, ...any)) func() (*BuildWindow, string) { - said := "" - say := func(why string) { - if logf != nil && why != said { - said = why - logf("%s, so %s builds at any hour", why, node) - } - } - fault := func(why string) (*BuildWindow, string) { - say(why) - return nil, why - } - return func() (*BuildWindow, string) { - if path == "" { - return nil, "" - } - raw, err := os.ReadFile(path) - if err != nil { - return fault(fmt.Sprintf("the setting %s cannot be read: %v", BuildHoursSetting, err)) - } - var s map[string]json.RawMessage - if err := json.Unmarshal(raw, &s); err != nil { - return fault(fmt.Sprintf("the settings file %s is not JSON: %v", path, err)) - } - setting := "" - if v, ok := s[BuildHoursSetting]; ok && json.Unmarshal(v, &setting) != nil { - return fault(fmt.Sprintf("the setting %s %s is not a string", BuildHoursSetting, v)) - } - w, err := ParseBuildWindow(setting) - if err != nil { - return fault(err.Error()) - } - said = "" - return w, "" - } -} diff --git a/modules/mesh-build-go/buildstep/capacity.go b/modules/mesh-build-go/buildstep/capacity.go deleted file mode 100644 index 0552bdbd2..000000000 --- a/modules/mesh-build-go/buildstep/capacity.go +++ /dev/null @@ -1,57 +0,0 @@ -package buildstep - -import ( - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - - "encoding/json" - "fmt" - "os" -) - -// NodeCapacity is the node's build capacity, read from the module's settings file at path at every call, so a change -// takes effect at the next pull. No path, no file value, or a value that is not a whole number of at least 0 gives 0 and -// a value that cannot be read says why: pulling on a setting nobody can read could build on a node that must not. -func NodeCapacity(path, node string, logf func(string, ...any)) func() int { - say := func(format string, args ...any) { - if logf != nil { - logf(format, args...) - } - } - return func() int { - n, err := ReadCapacity(path) - if err != nil { - say("%v, so %s pulls nothing", err, node) - return 0 - } - return n - } -} - -// ReadCapacity is the capacity the settings file at path holds, and why it cannot be read when it cannot (then 0). -func ReadCapacity(path string) (int, error) { - if path == "" { - return 0, nil - } - raw, err := os.ReadFile(path) - if err != nil { - return 0, fmt.Errorf("the build capacity cannot be read: %w", err) - } - var s map[string]json.RawMessage - if err := json.Unmarshal(raw, &s); err != nil { - return 0, fmt.Errorf("the settings file %s is not JSON: %w", path, err) - } - return capacityOf(s[sdkstep.CapacitySetting]) -} - -// capacityOf is the capacity a config value holds: absent or null is 0; anything but a whole number of at least 0 is -// refused, naming it. -func capacityOf(value json.RawMessage) (int, error) { - if len(value) == 0 || string(value) == "null" { - return 0, nil - } - var n int - if err := json.Unmarshal(value, &n); err != nil || n < 0 { - return 0, fmt.Errorf("the build capacity %s is not a whole number of asks at once, 0 or more", value) - } - return n, nil -} diff --git a/modules/mesh-build-go/buildstep/capacity_cpu.go b/modules/mesh-build-go/buildstep/capacity_cpu.go deleted file mode 100644 index 61f2c1356..000000000 --- a/modules/mesh-build-go/buildstep/capacity_cpu.go +++ /dev/null @@ -1,141 +0,0 @@ -package buildstep - -import ( - "encoding/json" - "fmt" - "math" - "os" - "runtime" - "strconv" - "strings" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/buildcpu" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -// **A build seat's capacity follows the CPU its node gives builds** (issue 1806's follow-up; issue 1890, 2026-10-26 -// 19:41: under the 50 % cap the workstation's mesh-build-go kept capacity 3, three full mesh-catalog checks shared 12 cores, and -// each step ran past the 30-minute step bound with no test run). The configured capacity is an upper bound; the node's -// build slice bounds it again by the cores a step needs: floor(the slice's quota in cores / cores-per-step), one at -// least. The quota is read live from the cgroup at every judgement, so a changed cap is followed at the next take -// without a restart, and the result is said (the seat's current verb, the status tools, `capacity.` in the pauses -// state that the delivery view's build_usage reads). - -// CoresPerStepSetting is a build module's setting of the processors one of its steps needs: a number above zero, the -// same on every node (a step's need is the module's, not the node's). Each build module declares it with its own default -// (DefaultCoresPerStep). -const CoresPerStepSetting = "cores-per-step" - -// DefaultCoresPerStep are the build modules' defaults by language, from measured steps (2026-10-26): a full mesh-catalog -// check on mesh-build-go takes what it is given (three at once took 965 % of the workstation's 1200 % slice, about 4 cores each, -// and ran past the 30-minute step bound), so a Go step is given 6, half again what starved; a Node step (tsc, esbuild, a -// test runner: median 15 s) and an image build (buildah, its RUN lines mostly fetches) need 2. -var DefaultCoresPerStep = map[string]float64{sdkstep.AskGo: 6, sdkstep.AskNode: 2, sdkstep.AskImage: 2} - -// Quota is the build slice's CPU quota as this process's cgroup holds it, in percent of one processor (1200 is 12 -// cores), and where it was read: the cgroup's cpu.max (buildcpu.ReadInForce, the tighter of its unit's and its slice's), -// else the share the composer gave (buildcpu.ShareWord) over the machine's processors, else 0 and why none is known. -func Quota() (percent int, from string) { - f := buildcpu.ReadInForce() - if f.Quota > 0 { - path := f.Slice.Path - if path == "" { - path = f.Cgroup - } - return f.Quota, "the cpu.max of " + path - } - if n, err := strconv.Atoi(strings.TrimSpace(os.Getenv(buildcpu.ShareWord))); err == nil && n >= 1 && n <= 100 { - return buildcpu.Quota(n, runtime.NumCPU()), fmt.Sprintf("the share %d%% the composer gave (%s), of %d processors; no cpu.max is read", n, buildcpu.ShareWord, runtime.NumCPU()) - } - return 0, "no CPU quota: neither a cpu.max on its cgroup nor a share from the composer" -} - -// EffectiveCapacity is the capacity a seat's holder judges by, from its configured capacity, its node's quota (percent of -// one processor, 0 when none is known) and the cores one of its steps needs. Without a quota it is the configured one; -// with one, min(configured, floor(quota cores / coresPerStep)), and one at least while the configured one is above -// zero. A coresPerStep of zero or less is taken as 1. -func EffectiveCapacity(configured, quotaPercent int, quotaFrom string, coresPerStep float64) sdkstep.Capacity { - if coresPerStep <= 0 || math.IsNaN(coresPerStep) || math.IsInf(coresPerStep, 0) { - coresPerStep = 1 - } - c := sdkstep.Capacity{Configured: configured, Effective: configured, QuotaFrom: quotaFrom, CoresPerStep: coresPerStep} - switch { - case configured <= 0: - c.Effective = 0 - c.Why = fmt.Sprintf("its configured capacity is %d, so it pulls nothing", configured) - return c - case quotaPercent <= 0: - c.Why = fmt.Sprintf("its configured capacity %d; %s, so the CPU bounds nothing", configured, quotaFrom) - return c - } - c.QuotaCores = float64(quotaPercent) / 100 - c.ByCPU = int(math.Floor(c.QuotaCores/coresPerStep + 1e-9)) - if c.ByCPU < 1 { - c.ByCPU = 1 - } - byCPU := fmt.Sprintf("%g cores of the build slice (%s) / %g cores a step = %d", c.QuotaCores, quotaFrom, coresPerStep, c.ByCPU) - if c.ByCPU < configured { - c.Effective = c.ByCPU - c.Why = fmt.Sprintf("%d, bounded by the CPU: %s, under its configured %d", c.Effective, byCPU, configured) - } else { - c.Why = fmt.Sprintf("%d, its configured capacity; the CPU allows %s", configured, byCPU) - } - return c -} - -// NodeCoresPerStep is the module's cores-per-step, read from its settings file at path at every call so a change is -// followed at the next judgement; fallback when there is no path, no value or one that is not a number above zero, said -// once per distinct fault through logf. -func NodeCoresPerStep(path string, fallback float64, logf func(string, ...any)) func() float64 { - said := "" - say := func(why string) { - if logf != nil && why != said { - said = why - logf("%s, so a step is taken to need %g cores", why, fallback) - } - } - return func() float64 { - if path == "" { - return fallback - } - raw, err := os.ReadFile(path) - if err != nil { - say(fmt.Sprintf("the setting %s cannot be read: %v", CoresPerStepSetting, err)) - return fallback - } - var s map[string]json.RawMessage - if err := json.Unmarshal(raw, &s); err != nil { - say(fmt.Sprintf("the settings file %s is not JSON: %v", path, err)) - return fallback - } - v, ok := s[CoresPerStepSetting] - if !ok { - return fallback // not declared yet (a module before its manifest names it): the default, nothing to say - } - n, err := coresOf(v) - if err != nil { - say(fmt.Sprintf("the setting %s %s: %v", CoresPerStepSetting, v, err)) - return fallback - } - said = "" - return n - } -} - -// coresOf reads a cores-per-step value: a JSON number or a string holding one, above zero. -func coresOf(v json.RawMessage) (float64, error) { - var n float64 - if err := json.Unmarshal(v, &n); err != nil { - var s string - if err := json.Unmarshal(v, &s); err != nil { - return 0, fmt.Errorf("is neither a number nor a string") - } - if n, err = strconv.ParseFloat(strings.TrimSpace(s), 64); err != nil { - return 0, fmt.Errorf("is not a number") - } - } - if n <= 0 || math.IsNaN(n) || math.IsInf(n, 0) { - return 0, fmt.Errorf("is not above zero") - } - return n, nil -} diff --git a/modules/mesh-build-go/buildstep/capacity_test.go b/modules/mesh-build-go/buildstep/capacity_test.go deleted file mode 100644 index aef58c6e0..000000000 --- a/modules/mesh-build-go/buildstep/capacity_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package buildstep - -import ( - "os" - "path/filepath" - "strings" - "testing" - "time" -) - -// 1887/A7: the node's build capacity is the build module's setting, read at every pull: the control-node at 0 pulls -// nothing, a change takes effect at the next read, and a setting that cannot be read pulls nothing. -// ADR 0553 §4: a step's threads are the composer's share over the module's own capacity; without the word, none. And -// issue 1806's follow-up: the capacity judged by is the configured one bounded by the build slice's cores over the cores -// a step needs (the three build nodes as they stand on 2026-10-26), and cores-per-step is read from the settings file. -func TestNodeCapacityAndLimits(t *testing.T) { - // ADR 0567 §12: the capacity is the node's integer, its default 0, and no default names a node. - if got := NodeCapacity("", "laptop", nil)(); got != 0 { - t.Errorf("no settings file = %d, want 0", got) - } - file := filepath.Join(t.TempDir(), "settings.json") - capacity := NodeCapacity(file, "anchor", nil) - for value, want := range map[string]int{`{"capacity":1}`: 1, `{"capacity":4}`: 4, `{}`: 0, `{"capacity":null}`: 0, - `{"capacity":"anchor=3"}`: 0, `{"capacity":-1}`: 0, `{"capacity":1.5}`: 0} { - os.WriteFile(file, []byte(value), 0o600) - if got := capacity(); got != want { - t.Errorf("%s = %d, want %d", value, got, want) - } - } - if got := NodeCapacity(filepath.Join(t.TempDir(), "none"), "anchor", nil)(); got != 0 { - t.Errorf("a missing file = %d, want 0", got) - } - t.Setenv("MESH_BUILD_CPU_SHARE", "") - if l := NodeLimits(3); l.Threads != 0 || l.Slots != 3 { - t.Errorf("without the word: %+v", l) - } - t.Setenv("MESH_BUILD_CPU_SHARE", "75") - if l := NodeLimits(3); l.Percent != 75 || l.Slots != 3 || l.Threads < 1 { - t.Errorf("from the word: %+v", l) - } - for _, c := range []struct { - name string - configured, quota int - cores float64 - effective, byCPU int - }{ - {"shanks: 12 cores, configured 3", 3, 1200, 6, 2, 2}, - {"ace: 18 cores, configured 2", 2, 1800, 6, 2, 3}, - {"g14: 8 cores, configured 2", 2, 800, 6, 1, 1}, - {"node on shanks: 12 cores at 2", 3, 1200, 2, 3, 6}, - {"no quota: the configured one", 3, 0, 6, 3, 0}, - {"configured 0 pulls nothing", 0, 1200, 6, 0, 0}, - {"a quota under one step still builds one", 2, 100, 6, 1, 1}, - {"no cores a step is one", 2, 150, 0, 1, 1}, - } { - got := EffectiveCapacity(c.configured, c.quota, "test", c.cores) - if got.Effective != c.effective || got.ByCPU != c.byCPU || got.Why == "" { - t.Errorf("%s: %+v, want effective %d, by CPU %d", c.name, got, c.effective, c.byCPU) - } - } - file = filepath.Join(t.TempDir(), "settings.json") - var said []string - cores := NodeCoresPerStep(file, 6, func(f string, a ...any) { said = append(said, f) }) - for _, c := range []struct { - file string - want float64 - }{{`{"capacity":2}`, 6}, {`{"cores-per-step":4}`, 4}, {`{"cores-per-step":"3.5"}`, 3.5}, {`{"cores-per-step":0}`, 6}, {`{"cores-per-step":0}`, 6}} { - os.WriteFile(file, []byte(c.file), 0o600) - if got := cores(); got != c.want { - t.Errorf("cores-per-step from %s = %g, want %g", c.file, got, c.want) - } - } - if len(said) != 1 { - t.Errorf("a value not above zero is said once, said %d times", len(said)) - } - - // The operator, 2026-10-26 21:18: g14 builds only from 18:00 to 06:00, its local time. Outside its build hours the - // capacity judged by is 0, said with the window and when it opens; a node not named, or a bad value, builds at any hour. - // And a node its module proves cannot build (ace without /dev/net/tun, 2026-10-28) judges by 0 at every hour, saying - // why, so its asks go to a node that can. - cet := time.FixedZone("CET", 3600) - day := func(hh, mm int) time.Time { return time.Date(2026, 10, 26, hh, mm, 0, 0, cet) } - was := now - defer func() { now = was }() - for _, c := range []struct { - name, setting, node string - at time.Time - effective int - edge string // the window's next edge, HH:MM; "" for no window - bad bool - ineligible string // what the module's Eligible says; "" for eligible - }{ - {"the laptop in the office", "18:00-06:00", "laptop", day(10, 0), 0, "18:00", false, ""}, - {"the laptop in the evening", "18:00-06:00", "laptop", day(18, 0), 2, "06:00", false, ""}, - {"the laptop past midnight", "18:00-06:00", "laptop", day(5, 59), 2, "06:00", false, ""}, - {"the laptop at the close", "18:00-06:00", "laptop", day(6, 0), 0, "18:00", false, ""}, - {"a day window", "09:00-17:30", "anchor", day(17, 29), 2, "17:30", false, ""}, - {"no window", "", "anchor", day(10, 0), 2, "", false, ""}, - {"a bad time", "18:00-6", "laptop", day(10, 0), 2, "", true, ""}, - {"no span", "18:00-18:00", "laptop", day(10, 0), 2, "", true, ""}, - {"the old form naming a node", "laptop=18:00-06:00", "laptop", day(10, 0), 2, "", true, ""}, - {"a node without /dev/net/tun", "", "anchor", day(10, 0), 0, "", false, "/dev/net/tun cannot be opened: no such device"}, - {"not eligible within its hours", "18:00-06:00", "laptop", day(19, 0), 0, "06:00", false, "/dev/net/tun cannot be opened: no such device"}, - } { - w, err := ParseBuildWindow(c.setting) - if (err != nil) != c.bad { - t.Errorf("%s: parse %v", c.name, err) - } - if edge := ""; w != nil { - edge = w.NextEdge(c.at).Format("15:04") - if edge != c.edge { - t.Errorf("%s: next edge %s, want %s", c.name, edge, c.edge) - } - } else if c.edge != "" { - t.Errorf("%s: no window, want one", c.name) - } - file := filepath.Join(t.TempDir(), "settings.json") - os.WriteFile(file, []byte(`{"build-hours":"`+c.setting+`"}`), 0o600) - now = func() time.Time { return c.at } - p := &Puller{Language: "go", Node: c.node, Capacity: func() int { return 2 }, BuildHours: NodeBuildHours(file, c.node, nil), - Eligible: func() string { return c.ineligible }} - got := p.CapacityDetail() - outside := c.effective == 0 && c.ineligible == "" - if got.Effective != c.effective || got.OutsideHours != outside || (outside && !strings.Contains(got.Why, "outside its build hours 18:00-06:00 CET until 18:00")) { - t.Errorf("%s: %+v, want capacity %d", c.name, got, c.effective) - } - if got.Ineligible != c.ineligible || (c.ineligible != "" && !strings.HasPrefix(got.Why, "0, not eligible: "+c.ineligible+" (otherwise ")) { - t.Errorf("%s: not eligible is not said: %+v", c.name, got) - } - // A value that cannot be read builds at any hour, loudly: the record names the value and says why. - if c.bad && (!strings.Contains(got.BuildHoursFault, c.setting) || !strings.Contains(got.Why, "at any hour, because its build hours cannot be read")) { - t.Errorf("%s: a bad value is not said in the record: %+v", c.name, got) - } - } -} diff --git a/modules/mesh-build-go/buildstep/cmd/mesh-pack/main.go b/modules/mesh-build-go/buildstep/cmd/mesh-pack/main.go deleted file mode 100644 index 5b03c5dcb..000000000 --- a/modules/mesh-build-go/buildstep/cmd/mesh-pack/main.go +++ /dev/null @@ -1,111 +0,0 @@ -// mesh-pack builds a Go bundle by hand with the recipe of the mesh-build-go module and packs it with mesh-sdk's own -// buildstep.Pack, printing the digest, so a hand build has the form of a built artifact and, with the same Go version, -// its digest (novox/hq ADR 0526; fallback record F1; issue 1499 for the Go version). -// -// mesh-pack -dir -from -binary [-system arch] [-out ] -// mesh-pack -pack [-out ] (a `files` archive: pack a tree as it is) -// -// The recipe is mesh-catalog modules/mesh-build-go cmd/mesh-build-go/build.go (recipeFlags, recipeLinkerFlags, -// recipeSystemStamp, buildEnv): CGO_ENABLED=0, GOFLAGS "-trimpath -buildvcs=false -mod=mod" (-mod=vendor when the -// directory vendors), GOTOOLCHAIN=local, GOPROXY=off, and -ldflags "-s -w -X main.builtFor=". -package main - -import ( - "flag" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" -) - -const ( - recipeFlags = "-trimpath -buildvcs=false" - recipeLinkerFlags = "-s -w" - recipeSystemStamp = "main.builtFor" -) - -// Env is the build module's environment for the compile of dir, added to the caller's own. -func Env(dir string) []string { - mod := "-mod=mod" - if _, err := os.Stat(filepath.Join(dir, "vendor", "modules.txt")); err == nil { - mod = "-mod=vendor" - } - return append(os.Environ(), - "CGO_ENABLED=0", - "GOFLAGS="+recipeFlags+" "+mod, - "GOTOOLCHAIN=local", - "GOPROXY=off", - ) -} - -// Args is the arguments of the go command of the recipe. -func Args(dir, from, out, binary, system string) []string { - linker := recipeLinkerFlags - if s := strings.TrimSpace(system); s != "" { - linker += " -X " + recipeSystemStamp + "=" + s - } - return []string{"-C", dir, "build", "-ldflags", linker, "-o", filepath.Join(out, binary), "./" + strings.Trim(from, "./")} -} - -// Build compiles the package into a fresh directory and answers it. -func Build(dir, from, binary, system string) (string, error) { - out, err := os.MkdirTemp("", "mesh-pack-") - if err != nil { - return "", err - } - cmd := exec.Command("go", Args(dir, from, out, binary, system)...) - cmd.Env = Env(dir) - cmd.Stdout, cmd.Stderr = os.Stderr, os.Stderr - if err := cmd.Run(); err != nil { - os.RemoveAll(out) - return "", fmt.Errorf("go build of %s: %w", from, err) - } - return out, nil -} - -func run(args []string) (string, error) { - fs := flag.NewFlagSet("mesh-pack", flag.ContinueOnError) - dir := fs.String("dir", ".", "the Go module's directory") - from := fs.String("from", "", "the package to build, relative to -dir (the artifact's from)") - binary := fs.String("binary", "", "the binary's name in the archive") - system := fs.String("system", "", "the system stamped into main.builtFor (an artifact's system, e.g. arch)") - pack := fs.String("pack", "", "pack this directory as it is (a files archive) instead of building") - outFile := fs.String("out", "", "write the archive here") - if err := fs.Parse(args); err != nil { - return "", err - } - root := *pack - if root == "" { - if *from == "" || *binary == "" { - return "", fmt.Errorf("-from and -binary are needed (or -pack )") - } - out, err := Build(*dir, *from, *binary, *system) - if err != nil { - return "", err - } - defer os.RemoveAll(out) - root = out - } - archive, digest, err := buildstep.Pack(root) - if err != nil { - return "", err - } - if *outFile != "" { - if err := os.WriteFile(*outFile, archive, 0o644); err != nil { - return "", err - } - } - return digest, nil -} - -func main() { - digest, err := run(os.Args[1:]) - if err != nil { - fmt.Fprintln(os.Stderr, "mesh-pack:", err) - os.Exit(1) - } - fmt.Println(digest) -} diff --git a/modules/mesh-build-go/buildstep/cmd/mesh-pack/main_test.go b/modules/mesh-build-go/buildstep/cmd/mesh-pack/main_test.go deleted file mode 100644 index 0c866886a..000000000 --- a/modules/mesh-build-go/buildstep/cmd/mesh-pack/main_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package main - -import ( - "os" - "path/filepath" - "testing" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" -) - -func fixture(t *testing.T) string { - t.Helper() - d := t.TempDir() - os.MkdirAll(filepath.Join(d, "sub"), 0o755) - os.WriteFile(filepath.Join(d, "a.txt"), []byte("alpha"), 0o644) - os.WriteFile(filepath.Join(d, "sub", "run"), []byte("#!/bin/sh\n"), 0o755) - return d -} - -func TestPackFixtureTwiceGivesBuildstepsDigest(t *testing.T) { - d := fixture(t) - _, want, err := buildstep.Pack(d) - if err != nil { - t.Fatal(err) - } - for i := 0; i < 2; i++ { - got, err := run([]string{"-pack", d, "-out", filepath.Join(t.TempDir(), "x.tgz")}) - if err != nil || got != want { - t.Fatalf("run %d: %q, %v; want %q", i, got, err, want) - } - } -} - -func TestBuildTwiceGivesOneDigestAndRecipeArgs(t *testing.T) { - m := t.TempDir() - os.WriteFile(filepath.Join(m, "go.mod"), []byte("module x\n\ngo 1.21\n"), 0o644) - os.MkdirAll(filepath.Join(m, "cmd", "p"), 0o755) - os.WriteFile(filepath.Join(m, "cmd", "p", "main.go"), []byte("package main\n\nvar builtFor string\n\nfunc main() { println(builtFor) }\n"), 0o644) - args := []string{"-dir", m, "-from", "cmd/p", "-binary", "p", "-system", "arch"} - a, err := run(args) - if err != nil { - t.Skipf("no go toolchain that builds offline: %v", err) - } - b, err := run(args) - if err != nil || a != b { - t.Fatalf("two builds: %q, %q, %v", a, b, err) - } - got := Args("/d", "./cmd/p/", "/o", "p", "arch") - if got[len(got)-1] != "./cmd/p" || got[4] != "-s -w -X main.builtFor=arch" { - t.Fatalf("args %v", got) - } -} diff --git a/modules/mesh-build-go/buildstep/cmd/seatgen/main.go b/modules/mesh-build-go/buildstep/cmd/seatgen/main.go deleted file mode 100644 index f550b911e..000000000 --- a/modules/mesh-build-go/buildstep/cmd/seatgen/main.go +++ /dev/null @@ -1,80 +0,0 @@ -// Command seatgen writes, or with -check compares, a contracts module's generated Go and TypeScript. -package main - -import ( - "flag" - "fmt" - "os" - "path/filepath" - "sort" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/seatgen" -) - -func main() { - check := flag.Bool("check", false, "compare instead of writing: name every path out of step") - goModule := flag.String("go-module", "", "the generated Go tree's module path, such as git.novox.be/novox/mesh-contracts//go (there is no root module)") - tsPackage := flag.String("ts-package", "", "the generated TypeScript package's name, such as @novox/mesh-contracts-") - domainSDK := flag.String("domain-sdk", "", "the Go module of the contracts module's domain SDK, which a client may import (ADR 0634 §2); empty when it has none") - flag.Parse() - dir := flag.Arg(0) - m, err := seatgen.Load(dir, *goModule, *tsPackage) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - m.DomainSDK = *domainSDK - files, err := seatgen.Generate(m) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if *check { - out, err := seatgen.Compare(dir, files) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - // The clients beside the contracts (ADR 0627 §3) and module.json's Go and npm package artifacts (ADR 0625 §1, §3). - for _, check := range []func(string, *seatgen.Module) ([]string, error){seatgen.CheckClients, seatgen.CheckArtifacts} { - more, err := check(dir, m) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - out = append(out, more...) - } - for _, p := range out { - fmt.Println(p) - } - if len(out) > 0 { - os.Exit(1) - } - return - } - for _, root := range seatgen.GeneratedRoots { - _ = os.RemoveAll(filepath.Join(dir, root, "src")) - } - // Each seat's npm package's sources too (ADR 0625 §1), so a file no definition writes any more is gone. - stale, _ := filepath.Glob(filepath.Join(dir, "ts", "seats", "*", "src")) - for _, p := range stale { - _ = os.RemoveAll(p) - } - paths := make([]string, 0, len(files)) - for p := range files { - paths = append(paths, p) - } - sort.Strings(paths) - for _, p := range paths { - full := filepath.Join(dir, p) - if err := os.MkdirAll(filepath.Dir(full), 0o755); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := os.WriteFile(full, files[p], 0o644); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - } - fmt.Println(len(paths), "files") -} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/README.md b/modules/mesh-build-go/buildstep/conformance/captured/README.md deleted file mode 100644 index 3e1456c54..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# The conformance kit's captured runner output - -Every file here is the real output of a test runner, never written by hand (issue 1901: a fixture that agrees with the -mistake proves the mistake). The toolchains are the build nodes' own, as `mesh-build-go.build_go_toolchains` and -`mesh-build-node.build_node_toolchains` reported them on 2026-10-26: go1.27.3-X:nodwarf5 on every build node, node -v26.12.1 (npm 12.2.1) on shanks, novox and g14, and typescript 5.9.3 from mesh-build-node's toolchain/package.json. -To capture a case again, make its tiny project in a fresh directory as below and run the command shown; the kit's case -table (conformance.go) says what each failure must say. - -## go/ — `go test -json` - -- `passfirst.jsonl` and `subtests.jsonl` (2026-10-26, go1.27.3-X:nodwarf5, for issue 1901's thorough fix): in - `/tmp/1901k/go/`, `GOTOOLCHAIN=local GOFLAGS=-mod=mod go test -json -count=1 ./... > ../.jsonl 2>&1`. - - passfirst: module `example.com/passfirst`, `go 1.26`. Package `a` has `TestTheFirstPackagePasses` (empty). Package `b` - has `TestTheSecondPackagePassesFirst` (empty) and `TestTheSecondPackageFails`, which calls - `t.Logf("judged against the seat as it stands")` then `t.Fatalf("the seat has 2 holders, want 1")`: a passing package - and a passing test before the failing one. - - subtests: module `example.com/subtests`; `TestTheTable` runs `t.Run("passes", func(t *testing.T) {})` and - `t.Run("fails", func(t *testing.T) { t.Errorf("got 3 machines, want 4") })`: the parent fails only by its subtest. -- `subpanic.jsonl` (2026-10-26, go1.27.3-X:nodwarf5, review round 1 of issue 1901's fix), the same way: module - `example.com/subpanic`; `TestTable` runs `t.Run("passes", func(t *testing.T) {})` and `t.Run("panics", ...)`, which - writes to a nil map. go test -json files the subtest's panic under the parent `TestTable`. -- `logthenfatal.jsonl`, `panicking`, `timeout`, `deeptimeout`, `buildfail`, `exiting`, `killed`, `passthenfail`, - `mainexit`, `race`, `racemain` were captured for issue 1901's first and third meetings (2026-10-23 and 2026-10-25, - go1.27.3) in mesh-catalog's mesh-build-go (`testdata/captured/go-test-json-*.jsonl`, named there `go-test-json-pkg-` - and `go-test-json-log-then-fatal`) and moved here unchanged. From that README: each is the standard output and error of - `go test -json -count=1 ./...` (the timeouts with `-timeout 2s`; race and racemain with `-race`, CGO_ENABLED=1) in a - throwaway one-file module that fails without a test's own assertion: panicking (a nil map write in TestPanics), timeout - (TestWaitsForever sleeps past the timeout), deeptimeout (two parallel tests and sixty blocked goroutines past the - timeout, so the goroutine dump pushes the panic line out of the last 4 KB), buildfail (a type error in a test file), - exiting (os.Exit(3) in TestExits), killed (TestKilled sends itself SIGKILL), passthenfail (TestMain panics in a - goroutine after m.Run passed), mainexit (TestMain exits 2 after m.Run passed: go test prints "PASS" and then - "FAIL "), race (TestRacesOnTheSeat writes a package variable from itself and a goroutine), racemain (TestMain does - so after m.Run passed). logthenfatal is a test `TestThree` in package `x` that logs a line with t.Logf and then fails - with a multi-line t.Fatalf naming three subscriptions. - -## node/ — `npm test` running `node --test` under the TAP reporter - -Captured 2026-10-26 with node v26.12.1 and npm 12.2.1 (`/usr/bin/node`, `/usr/bin/npm`), in `/tmp/1901k/node/`, the -way mesh-build-node runs a test script: - - PATH=/usr/bin:$PATH NODE_OPTIONS="--test-reporter=tap --test-reporter-destination=/tmp/1901k/node/.tap" \ - npm test > ../.stdout 2> ../.stderr - -`.tap` is the report file, `.console` the stdout followed by the stderr. Each project's package.json is -`{"name":"","private":true,"type":"module","scripts":{"test":"node --test --experimental-strip-types 'test/*.test.ts'"}}` -(the script every TypeScript package of the catalogue and the SDK runs), with these test files: - -- two-files: `test/a.test.ts` holds `test('passes in the first file', () => {})`; `test/b.test.ts` holds - `test('passes in the second file first', () => {})` and `test('fails in the second file', ...)`, which logs - `judged against the seat as it stands` and asserts `assert.strictEqual(1 + 1, 3, 'one plus one is not three')`. -- suite: `test/a.test.ts` has `describe('the seat', ...)` with `it('passes inside', () => {})` and `it('fails inside', ...)` - asserting `assert.deepStrictEqual({ holders: 2 }, { holders: 1 })`. -- crash: `test/a.test.ts` holds `test('passes before the crash', () => {})`; `test/b.test.ts` holds - `test('throws after it returned', ...)`, which throws `new Error('the bus closed under the test')` in a `setTimeout` of - 1 ms, and `test('waits after the throw', ...)`, which waits 50 ms: node fails the file with an uncaught exception. -- logcrash (review round 1): `test/a.test.ts` holds `test('passes and logs', ...)`, which logs - `retrying after Error: the store was not ready yet`; `test/b.test.ts` is crash's. A passing test's console line - holding "Error" comes before the crash's own. -- timeout: `test/a.test.ts` holds `test('passes before the wait', () => {})` and - `test('waits for an answer that never comes', { timeout: 200 }, async () => { await new Promise(() => {}); })`. -- syntax: `test/a.test.ts` holds `test('passes in the first file', () => {})`; `test/b.test.ts` is - `import test from 'node:test';` and `test('never loads', () => {` (cut off): the file does not load. - -## tsc/ — the type-check - -`typeerror.console` (2026-10-26, typescript 5.9.3 under node v26.12.1): in `/tmp/1901k/tsc/typeerror`, `ok.ts` is -`export const holders: number = 1;` and `seat.ts` is `import { holders } from './ok.js'; export const name: string = holders;`; -the command is mesh-build-node's type-check line without a tsconfig.json: - - node /bin/tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 --rootDir . ok.ts seat.ts - -and the file is its stdout followed by its stderr. - -## passing/ — a runner's words when the network did not answer (novox/hq issue 1748, ADR 0664 §1) - -Not captured by running: a network cannot be cut on demand in a test. Each file holds the words a runner wrote when a -build step met the fault on the mesh (the journal of ace on 2026-11-09 for ssh and go, the forge's sshd penalty; npm's -error codes and buildah's pull failure as those programs print them), and for each a negative case, a failure of the -source whose words are never a network's (an unknown revision, a checksum, a missing package, a failed RUN). Name: -`-.txt`; the kit's table (conformance.go, PassingCases) says which are transport faults. diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/buildfail.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/buildfail.jsonl deleted file mode 100644 index 2b7967da9..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/buildfail.jsonl +++ /dev/null @@ -1,6 +0,0 @@ -{"ImportPath":"example.com/buildfail [example.com/buildfail.test]","Action":"build-output","Output":"# example.com/buildfail [example.com/buildfail.test]\n"} -{"ImportPath":"example.com/buildfail [example.com/buildfail.test]","Action":"build-output","Output":"./p_test.go:5:40: cannot use \"seat\" (untyped string constant) as int value in variable declaration\n"} -{"ImportPath":"example.com/buildfail [example.com/buildfail.test]","Action":"build-fail"} -{"Time":"2026-10-25T15:34:33.261137737+01:00","Action":"start","Package":"example.com/buildfail"} -{"Time":"2026-10-25T15:34:33.261255019+01:00","Action":"output","Package":"example.com/buildfail","Output":"FAIL\texample.com/buildfail [build failed]\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.261268099+01:00","Action":"fail","Package":"example.com/buildfail","Elapsed":0,"FailedBuild":"example.com/buildfail [example.com/buildfail.test]"} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/deeptimeout.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/deeptimeout.jsonl deleted file mode 100644 index 401825082..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/deeptimeout.jsonl +++ /dev/null @@ -1,417 +0,0 @@ -{"Time":"2026-10-25T15:35:18.991630993+01:00","Action":"start","Package":"example.com/deeptimeout"} -{"Time":"2026-10-25T15:35:18.993895188+01:00","Action":"run","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat"} -{"Time":"2026-10-25T15:35:18.993963909+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":"=== RUN TestHoldsTheSeat\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:18.99399484+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":"=== PAUSE TestHoldsTheSeat\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:18.9939982+01:00","Action":"pause","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat"} -{"Time":"2026-10-25T15:35:18.99400173+01:00","Action":"run","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus"} -{"Time":"2026-10-25T15:35:18.99400456+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"=== RUN TestWaitsForTheBus\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:18.99400838+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"=== PAUSE TestWaitsForTheBus\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:18.99401133+01:00","Action":"pause","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus"} -{"Time":"2026-10-25T15:35:18.99401441+01:00","Action":"cont","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat"} -{"Time":"2026-10-25T15:35:18.99401704+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":"=== CONT TestHoldsTheSeat\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:18.994074141+01:00","Action":"cont","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus"} -{"Time":"2026-10-25T15:35:18.994102612+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"=== CONT TestWaitsForTheBus\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:21.00935195+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"panic: test timed out after 2s\n"} -{"Time":"2026-10-25T15:35:21.00938383+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\trunning tests:\n"} -{"Time":"2026-10-25T15:35:21.009394391+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t\tTestHoldsTheSeat (2s)\n"} -{"Time":"2026-10-25T15:35:21.009398021+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t\tTestWaitsForTheBus (2s)\n"} -{"Time":"2026-10-25T15:35:21.009401801+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009406481+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 81 [running]:\n"} -{"Time":"2026-10-25T15:35:21.009409911+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.(*M).startAlarm.func1()\n"} -{"Time":"2026-10-25T15:35:21.009413361+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2961 +0x34a\n"} -{"Time":"2026-10-25T15:35:21.009418341+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by time.goFunc\n"} -{"Time":"2026-10-25T15:35:21.009421781+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/time/sleep.go:182 +0x2d\n"} -{"Time":"2026-10-25T15:35:21.009424991+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009428341+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 1 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009431721+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.tRunner.func1()\n"} -{"Time":"2026-10-25T15:35:21.009441811+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2144 +0x425\n"} -{"Time":"2026-10-25T15:35:21.009445511+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.tRunner(0x282e9702008, 0x282e9646bc8)\n"} -{"Time":"2026-10-25T15:35:21.009449641+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2201 +0x123\n"} -{"Time":"2026-10-25T15:35:21.009453471+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.runTests({0x55a45d, 0x17}, {0x55a45d, 0x17}, 0x282e95940f0, {0x6f19f0, 0x2, 0x2}, {0xc2afa2ca3b3c0c8d, 0x7737f168, ...})\n"} -{"Time":"2026-10-25T15:35:21.009462092+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2742 +0x510\n"} -{"Time":"2026-10-25T15:35:21.009467222+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.(*M).Run(0x282e96581e0)\n"} -{"Time":"2026-10-25T15:35:21.009470662+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2602 +0x6af\n"} -{"Time":"2026-10-25T15:35:21.009473692+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"main.main()\n"} -{"Time":"2026-10-25T15:35:21.009476942+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t_testmain.go:48 +0x9b\n"} -{"Time":"2026-10-25T15:35:21.009480092+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009483242+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 7 [sleep]:\n"} -{"Time":"2026-10-25T15:35:21.009486502+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"time.Sleep(0xdf8475800)\n"} -{"Time":"2026-10-25T15:35:21.009490682+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/runtime/time.go:368 +0x165\n"} -{"Time":"2026-10-25T15:35:21.009493812+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat(0x282e9702248?)\n"} -{"Time":"2026-10-25T15:35:21.009498842+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:14 +0x9e\n"} -{"Time":"2026-10-25T15:35:21.009502242+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.tRunner(0x282e9702248, 0x6d5e78)\n"} -{"Time":"2026-10-25T15:35:21.009505742+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-25T15:35:21.009509292+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by testing.(*T).Run in goroutine 1\n"} -{"Time":"2026-10-25T15:35:21.009512752+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2260 +0x4d4\n"} -{"Time":"2026-10-25T15:35:21.009515792+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009518623+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 8 [sleep]:\n"} -{"Time":"2026-10-25T15:35:21.009521303+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"time.Sleep(0xdf8475800)\n"} -{"Time":"2026-10-25T15:35:21.009524423+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/runtime/time.go:368 +0x165\n"} -{"Time":"2026-10-25T15:35:21.009531403+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestWaitsForTheBus(0x282e9702488?)\n"} -{"Time":"2026-10-25T15:35:21.009534943+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:19 +0x25\n"} -{"Time":"2026-10-25T15:35:21.009538403+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"testing.tRunner(0x282e9702488, 0x6d5e80)\n"} -{"Time":"2026-10-25T15:35:21.009541953+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-25T15:35:21.009545233+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by testing.(*T).Run in goroutine 1\n"} -{"Time":"2026-10-25T15:35:21.009548323+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/usr/lib/go/src/testing/testing.go:2260 +0x4d4\n"} -{"Time":"2026-10-25T15:35:21.009551343+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009554263+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 9 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009557523+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009561063+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009564513+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009571113+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009574233+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009577433+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 10 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009580823+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009584174+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009587504+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009590974+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009594004+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009597184+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 11 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009600394+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009603874+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009610954+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009614714+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009618104+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009621364+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 12 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009624704+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009628324+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009631954+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009635404+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009638734+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009641904+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 13 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009645325+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009648645+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009652065+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009655625+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009658885+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009663385+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 14 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009666735+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009670235+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009676385+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009680205+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009683315+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009686475+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 15 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009689785+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009697235+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009700795+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009704985+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009708085+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009711346+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 16 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009714586+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009717946+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009721676+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009725626+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009728866+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009732106+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 17 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009735376+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009738956+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009742326+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009746436+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009750666+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009754126+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 18 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009758286+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009761846+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009765776+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009769816+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009773167+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009780507+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 19 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009784207+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009788007+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009791627+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009796347+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009799427+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009802937+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 20 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009806667+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009809987+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009813827+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009818087+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009821397+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009824227+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 21 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009827607+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009831307+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009835167+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009839528+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009842728+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009845888+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 22 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009849168+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009852548+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009855958+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009863648+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009866938+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009870088+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 23 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009879828+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009883728+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009887608+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009891548+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009895238+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009898748+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 24 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009902349+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009907109+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009911519+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009915609+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009918939+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009922329+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 25 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009928329+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009931909+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.009935489+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.009939429+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.009942699+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.009946019+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 26 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.009949559+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.009953489+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.00996244+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.00996647+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.00996987+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.00997314+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 27 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.00997664+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.00998035+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.00998418+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.00998793+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.00999131+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.00999534+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 28 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.00999894+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.01000268+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.0100087+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.01001258+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.01001605+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.01002007+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 29 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.01002393+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010027531+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010031351+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010035521+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010038781+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010042281+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 30 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010046091+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010054261+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010057881+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010061781+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010064931+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010068261+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 31 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010072151+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010075981+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010079841+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010098802+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010103202+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010106382+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 32 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010109852+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010113242+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010116952+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010120672+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010124112+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010127162+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 33 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010130662+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010134442+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010138142+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010141972+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010145362+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010152262+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 34 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010156353+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010159913+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010163533+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010167403+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010170533+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010173953+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 35 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010177453+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010181033+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010184693+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010188583+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010191753+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010195033+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 36 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010198603+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010202393+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010206123+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010210583+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010213503+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010216914+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 37 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010220134+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010223644+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010227154+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010235154+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010238354+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010241754+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 38 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010270284+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010275144+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010278714+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010282825+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010285795+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010288935+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 39 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010292405+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010295915+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010299545+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010311835+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010315565+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010318975+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 40 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010322655+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010326225+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010329815+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010333745+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010337095+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010340515+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 41 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010344066+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010347706+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010355596+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010359046+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010362036+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010365076+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 42 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010367956+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010370906+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010375366+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010378386+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010381006+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010383666+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 43 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010386676+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010389786+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010392636+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010395746+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010398466+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010401166+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 44 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010404226+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010407186+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010410117+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010413237+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010416157+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010418897+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 45 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010423157+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010430107+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010433197+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010451207+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010454217+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010456967+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 46 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010459877+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010463967+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010467067+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010470597+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010473418+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010476108+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 47 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010478998+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010481958+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010484978+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010488258+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010490888+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010493628+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 48 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010496588+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010499498+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010502498+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010505768+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010508558+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010514148+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 49 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010517178+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010520238+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010523478+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010526818+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010529718+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010532508+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 50 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010535639+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010538749+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010541939+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010546689+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010549869+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010552989+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 51 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010556299+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010560079+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010563479+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010567189+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010570299+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010573079+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 52 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010576319+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010579599+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010583099+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010590519+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010594029+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010596989+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 53 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.01059986+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.01060433+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.01060789+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.01061136+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.01061393+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.01061667+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 54 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.01061984+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.0106227+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.01062566+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.01062876+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.01063131+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.01063428+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 55 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.01063719+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.01063997+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.01064278+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.01064582+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.01064836+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.01065114+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 56 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.01065437+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.01065724+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010671481+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010675671+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010678431+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010691171+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 57 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010694531+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010697641+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010700781+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010704001+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010706611+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010709421+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 58 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010712331+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010715351+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010718431+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010721691+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010724371+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010727362+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 59 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010730592+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010733662+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010736712+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010740162+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010742922+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010745772+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 60 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010752222+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010755402+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010758542+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010761822+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010764592+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010767992+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 61 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010771062+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010774282+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010779382+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010782942+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010785722+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010788573+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 62 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010791893+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010794943+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010798083+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010801683+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010804293+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010807283+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 63 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010810443+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010813553+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010816793+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010820233+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010823063+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010829493+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 64 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010832683+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010835953+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010839223+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010842463+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010845333+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010848423+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 65 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010851663+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010854964+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010858364+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010861714+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010864914+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010867984+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 66 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010870944+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010874114+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010877464+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010880504+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010883144+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010886194+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 67 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010889154+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010892234+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010895524+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010902154+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.010904984+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\n"} -{"Time":"2026-10-25T15:35:21.010907984+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"goroutine 68 [chan receive]:\n"} -{"Time":"2026-10-25T15:35:21.010911064+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"example.com/deeptimeout.TestHoldsTheSeat.func1()\n"} -{"Time":"2026-10-25T15:35:21.010914074+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x19\n"} -{"Time":"2026-10-25T15:35:21.010917365+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"created by example.com/deeptimeout.TestHoldsTheSeat in goroutine 7\n"} -{"Time":"2026-10-25T15:35:21.010920505+01:00","Action":"output","Package":"example.com/deeptimeout","Test":"TestWaitsForTheBus","Output":"\t/tmp/fix-1901b/deeptimeout/p_test.go:12 +0x37\n"} -{"Time":"2026-10-25T15:35:21.013209581+01:00","Action":"output","Package":"example.com/deeptimeout","Output":"FAIL\texample.com/deeptimeout\t2.021s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:35:21.013258851+01:00","Action":"fail","Package":"example.com/deeptimeout","Elapsed":2.022} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/exiting.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/exiting.jsonl deleted file mode 100644 index ec4ce02fc..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/exiting.jsonl +++ /dev/null @@ -1,10 +0,0 @@ -{"Time":"2026-10-25T15:34:33.768742837+01:00","Action":"start","Package":"example.com/exiting"} -{"Time":"2026-10-25T15:34:33.773822287+01:00","Action":"run","Package":"example.com/exiting","Test":"TestFine"} -{"Time":"2026-10-25T15:34:33.773896608+01:00","Action":"output","Package":"example.com/exiting","Test":"TestFine","Output":"=== RUN TestFine\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.773940319+01:00","Action":"output","Package":"example.com/exiting","Test":"TestFine","Output":"--- PASS: TestFine (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.773945359+01:00","Action":"pass","Package":"example.com/exiting","Test":"TestFine","Elapsed":0} -{"Time":"2026-10-25T15:34:33.773952529+01:00","Action":"run","Package":"example.com/exiting","Test":"TestExits"} -{"Time":"2026-10-25T15:34:33.773956439+01:00","Action":"output","Package":"example.com/exiting","Test":"TestExits","Output":"=== RUN TestExits\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.773959829+01:00","Action":"output","Package":"example.com/exiting","Test":"TestExits","Output":" p_test.go:11: closing the store\n"} -{"Time":"2026-10-25T15:34:33.775158538+01:00","Action":"output","Package":"example.com/exiting","Output":"FAIL\texample.com/exiting\t0.006s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.775186509+01:00","Action":"fail","Package":"example.com/exiting","Elapsed":0.006} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/killed.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/killed.jsonl deleted file mode 100644 index f4ba5258a..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/killed.jsonl +++ /dev/null @@ -1,7 +0,0 @@ -{"Time":"2026-10-25T15:34:34.328258934+01:00","Action":"start","Package":"example.com/killed"} -{"Time":"2026-10-25T15:34:34.331465435+01:00","Action":"run","Package":"example.com/killed","Test":"TestKilled"} -{"Time":"2026-10-25T15:34:34.331699248+01:00","Action":"output","Package":"example.com/killed","Test":"TestKilled","Output":"=== RUN TestKilled\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.331853111+01:00","Action":"output","Package":"example.com/killed","Test":"TestKilled","Output":" p_test.go:10: the kernel is about to kill this\n"} -{"Time":"2026-10-25T15:34:34.334563213+01:00","Action":"output","Package":"example.com/killed","Test":"TestKilled","Output":"signal: killed\n"} -{"Time":"2026-10-25T15:34:34.334611114+01:00","Action":"output","Package":"example.com/killed","Output":"FAIL\texample.com/killed\t0.006s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.334627134+01:00","Action":"fail","Package":"example.com/killed","Elapsed":0.006} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/logthenfatal.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/logthenfatal.jsonl deleted file mode 100644 index c59fba2f1..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/logthenfatal.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{"Action":"start","Package":"x"} -{"Action":"run","Package":"x","Test":"TestThree"} -{"Action":"output","Package":"x","Test":"TestThree","Output":"=== RUN TestThree\n","OutputType":"frame"} -{"Action":"output","Package":"x","Test":"TestThree","Output":" a_test.go:4: judged against /var/lib/mesh-build-go-work/id/beside/mesh-catalog as cloned\n"} -{"Action":"output","Package":"x","Test":"TestThree","Output":" a_test.go:5: 3 subscription(s) derive to a subject no emitter owns:\n","OutputType":"error"} -{"Action":"output","Package":"x","Test":"TestThree","Output":" a.b.c\n","OutputType":"error-continue"} -{"Action":"output","Package":"x","Test":"TestThree","Output":" d.e.f\n","OutputType":"error-continue"} -{"Action":"output","Package":"x","Test":"TestThree","Output":" g.h.i\n","OutputType":"error-continue"} -{"Action":"output","Package":"x","Test":"TestThree","Output":"--- FAIL: TestThree (0.00s)\n","OutputType":"frame"} -{"Action":"fail","Package":"x","Test":"TestThree","Elapsed":0} -{"Action":"output","Package":"x","Output":"FAIL\n","OutputType":"frame"} -{"Action":"output","Package":"x","Output":"FAIL\tx\t0.002s\n","OutputType":"frame"} -{"Action":"fail","Package":"x","Elapsed":0.002} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/mainexit.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/mainexit.jsonl deleted file mode 100644 index 5f106bada..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/mainexit.jsonl +++ /dev/null @@ -1,8 +0,0 @@ -{"Time":"2026-10-25T15:34:35.274953775+01:00","Action":"start","Package":"example.com/mainexit"} -{"Time":"2026-10-25T15:34:35.278129565+01:00","Action":"run","Package":"example.com/mainexit","Test":"TestFine"} -{"Time":"2026-10-25T15:34:35.278191516+01:00","Action":"output","Package":"example.com/mainexit","Test":"TestFine","Output":"=== RUN TestFine\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:35.278341979+01:00","Action":"output","Package":"example.com/mainexit","Test":"TestFine","Output":"--- PASS: TestFine (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:35.278351739+01:00","Action":"pass","Package":"example.com/mainexit","Test":"TestFine","Elapsed":0} -{"Time":"2026-10-25T15:34:35.278359039+01:00","Action":"output","Package":"example.com/mainexit","Output":"PASS\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:35.279516487+01:00","Action":"output","Package":"example.com/mainexit","Output":"FAIL\texample.com/mainexit\t0.004s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:35.279539298+01:00","Action":"fail","Package":"example.com/mainexit","Elapsed":0.005} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/panicking.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/panicking.jsonl deleted file mode 100644 index 7609d5d2f..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/panicking.jsonl +++ /dev/null @@ -1,27 +0,0 @@ -{"Time":"2026-10-25T15:34:33.031091436+01:00","Action":"start","Package":"example.com/panicking"} -{"Time":"2026-10-25T15:34:33.036353279+01:00","Action":"run","Package":"example.com/panicking","Test":"TestBefore"} -{"Time":"2026-10-25T15:34:33.036441781+01:00","Action":"output","Package":"example.com/panicking","Test":"TestBefore","Output":"=== RUN TestBefore\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.036568163+01:00","Action":"output","Package":"example.com/panicking","Test":"TestBefore","Output":"--- PASS: TestBefore (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.036609863+01:00","Action":"pass","Package":"example.com/panicking","Test":"TestBefore","Elapsed":0} -{"Time":"2026-10-25T15:34:33.036641304+01:00","Action":"run","Package":"example.com/panicking","Test":"TestPanics"} -{"Time":"2026-10-25T15:34:33.036645914+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"=== RUN TestPanics\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.036698995+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":" p_test.go:8: about to look up the seat\n"} -{"Time":"2026-10-25T15:34:33.036773996+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"--- FAIL: TestPanics (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.03897418+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"panic: assignment to entry in nil map [recovered, repanicked]\n"} -{"Time":"2026-10-25T15:34:33.040332172+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\n"} -{"Time":"2026-10-25T15:34:33.040414493+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"goroutine 8 [running]:\n"} -{"Time":"2026-10-25T15:34:33.040521475+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"testing.tRunner.func1.2({0x6b8120, 0x6eff80})\n"} -{"Time":"2026-10-25T15:34:33.040601826+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/usr/lib/go/src/testing/testing.go:2125 +0x232\n"} -{"Time":"2026-10-25T15:34:33.040641947+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"testing.tRunner.func1()\n"} -{"Time":"2026-10-25T15:34:33.040720648+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/usr/lib/go/src/testing/testing.go:2128 +0x329\n"} -{"Time":"2026-10-25T15:34:33.04083286+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"panic({0x6b8120?, 0x6eff80?})\n"} -{"Time":"2026-10-25T15:34:33.040912921+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/usr/lib/go/src/runtime/panic.go:859 +0x125\n"} -{"Time":"2026-10-25T15:34:33.040981652+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"example.com/panicking.TestPanics(0x228226cd0488?)\n"} -{"Time":"2026-10-25T15:34:33.041059903+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/tmp/fix-1901b/panicking/p_test.go:10 +0x53\n"} -{"Time":"2026-10-25T15:34:33.041132704+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"testing.tRunner(0x228226cd0488, 0x6d5bc8)\n"} -{"Time":"2026-10-25T15:34:33.041215586+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-25T15:34:33.041221966+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"created by testing.(*T).Run in goroutine 1\n"} -{"Time":"2026-10-25T15:34:33.041225556+01:00","Action":"output","Package":"example.com/panicking","Test":"TestPanics","Output":"\t/usr/lib/go/src/testing/testing.go:2260 +0x4d4\n"} -{"Time":"2026-10-25T15:34:33.041984088+01:00","Action":"fail","Package":"example.com/panicking","Test":"TestPanics","Elapsed":0} -{"Time":"2026-10-25T15:34:33.041996638+01:00","Action":"output","Package":"example.com/panicking","Output":"FAIL\texample.com/panicking\t0.010s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:33.042044079+01:00","Action":"fail","Package":"example.com/panicking","Elapsed":0.011} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/passfirst.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/passfirst.jsonl deleted file mode 100644 index a8286d9ce..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/passfirst.jsonl +++ /dev/null @@ -1,22 +0,0 @@ -{"Time":"2026-10-26T19:40:29.574068887+01:00","Action":"start","Package":"example.com/passfirst/a"} -{"Time":"2026-10-26T19:40:29.574347185+01:00","Action":"start","Package":"example.com/passfirst/b"} -{"Time":"2026-10-26T19:40:29.576503518+01:00","Action":"run","Package":"example.com/passfirst/a","Test":"TestTheFirstPackagePasses"} -{"Time":"2026-10-26T19:40:29.576557657+01:00","Action":"output","Package":"example.com/passfirst/a","Test":"TestTheFirstPackagePasses","Output":"=== RUN TestTheFirstPackagePasses\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576589367+01:00","Action":"output","Package":"example.com/passfirst/a","Test":"TestTheFirstPackagePasses","Output":"--- PASS: TestTheFirstPackagePasses (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576594637+01:00","Action":"pass","Package":"example.com/passfirst/a","Test":"TestTheFirstPackagePasses","Elapsed":0} -{"Time":"2026-10-26T19:40:29.576602487+01:00","Action":"output","Package":"example.com/passfirst/a","Output":"PASS\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576614477+01:00","Action":"run","Package":"example.com/passfirst/b","Test":"TestTheSecondPackagePassesFirst"} -{"Time":"2026-10-26T19:40:29.576626897+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackagePassesFirst","Output":"=== RUN TestTheSecondPackagePassesFirst\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576631187+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackagePassesFirst","Output":"--- PASS: TestTheSecondPackagePassesFirst (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576635567+01:00","Action":"pass","Package":"example.com/passfirst/b","Test":"TestTheSecondPackagePassesFirst","Elapsed":0} -{"Time":"2026-10-26T19:40:29.576638427+01:00","Action":"run","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails"} -{"Time":"2026-10-26T19:40:29.576640647+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails","Output":"=== RUN TestTheSecondPackageFails\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576643477+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails","Output":" b_test.go:8: judged against the seat as it stands\n"} -{"Time":"2026-10-26T19:40:29.576646497+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails","Output":" b_test.go:9: the seat has 2 holders, want 1\n","OutputType":"error"} -{"Time":"2026-10-26T19:40:29.576650087+01:00","Action":"output","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails","Output":"--- FAIL: TestTheSecondPackageFails (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.576652797+01:00","Action":"fail","Package":"example.com/passfirst/b","Test":"TestTheSecondPackageFails","Elapsed":0} -{"Time":"2026-10-26T19:40:29.576655177+01:00","Action":"output","Package":"example.com/passfirst/b","Output":"FAIL\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.577365541+01:00","Action":"output","Package":"example.com/passfirst/a","Output":"ok \texample.com/passfirst/a\t0.003s\n"} -{"Time":"2026-10-26T19:40:29.577382561+01:00","Action":"pass","Package":"example.com/passfirst/a","Elapsed":0.003} -{"Time":"2026-10-26T19:40:29.577380641+01:00","Action":"output","Package":"example.com/passfirst/b","Output":"FAIL\texample.com/passfirst/b\t0.003s\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.5774131+01:00","Action":"fail","Package":"example.com/passfirst/b","Elapsed":0.003} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/passthenfail.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/passthenfail.jsonl deleted file mode 100644 index 55fa9309c..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/passthenfail.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"Time":"2026-10-25T15:34:34.919624192+01:00","Action":"start","Package":"example.com/passthenfail"} -{"Time":"2026-10-25T15:34:34.922861224+01:00","Action":"run","Package":"example.com/passthenfail","Test":"TestFine"} -{"Time":"2026-10-25T15:34:34.922932965+01:00","Action":"output","Package":"example.com/passthenfail","Test":"TestFine","Output":"=== RUN TestFine\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.922969205+01:00","Action":"output","Package":"example.com/passthenfail","Test":"TestFine","Output":"--- PASS: TestFine (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.922979956+01:00","Action":"pass","Package":"example.com/passthenfail","Test":"TestFine","Elapsed":0} -{"Time":"2026-10-25T15:34:34.922989416+01:00","Action":"output","Package":"example.com/passthenfail","Output":"PASS\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.925022528+01:00","Action":"output","Package":"example.com/passthenfail","Output":"panic: the bus closed after the tests: nats: connection closed\n"} -{"Time":"2026-10-25T15:34:34.925043388+01:00","Action":"output","Package":"example.com/passthenfail","Output":"\n"} -{"Time":"2026-10-25T15:34:34.925046848+01:00","Action":"output","Package":"example.com/passthenfail","Output":"goroutine 20 [running]:\n"} -{"Time":"2026-10-25T15:34:34.925051338+01:00","Action":"output","Package":"example.com/passthenfail","Output":"example.com/passthenfail.TestMain.func1()\n"} -{"Time":"2026-10-25T15:34:34.925055878+01:00","Action":"output","Package":"example.com/passthenfail","Output":"\t/tmp/fix-1901b/passthenfail/p_test.go:13 +0x25\n"} -{"Time":"2026-10-25T15:34:34.925061428+01:00","Action":"output","Package":"example.com/passthenfail","Output":"created by example.com/passthenfail.TestMain in goroutine 1\n"} -{"Time":"2026-10-25T15:34:34.925065028+01:00","Action":"output","Package":"example.com/passthenfail","Output":"\t/tmp/fix-1901b/passthenfail/p_test.go:13 +0x25\n"} -{"Time":"2026-10-25T15:34:34.925390203+01:00","Action":"output","Package":"example.com/passthenfail","Output":"FAIL\texample.com/passthenfail\t0.005s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:34.925402904+01:00","Action":"fail","Package":"example.com/passthenfail","Elapsed":0.006} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/race.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/race.jsonl deleted file mode 100644 index 93e9ac17d..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/race.jsonl +++ /dev/null @@ -1,53 +0,0 @@ -{"Time":"2026-10-25T15:50:42.908557309+01:00","Action":"start","Package":"example.com/race"} -{"Time":"2026-10-25T15:50:42.924298679+01:00","Action":"run","Package":"example.com/race","Test":"TestBefore"} -{"Time":"2026-10-25T15:50:42.92438195+01:00","Action":"output","Package":"example.com/race","Test":"TestBefore","Output":"=== RUN TestBefore\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.924648842+01:00","Action":"output","Package":"example.com/race","Test":"TestBefore","Output":"--- PASS: TestBefore (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.924685133+01:00","Action":"pass","Package":"example.com/race","Test":"TestBefore","Elapsed":0} -{"Time":"2026-10-25T15:50:42.924728573+01:00","Action":"run","Package":"example.com/race","Test":"TestRacesOnTheSeat"} -{"Time":"2026-10-25T15:50:42.924733573+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"=== RUN TestRacesOnTheSeat\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.92637298+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"==================\n"} -{"Time":"2026-10-25T15:50:42.92641567+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"WARNING: DATA RACE\n"} -{"Time":"2026-10-25T15:50:42.926444061+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"Write at 0x000000833468 by goroutine 10:\n"} -{"Time":"2026-10-25T15:50:42.926462621+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" example.com/race.TestRacesOnTheSeat.func1()\n"} -{"Time":"2026-10-25T15:50:42.926467121+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /tmp/fix-1901b/race/p_test.go:13 +0x24\n"} -{"Time":"2026-10-25T15:50:42.926483061+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"\n"} -{"Time":"2026-10-25T15:50:42.926509741+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"Previous write at 0x000000833468 by goroutine 9:\n"} -{"Time":"2026-10-25T15:50:42.926530142+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" example.com/race.TestRacesOnTheSeat()\n"} -{"Time":"2026-10-25T15:50:42.926534952+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /tmp/fix-1901b/race/p_test.go:14 +0x30\n"} -{"Time":"2026-10-25T15:50:42.926550462+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.tRunner()\n"} -{"Time":"2026-10-25T15:50:42.926554612+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2195 +0x21c\n"} -{"Time":"2026-10-25T15:50:42.926571142+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.(*T).Run.gowrap1()\n"} -{"Time":"2026-10-25T15:50:42.926575812+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2260 +0x38\n"} -{"Time":"2026-10-25T15:50:42.926592202+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"\n"} -{"Time":"2026-10-25T15:50:42.926607792+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"Goroutine 10 (running) created at:\n"} -{"Time":"2026-10-25T15:50:42.926624292+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" example.com/race.TestRacesOnTheSeat()\n"} -{"Time":"2026-10-25T15:50:42.926628923+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /tmp/fix-1901b/race/p_test.go:13 +0x24\n"} -{"Time":"2026-10-25T15:50:42.926643853+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.tRunner()\n"} -{"Time":"2026-10-25T15:50:42.926648103+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2195 +0x21c\n"} -{"Time":"2026-10-25T15:50:42.926674843+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.(*T).Run.gowrap1()\n"} -{"Time":"2026-10-25T15:50:42.926680673+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2260 +0x38\n"} -{"Time":"2026-10-25T15:50:42.926695433+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"\n"} -{"Time":"2026-10-25T15:50:42.926711063+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"Goroutine 9 (running) created at:\n"} -{"Time":"2026-10-25T15:50:42.926726614+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.(*T).Run()\n"} -{"Time":"2026-10-25T15:50:42.926730814+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2260 +0xb12\n"} -{"Time":"2026-10-25T15:50:42.926746484+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.runTests.func1()\n"} -{"Time":"2026-10-25T15:50:42.926750764+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2744 +0x84\n"} -{"Time":"2026-10-25T15:50:42.926765354+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.tRunner()\n"} -{"Time":"2026-10-25T15:50:42.926769844+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2195 +0x21c\n"} -{"Time":"2026-10-25T15:50:42.926791794+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.runTests()\n"} -{"Time":"2026-10-25T15:50:42.926796704+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2742 +0x9e9\n"} -{"Time":"2026-10-25T15:50:42.926811544+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.(*M).Run()\n"} -{"Time":"2026-10-25T15:50:42.926816694+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" /usr/lib/go/src/testing/testing.go:2602 +0xf44\n"} -{"Time":"2026-10-25T15:50:42.926831695+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" main.main()\n"} -{"Time":"2026-10-25T15:50:42.926835935+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" _testmain.go:50 +0x164\n"} -{"Time":"2026-10-25T15:50:42.926850905+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"==================\n"} -{"Time":"2026-10-25T15:50:42.935320241+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":" testing.go:1867: race detected during execution of test\n","OutputType":"error"} -{"Time":"2026-10-25T15:50:42.935520113+01:00","Action":"output","Package":"example.com/race","Test":"TestRacesOnTheSeat","Output":"--- FAIL: TestRacesOnTheSeat (0.01s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.935592973+01:00","Action":"fail","Package":"example.com/race","Test":"TestRacesOnTheSeat","Elapsed":0.01} -{"Time":"2026-10-25T15:50:42.935722225+01:00","Action":"run","Package":"example.com/race","Test":"TestAfter"} -{"Time":"2026-10-25T15:50:42.935728845+01:00","Action":"output","Package":"example.com/race","Test":"TestAfter","Output":"=== RUN TestAfter\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.935995928+01:00","Action":"output","Package":"example.com/race","Test":"TestAfter","Output":"--- PASS: TestAfter (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.936006328+01:00","Action":"pass","Package":"example.com/race","Test":"TestAfter","Elapsed":0} -{"Time":"2026-10-25T15:50:42.936009978+01:00","Action":"output","Package":"example.com/race","Output":"FAIL\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.937730745+01:00","Action":"output","Package":"example.com/race","Output":"FAIL\texample.com/race\t0.028s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:42.937802066+01:00","Action":"fail","Package":"example.com/race","Elapsed":0.029} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/racemain.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/racemain.jsonl deleted file mode 100644 index 8a2a5c076..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/racemain.jsonl +++ /dev/null @@ -1,27 +0,0 @@ -{"Time":"2026-10-25T15:50:43.551701745+01:00","Action":"start","Package":"example.com/racemain"} -{"Time":"2026-10-25T15:50:43.570709708+01:00","Action":"run","Package":"example.com/racemain","Test":"TestFine"} -{"Time":"2026-10-25T15:50:43.570806059+01:00","Action":"output","Package":"example.com/racemain","Test":"TestFine","Output":"=== RUN TestFine\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:43.57085525+01:00","Action":"output","Package":"example.com/racemain","Test":"TestFine","Output":"--- PASS: TestFine (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:43.57086149+01:00","Action":"pass","Package":"example.com/racemain","Test":"TestFine","Elapsed":0} -{"Time":"2026-10-25T15:50:43.57086974+01:00","Action":"output","Package":"example.com/racemain","Output":"PASS\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:43.572155623+01:00","Action":"output","Package":"example.com/racemain","Output":"==================\n"} -{"Time":"2026-10-25T15:50:43.572168083+01:00","Action":"output","Package":"example.com/racemain","Output":"WARNING: DATA RACE\n"} -{"Time":"2026-10-25T15:50:43.572171933+01:00","Action":"output","Package":"example.com/racemain","Output":"Write at 0x000000836428 by goroutine 9:\n"} -{"Time":"2026-10-25T15:50:43.572176703+01:00","Action":"output","Package":"example.com/racemain","Output":" example.com/racemain.TestMain.func1()\n"} -{"Time":"2026-10-25T15:50:43.572180053+01:00","Action":"output","Package":"example.com/racemain","Output":" /tmp/fix-1901b/racemain/p_test.go:15 +0x24\n"} -{"Time":"2026-10-25T15:50:43.572184923+01:00","Action":"output","Package":"example.com/racemain","Output":"\n"} -{"Time":"2026-10-25T15:50:43.572189613+01:00","Action":"output","Package":"example.com/racemain","Output":"Previous write at 0x000000836428 by main goroutine:\n"} -{"Time":"2026-10-25T15:50:43.572192993+01:00","Action":"output","Package":"example.com/racemain","Output":" example.com/racemain.TestMain()\n"} -{"Time":"2026-10-25T15:50:43.572198573+01:00","Action":"output","Package":"example.com/racemain","Output":" /tmp/fix-1901b/racemain/p_test.go:16 +0x44\n"} -{"Time":"2026-10-25T15:50:43.572202433+01:00","Action":"output","Package":"example.com/racemain","Output":" main.main()\n"} -{"Time":"2026-10-25T15:50:43.572205623+01:00","Action":"output","Package":"example.com/racemain","Output":" _testmain.go:48 +0x171\n"} -{"Time":"2026-10-25T15:50:43.572208443+01:00","Action":"output","Package":"example.com/racemain","Output":"\n"} -{"Time":"2026-10-25T15:50:43.572211573+01:00","Action":"output","Package":"example.com/racemain","Output":"Goroutine 9 (running) created at:\n"} -{"Time":"2026-10-25T15:50:43.572214803+01:00","Action":"output","Package":"example.com/racemain","Output":" example.com/racemain.TestMain()\n"} -{"Time":"2026-10-25T15:50:43.572218043+01:00","Action":"output","Package":"example.com/racemain","Output":" /tmp/fix-1901b/racemain/p_test.go:15 +0x37\n"} -{"Time":"2026-10-25T15:50:43.572225414+01:00","Action":"output","Package":"example.com/racemain","Output":" main.main()\n"} -{"Time":"2026-10-25T15:50:43.572228654+01:00","Action":"output","Package":"example.com/racemain","Output":" _testmain.go:48 +0x171\n"} -{"Time":"2026-10-25T15:50:43.572231664+01:00","Action":"output","Package":"example.com/racemain","Output":"==================\n"} -{"Time":"2026-10-25T15:50:44.581262249+01:00","Action":"output","Package":"example.com/racemain","Output":"Found 1 data race(s)\n"} -{"Time":"2026-10-25T15:50:44.584693204+01:00","Action":"output","Package":"example.com/racemain","Output":"FAIL\texample.com/racemain\t1.031s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:50:44.584737425+01:00","Action":"fail","Package":"example.com/racemain","Elapsed":1.033} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/subpanic.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/subpanic.jsonl deleted file mode 100644 index ec85af784..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/subpanic.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"Time":"2026-10-26T20:15:37.791161045+01:00","Action":"start","Package":"example.com/subpanic"} -{"Time":"2026-10-26T20:15:37.793205666+01:00","Action":"run","Package":"example.com/subpanic","Test":"TestTable"} -{"Time":"2026-10-26T20:15:37.793257158+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"=== RUN TestTable\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.793288149+01:00","Action":"run","Package":"example.com/subpanic","Test":"TestTable/passes"} -{"Time":"2026-10-26T20:15:37.793290669+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable/passes","Output":"=== RUN TestTable/passes\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.793298009+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable/passes","Output":"--- PASS: TestTable/passes (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.793311679+01:00","Action":"pass","Package":"example.com/subpanic","Test":"TestTable/passes","Elapsed":0} -{"Time":"2026-10-26T20:15:37.79331977+01:00","Action":"run","Package":"example.com/subpanic","Test":"TestTable/panics"} -{"Time":"2026-10-26T20:15:37.79332377+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable/panics","Output":"=== RUN TestTable/panics\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.79332773+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable/panics","Output":"--- FAIL: TestTable/panics (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.79333111+01:00","Action":"fail","Package":"example.com/subpanic","Test":"TestTable/panics","Elapsed":0} -{"Time":"2026-10-26T20:15:37.79333383+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"--- FAIL: TestTable (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.795322529+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"panic: assignment to entry in nil map [recovered, repanicked]\n"} -{"Time":"2026-10-26T20:15:37.795331489+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\n"} -{"Time":"2026-10-26T20:15:37.795340579+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"goroutine 9 [running]:\n"} -{"Time":"2026-10-26T20:15:37.79534387+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"testing.tRunner.func1.2({0x6b7010, 0x6eef80})\n"} -{"Time":"2026-10-26T20:15:37.79534657+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/usr/lib/go/src/testing/testing.go:2125 +0x232\n"} -{"Time":"2026-10-26T20:15:37.79534907+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"testing.tRunner.func1()\n"} -{"Time":"2026-10-26T20:15:37.79535172+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/usr/lib/go/src/testing/testing.go:2128 +0x329\n"} -{"Time":"2026-10-26T20:15:37.79535625+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"panic({0x6b7010?, 0x6eef80?})\n"} -{"Time":"2026-10-26T20:15:37.79535879+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/usr/lib/go/src/runtime/panic.go:859 +0x125\n"} -{"Time":"2026-10-26T20:15:37.79536129+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"example.com/subpanic.TestTable.func2(0x3b39436666c8?)\n"} -{"Time":"2026-10-26T20:15:37.79536452+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/tmp/1901k/go/subpanic/p_test.go:7 +0x28\n"} -{"Time":"2026-10-26T20:15:37.79536782+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"testing.tRunner(0x3b39436666c8, 0x6d4b58)\n"} -{"Time":"2026-10-26T20:15:37.7953704+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-26T20:15:37.79537289+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"created by testing.(*T).Run in goroutine 7\n"} -{"Time":"2026-10-26T20:15:37.795381681+01:00","Action":"output","Package":"example.com/subpanic","Test":"TestTable","Output":"\t/usr/lib/go/src/testing/testing.go:2260 +0x4d4\n"} -{"Time":"2026-10-26T20:15:37.795731441+01:00","Action":"fail","Package":"example.com/subpanic","Test":"TestTable","Elapsed":0} -{"Time":"2026-10-26T20:15:37.795759332+01:00","Action":"output","Package":"example.com/subpanic","Output":"FAIL\texample.com/subpanic\t0.004s\n","OutputType":"frame"} -{"Time":"2026-10-26T20:15:37.795783503+01:00","Action":"fail","Package":"example.com/subpanic","Elapsed":0.005} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/subtests.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/subtests.jsonl deleted file mode 100644 index b12cb5aca..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/subtests.jsonl +++ /dev/null @@ -1,17 +0,0 @@ -{"Time":"2026-10-26T19:40:29.768101399+01:00","Action":"start","Package":"example.com/subtests"} -{"Time":"2026-10-26T19:40:29.770109733+01:00","Action":"run","Package":"example.com/subtests","Test":"TestTheTable"} -{"Time":"2026-10-26T19:40:29.770152272+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable","Output":"=== RUN TestTheTable\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770189372+01:00","Action":"run","Package":"example.com/subtests","Test":"TestTheTable/passes"} -{"Time":"2026-10-26T19:40:29.770191882+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable/passes","Output":"=== RUN TestTheTable/passes\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770197442+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable/passes","Output":"--- PASS: TestTheTable/passes (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770204352+01:00","Action":"pass","Package":"example.com/subtests","Test":"TestTheTable/passes","Elapsed":0} -{"Time":"2026-10-26T19:40:29.770209622+01:00","Action":"run","Package":"example.com/subtests","Test":"TestTheTable/fails"} -{"Time":"2026-10-26T19:40:29.770211832+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable/fails","Output":"=== RUN TestTheTable/fails\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770214722+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable/fails","Output":" s_test.go:7: got 3 machines, want 4\n","OutputType":"error"} -{"Time":"2026-10-26T19:40:29.770218032+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable/fails","Output":"--- FAIL: TestTheTable/fails (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770220732+01:00","Action":"fail","Package":"example.com/subtests","Test":"TestTheTable/fails","Elapsed":0} -{"Time":"2026-10-26T19:40:29.770223522+01:00","Action":"output","Package":"example.com/subtests","Test":"TestTheTable","Output":"--- FAIL: TestTheTable (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770226292+01:00","Action":"fail","Package":"example.com/subtests","Test":"TestTheTable","Elapsed":0} -{"Time":"2026-10-26T19:40:29.770228582+01:00","Action":"output","Package":"example.com/subtests","Output":"FAIL\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770561979+01:00","Action":"output","Package":"example.com/subtests","Output":"FAIL\texample.com/subtests\t0.002s\n","OutputType":"frame"} -{"Time":"2026-10-26T19:40:29.770581629+01:00","Action":"fail","Package":"example.com/subtests","Elapsed":0.002} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/go/timeout.jsonl b/modules/mesh-build-go/buildstep/conformance/captured/go/timeout.jsonl deleted file mode 100644 index 12a2c12fc..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/go/timeout.jsonl +++ /dev/null @@ -1,43 +0,0 @@ -{"Time":"2026-10-25T15:34:36.049580618+01:00","Action":"start","Package":"example.com/timeout"} -{"Time":"2026-10-25T15:34:36.053250986+01:00","Action":"run","Package":"example.com/timeout","Test":"TestQuick"} -{"Time":"2026-10-25T15:34:36.053354018+01:00","Action":"output","Package":"example.com/timeout","Test":"TestQuick","Output":"=== RUN TestQuick\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:36.053459789+01:00","Action":"output","Package":"example.com/timeout","Test":"TestQuick","Output":"--- PASS: TestQuick (0.00s)\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:36.05348499+01:00","Action":"pass","Package":"example.com/timeout","Test":"TestQuick","Elapsed":0} -{"Time":"2026-10-25T15:34:36.0535114+01:00","Action":"run","Package":"example.com/timeout","Test":"TestWaitsForever"} -{"Time":"2026-10-25T15:34:36.05351549+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"=== RUN TestWaitsForever\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:36.053567451+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":" p_test.go:11: waiting for the bus\n"} -{"Time":"2026-10-25T15:34:38.064693307+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"panic: test timed out after 2s\n"} -{"Time":"2026-10-25T15:34:38.06487122+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\trunning tests:\n"} -{"Time":"2026-10-25T15:34:38.06491684+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t\tTestWaitsForever (2s)\n"} -{"Time":"2026-10-25T15:34:38.065034382+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\n"} -{"Time":"2026-10-25T15:34:38.065108573+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"goroutine 33 [running]:\n"} -{"Time":"2026-10-25T15:34:38.065154754+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.(*M).startAlarm.func1()\n"} -{"Time":"2026-10-25T15:34:38.065386208+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2961 +0x34a\n"} -{"Time":"2026-10-25T15:34:38.065431878+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"created by time.goFunc\n"} -{"Time":"2026-10-25T15:34:38.0655151+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/time/sleep.go:182 +0x2d\n"} -{"Time":"2026-10-25T15:34:38.06553471+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\n"} -{"Time":"2026-10-25T15:34:38.065847805+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"goroutine 1 [chan receive]:\n"} -{"Time":"2026-10-25T15:34:38.066038298+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.(*T).Run(0x3a0209bc8008, {0x5580aa?, 0x3a0209a9caa0?}, 0x6d5b10)\n"} -{"Time":"2026-10-25T15:34:38.066047488+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2268 +0x4f2\n"} -{"Time":"2026-10-25T15:34:38.066051368+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.runTests.func1(0x3a0209bc8008)\n"} -{"Time":"2026-10-25T15:34:38.066056128+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2744 +0x37\n"} -{"Time":"2026-10-25T15:34:38.066059478+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.tRunner(0x3a0209bc8008, 0x3a0209a9cbc8)\n"} -{"Time":"2026-10-25T15:34:38.066064958+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-25T15:34:38.066069599+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.runTests({0x559017, 0x13}, {0x559017, 0x13}, 0x3a0209b8e0d8, {0x6f19f0, 0x2, 0x2}, {0xc2afa2bf832a3f56, 0x773908b5, ...})\n"} -{"Time":"2026-10-25T15:34:38.066083309+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2742 +0x510\n"} -{"Time":"2026-10-25T15:34:38.066086879+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.(*M).Run(0x3a0209b8c1e0)\n"} -{"Time":"2026-10-25T15:34:38.066090269+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2602 +0x6af\n"} -{"Time":"2026-10-25T15:34:38.066093429+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"main.main()\n"} -{"Time":"2026-10-25T15:34:38.066097569+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t_testmain.go:48 +0x9b\n"} -{"Time":"2026-10-25T15:34:38.066100639+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\n"} -{"Time":"2026-10-25T15:34:38.066103769+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"goroutine 20 [sleep]:\n"} -{"Time":"2026-10-25T15:34:38.066106969+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"time.Sleep(0xdf8475800)\n"} -{"Time":"2026-10-25T15:34:38.066110279+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/runtime/time.go:368 +0x165\n"} -{"Time":"2026-10-25T15:34:38.066113639+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"example.com/timeout.TestWaitsForever(0x3a0209bc8488?)\n"} -{"Time":"2026-10-25T15:34:38.066117109+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/tmp/fix-1901b/timeout/p_test.go:12 +0x48\n"} -{"Time":"2026-10-25T15:34:38.066120239+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"testing.tRunner(0x3a0209bc8488, 0x6d5b10)\n"} -{"Time":"2026-10-25T15:34:38.066123509+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2195 +0xea\n"} -{"Time":"2026-10-25T15:34:38.066126839+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"created by testing.(*T).Run in goroutine 1\n"} -{"Time":"2026-10-25T15:34:38.066129989+01:00","Action":"output","Package":"example.com/timeout","Test":"TestWaitsForever","Output":"\t/usr/lib/go/src/testing/testing.go:2260 +0x4d4\n"} -{"Time":"2026-10-25T15:34:38.066986453+01:00","Action":"output","Package":"example.com/timeout","Output":"FAIL\texample.com/timeout\t2.017s\n","OutputType":"frame"} -{"Time":"2026-10-25T15:34:38.067002113+01:00","Action":"fail","Package":"example.com/timeout","Elapsed":2.017} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/crash.console b/modules/mesh-build-go/buildstep/conformance/captured/node/crash.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/crash.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/crash.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/crash.tap deleted file mode 100644 index bea3c6515..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/crash.tap +++ /dev/null @@ -1,41 +0,0 @@ -TAP version 13 -# Subtest: passes before the crash -ok 1 - passes before the crash - --- - duration_ms: 0.746694 - type: 'test' - ... -# Subtest: throws after it returned -ok 2 - throws after it returned - --- - duration_ms: 0.763364 - type: 'test' - ... -# Subtest: waits after the throw -ok 3 - waits after the throw - --- - duration_ms: 49.953893 - type: 'test' - ... -# Error: Test "throws after it returned" at test/b.test.ts:2:1 generated asynchronous activity after the test ended. This activity created the error "Error: the bus closed under the test" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Subtest: test/b.test.ts -not ok 2 - test/b.test.ts - --- - duration_ms: 155.864774 - type: 'test' - location: '/tmp/1901k/node/crash/test/b.test.ts:1:1' - failureType: 'testCodeFailure' - exitCode: 1 - signal: ~ - error: 'test failed' - code: 'ERR_TEST_FAILURE' - ... -1..4 -# tests 4 -# suites 0 -# pass 3 -# fail 1 -# cancelled 0 -# skipped 0 -# todo 0 -# duration_ms 168.479173 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.console b/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.tap deleted file mode 100644 index 89dbfb8fc..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/logcrash.tap +++ /dev/null @@ -1,42 +0,0 @@ -TAP version 13 -# retrying after Error: the store was not ready yet -# Subtest: passes and logs -ok 1 - passes and logs - --- - duration_ms: 1.184595 - type: 'test' - ... -# Subtest: throws after it returned -ok 2 - throws after it returned - --- - duration_ms: 0.748862 - type: 'test' - ... -# Subtest: waits after the throw -ok 3 - waits after the throw - --- - duration_ms: 51.019875 - type: 'test' - ... -# Error: Test "throws after it returned" at test/b.test.ts:2:1 generated asynchronous activity after the test ended. This activity created the error "Error: the bus closed under the test" and would have caused the test to fail, but instead triggered an uncaughtException event. -# Subtest: test/b.test.ts -not ok 2 - test/b.test.ts - --- - duration_ms: 172.91715 - type: 'test' - location: '/tmp/1901k/node/logcrash/test/b.test.ts:1:1' - failureType: 'testCodeFailure' - exitCode: 1 - signal: ~ - error: 'test failed' - code: 'ERR_TEST_FAILURE' - ... -1..4 -# tests 4 -# suites 0 -# pass 3 -# fail 1 -# cancelled 0 -# skipped 0 -# todo 0 -# duration_ms 185.744334 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/suite.console b/modules/mesh-build-go/buildstep/conformance/captured/node/suite.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/suite.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/suite.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/suite.tap deleted file mode 100644 index 06e976116..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/suite.tap +++ /dev/null @@ -1,61 +0,0 @@ -TAP version 13 -# Subtest: the seat - # Subtest: passes inside - ok 1 - passes inside - --- - duration_ms: 0.577396 - type: 'test' - ... - # Subtest: fails inside - not ok 2 - fails inside - --- - duration_ms: 1.621198 - type: 'test' - location: '/tmp/1901k/node/suite/test/a.test.ts:5:3' - failureType: 'testCodeFailure' - error: |- - Expected values to be strictly deep-equal: - + actual - expected - -  { - + holders: 2 - - holders: 1 -  } - - code: 'ERR_ASSERTION' - name: 'AssertionError' - expected: - holders: 1 - actual: - holders: 2 - operator: 'deepStrictEqual' - stack: |- - TestContext. (file:///tmp/1901k/node/suite/test/a.test.ts:5:37) - Test.runInAsyncScope (node:async_hooks:226:14) - Test.run (node:internal/test_runner/test:1402:25) - Suite.processPendingSubtests (node:internal/test_runner/test:974:18) - Test.postRun (node:internal/test_runner/test:1542:19) - Test.run (node:internal/test_runner/test:1467:12) - async Promise.all (index 0) - async Suite.run (node:internal/test_runner/test:1905:7) - async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) - ... - 1..2 -not ok 1 - the seat - --- - duration_ms: 3.295664 - type: 'suite' - location: '/tmp/1901k/node/suite/test/a.test.ts:3:1' - failureType: 'subtestsFailed' - error: '1 subtest failed' - code: 'ERR_TEST_FAILURE' - ... -1..1 -# tests 2 -# suites 1 -# pass 1 -# fail 1 -# cancelled 0 -# skipped 0 -# todo 0 -# duration_ms 115.948112 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.console b/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.tap deleted file mode 100644 index ceadd12c2..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/syntax.tap +++ /dev/null @@ -1,47 +0,0 @@ -TAP version 13 -# Subtest: passes in the first file -ok 1 - passes in the first file - --- - duration_ms: 0.637465 - type: 'test' - ... -# node:internal/modules/run_main:111 -# triggerUncaughtException( -# ^ -# file:///tmp/1901k/node/syntax/test/b.test.ts:2 -# test('never loads', () => { -# SyntaxError [ERR_INVALID_TYPESCRIPT_SYNTAX]: Expected ',', got '' -#  at parseTypeScript (node:internal/modules/typescript:61:36) -#  at processTypeScriptCode (node:internal/modules/typescript:129:37) -#  at Object.stripTypeScriptModuleTypes (node:internal/modules/typescript:172:22) -#  at stripTypeScriptModuleTypes (node:internal/modules/esm/translators:35:49) -#  at ModuleLoader. (node:internal/modules/esm/translators:688:29) -#  at \#translate (node:internal/modules/esm/loader:441:20) -#  at afterLoad (node:internal/modules/esm/loader:509:29) -#  at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:514:12) -#  at \#getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:567:36) -#  at afterResolve (node:internal/modules/esm/loader:614:52) { -# code: 'ERR_INVALID_TYPESCRIPT_SYNTAX' -# } -# Node.js v26.12.1 -# Subtest: test/b.test.ts -not ok 2 - test/b.test.ts - --- - duration_ms: 87.629815 - type: 'test' - location: '/tmp/1901k/node/syntax/test/b.test.ts:1:1' - failureType: 'testCodeFailure' - exitCode: 1 - signal: ~ - error: 'test failed' - code: 'ERR_TEST_FAILURE' - ... -1..2 -# tests 2 -# suites 0 -# pass 1 -# fail 1 -# cancelled 0 -# skipped 0 -# todo 0 -# duration_ms 106.551435 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.console b/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.tap deleted file mode 100644 index dd87e1717..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/timeout.tap +++ /dev/null @@ -1,26 +0,0 @@ -TAP version 13 -# Subtest: passes before the wait -ok 1 - passes before the wait - --- - duration_ms: 0.683015 - type: 'test' - ... -# Subtest: waits for an answer that never comes -not ok 2 - waits for an answer that never comes - --- - duration_ms: 201.103775 - type: 'test' - location: '/tmp/1901k/node/timeout/test/a.test.ts:3:1' - failureType: 'testTimeoutFailure' - error: 'test timed out after 200ms' - code: 'ERR_TEST_FAILURE' - ... -1..2 -# tests 2 -# suites 0 -# pass 1 -# fail 0 -# cancelled 1 -# skipped 0 -# todo 0 -# duration_ms 308.920061 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.console b/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.console deleted file mode 100644 index 90a8ef65e..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.console +++ /dev/null @@ -1,2 +0,0 @@ -npm notice run test -npm notice run node --test --experimental-strip-types 'test/*.test.ts' diff --git a/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.tap b/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.tap deleted file mode 100644 index 8e0a85b83..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/node/two-files.tap +++ /dev/null @@ -1,49 +0,0 @@ -TAP version 13 -# Subtest: passes in the first file -ok 1 - passes in the first file - --- - duration_ms: 0.740124 - type: 'test' - ... -# judged against the seat as it stands -# Subtest: passes in the second file first -ok 2 - passes in the second file first - --- - duration_ms: 0.916463 - type: 'test' - ... -# Subtest: fails in the second file -not ok 3 - fails in the second file - --- - duration_ms: 1.719236 - type: 'test' - location: '/tmp/1901k/node/two-files/test/b.test.ts:4:1' - failureType: 'testCodeFailure' - error: |- - one plus one is not three - - 2 !== 3 - - code: 'ERR_ASSERTION' - name: 'AssertionError' - expected: 3 - actual: 2 - operator: 'strictEqual' - stack: |- - TestContext. (file:///tmp/1901k/node/two-files/test/b.test.ts:6:10) - Test.runInAsyncScope (node:async_hooks:226:14) - Test.run (node:internal/test_runner/test:1402:25) - Test.processPendingSubtests (node:internal/test_runner/test:974:18) - Test.postRun (node:internal/test_runner/test:1542:19) - Test.run (node:internal/test_runner/test:1467:12) - async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) - ... -1..3 -# tests 3 -# suites 0 -# pass 2 -# fail 1 -# cancelled 0 -# skipped 0 -# todo 0 -# duration_ms 135.931121 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-run.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-run.txt deleted file mode 100644 index 2bac81e5a..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-run.txt +++ /dev/null @@ -1 +0,0 @@ -Error: building at STEP "RUN false": exit status 1 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-timeout.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-timeout.txt deleted file mode 100644 index 8fb9a99fa..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/buildah-bud-timeout.txt +++ /dev/null @@ -1 +0,0 @@ -Error: creating build container: initializing source docker://alpine: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 10.10.0.3:53: i/o timeout diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-closed.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-closed.txt deleted file mode 100644 index 259bd3a57..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-closed.txt +++ /dev/null @@ -1,2 +0,0 @@ -Connection closed by 10.10.0.1 port 222 -fatal: Could not read from remote repository. diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-kex.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-kex.txt deleted file mode 100644 index 50a6d9b0a..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-kex.txt +++ /dev/null @@ -1,6 +0,0 @@ -kex_exchange_identification: read: Connection reset by peer -Connection reset by 10.10.0.1 port 222 -fatal: Could not read from remote repository. - -Please make sure you have the correct access rights -and the repository exists. diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-noref.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-noref.txt deleted file mode 100644 index 8f5ec1a62..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-noref.txt +++ /dev/null @@ -1 +0,0 @@ -fatal: couldn't find remote ref 0123456789abcdef0123456789abcdef01234567 diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-resolve.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-resolve.txt deleted file mode 100644 index 3c1742f80..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/git-fetch-resolve.txt +++ /dev/null @@ -1,2 +0,0 @@ -ssh: Could not resolve hostname mesh-forge: Temporary failure in name resolution -fatal: Could not read from remote repository. diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-checksum.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-checksum.txt deleted file mode 100644 index a40e58961..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-checksum.txt +++ /dev/null @@ -1 +0,0 @@ -{"Path":"git.novox.be/novox/mesh-sdk/go","Error":"verifying module: checksum mismatch"} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-dial.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-dial.txt deleted file mode 100644 index 568886bee..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-dial.txt +++ /dev/null @@ -1 +0,0 @@ -{"Path":"git.novox.be/novox/mesh-sdk/go","Error":"git.novox.be/novox/mesh-sdk/go@abc: dial tcp 10.10.0.1:5100: i/o timeout"} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-lookup.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-lookup.txt deleted file mode 100644 index 4d523f910..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-lookup.txt +++ /dev/null @@ -1 +0,0 @@ -{"Path":"git.novox.be/novox/mesh-sdk/go","Error":"git.novox.be/novox/mesh-sdk/go@abc: dial tcp: lookup git.novox.be on 10.10.0.3:53: read udp 10.10.0.3:42292->10.10.0.3:53: i/o timeout"} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-unknown.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-unknown.txt deleted file mode 100644 index 1603ebfe5..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/go-download-unknown.txt +++ /dev/null @@ -1 +0,0 @@ -{"Path":"git.novox.be/novox/mesh-sdk/go","Error":"invalid version: unknown revision abc"} diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-404.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-404.txt deleted file mode 100644 index 53e44d285..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-404.txt +++ /dev/null @@ -1,2 +0,0 @@ -npm error code E404 -npm error 404 Not Found - GET https://git.novox.be/api/packages/novox/npm/@novox%2fx diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-eaiagain.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-eaiagain.txt deleted file mode 100644 index c47a48568..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-eaiagain.txt +++ /dev/null @@ -1,3 +0,0 @@ -npm error code EAI_AGAIN -npm error syscall getaddrinfo -npm error errno EAI_AGAIN diff --git a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-econnreset.txt b/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-econnreset.txt deleted file mode 100644 index 1657f055c..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/passing/npm-ci-econnreset.txt +++ /dev/null @@ -1,4 +0,0 @@ -npm error code ECONNRESET -npm error syscall read -npm error errno -104 -npm error network aborted diff --git a/modules/mesh-build-go/buildstep/conformance/captured/tsc/typeerror.console b/modules/mesh-build-go/buildstep/conformance/captured/tsc/typeerror.console deleted file mode 100644 index ac7713ed5..000000000 --- a/modules/mesh-build-go/buildstep/conformance/captured/tsc/typeerror.console +++ /dev/null @@ -1 +0,0 @@ -seat.ts(2,14): error TS2322: Type 'number' is not assignable to type 'string'. diff --git a/modules/mesh-build-go/buildstep/conformance/conformance.go b/modules/mesh-build-go/buildstep/conformance/conformance.go deleted file mode 100644 index f04eadbbe..000000000 --- a/modules/mesh-build-go/buildstep/conformance/conformance.go +++ /dev/null @@ -1,279 +0,0 @@ -// Package conformance is the kit every build module's tests run (novox/hq issue 1901, its thorough fix): real output of -// the test runners, captured with the build nodes' own toolchains (captured/README.md), and what a build module must say -// of each failure in it under the failure contract (buildstep.Failure). A build module's test calls Run with its own parse -// path, the code that turns a runner's output into the failures of its test result; the kit fails the test when a -// failure is not named, its cause is missing or wrong, or a passing line stands in its place. -// -// A catalogue check (mesh-catalog checks/failurekit) refuses a build module with a test step whose tests do not call Run, -// and any build module whose tests do not call LeftRunning, the kit's case of steps a previous process left running -// (leftrunning.go, issue 1890). -package conformance - -import ( - "embed" - "fmt" - "slices" - "strings" - "testing" - - "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -// The runners the kit holds output of. -const ( - // GoTest is `go test -json -count=1 ./...`: Output.Stdout is its output (go1.27.3). - GoTest = "go test -json" - // NodeTest is a package's `npm test` running `node --test --experimental-strip-types` with - // NODE_OPTIONS=buildstep.NodeTestOptions(): Output.Report is the TAP file, Output.Stdout the script's own output - // and stderr, Output.Dir the package's directory as it was captured (node v26.12.1, npm 12.2.1). - NodeTest = "node --test" - // TypeCheck is tsc's type-check (`tsc --noEmit`, typescript 5.9.3): Output.Stdout is what it wrote; its failure - // names the test "type-check". - TypeCheck = "tsc" -) - -// Output is one captured run of a runner, as a build module's parse path takes it. -type Output struct { - Stdout, Stderr string - // Report is what a runner wrote to a report file of its own (node --test's TAP), "" for the others. - Report string - // Dir is the directory the run was captured in: a node test's file is said relative to it. - Dir string -} - -// Parse is a build module's own parse path: the failures its test result would carry for one run that failed. -type Parse func(Output) []buildstep.Failure - -// Case is one captured run and what its failure must say. -type Case struct { - Name string - Runner string - // Test is the failing test the failure names (for a package that stopped, the tests that were running; "" for none). - Test string - // File, when set, is where the failing test is. - File string - // Cause holds what the failure's cause must contain. - Cause []string - // Passing are the names of tests that passed in the run, and what they logged: no failure's words may hold them. - Passing []string -} - -//go:embed captured -var captured embed.FS - -// Cases are the kit's cases of a runner. -func Cases(runner string) []Case { - var out []Case - for _, c := range cases { - if c.Runner == runner { - out = append(out, c) - } - } - return out -} - -var cases = []Case{ - {Name: "passfirst", Runner: GoTest, Test: "TestTheSecondPackageFails", Cause: []string{"the seat has 2 holders, want 1"}, - Passing: []string{"TestTheFirstPackagePasses", "TestTheSecondPackagePassesFirst"}}, - {Name: "subtests", Runner: GoTest, Test: "TestTheTable/fails", Cause: []string{"got 3 machines, want 4"}, Passing: []string{"TestTheTable/passes"}}, - {Name: "logthenfatal", Runner: GoTest, Test: "TestThree", Cause: []string{"3 subscription(s) derive to a subject no emitter owns:"}}, - {Name: "panicking", Runner: GoTest, Test: "TestPanics", Cause: []string{"panic: assignment to entry in nil map"}}, - {Name: "timeout", Runner: GoTest, Test: "TestWaitsForever", Cause: []string{"panic: test timed out after 2s", "TestWaitsForever"}}, - {Name: "deeptimeout", Runner: GoTest, Test: "TestHoldsTheSeat, TestWaitsForTheBus", Cause: []string{"panic: test timed out after 2s", "TestHoldsTheSeat", "TestWaitsForTheBus"}}, - {Name: "buildfail", Runner: GoTest, Cause: []string{`cannot use "seat" (untyped string constant) as int value`}}, - {Name: "exiting", Runner: GoTest, Test: "TestExits", Cause: []string{"exited", "TestExits"}}, - {Name: "killed", Runner: GoTest, Test: "TestKilled", Cause: []string{"signal: killed"}}, - {Name: "passthenfail", Runner: GoTest, Cause: []string{"panic: the bus closed after the tests: nats: connection closed"}}, - {Name: "mainexit", Runner: GoTest, Cause: []string{"passed", "exited"}}, - {Name: "race", Runner: GoTest, Test: "TestRacesOnTheSeat", Cause: []string{"DATA RACE", "Write at", "example.com/race.TestRacesOnTheSeat.func1()", "p_test.go:13", "created at example.com/race.TestRacesOnTheSeat()"}}, - {Name: "subpanic", Runner: GoTest, Test: "TestTable/panics", Cause: []string{"panic: assignment to entry in nil map"}, Passing: []string{"TestTable/passes"}}, - {Name: "racemain", Runner: GoTest, Cause: []string{"DATA RACE", "Write at", "example.com/racemain.TestMain.func1()", "p_test.go:15", "created at example.com/racemain.TestMain()"}}, - - {Name: "two-files", Runner: NodeTest, Test: "fails in the second file", File: "test/b.test.ts:4:1", Cause: []string{"one plus one is not three"}, - Passing: []string{"passes in the first file", "passes in the second file first"}}, - {Name: "suite", Runner: NodeTest, Test: "fails inside", File: "test/a.test.ts:5:3", Cause: []string{"Expected values to be strictly deep-equal:"}, - Passing: []string{"passes inside"}}, - {Name: "crash", Runner: NodeTest, Test: "test/b.test.ts", File: "test/b.test.ts:1:1", Cause: []string{"the bus closed under the test"}, - Passing: []string{"passes before the crash"}}, - {Name: "logcrash", Runner: NodeTest, Test: "test/b.test.ts", File: "test/b.test.ts:1:1", Cause: []string{"the bus closed under the test"}, - Passing: []string{"passes and logs", "retrying after Error: the store was not ready yet"}}, - {Name: "timeout", Runner: NodeTest, Test: "waits for an answer that never comes", File: "test/a.test.ts:3:1", Cause: []string{"test timed out after 200ms"}, - Passing: []string{"passes before the wait"}}, - {Name: "syntax", Runner: NodeTest, Test: "test/b.test.ts", File: "test/b.test.ts:1:1", Cause: []string{"SyntaxError", "Expected ',', got ''"}, - Passing: []string{"passes in the first file"}}, - - {Name: "typeerror", Runner: TypeCheck, Test: "type-check", Cause: []string{"seat.ts(2,14): error TS2322: Type 'number' is not assignable to type 'string'."}}, -} - -// Load is the captured output of a case. -func Load(c Case) (Output, error) { - switch c.Runner { - case GoTest: - b, err := captured.ReadFile("captured/go/" + c.Name + ".jsonl") - return Output{Stdout: string(b)}, err - case NodeTest: - report, err := captured.ReadFile("captured/node/" + c.Name + ".tap") - if err != nil { - return Output{}, err - } - console, err := captured.ReadFile("captured/node/" + c.Name + ".console") - return Output{Report: string(report), Stdout: string(console), Dir: "/tmp/1901k/node/" + c.Name}, err - default: - b, err := captured.ReadFile("captured/tsc/" + c.Name + ".console") - return Output{Stdout: string(b), Dir: "/tmp/1901k/tsc/" + c.Name}, err - } -} - -// Run runs every case of runner through parse, each as a subtest, and fails a case whose failure does not keep the -// contract: exactly one failure, naming the failing test (and its file, where the runner says it), with a cause that -// holds what the case says and is no passing line, an output that starts with the cause, stays within its bound and -// holds no passing line and no passing test's name. -func Run(t *testing.T, runner string, parse Parse) { - t.Helper() - cs := Cases(runner) - if len(cs) == 0 { - t.Fatalf("the kit holds no case of the runner %q", runner) - } - for _, c := range cs { - t.Run(c.Name, func(t *testing.T) { - out, err := Load(c) - if err != nil { - t.Fatal(err) - } - for _, problem := range Judge(c, parse(out)) { - t.Error(problem) - } - }) - } -} - -// Judge says what is wrong with the failures a parse path made of a case; nothing when they keep the contract. -func Judge(c Case, failed []buildstep.Failure) []string { - var problems []string - say := func(s string) { problems = append(problems, c.Runner+" "+c.Name+": "+s) } - if len(failed) != 1 { - say(fmt.Sprintf("want one failure, got %d: %s", len(failed), describe(failed))) - if len(failed) == 0 { - return problems - } - } - f := failed[0] - if f.Test != c.Test { - say("the failure names the test " + quote(f.Test) + ", want " + quote(c.Test)) - } - if c.File != "" && f.File != c.File { - say("the failure's file is " + quote(f.File) + ", want " + quote(c.File)) - } - if why := buildstep.Hidden(f); why != "" { - say("the failure hides its cause: " + why) - } - for _, want := range c.Cause { - if !strings.Contains(f.Cause, want) { - say("the cause " + quote(f.Cause) + " does not hold " + quote(want)) - } - } - if first := strings.SplitN(f.Output, "\n", 2)[0]; strings.TrimSpace(first) != strings.TrimSpace(f.Cause) { - say("the output starts with " + quote(first) + ", not with the cause") - } - if len(f.Output) > buildstep.OutputBytes+buildstep.LineBytes+64 { - say(fmt.Sprintf("the output holds %d bytes, over its bound", len(f.Output))) - } - for _, l := range strings.Split(f.Output, "\n") { - if buildstep.PassingLine(l) { - say("the output keeps the passing line " + quote(l)) - } - } - for _, p := range c.Passing { - if strings.Contains(f.Output, p+"\n") || strings.HasSuffix(f.Output, p) || strings.Contains(f.Cause, p) || strings.Contains(f.Output, "- "+p) { - say("the failure's words hold the passing test " + quote(p)) - } - } - return problems -} - -func describe(failed []buildstep.Failure) string { - var s []string - for _, f := range failed { - s = append(s, quote(f.Package+" "+f.Test)+" ("+quote(f.Cause)+")") - } - return strings.Join(s, ", ") -} - -func quote(s string) string { return fmt.Sprintf("%q", s) } - -// The runners whose network failures the kit holds words of (Passing). -const ( - GitFetch = "git fetch" - GoDownload = "go mod download" - NpmCI = "npm ci" - BuildahBud = "buildah bud" -) - -// PassingCase is the words of one runner and whether they are a transport fault: a network that did not answer, which the -// bus gives the ask again for (novox/hq ADR 0664 §1), or a failure of the source, which fails the step at once. -type PassingCase struct { - Name, Runner string - Transport bool -} - -// PassingCases are the kit's cases of the network's failures (captured/passing). -var PassingCases = []PassingCase{ - {"git-fetch-kex", GitFetch, true}, {"git-fetch-closed", GitFetch, true}, {"git-fetch-resolve", GitFetch, true}, {"git-fetch-noref", GitFetch, false}, - {"go-download-lookup", GoDownload, true}, {"go-download-dial", GoDownload, true}, {"go-download-unknown", GoDownload, false}, {"go-download-checksum", GoDownload, false}, - {"npm-ci-econnreset", NpmCI, true}, {"npm-ci-eaiagain", NpmCI, true}, {"npm-ci-404", NpmCI, false}, - {"buildah-bud-timeout", BuildahBud, true}, {"buildah-bud-run", BuildahBud, false}, -} - -// Failed is a build module's own path from a runner's words to the error its step ends with: the same code its step runs on -// a failed command, fed the words of a runner's failed run. -type Failed func(runner, words string) error - -// Passing runs every case of the runners through failed, each as a subtest, and fails a build module whose step does not -// say a network's failure as a buildstep.Passing (the bus then gives the ask again) or says a failure of the source as one. -// A build module names the runners its steps use; the case's words are in captured/passing. -func Passing(t *testing.T, runners []string, failed Failed) { - t.Helper() - ran := 0 - for _, c := range PassingCases { - if !slices.Contains(runners, c.Runner) { - continue - } - ran++ - t.Run(c.Name, func(t *testing.T) { - if problem := judgePassing(c, failed); problem != "" { - t.Error(problem) - } - }) - } - if ran == 0 { - t.Fatalf("the kit holds no passing case of the runners %v", runners) - } -} - -// JudgePassing is the problems of failed over every case of the runners: what Passing fails a build module for. -func JudgePassing(runners []string, failed Failed) []string { - var out []string - for _, c := range PassingCases { - if slices.Contains(runners, c.Runner) { - if p := judgePassing(c, failed); p != "" { - out = append(out, p) - } - } - } - return out -} - -func judgePassing(c PassingCase, failed Failed) string { - words, err := captured.ReadFile("captured/passing/" + c.Name + ".txt") - if err != nil { - return err.Error() - } - got := failed(c.Runner, string(words)) - switch { - case got == nil: - return c.Name + ": the step passed on a failed run" - case buildstep.IsPassing(got) != c.Transport: - return fmt.Sprintf("%s: the step ends %q, a transport fault %v, want %v", c.Name, got, buildstep.IsPassing(got), c.Transport) - } - return "" -} diff --git a/modules/mesh-build-go/buildstep/conformance/conformance_test.go b/modules/mesh-build-go/buildstep/conformance/conformance_test.go deleted file mode 100644 index f9acdf774..000000000 --- a/modules/mesh-build-go/buildstep/conformance/conformance_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package conformance - -import ( - "context" - "encoding/json" - "errors" - "strings" - "testing" - "time" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep" - buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -// The failure contract (issue 1901): the SDK's own parsers keep it on every captured case of the kit (1901/AC6); the -// kit refuses what the build modules sent before it; the contract's own rules; and the Go reader's older guarantees. -func TestTheFailureContract(t *testing.T) { - t.Run("the SDK parsers keep it", func(t *testing.T) { - Run(t, GoTest, func(o Output) []sdkstep.Failure { return buildstep.ReadGoTest(o.Stdout, ".").Failed }) - Run(t, NodeTest, func(o Output) []sdkstep.Failure { return buildstep.ReadTAP(".", "test", o.Dir, o.Report, o.Stdout) }) - Run(t, TypeCheck, func(o Output) []sdkstep.Failure { - return []sdkstep.Failure{sdkstep.ConsoleFailure(".", "type-check", o.Stdout+o.Stderr)} - }) - }) - - // ADR 0664 §1 (issue 1748): the shared wrapper keeps the passing cases; a step that never says a network's failure as a - // transport fault, or says every failure as one, is refused. - t.Run("the passing cases", func(t *testing.T) { - all := []string{GitFetch, GoDownload, NpmCI, BuildahBud} - Passing(t, all, func(_, words string) error { return buildstep.Transport(errors.New(words)) }) - if p := JudgePassing(all, func(_, words string) error { return errors.New(words) }); len(p) != 8 { - t.Errorf("a step that wraps nothing: %d problems, want 8 (one per transport case):\n%s", len(p), strings.Join(p, "\n")) - } - if p := JudgePassing(all, func(_, words string) error { return &sdkstep.Passing{Err: errors.New(words)} }); len(p) != 5 { - t.Errorf("a step that wraps everything: %d problems, want 5 (one per source failure):\n%s", len(p), strings.Join(p, "\n")) - } - }) - - // 1890/AC7: the SDK's start sweep keeps the left-running case, and the kit refuses a sweep that ends nothing or ends - // everything. - t.Run("the left-running case", func(t *testing.T) { - LeftRunning(t, func(ctx context.Context, scan buildrun.Scan, node string, before time.Time, logf func(string, ...any)) { - buildrun.EndStaleAtStart(ctx, scan, node, before, logf) - }) - if p := JudgeLeftRunning(func(context.Context, buildrun.Scan, string, time.Time, func(string, ...any)) {}); len(p) != 11 { - t.Errorf("a sweep that ends nothing: %d problems, want 11 (three steps not ended and unsaid, one owner unnamed, two asks not deleted and unsaid):\n%s", len(p), strings.Join(p, "\n")) - } - wrongNode := func(ctx context.Context, scan buildrun.Scan, _ string, before time.Time, logf func(string, ...any)) { - buildrun.EndStaleAtStart(ctx, scan, "kitother", before, logf) - } - if p := JudgeLeftRunning(wrongNode); len(p) == 0 { - t.Error("a sweep of another node's steps is not refused") - } - }) - - // node's output cut to its first fifteen lines with no cause, whose first line was a passing test of the first file - // (mesh-build-node's lines() before the contract), and a Go failure keeping its first line. - t.Run("the kit refuses a failure that hides its cause", func(t *testing.T) { - firstLines := func(s string) string { - var keep []string - for _, l := range strings.Split(s, "\n") { - if l = strings.TrimSpace(l); l != "" && len(keep) < 15 { - keep = append(keep, l) - } - } - return strings.Join(keep, "\n") - } - for _, c := range []struct { - runner, name string - old func(Output) []sdkstep.Failure - }{ - {NodeTest, "two-files", func(o Output) []sdkstep.Failure { - return []sdkstep.Failure{{Package: ".", Test: "test", Output: firstLines(o.Report)}} - }}, - {GoTest, "passfirst", func(o Output) []sdkstep.Failure { - return []sdkstep.Failure{{Package: "example.com/passfirst/b", Test: "TestTheSecondPackageFails", Cause: "ok \texample.com/passfirst/a", Output: "--- PASS: TestTheSecondPackagePassesFirst"}} - }}, - } { - for _, k := range Cases(c.runner) { - if k.Name != c.name { - continue - } - out, err := Load(k) - if err != nil { - t.Fatal(err) - } - if problems := Judge(k, c.old(out)); len(problems) == 0 { - t.Errorf("%s %s: the kit passed a failure that hides its cause", c.runner, c.name) - } - } - } - }) - - // What a passing line is (a test's own line starting "ok " is none), when a failure hides its cause, and that a long - // failure keeps its last lines within the bound and starts with a real line for an older checker, which reads only - // the first line of the output cut to 120 characters (1901/AC1, AC3). - t.Run("its rules", func(t *testing.T) { - for _, c := range []struct { - line string - passing bool - }{ - {"✔ the same merge has the same id (8.0ms)", true}, {"ok 1 - passes", true}, {" ok 3 - inside", true}, - {"ok \texample.com/a\t0.01s", true}, {"PASS", true}, {"--- PASS: TestA (0.00s)", true}, - {" --- PASS: TestA/sub (0.00s)", true}, {"✖ fails (1ms)", false}, {"not ok 2 - fails", false}, - {"okay, the seat moved", false}, {"ok then: the store refused the write", false}, {"ok the seat", false}, {"FAIL", false}, - } { - if sdkstep.PassingLine(c.line) != c.passing { - t.Errorf("PassingLine(%q) = %v, want %v", c.line, !c.passing, c.passing) - } - } - if sdkstep.Hidden(sdkstep.Failure{Cause: "the seat has 2 holders"}) != "" || sdkstep.Hidden(sdkstep.Failure{}) == "" || - sdkstep.Hidden(sdkstep.Failure{Cause: "✔ passes (1ms)"}) == "" { - t.Error("Hidden does not tell a real cause from none and from a passing line") - } - var lines []string - for i := 0; i < 400; i++ { - lines = append(lines, " x_test.go:1: log line "+strings.Repeat("y", 40)) - } - lines = append(lines, " x_test.go:9: the real cause", "--- FAIL: TestX (0.00s)") - oldFirst := func(out string) string { // the older checker's rule (judge.go firstLine before issue 1901) - for _, l := range strings.Split(out, "\n") { - if l = strings.TrimSpace(l); l != "" { - return l[:min(len(l), 120)] - } - } - return "" - } - for _, cause := range []string{"the real cause", ""} { - out := sdkstep.Clip(lines, cause) - if len(out) > sdkstep.OutputBytes+sdkstep.LineBytes { - t.Errorf("1901/AC1: kept %d bytes, bound is %d", len(out), sdkstep.OutputBytes) - } - if !strings.HasSuffix(out, "the real cause\n--- FAIL: TestX (0.00s)") || !strings.Contains(out, "\n... (") { - t.Errorf("1901/AC1: the last lines or the marker are lost: %q...%q", out[:40], out[len(out)-60:]) - } - if got := oldFirst(out); strings.HasPrefix(got, "... (") || got == "" || (cause != "" && got != cause) { - t.Errorf("1901/AC3: cause %q: an older checker would read %q", cause, got) - } - } - }) - - // The Go reader (moved from mesh-build-go): an older checker, which knows no "cause" field, still reads a failure and - // gets at least the lines it kept (1901/AC3); a test's indented log line saying "panic:" is not the cause, go's own at - // column 0 is (1901/AC4); and each package counts its own skipped tests (issue 890). - t.Run("the Go reader", func(t *testing.T) { - read := func(name string) string { - raw, err := captured.ReadFile("captured/go/" + name + ".jsonl") - if err != nil { - t.Fatal(err) - } - return string(raw) - } - b, _ := json.Marshal(buildstep.ReadGoTest(read("logthenfatal"), ".").Failed) - var old []struct { - Output string `json:"output,omitempty"` - } - if err := json.Unmarshal(b, &old); err != nil || len(old) != 1 || !strings.Contains(old[0].Output, "judged against") || !strings.Contains(old[0].Output, "3 subscription(s)") { - t.Errorf("1901/AC3: an older checker reads %+v, %v", old, err) - } - lines := strings.SplitAfter(read("deeptimeout"), "\n") - added := `{"Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":" p_test.go:9: the child said:\n"}` + "\n" + - `{"Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":" panic: child retried and recovered\n"}` + "\n" + - `{"Action":"output","Package":"example.com/deeptimeout","Test":"TestHoldsTheSeat","Output":" WARNING: DATA RACE\n"}` + "\n" - if got := buildstep.ReadGoTest(strings.Join(lines[:10], "")+added+strings.Join(lines[10:], ""), ".").Failed; len(got) != 1 || !strings.HasPrefix(got[0].Cause, "panic: test timed out after 2s") { - t.Errorf("1901/AC4: failures = %+v, want the timeout's panic as the cause", got) - } - res := buildstep.ReadGoTest(`{"Action":"run","Package":"m/a","Test":"TestA"} -{"Action":"skip","Package":"m/a","Test":"TestA","Elapsed":0} -{"Action":"run","Package":"m/b","Test":"TestB"} -{"Action":"pass","Package":"m/b","Test":"TestB","Elapsed":0} -{"Action":"pass","Package":"m/a","Elapsed":0} -{"Action":"pass","Package":"m/b","Elapsed":0} -`, ".") - got := map[string]int{} - for _, p := range res.Packages { - got[p.Package] = p.Skipped - } - if res.Skipped != 1 || got["m/a"] != 1 || got["m/b"] != 0 { - t.Errorf("skipped = %d, per package %v, want 1 with m/a 1 and m/b 0", res.Skipped, got) - } - }) -} diff --git a/modules/mesh-build-go/buildstep/conformance/leftrunning.go b/modules/mesh-build-go/buildstep/conformance/leftrunning.go deleted file mode 100644 index 50c58f90b..000000000 --- a/modules/mesh-build-go/buildstep/conformance/leftrunning.go +++ /dev/null @@ -1,212 +0,0 @@ -package conformance - -import ( - "context" - "encoding/json" - "fmt" - "sort" - "strings" - "sync" - "testing" - "time" - - buildrun "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildrun" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - stdio "git.novox.be/novox/mesh-sdk/go" -) - -// **A step left running by a previous process** (novox/hq issue 1890, note 21): when a delivery replaced mesh-build-go -// on a node while a check ask ran, the new process's start sweep let the ask's key stand as running, and it held one -// of the node's build slots until a hand end. Every build module runs this case (LeftRunning) through the start sweep -// its main runs: the hand-started steps a previous process left are ended at once and loud, its asks' keys deleted (the -// stream redelivers the ask, novox/hq ADR 0525 §6, and its asker keeps waiting for that), what this process runs kept. A -// catalogue check (mesh-catalog checks/failurekit) refuses a build module whose tests do not call LeftRunning. - -// Sweep is a build module's own start sweep, as its main runs it once at its start: it ends node's steps in scan that -// no process of the module runs any more (buildrun.EndStaleAtStart, here with the runtime already serving), before -// being the start of the process, saying each end with logf. -type Sweep func(ctx context.Context, scan buildrun.Scan, node string, before time.Time, logf func(string, ...any)) - -// LeftNode is the node the case's steps are of. -const LeftNode = "kitnode" - -// leftCase is one step in the steps state before the sweep, and whether the sweep must end it. -type leftCase struct { - id, tool, owner, state string - node string - age time.Duration // started this long before the process began (negative: after it) - ended bool - deleted bool // a gone process's ask: its key is deleted, not ended -} - -// gone is a previous process's owner on the same node. -var gone = "b00t-of-the-kit.4242.mvp0000" - -func leftCases() []leftCase { - return []leftCase{ - {id: "mvpwlkzi7e6ca8", tool: "check ask", owner: gone, age: 5 * time.Minute, deleted: true}, // note 21's ghost - {id: "mvpwlkzi7e6ca9", tool: "delivery ask", owner: gone, age: -time.Second, deleted: true}, - {id: "gonehand1", tool: "build_x_test", owner: gone, age: time.Minute, ended: true}, - {id: "oldhand1", tool: "build_x_fetch", age: time.Hour, ended: true}, // no owner: an older build's - {id: "mvpwlkzi7e6caa", tool: "check ask", age: time.Hour, ended: true}, // no owner, past the bound - {id: "mvpwlkzi7e6cab", tool: "check ask", age: 5 * time.Minute}, // no owner, the stream's still - {id: "mvpwlkzi7e6cac", tool: "check ask", owner: buildrun.Owner, age: time.Minute}, // this process's - {id: "minehand1", tool: "build_x_test", owner: buildrun.Owner, age: -time.Second}, - {id: "donehand1", tool: "build_x_test", owner: gone, age: time.Hour, state: sdkstep.StepPassed}, - {id: "otherhand1", tool: "build_x_test", owner: gone, age: time.Hour, node: "kitother"}, - } -} - -// LeftRunning runs the case through sweep and fails the test for each step the sweep ended or kept wrongly, or ended -// without saying it. -func LeftRunning(t *testing.T, sweep Sweep) { - t.Helper() - for _, problem := range JudgeLeftRunning(sweep) { - t.Error(problem) - } -} - -// JudgeLeftRunning says what is wrong with what sweep did to the case; nothing when it keeps the rule. -func JudgeLeftRunning(sweep Sweep) []string { - st := &steps{vals: map[string][]byte{}, revs: map[string]uint64{}} - before := time.Now() - for _, c := range leftCases() { - node, state := c.node, c.state - if node == "" { - node = LeftNode - } - if state == "" { - state = sdkstep.StepRunning - } - key, _ := sdkstep.StepKey(node, c.id) - raw, err := sdkstep.EncodeStep(sdkstep.Step{ID: c.id, Tool: c.tool, Node: node, State: state, Started: before.Add(-c.age).UTC(), Owner: c.owner}) - if err != nil { - return []string{"the kit's step " + c.id + ": " + err.Error()} - } - st.set(key, raw) - } - served := make(chan struct{}) - close(served) - was := buildrun.StaleServed - buildrun.StaleServed = func() <-chan struct{} { return served } - defer func() { buildrun.StaleServed = was }() - var mu sync.Mutex - var said []string - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - sweep(ctx, st.scan(), LeftNode, before, func(f string, a ...any) { - mu.Lock() - defer mu.Unlock() - said = append(said, fmt.Sprintf(f, a...)) - }) - mu.Lock() - log := strings.Join(said, "\n") - mu.Unlock() - var problems []string - for _, c := range leftCases() { - node := c.node - if node == "" { - node = LeftNode - } - key, _ := sdkstep.StepKey(node, c.id) - raw := st.get(key) - if c.deleted { - if raw != nil { - problems = append(problems, fmt.Sprintf("left running: the ask %s of the gone owner %q is still held after the sweep (%s); "+ - "its key is deleted, never ended: the stream redelivers it (ADR 0525 §6)", key, c.owner, raw)) - } - if !strings.Contains(log, key) || !strings.Contains(log, c.owner) { - problems = append(problems, "left running: the delete of "+key+" is not said with its owner "+c.owner) - } - continue - } - if raw == nil { - problems = append(problems, "left running: the step "+key+" is gone after the sweep, want it kept or ended") - continue - } - s, err := sdkstep.DecodeStep(raw) - if err != nil { - problems = append(problems, key+": "+err.Error()) - continue - } - want := c.state - if want == "" { - want = sdkstep.StepRunning - } - if c.ended { - want = sdkstep.StepFailed - } - if s.State != want { - problems = append(problems, fmt.Sprintf("left running: the step %s (%s, owner %q, %s before the start) is %s after the sweep, want %s", key, c.tool, c.owner, c.age, s.State, want)) - } - if c.ended && !strings.Contains(log, key) { - problems = append(problems, "left running: the end of "+key+" is not said") - } - if c.ended && c.owner != "" && !strings.Contains(log, c.owner) { - problems = append(problems, "left running: the end of "+key+" does not name its owner "+c.owner) - } - } - sort.Strings(problems) - return problems -} - -// steps is a steps state with revisions, whose Update lands only at the revision read (stdio.ErrChanged otherwise). -type steps struct { - mu sync.Mutex - vals map[string][]byte - revs map[string]uint64 -} - -func (s *steps) set(key string, raw []byte) { - s.mu.Lock() - defer s.mu.Unlock() - s.vals[key], s.revs[key] = raw, s.revs[key]+1 -} - -func (s *steps) get(key string) []byte { - s.mu.Lock() - defer s.mu.Unlock() - return s.vals[key] -} - -func (s *steps) scan() buildrun.Scan { - return buildrun.Scan{ - Keys: func() ([]string, error) { - s.mu.Lock() - defer s.mu.Unlock() - var out []string - for k := range s.vals { - out = append(out, k) - } - return out, nil - }, - Get: func(key string) (json.RawMessage, uint64, error) { - s.mu.Lock() - defer s.mu.Unlock() - return s.vals[key], s.revs[key], nil - }, - Delete: func(key string, revision uint64) error { - s.mu.Lock() - defer s.mu.Unlock() - if s.revs[key] != revision { - return stdio.ErrChanged - } - delete(s.vals, key) - s.revs[key]++ - return nil - }, - Update: func(key string, value any, revision uint64) (uint64, error) { - raw, err := json.Marshal(value) - if err != nil { - return 0, err - } - s.mu.Lock() - defer s.mu.Unlock() - if s.revs[key] != revision { - return 0, stdio.ErrChanged - } - s.vals[key], s.revs[key] = raw, revision+1 - return revision + 1, nil - }, - } -} diff --git a/modules/mesh-build-go/buildstep/cpu.go b/modules/mesh-build-go/buildstep/cpu.go deleted file mode 100644 index d0e41b805..000000000 --- a/modules/mesh-build-go/buildstep/cpu.go +++ /dev/null @@ -1,14 +0,0 @@ -package buildstep - -import ( - "os" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/buildcpu" -) - -// NodeLimits is what one step of a build module is held to (novox/hq ADR 0553 §4): the node's processor share from the -// word the composer gives the module (buildcpu.ShareWord), divided by the module's own capacity, own, over the machine's -// processors. Without the word, no thread limit: Threads is 0. -func NodeLimits(own int) buildcpu.Limits { - return buildcpu.FromWords(os.Getenv, own) -} diff --git a/modules/mesh-build-go/buildstep/digestshape_test.go b/modules/mesh-build-go/buildstep/digestshape_test.go deleted file mode 100644 index 55807bbf0..000000000 --- a/modules/mesh-build-go/buildstep/digestshape_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package buildstep - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "sort" - "strings" - "sync" - "testing" - "time" - - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -// credentialField is the node runtime's rule for a state value (mesh-tools node-tools/internal/bus/state.go, novox/hq -// ADR 0201), copied whole: the first field anywhere in the value whose name, lower-cased and without - _ and spaces, ends -// in a credential word, or "". A step's end is refused when it answers a field. -func credentialField(value json.RawMessage) string { - endings := []string{"password", "passwd", "secret", "token", "credential", "credentials", - "authorization", "apikey", "privatekey", "accesskey", "cookie"} - var v any - if json.Unmarshal(value, &v) != nil { - return "" - } - var walk func(any) string - walk = func(v any) string { - switch t := v.(type) { - case map[string]any: - keys := make([]string, 0, len(t)) - for k := range t { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - norm := strings.NewReplacer("-", "", "_", "", " ", "").Replace(strings.ToLower(k)) - for _, end := range endings { - if strings.HasSuffix(norm, end) { - return k - } - } - if found := walk(t[k]); found != "" { - return found - } - } - case []any: - for _, x := range t { - if found := walk(x); found != "" { - return found - } - } - } - return "" - } - return walk(v) -} - -// runtimeState is a steps state that refuses a value as the node runtime does, and keeps every value it took. -type runtimeState struct { - mu sync.Mutex - took map[string][]sdkstep.Step - refused int -} - -func newRuntimeState() *runtimeState { return &runtimeState{took: map[string][]sdkstep.Step{}} } - -func (s *runtimeState) put(key string, value any) (uint64, error) { - raw, _ := value.(json.RawMessage) - if f := credentialField(raw); f != "" { - s.mu.Lock() - s.refused++ - s.mu.Unlock() - return 0, fmt.Errorf("steps.%s carries a field %q, which names a credential", key, f) - } - st, err := sdkstep.DecodeStep(raw) - if err != nil { - return 0, err - } - s.mu.Lock() - defer s.mu.Unlock() - s.took[key] = append(s.took[key], st) - return uint64(len(s.took[key])), nil -} - -func (s *runtimeState) last(key string) (sdkstep.Step, bool) { - s.mu.Lock() - defer s.mu.Unlock() - t := s.took[key] - if len(t) == 0 { - return sdkstep.Step{}, false - } - return t[len(t)-1], true -} - -func fastEnds(t *testing.T) { - attempts, retry := EndAttempts, EndRetry - EndAttempts, EndRetry = 2, time.Millisecond - t.Cleanup(func() { EndAttempts, EndRetry = attempts, retry }) -} - -// 1930/AC1: given a check of a repository with the package .../internal/token, when its ask's answer is stored as the -// step's end, then no field is keyed by a package path: the runtime's credential rule takes the value, and the package -// and its digest read back from the stored end. -func TestADigestOfAPackageNamedTokenIsStoredAsAList(t *testing.T) { - fastEnds(t) - r := &recorder{ - fetch: map[string]any{"workspace": "/w"}, - digests: map[string]string{"x/internal/token": "d-token", "x/pkg/a": "d-a"}, - tests: map[string]bool{"x/internal/token": true, "x/pkg/a": true}, - } - out, err := RunAsk(context.Background(), r.steps(), ask(sdkstep.CheckJob{Levels: []string{sdkstep.LevelUnit}, - Fetch: sdkstep.Fetch{Repository: "novox/x", Commit: runCommit}})) - if err != nil { - t.Fatal(err) - } - old, _ := json.Marshal(map[string]any{"levels": []any{map[string]any{"level": "unit", "digest": map[string]any{"packages": r.digests}}}}) - if credentialField(old) != "x/internal/token" { - t.Fatalf("the rule does not refuse the form before issue 1930 (%s): the test proves nothing", old) - } - st := newRuntimeState() - if err := finish(st.put, "shanks.a1", sdkstep.Step{ID: "a1", Tool: "check ask", Node: "shanks", State: sdkstep.StepRunning, Started: time.Now()}, out, nil, t.Logf); err != nil { - t.Fatal(err) - } - s, ok := st.last("shanks.a1") - if !ok || s.State != sdkstep.StepPassed || st.refused != 0 { - t.Fatalf("the end %+v (written %v, refused %d), want it passed and taken at once", s, ok, st.refused) - } - var a sdkstep.CheckAnswer - if err := json.Unmarshal(s.Result, &a); err != nil { - t.Fatal(err) - } - if len(a.Levels) != 1 || a.Levels[0].Digest == nil { - t.Fatalf("levels %+v, want the unit level with its digest", a.Levels) - } - want := []sdkstep.PackageDigest{{Package: "x/internal/token", Digest: "d-token"}, {Package: "x/pkg/a", Digest: "d-a"}} - if got := a.Levels[0].Digest.Packages; fmt.Sprint(got) != fmt.Sprint(want) { - t.Errorf("packages %v, want %v", got, want) - } - if !strings.Contains(string(s.Result), `"package":"x/internal/token"`) { - t.Errorf("the stored end does not name the package as a value: %s", s.Result) - } -} - -// 1930/AC2: given an end the state refuses every time, when finish writes it, then it logs the refusal and writes a small -// failed end without the result that names the write's error; and when no end can be written at all it answers an error. -func TestARefusedEndIsSaidAndEndsTheStepFailed(t *testing.T) { - fastEnds(t) - big := errors.New("the value carries a field \"x/internal/token\", which names a credential") - var refused int - var stored []sdkstep.Step - put := func(key string, value any) (uint64, error) { - st, _ := sdkstep.DecodeStep(value.(json.RawMessage)) - if len(st.Result) > 0 { - refused++ - return 0, big - } - stored = append(stored, st) - return 1, nil - } - var logged []string - logf := func(format string, args ...any) { logged = append(logged, fmt.Sprintf(format, args...)) } - err := finish(put, "shanks.a2", sdkstep.Step{ID: "a2", Tool: "check ask", Node: "shanks", State: sdkstep.StepRunning, Started: time.Now()}, map[string]any{"levels": 1}, nil, logf) - if err != nil { - t.Fatalf("finish answered %v, want the small end written", err) - } - if refused != EndAttempts || len(stored) != 1 { - t.Fatalf("refused %d, stored %d, want %d refusals and one small end", refused, len(stored), EndAttempts) - } - s := stored[0] - if s.State != sdkstep.StepFailed || len(s.Result) != 0 || !strings.Contains(s.Reason, "could not be written") || - !strings.Contains(s.Reason, big.Error()) || !strings.Contains(s.Reason, "passed") { - t.Errorf("the small end %+v, want failed, no result, naming the write's error and that it passed", s) - } - if len(logged) == 0 || !strings.Contains(logged[0], big.Error()) { - t.Errorf("logged %q, want the refusal said", logged) - } - none := func(string, any) (uint64, error) { return 0, errors.New("the bus is gone") } - if err := finish(none, "shanks.a3", sdkstep.Step{ID: "a3", Tool: "check ask", Node: "shanks", Started: time.Now()}, nil, nil, logf); err == nil || !strings.Contains(err.Error(), "the bus is gone") { - t.Errorf("finish with no write possible answered %v, want the error", err) - } -} - -// 1930/AC2: given an ask whose end the state refuses, when it runs, then the ask is acknowledged only once its small -// failed end is written; when no end can be written at all, it is given back, never acknowledged as done. -func TestAnAskWhoseEndCannotBeWrittenIsNotAcked(t *testing.T) { - fastEnds(t) - for _, tc := range []struct { - name string - smallOK bool - wantAcked bool - }{{"the small end written", true, true}, {"no end written", false, false}} { - t.Run(tc.name, func(t *testing.T) { - src := NewFakeAsks() - a := testAsk(sdkstep.AskCheck) - _ = src.PublishAsk(a) - var mu sync.Mutex - var ends []sdkstep.Step - put := func(key string, value any) (uint64, error) { - st, err := sdkstep.DecodeStep(value.(json.RawMessage)) - if err != nil { - return 0, err - } - if st.State != sdkstep.StepRunning && (len(st.Result) > 0 || !tc.smallOK) { - return 0, errors.New("refused") - } - mu.Lock() - ends = append(ends, st) - mu.Unlock() - return 1, nil - } - p := &Puller{Source: src, Language: sdkstep.AskGo, Node: "shanks", Put: put, Capacity: func() int { return 1 }, - PullWait: 10 * time.Millisecond, Logf: t.Logf, - Run: func(ctx context.Context, a sdkstep.StepAsk) (any, error) { return map[string]any{"ran": true}, nil }} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go p.Pull(ctx) - waitFor(t, "the ask's fate", func() bool { ac, tm, nk := src.Fates(); return len(ac)+len(tm)+len(nk) > 0 }) - cancel() - acked, termed, naked := src.Fates() - if tc.wantAcked && (len(acked) != 1 || len(naked) != 0) || !tc.wantAcked && (len(acked) != 0 || len(naked) == 0) || len(termed) != 0 { - t.Fatalf("acked %v naked %v termed %v", acked, naked, termed) - } - mu.Lock() - defer mu.Unlock() - if tc.smallOK { - last := ends[len(ends)-1] - if last.State != sdkstep.StepFailed || !strings.Contains(last.Reason, "refused") { - t.Errorf("the end %+v, want the small failed end", last) - } - } - }) - } -} diff --git a/modules/mesh-build-go/buildstep/fetch.go b/modules/mesh-build-go/buildstep/fetch.go deleted file mode 100644 index 4c74474cb..000000000 --- a/modules/mesh-build-go/buildstep/fetch.go +++ /dev/null @@ -1,208 +0,0 @@ -package buildstep - -import ( - "context" - "fmt" - "net/url" - "os" - "path/filepath" - "regexp" - "strings" - - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - dforgekey "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/forgekey" - "git.novox.be/novox/mesh-sdk/go/forgekey" -) - -// Option changes FetchCommit. -type Option func(*fetchOptions) - -type fetchOptions struct { - allowFile bool - mirror string -} - -// AllowFileRemote lets FetchCommit take a file:// remote. It is for a test's local repository; production -// code does not pass it, and FetchCommit then refuses anything but ssh://. -func AllowFileRemote() Option { return func(o *fetchOptions) { o.allowFile = true } } - -// WithMirror makes FetchCommit (and MergeInto) borrow objects from mirror, a bare repository that UpdateMirror keeps -// in the build module's own cache (novox/hq ADR 0536 §2; issue 890): the workspace's .git/objects/info/alternates -// names the mirror's objects directory, so git transfers only the objects the mirror lacks. It is a plain file, never -// a symlink. mirror must be an absolute path of an existing directory; the workspace never writes to it. -func WithMirror(mirror string) Option { return func(o *fetchOptions) { o.mirror = mirror } } - -// useMirror writes the alternates file of the repository in dir, when a mirror is set. -func useMirror(o fetchOptions, dir string) error { - if o.mirror == "" { - return nil - } - info := filepath.Join(dir, ".git", "objects", "info") - if err := os.MkdirAll(info, 0o755); err != nil { - return fmt.Errorf("buildstep: the mirror cannot be used: %w", err) - } - line := filepath.Join(o.mirror, "objects") + "\n" - if err := os.WriteFile(filepath.Join(info, "alternates"), []byte(line), 0o644); err != nil { - return fmt.Errorf("buildstep: the mirror cannot be used: %w", err) - } - return nil -} - -var ( - commitOK = regexp.MustCompile(`^[0-9a-f]{40}$`) - refOK = regexp.MustCompile(`^refs/[A-Za-z0-9._/-]+$`) -) - -// gitFailure is a failed git command said in git's own words; one whose words are a network's (a lookup, a timeout, ssh's key -// exchange cut by a forge's per-source penalty) is a sdkstep.Passing, so the ask is given again after a delay (ADR 0664 §1). -func gitFailure(verb, said string) error { - err := fmt.Errorf("git %s: %s", verb, said) - if sdkstep.PassingCause(said) { - return &sdkstep.Passing{Err: err} - } - return err -} - -// FetchCommit fetches one commit of a forge repository into dir, an empty directory, and checks it out detached -// (novox/hq ADR 0466 §4, §5; issue 1474). remote is ssh:////.git, the ssh name being the -// one the build module's templates set up (ADR 0409 §1); commit is a full 40-hex sha; ref is optional, and names -// the pull request's head (refs/pull//head) when the commit is only there. Every git command runs through run -// as `git -C dir ...` with GIT_TERMINAL_PROMPT=0 and no credential helper, so nothing is asked for and no -// credential is used. A remote that is not ssh://, or one with user information, and a commit that is not 40 -// hex digits are refused before anything runs. -func FetchCommit(ctx context.Context, run forgekey.Runner, dir, remote, commit, ref string, opts ...Option) error { - var o fetchOptions - for _, opt := range opts { - opt(&o) - } - if err := checkFetch(o, dir, remote, commit, ref); err != nil { - return err - } - env := []string{"GIT_TERMINAL_PROMPT=0"} - git := func(args ...string) (string, error) { - full := append([]string{"-c", "credential.helper=", "-C", dir}, args...) - r := run(ctx, env, "git", full...) - if r.Status != 0 || r.Err != "" { - return "", gitFailure(args[0], dforgekey.Said(r.Err+"\n"+r.Stderr)) - } - return r.Stdout, nil - } - if _, err := git("init", "-q"); err != nil { - return err - } - if err := useMirror(o, dir); err != nil { - return err - } - if _, err := git("remote", "add", "origin", remote); err != nil { - return err - } - if _, err := git("fetch", "--no-tags", "--depth", "1", "origin", commit); err != nil { - if ref == "" { - return err - } - if _, rerr := git("fetch", "--no-tags", "origin", ref); rerr != nil { - return fmt.Errorf("%v; then the ref %s: %w", err, ref, rerr) - } - if _, verr := git("cat-file", "-e", commit+"^{commit}"); verr != nil { - return fmt.Errorf("the commit %s is not in %s: %w", commit, ref, verr) - } - } - if _, err := git("checkout", "-q", "--detach", commit); err != nil { - return err - } - out, err := git("rev-parse", "HEAD") - if err != nil { - return err - } - if head := strings.TrimSpace(out); head != commit { - return fmt.Errorf("the checkout is at %s, not at the commit %s", head, commit) - } - return nil -} - -// UpdateMirror brings the bare repository mirror to commit: it makes the mirror when it is absent (git init --bare, -// origin set to remote), then fetches the commit, or the ref when only the ref holds it, with the same rules as -// FetchCommit (no prompt, no credential helper, ssh:// or an allowed file:// remote, a 40-hex commit). The mirror -// keeps every commit it was brought to, so later fetches through WithMirror transfer only what is new. Callers -// serialise updates of one mirror. -func UpdateMirror(ctx context.Context, run forgekey.Runner, mirror, remote, commit, ref string, opts ...Option) error { - var o fetchOptions - for _, opt := range opts { - opt(&o) - } - if !filepath.IsAbs(mirror) { - return fmt.Errorf("buildstep: the mirror %q is not an absolute path", mirror) - } - if err := checkFetch(o, mirror, remote, commit, ref); err != nil { - return err - } - env := []string{"GIT_TERMINAL_PROMPT=0"} - git := func(args ...string) error { - r := run(ctx, env, "git", append([]string{"-c", "credential.helper="}, args...)...) - if r.Status != 0 || r.Err != "" { - verb := args[0] - if verb == "-C" && len(args) > 2 { // the mirror's commands are named by what they do, not by -C - verb = args[2] - } - return gitFailure(verb, dforgekey.Said(r.Err+"\n"+r.Stderr)) - } - return nil - } - in := func(args ...string) error { return git(append([]string{"-C", mirror}, args...)...) } - if _, err := os.Stat(filepath.Join(mirror, "HEAD")); err != nil { - if err := git("init", "-q", "--bare", mirror); err != nil { - return err - } - if err := in("remote", "add", "origin", remote); err != nil { - return err - } - } else if err := in("remote", "set-url", "origin", remote); err != nil { - return err - } - if err := in("fetch", "--no-tags", "origin", commit); err != nil { - if ref == "" { - return err - } - if rerr := in("fetch", "--no-tags", "origin", ref); rerr != nil { - return fmt.Errorf("%v; then the ref %s: %w", err, ref, rerr) - } - } - if err := in("cat-file", "-e", commit+"^{commit}"); err != nil { - return fmt.Errorf("the commit %s is not in the mirror: %w", commit, err) - } - return nil -} - -func checkFetch(o fetchOptions, dir, remote, commit, ref string) error { - if dir == "" { - return fmt.Errorf("buildstep: no workspace directory") - } - if o.mirror != "" { - if !filepath.IsAbs(o.mirror) { - return fmt.Errorf("buildstep: the mirror %q is not an absolute path", o.mirror) - } - if fi, err := os.Stat(o.mirror); err != nil || !fi.IsDir() { - return fmt.Errorf("buildstep: the mirror %q is not an existing directory", o.mirror) - } - } - if !commitOK.MatchString(commit) { - return fmt.Errorf("buildstep: %q is not a full commit (40 hex digits)", commit) - } - if ref != "" && !refOK.MatchString(ref) { - return fmt.Errorf("buildstep: %q is not a ref (refs/...)", ref) - } - u, err := url.Parse(remote) - if err != nil { - return fmt.Errorf("buildstep: the remote is not a URL: %w", err) - } - if u.User != nil { - return fmt.Errorf("buildstep: the remote carries user information; the key is the credential") - } - switch { - case u.Scheme == "ssh" && u.Host != "": - case u.Scheme == "file" && o.allowFile: - default: - return fmt.Errorf("buildstep: the remote %q is not ssh://", remote) - } - return nil -} diff --git a/modules/mesh-build-go/buildstep/fetch_integration_test.go b/modules/mesh-build-go/buildstep/fetch_integration_test.go deleted file mode 100644 index 5f782a1f6..000000000 --- a/modules/mesh-build-go/buildstep/fetch_integration_test.go +++ /dev/null @@ -1,59 +0,0 @@ -//go:build integration - -package buildstep - -import ( - "context" - "os" - "os/exec" - "path/filepath" - "strings" - "testing" - - "git.novox.be/novox/mesh-sdk/go/forgekey" -) - -func gitIn(t *testing.T, dir string, args ...string) string { - t.Helper() - cmd := exec.Command("git", append([]string{"-C", dir, "-c", "user.name=t", "-c", "user.email=t@example.invalid"}, args...)...) - out, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("git %v: %v\n%s", args, err, out) - } - return strings.TrimSpace(string(out)) -} - -// 1474/AC5: a local bare repository with a commit only under refs/pull/1/head (a file:// remote, allowed by the -// test-only option): the workspace's HEAD is the commit. The forge itself is proven live after the build -// modules' delivery (ADR 0466 §5). -func TestFetchCommitFromAPullRefOnly(t *testing.T) { - root := t.TempDir() - bare := filepath.Join(root, "r.git") - work := filepath.Join(root, "work") - for _, d := range []string{bare, work} { - if err := os.MkdirAll(d, 0o755); err != nil { - t.Fatal(err) - } - } - gitIn(t, bare, "init", "-q", "--bare") - gitIn(t, work, "init", "-q") - if err := os.WriteFile(filepath.Join(work, "f"), []byte("x"), 0o644); err != nil { - t.Fatal(err) - } - gitIn(t, work, "add", "f") - gitIn(t, work, "commit", "-q", "-m", "pull request head") - commit := gitIn(t, work, "rev-parse", "HEAD") - gitIn(t, work, "push", "-q", bare, "HEAD:refs/pull/1/head") - - ws := filepath.Join(root, "ws") - if err := os.MkdirAll(ws, 0o755); err != nil { - t.Fatal(err) - } - err := FetchCommit(context.Background(), forgekey.ExecRunner, ws, "file://"+bare, commit, "refs/pull/1/head", AllowFileRemote()) - if err != nil { - t.Fatal(err) - } - if head := gitIn(t, ws, "rev-parse", "HEAD"); head != commit { - t.Errorf("HEAD = %s, want %s", head, commit) - } -} diff --git a/modules/mesh-build-go/buildstep/fetch_test.go b/modules/mesh-build-go/buildstep/fetch_test.go deleted file mode 100644 index 3b00f19de..000000000 --- a/modules/mesh-build-go/buildstep/fetch_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package buildstep - -import ( - "context" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - "strings" - "testing" - - "git.novox.be/novox/mesh-sdk/go/forgekey" -) - -const sha = "0123456789abcdef0123456789abcdef01234567" - -// fakeGit records every command and answers by a rule. -type fakeGit struct { - calls []string - envs [][]string - rule func(args string) forgekey.Ran -} - -func (f *fakeGit) run(ctx context.Context, env []string, name string, args ...string) forgekey.Ran { - line := name + " " + strings.Join(args, " ") - f.calls = append(f.calls, line) - f.envs = append(f.envs, env) - if f.rule != nil { - if r := f.rule(line); r.Status != 0 || r.Stdout != "" || r.Err != "" { - return r - } - } - if len(args) > 4 && args[4] == "rev-parse" { - return forgekey.Ran{Stdout: sha + "\n"} - } - return forgekey.Ran{} -} - -const pre = "git -c credential.helper= -C /w " - -// 1474/AC1: the git commands are exactly the sequence, none with a credential or an https remote. -func TestFetchCommitRunsTheSequence(t *testing.T) { - f := &fakeGit{} - if err := FetchCommit(context.Background(), f.run, "/w", "ssh://mesh-forge/novox/mesh-sdk.git", sha, ""); err != nil { - t.Fatal(err) - } - want := []string{ - pre + "init -q", - pre + "remote add origin ssh://mesh-forge/novox/mesh-sdk.git", - pre + "fetch --no-tags --depth 1 origin " + sha, - pre + "checkout -q --detach " + sha, - pre + "rev-parse HEAD", - } - if strings.Join(f.calls, "\n") != strings.Join(want, "\n") { - t.Errorf("commands:\n%s\nwant:\n%s", strings.Join(f.calls, "\n"), strings.Join(want, "\n")) - } - for i, c := range f.calls { - if strings.Contains(c, "https://") || strings.Contains(c, "@") || !strings.Contains(c, "credential.helper= ") { - t.Errorf("command %q carries a credential or https", c) - } - if len(f.envs[i]) != 1 || f.envs[i][0] != "GIT_TERMINAL_PROMPT=0" { - t.Errorf("env %v", f.envs[i]) - } - } -} - -// 1474/AC2: the depth-1 fetch fails and a pull ref is given: the ref is fetched and the commit verified; with no -// ref, the fetch's failure is the answer. -func TestFetchCommitFallsBackToThePullRef(t *testing.T) { - f := &fakeGit{rule: func(l string) forgekey.Ran { - if strings.Contains(l, "--depth 1") { - return forgekey.Ran{Status: 128, Stderr: "fatal: couldn't find remote ref " + sha + "\n"} - } - return forgekey.Ran{} - }} - if err := FetchCommit(context.Background(), f.run, "/w", "ssh://mesh-forge/o/r.git", sha, "refs/pull/1/head"); err != nil { - t.Fatal(err) - } - want := []string{pre + "fetch --no-tags origin refs/pull/1/head", pre + "cat-file -e " + sha + "^{commit}", pre + "checkout -q --detach " + sha} - got := strings.Join(f.calls[3:6], "\n") - if got != strings.Join(want, "\n") { - t.Errorf("after the failed fetch:\n%s\nwant:\n%s", got, strings.Join(want, "\n")) - } - - g := &fakeGit{rule: f.rule} - err := FetchCommit(context.Background(), g.run, "/w", "ssh://mesh-forge/o/r.git", sha, "") - if err == nil || !strings.Contains(err.Error(), "couldn't find remote ref") || len(g.calls) != 3 { - t.Errorf("without a ref: %v after %d commands", err, len(g.calls)) - } - - h := &fakeGit{rule: func(l string) forgekey.Ran { - if strings.Contains(l, "--depth 1") || strings.Contains(l, "cat-file") { - return forgekey.Ran{Status: 1, Stderr: "no"} - } - return forgekey.Ran{} - }} - if err := FetchCommit(context.Background(), h.run, "/w", "ssh://mesh-forge/o/r.git", sha, "refs/pull/1/head"); err == nil { - t.Error("a commit that is not in the ref was accepted") - } - - // ADR 0664 §1 (issue 1748): the words a forge's sshd penalty leaves (captured on ace, 2026-11-09) are a transport fault the bus - // gives the ask again for; a missing commit is not. - for _, c := range []struct { - said string - passing bool - }{ - {"kex_exchange_identification: read: Connection reset by peer\nfatal: Could not read from remote repository.", true}, - {"Connection closed by 10.10.0.1 port 222", true}, - {"ssh: Could not resolve hostname mesh-forge: Temporary failure in name resolution", true}, - {"fatal: couldn't find remote ref " + sha, false}, - } { - x := &fakeGit{rule: func(l string) forgekey.Ran { - if strings.Contains(l, " fetch ") { - return forgekey.Ran{Status: 128, Stderr: c.said} - } - return forgekey.Ran{} - }} - if err := FetchCommit(context.Background(), x.run, "/w", "ssh://mesh-forge/o/r.git", sha, ""); err == nil || sdkstep.IsPassing(err) != c.passing { - t.Errorf("%q: %v, passing %v, want %v", c.said, err, err != nil && sdkstep.IsPassing(err), c.passing) - } - } -} - -// 1474/AC3: HEAD differs from the commit after the checkout: an error naming both. -func TestFetchCommitAnswersAHeadThatIsNotTheCommit(t *testing.T) { - other := strings.Repeat("a", 40) - f := &fakeGit{rule: func(l string) forgekey.Ran { - if strings.HasSuffix(l, "rev-parse HEAD") { - return forgekey.Ran{Stdout: other + "\n"} - } - return forgekey.Ran{} - }} - err := FetchCommit(context.Background(), f.run, "/w", "ssh://mesh-forge/o/r.git", sha, "") - if err == nil || !strings.Contains(err.Error(), other) || !strings.Contains(err.Error(), sha) { - t.Errorf("error = %v, want both shas", err) - } -} - -// 1474/AC4: an https remote, user information, a file remote without the option, or a commit that is not 40 -// hex digits is refused before anything runs. -func TestFetchCommitRefusesBeforeRunningAnything(t *testing.T) { - for _, c := range []struct{ remote, commit, ref string }{ - {"https://forge.example/o/r.git", sha, ""}, - {"http://forge.example/o/r.git", sha, ""}, - {"ssh://git@mesh-forge/o/r.git", sha, ""}, - {"ssh://user:pw@mesh-forge/o/r.git", sha, ""}, - {"file:///tmp/r.git", sha, ""}, - {"/tmp/r.git", sha, ""}, - {"ssh://mesh-forge/o/r.git", "abc123", ""}, - {"ssh://mesh-forge/o/r.git", strings.ToUpper(sha), ""}, - {"ssh://mesh-forge/o/r.git", "main", ""}, - {"ssh://mesh-forge/o/r.git", sha, "--upload-pack=x"}, - } { - f := &fakeGit{} - if err := FetchCommit(context.Background(), f.run, "/w", c.remote, c.commit, c.ref); err == nil || len(f.calls) != 0 { - t.Errorf("%+v: err %v, %d commands", c, err, len(f.calls)) - } - } - f := &fakeGit{} - if err := FetchCommit(context.Background(), f.run, "/w", "file:///tmp/r.git", sha, "", AllowFileRemote()); err != nil { - t.Errorf("a file remote with the option: %v", err) - } -} diff --git a/modules/mesh-build-go/buildstep/generated.go b/modules/mesh-build-go/buildstep/generated.go deleted file mode 100644 index a3121c061..000000000 --- a/modules/mesh-build-go/buildstep/generated.go +++ /dev/null @@ -1,164 +0,0 @@ -package buildstep - -// **Regenerate and compare** (CAT-BG5, CAT-BN2; novox/hq ADR 0608 §5, design 26 *Contracts modules*). A module whose -// package artifact names `generated-from` holds contracts only: every file under its generated roots is written by the -// seat generator (package seatgen beside this file, command cmd/seatgen) from the definitions in that directory. A build module regenerates them with the generator -// it was built with (its version is this package's requirement, so a new generator is a new build module and a new -// fingerprint of what it builds) and names each file out of step: one that differs, one missing, one under a generated -// root the generator did not write. The test step fails on any; a trunk build's ask answers them in its out-of-step -// (sdkstep.BuildAnswer.OutOfStep), so the builder's build end raises generated-types-out-of-step even where no test -// step runs. Each build module compares its own roots: mesh-build-go `go`, mesh-build-node `ts`. - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "regexp" - "sort" - "strings" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/seatgen" - "git.novox.be/novox/mesh-sdk/go/catalogue" -) - -// GeneratedRootGo and GeneratedRootTS are the generated roots of a contracts module, one per build module. -const ( - GeneratedRootGo = "go" - GeneratedRootTS = "ts" -) - -var goModuleLine = regexp.MustCompile(`(?m)^module\s+(\S+)`) - -// OutOfStep is every file under root, a path from the module's directory, that the generator writes otherwise than the -// module holds it, for each `generated-from` its package artifacts name, sorted and each once; none for a module naming -// none. The generated trees' names are read from the seats already generated in (generatedNames). -func OutOfStep(moduleDir, root string) ([]string, error) { - raw, err := os.ReadFile(filepath.Join(moduleDir, "module.json")) - if errors.Is(err, os.ErrNotExist) { - return nil, nil // no manifest here: nothing names generated-from - } - if err != nil { - return nil, fmt.Errorf("the module's manifest cannot be read for its generated files: %w", err) - } - var m catalogue.Manifest - if err := json.Unmarshal(raw, &m); err != nil { - return nil, fmt.Errorf("the module's manifest does not parse: %w", err) - } - froms := map[string]bool{} - if m.Build != nil { - for _, a := range m.Build.Artifacts { - if a.GeneratedFrom != "" { - froms[filepath.Clean(a.GeneratedFrom)] = true - } - } - } - seen := map[string]bool{} - for from := range froms { - if filepath.IsAbs(from) || from == ".." || strings.HasPrefix(from, "../") { - return nil, fmt.Errorf("generated-from %q is not inside the module", from) - } - dir := filepath.Join(moduleDir, from) - goModule, tsPackage, err := generatedNames(dir) - if err != nil { - return nil, err - } - g, err := seatgen.Load(dir, goModule, tsPackage) - if err != nil { - return nil, fmt.Errorf("the seat definitions in %s do not load: %w", from, err) - } - files, err := seatgen.Generate(g) - if err != nil { - return nil, fmt.Errorf("the seat definitions in %s do not generate: %w", from, err) - } - out, err := seatgen.Compare(dir, files) - if err != nil { - return nil, err - } - for _, line := range out { - p, _, _ := strings.Cut(line, ": ") - if p == root || strings.HasPrefix(p, root+"/") { - seen[filepath.ToSlash(filepath.Join(from, p))] = true - } - } - } - paths := make([]string, 0, len(seen)) - for p := range seen { - paths = append(paths, p) - } - sort.Strings(paths) - return paths, nil -} - -// generatedNames reads the names the generated trees are rooted at from the seats already generated in dir: a seat's Go -// module is `/seats/` and its npm package `-` (a contracts module has no root -// package of either kind, ADR 0635 §1). A module with no seat generated yet gives none, and the generator says so only -// if a seat is defined whole. -func generatedNames(dir string) (goModule, tsPackage string, err error) { - names, _ := filepath.Glob(filepath.Join(dir, "seats", "*", "seat.json")) - for _, p := range names { - seat := filepath.Base(filepath.Dir(p)) - pkg := strings.ReplaceAll(seat, "-", "") - if goModule == "" { - if raw, err := os.ReadFile(filepath.Join(dir, GeneratedRootGo, "seats", pkg, "go.mod")); err == nil { - if m := goModuleLine.FindSubmatch(raw); m != nil { - goModule = strings.TrimSuffix(string(m[1]), "/seats/"+pkg) - } - } - } - if tsPackage == "" { - if raw, err := os.ReadFile(filepath.Join(dir, GeneratedRootTS, "seats", pkg, "package.json")); err == nil { - var p struct { - Name string `json:"name"` - } - if json.Unmarshal(raw, &p) == nil { - tsPackage = strings.TrimSuffix(p.Name, "-"+seat) - } - } - } - } - return goModule, tsPackage, nil -} - -// ModuleDirs is every directory in tree that holds a module.json, in any folder (ADR 0634 §8: a module is found by its -// manifest, whether it lies at the root, under modules/ or in a folder of another module), the tree's own first, then -// sorted. Hidden directories, node_modules and testdata are not entered. -func ModuleDirs(tree string) ([]string, error) { - var out []string - err := filepath.WalkDir(tree, func(p string, e os.DirEntry, err error) error { - if err != nil { - return err - } - if e.IsDir() { - if n := e.Name(); p != tree && (strings.HasPrefix(n, ".") || n == "node_modules" || n == "testdata") { - return filepath.SkipDir - } - return nil - } - if e.Name() == "module.json" { - out = append(out, filepath.Dir(p)) - } - return nil - }) - sort.Strings(out) - return out, err -} - -// CompareStep is AskSteps.Compare for a build module comparing root: it reads {"workspace", "module"}, the workspace's -// tree where tree says it is (the build module's own layout), and answers {"out-of-step": [...]}. -func CompareStep(root string, tree func(workspace string) string) StepFunc { - return func(_ context.Context, args map[string]any) (any, error) { - ws, _ := args["workspace"].(string) - mod, _ := args["module"].(string) - if ws == "" { - return nil, Refuse("the compare names no workspace") - } - paths, err := OutOfStep(filepath.Join(tree(ws), filepath.FromSlash(mod)), root) - if err != nil { - return nil, err - } - return map[string]any{"out-of-step": paths}, nil - } -} diff --git a/modules/mesh-build-go/buildstep/generated_test.go b/modules/mesh-build-go/buildstep/generated_test.go deleted file mode 100644 index e77906136..000000000 --- a/modules/mesh-build-go/buildstep/generated_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package buildstep - -import ( - "context" - "errors" - "os" - "path/filepath" - "reflect" - "sort" - "strings" - "testing" - - "git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep/seatgen" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" -) - -// contracts writes a contracts module of one seat, its generated files as the generator writes them, and answers its -// directory and the generated paths. -func contracts(t *testing.T, manifest string) (string, []string) { - t.Helper() - dir := t.TempDir() - for p, text := range map[string]string{ - "module.json": manifest, - "seats/one-store/seat.json": `{"format":1,"seat":"one-store","scope":"mesh","grain":"whole","domain":"Module","decision":"ADR 1","verbs":[{"name":"query","input":{"type":"object"},"answer":{"type":"object"}}]}`, - // A definition at the seat-list grain is read and generates nothing (ADR 0635 §1, §2). - "seats/other/seat.json": `{"format":1,"seat":"other","scope":"mesh","grain":"seat-list","domain":"Module","decision":"ADR 1","verbs":[{"name":"ask","input":{"type":"object"}}]}`, - } { - writeContract(t, filepath.Join(dir, p), text) - } - m, err := seatgen.Load(dir, "example.org/c/go", "@example/c") - if err != nil { - t.Fatal(err) - } - files, err := seatgen.Generate(m) - if err != nil { - t.Fatal(err) - } - var paths []string - for p, b := range files { - writeContract(t, filepath.Join(dir, p), string(b)) - paths = append(paths, p) - } - return dir, paths -} - -func writeContract(t *testing.T, path, text string) { - t.Helper() - if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(path, []byte(text), 0o644); err != nil { - t.Fatal(err) - } -} - -// **CAT-BG5, CAT-BN2**: a contracts module's generated files are regenerated and compared, each build module its own -// root; a file that differs, one missing and one the generator did not write are each named; a clean tree and a module -// naming no generated-from name none; a build ask answers them in its out-of-step. -func TestAContractsModulesGeneratedFilesAreComparedWithTheGenerator(t *testing.T) { - marked := `{"module":"c","build":{"artifacts":[{"name":"go","kind":"package","language":"go","paths":["go"],"generated-from":"."}]}}` - dir, paths := contracts(t, marked) - var goFile, tsFile string - for _, p := range paths { - if strings.HasPrefix(p, "go/") && strings.HasSuffix(p, ".go") && goFile == "" { - goFile = p - } - if strings.HasPrefix(p, "ts/") && strings.HasSuffix(p, ".ts") && tsFile == "" { - tsFile = p - } - } - for _, p := range paths { - if strings.Contains(p, "other") || p == "go/go.mod" || p == "ts/package.json" { - t.Errorf("%s is generated: a seat-list definition generates nothing and a contracts module has no root package", p) - } - } - if goFile == "" || tsFile == "" { - t.Fatalf("the generator wrote no Go or no TypeScript file: %v", paths) - } - for _, root := range []string{GeneratedRootGo, GeneratedRootTS} { - if got, err := OutOfStep(dir, root); err != nil || len(got) != 0 { - t.Fatalf("a clean tree, root %s: %v %v", root, got, err) - } - } - writeContract(t, filepath.Join(dir, goFile), "package changed\n") - writeContract(t, filepath.Join(dir, "go/extra.go"), "package extra\n") - writeContract(t, filepath.Join(dir, tsFile), "// changed\n") - got, err := OutOfStep(dir, GeneratedRootGo) - if want := sorted(goFile, "go/extra.go"); err != nil || !reflect.DeepEqual(got, want) { - t.Errorf("Go root: %v %v, want %v", got, err, want) - } - if got, _ := OutOfStep(dir, GeneratedRootTS); !reflect.DeepEqual(got, []string{tsFile}) { - t.Errorf("TypeScript root: %v, want %s alone", got, tsFile) - } - _ = os.Remove(filepath.Join(dir, goFile)) - if got, _ := OutOfStep(dir, GeneratedRootGo); !reflect.DeepEqual(got, sorted(goFile, "go/extra.go")) { - t.Errorf("a missing file is not named: %v", got) - } - plain, _ := contracts(t, `{"module":"p","build":{"artifacts":[{"name":"go","kind":"package","language":"go","paths":["go"]}]}}`) - writeContract(t, filepath.Join(plain, "go/extra.go"), "package extra\n") - if got, err := OutOfStep(plain, GeneratedRootGo); err != nil || len(got) != 0 { - t.Errorf("a module naming no generated-from compared: %v %v", got, err) - } - - // The build ask answers them beside what it built, and with a failed build too. - built := 0 - steps := AskSteps{Compare: CompareStep(GeneratedRootGo, func(ws string) string { return ws }), - Fetch: func(context.Context, map[string]any) (any, error) { - return map[string]any{"workspace": filepath.Dir(dir)}, nil - }, - Build: func(context.Context, map[string]any) (any, error) { - if built++; built > 1 { - return nil, errors.New("the second artifact does not build") - } - return map[string]any{"digest": "sha256:aa"}, nil - }} - job := sdkstep.BuildJob{Module: "c", Path: filepath.Base(dir), Fetch: &sdkstep.Fetch{Repository: "novox/c", Commit: "0123456789abcdef0123456789abcdef01234567"}, - Artifacts: []sdkstep.AskArtifact{{Artifact: "go"}}} - out, err := RunAsk(context.Background(), steps, ask(job)) - if a, ok := out.(sdkstep.BuildAnswer); err != nil || !ok || !reflect.DeepEqual(a.OutOfStep, sorted(goFile, "go/extra.go")) || len(a.Artifacts) != 1 { - t.Errorf("the build ask's out-of-step: %+v %v", out, err) - } - job.Artifacts = append(job.Artifacts, sdkstep.AskArtifact{Artifact: "go-other"}) - built = 0 - out, err = RunAsk(context.Background(), steps, ask(job)) - if a, ok := out.(sdkstep.BuildAnswer); err == nil || !ok || len(a.OutOfStep) != 2 { - t.Errorf("a failed build answered no out-of-step: %+v %v", out, err) - } -} - -func sorted(paths ...string) []string { - sort.Strings(paths) - return paths -} diff --git a/modules/mesh-build-go/buildstep/go.mod b/modules/mesh-build-go/buildstep/go.mod deleted file mode 100644 index 6739d8699..000000000 --- a/modules/mesh-build-go/buildstep/go.mod +++ /dev/null @@ -1,40 +0,0 @@ -module git.novox.be/novox/mesh-catalog/modules/mesh-build-go/buildstep - -go 1.26.0 - -require ( - git.novox.be/novox/mesh-contracts/go/seats/meshmoduleassigner v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/containerimageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/gopackageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/npmpackageregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/ociartifactregistryclient v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/containerimageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/gopackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/npmpackageregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/ociartifactregistry v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/builds v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk v0.0.0-00010101000000-000000000000 - git.novox.be/novox/mesh-sdk/go v0.0.0-00010101000000-000000000000 - github.com/nats-io/nats.go v1.54.0 -) - -require ( - github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op // indirect - github.com/google/go-tpm v0.9.8 // indirect - github.com/klauspost/compress v1.20.1 // indirect - github.com/minio/highwayhash v1.0.4 // indirect - github.com/nats-io/jwt/v2 v2.8.2 // indirect - github.com/nats-io/nats-server/v2 v2.11.17 // indirect - github.com/nats-io/nkeys v0.4.16 // indirect - github.com/nats-io/nuid v1.0.1 // indirect - golang.org/x/crypto v0.57.0 // indirect - golang.org/x/sys v0.48.0 // indirect - golang.org/x/time v0.16.0 // indirect -) - -require ( - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/clients/meshcatalogclient v0.0.0-00010101000000-000000000000 // indirect - git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog v0.0.0-00010101000000-000000000000 // indirect -) diff --git a/modules/mesh-build-go/buildstep/go.sum b/modules/mesh-build-go/buildstep/go.sum deleted file mode 100644 index 8ca93dfd0..000000000 --- a/modules/mesh-build-go/buildstep/go.sum +++ /dev/null @@ -1,25 +0,0 @@ -github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op h1:1BOWQJweNyvZMlpAHXGLiZQn9S+QXGcz3xh94lC0w6E= -github.com/antithesishq/antithesis-sdk-go v0.8.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= -github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= -github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= -github.com/klauspost/compress v1.20.1 h1:T7kKElXUMXrUJ2E9QhQhxFtcK5rPyLdsGZvdbLMPdiQ= -github.com/klauspost/compress v1.20.1/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= -github.com/minio/highwayhash v1.0.4 h1:asJizugGgchQod2ja9NJlGOWq4s7KsAWr5XUc9Clgl4= -github.com/minio/highwayhash v1.0.4/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= -github.com/nats-io/jwt/v2 v2.8.2 h1:XXRgB60MSTnqsRwejQurVDs/hcv2dkt+86GjI+I/bMc= -github.com/nats-io/jwt/v2 v2.8.2/go.mod h1:Ag/56sq9OblL4JgdYufDd16Egb17Kr/8WwwuO/forVc= -github.com/nats-io/nats-server/v2 v2.11.17 h1:GKEghcFK6A+aFx11Yf1LjgLC3txAwvyhnYzhBIQZA8I= -github.com/nats-io/nats-server/v2 v2.11.17/go.mod h1:B1sFVz4StNosQ903ak4N1G01Fl/9f8e06mXpFIE2K24= -github.com/nats-io/nats.go v1.54.0 h1:vsXoOxjHp/GmPUN+EcI7uOf/uB+iAP+kEsAFNQN0yzA= -github.com/nats-io/nats.go v1.54.0/go.mod h1:y+DZoD1oBOYfZTU681eTUiUjI0vbqYGixNVFHcjHJ0k= -github.com/nats-io/nkeys v0.4.16 h1:rd5oAuLOb8mnAycB0xleuEBNS1pVVnN0fv/FF34Eypg= -github.com/nats-io/nkeys v0.4.16/go.mod h1:llLgWoI0o4z/Q57q2R1kHfmocyhGV6VG/U18Glg1Afs= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= -golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= -golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= -golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= diff --git a/modules/mesh-build-go/buildstep/gotest.go b/modules/mesh-build-go/buildstep/gotest.go deleted file mode 100644 index a75f59b35..000000000 --- a/modules/mesh-build-go/buildstep/gotest.go +++ /dev/null @@ -1,410 +0,0 @@ -package buildstep - -// The reader of `go test -json` (moved whole from mesh-catalog's mesh-build-go, issue 1901's thorough fix): per package -// what ran and for how long, and each failure under the contract (failure.go), its real cause too when the failure is no -// test's assertion (a panic, a timeout, a build error, an exit, a kill, a race). - -import ( - "bufio" - "encoding/json" - "fmt" - sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" - "regexp" - "slices" - "strings" -) - -// GoPackage is one package's part of a Go test level. -type GoPackage struct { - Dir string `json:"dir"` - Package string `json:"package"` - Passed bool `json:"passed"` - Elapsed float64 `json:"elapsed"` - Tests int `json:"tests"` - // Skipped is how many of the package's tests skipped. - Skipped int `json:"skipped,omitempty"` - // NoTests is a package with no test files (at this level: a file with the other level's build tag is none). - NoTests bool `json:"no_tests,omitempty"` -} - -// TestTime is one test and the seconds it took. -type TestTime struct { - Package string `json:"package"` - Test string `json:"test"` - Elapsed float64 `json:"elapsed"` -} - -// GoTest is what one go.mod directory's `go test -json` said. -type GoTest struct { - Packages []GoPackage - Tests int - Skipped int - Times []TestTime - Failed []sdkstep.Failure - // Elapsed is the slowest package's running time in seconds. - Elapsed float64 - // Noise is the lines that were no event: what go said when it could not run the tests at all. - Noise []string -} - -// ReadGoTest reads the output of `go test -json` run in the go.mod directory dir. -func ReadGoTest(out, dir string) GoTest { - r := &goReader{dir: dir, pkgs: map[string]*GoPackage{}, builds: map[string][]string{}, pkgOut: map[string][]string{}, - testOut: map[string][]string{}, causes: map[string]string{}, failedIn: map[string]bool{}, - running: map[string][]string{}, passed: map[string]bool{}, built: map[string]bool{}} - sc := bufio.NewScanner(strings.NewReader(out)) - sc.Buffer(make([]byte, 1<<20), 1<<26) - for sc.Scan() { - var ev goEvent - if err := json.Unmarshal(sc.Bytes(), &ev); err != nil { - if l := strings.TrimSpace(sc.Text()); l != "" { - r.res.Noise = append(r.res.Noise, l) - } - continue - } - r.event(ev) - } - r.finish() - return r.res -} - -// goEvent is one line of `go test -json` (test2json, and the build events go test adds). -type goEvent struct { - Action string - Package string - Test string - Output string - OutputType string // "error" for a t.Error or t.Fatal message, "error-continue" for its further lines - ImportPath string - FailedBuild string - Elapsed float64 -} - -type goReader struct { - res GoTest - dir string - pkgs map[string]*GoPackage - order []string - builds map[string][]string // build output by import path - pkgOut map[string][]string - testOut map[string][]string // by package + "\x00" + test - causes map[string]string // the first error line of a test, by the same key - failedIn map[string]bool // packages with a failed test - // running is the tests that started and have not ended, by package, in the order they started: when a package - // fails with no failed test, these were running when its test program stopped. - running map[string][]string - // passed says a package's test program printed "PASS" before it failed; built says it failed to build. - passed, built map[string]bool -} - -func (r *goReader) pkg(name string) *GoPackage { - p := r.pkgs[name] - if p == nil { - p = &GoPackage{Dir: r.dir, Package: name} - r.pkgs[name] = p - r.order = append(r.order, name) - } - return p -} - -func keepLine(lines []string, out string) []string { - if t := strings.TrimRight(out, "\r\n"); t != "" && !strings.HasPrefix(t, "=== ") { - lines = append(lines, t) - } - return lines -} - -func (r *goReader) event(ev goEvent) { - switch { - case ev.Package == "" && ev.ImportPath != "": - if ev.Action == "build-output" { - r.builds[ev.ImportPath] = keepLine(r.builds[ev.ImportPath], ev.Output) - } - case ev.Package == "": - case ev.Test == "": - p := r.pkg(ev.Package) - switch ev.Action { - case "output": - // go test's own summary of a package is never a failure's words: a "PASS" before a "FAIL " says only - // that the tests passed and the program failed after them. - switch l := strings.TrimRight(ev.Output, "\r\n"); { - case l == "PASS": - r.passed[ev.Package] = true - case goSummaryLine(l): - default: - r.pkgOut[ev.Package] = keepLine(r.pkgOut[ev.Package], ev.Output) - } - case "pass": - p.Passed, p.Elapsed = true, ev.Elapsed - case "fail": - p.Passed, p.Elapsed = false, ev.Elapsed - if ev.FailedBuild != "" { - r.built[ev.Package] = true - r.pkgOut[ev.Package] = append(r.builds[ev.FailedBuild], r.pkgOut[ev.Package]...) - } - case "skip": - p.Passed, p.NoTests = true, true - } - default: - key := ev.Package + "\x00" + ev.Test - switch ev.Action { - case "output": - r.testOut[key] = keepLine(r.testOut[key], ev.Output) - if ev.OutputType == "error" && r.causes[key] == "" { - r.causes[key] = goErrorWords(ev.Output) - } - case "run": - r.running[ev.Package] = append(r.running[ev.Package], ev.Test) - case "pass", "fail", "skip": - r.running[ev.Package] = slices.DeleteFunc(r.running[ev.Package], func(t string) bool { return t == ev.Test }) - p := r.pkg(ev.Package) - p.Tests++ - r.res.Tests++ - if ev.Action == "skip" { - r.res.Skipped++ - p.Skipped++ - } - r.res.Times = append(r.res.Times, TestTime{Package: ev.Package, Test: ev.Test, Elapsed: ev.Elapsed}) - if ev.Action == "fail" { - r.failedIn[ev.Package] = true - if r.subtestFailed(ev.Package, ev.Test) { - return // a parent failed only by its subtest is that subtest's failure, said once - } - if r.subtestTakesTheCause(ev.Package, ev.Test) { - return // a subtest's panic, which go files under its parent, is said on the subtest - } - r.res.Failed = append(r.res.Failed, r.testFailure(ev.Package, ev.Test)) - } - } - } -} - -// subtestFailed says a failure of test under pkg was already reported for one of its subtests (they end first), each with -// a cause of its own, and the test reported no error and no runtime cause (a subtest's panic) of its own. -func (r *goReader) subtestFailed(pkg, test string) bool { - key := pkg + "\x00" + test - if r.causes[key] != "" || goRuntimeCause(r.testOut[key]) != "" { - return false - } - for _, f := range r.res.Failed { - if f.Package == pkg && strings.HasPrefix(f.Test, test+"/") { - return true - } - } - return false -} - -// noMessage is the cause of a test that failed and said nothing of why. -const noMessage = "the test failed without an error message (t.Fail or t.FailNow)" - -// subtestTakesTheCause gives a parent's runtime cause (a subtest's panic: go test -json files its lines under the -// parent) to the subtests of that parent that failed with no message of their own, and says it did. A parent with an -// error line of its own, or whose failed subtests each said why, is reported as itself. -func (r *goReader) subtestTakesTheCause(pkg, test string) bool { - key := pkg + "\x00" + test - if r.causes[key] != "" { - return false - } - cause := goRuntimeCause(r.testOut[key]) - if cause == "" { - return false - } - took := false - for i, f := range r.res.Failed { - if f.Package == pkg && strings.HasPrefix(f.Test, test+"/") && f.Cause == noMessage { - r.res.Failed[i].Cause, r.res.Failed[i].Output = cause, sdkstep.Clip(r.testOut[key], cause) - took = true - } - } - return took -} - -// testFailure is a test that failed: its cause is its first error line, the race it ran into, the runtime's line, or -// words saying it failed without a message. -func (r *goReader) testFailure(pkg, test string) sdkstep.Failure { - key := pkg + "\x00" + test - cause := r.causes[key] - if race := goRaceCause(r.testOut[key]); race != "" && (cause == "" || strings.HasPrefix(cause, "race detected")) { - cause = race // the race itself, not testing's "race detected during execution of test" - } else if cause == "" { - cause = goRuntimeCause(r.testOut[key]) - } - if cause == "" { - cause = noMessage - } - return sdkstep.Failure{Package: pkg, Test: test, Output: sdkstep.Clip(r.testOut[key], cause), Cause: cause} -} - -// goSummaryLine says a line is go test's summary of a package, in go's exact forms only: "PASS" or "FAIL" alone, -// "ok \t\t