From 5812a2f97de066b16a447d7032e841cf6be5b7c4 Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 13 Nov 2026 01:47:23 +0100 Subject: [PATCH] Runner: an image artifact's steps are asked of the seat on kind:image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Place named an image's build seat by "kind: image", a form no seat definition writes, so every image artifact's lint, unit and integration steps ended could not run. It now uses the seat definition's own form, seatdef.OnKindImage ("kind:image"). No other kind constant has the space. Builds: design 47 G §324, §397 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../internal/pipeline/place.go | 6 ++---- .../internal/pipeline/place_test.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/modules/mesh-delivery-pipeline/internal/pipeline/place.go b/modules/mesh-delivery-pipeline/internal/pipeline/place.go index 2037f55a..b71206d5 100644 --- a/modules/mesh-delivery-pipeline/internal/pipeline/place.go +++ b/modules/mesh-delivery-pipeline/internal/pipeline/place.go @@ -16,6 +16,7 @@ import ( nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" nodebuildimage "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildimage" nodebuildnode "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildnode" + "git.novox.be/novox/mesh-sdk/go/seatdef" ) // StepAsker puts one step's ask on a build seat's work queue, at the subject accept names (the seat's accepted kind `step` @@ -51,9 +52,6 @@ var buildSteps = []string{seat.StepResultStepLint, seat.StepResultStepUnit, seat // approval, asked last (§22, §26). var moduleSteps = []string{seat.StepResultStepComposition, seat.StepResultStepReview, seat.StepResultStepApproval} -// kindImage is the form of an acting rule's `on` naming an artifact kind (§324). -const kindImage = "kind: image" - // AskID is a step's ask id in the usual ask id form the holders accept (buildstep.CheckAskID): base 36 of started in // milliseconds, then six hex digits of the sha256 of the pipeline, the artifact and the step, so the same placement makes // the same id at every start and the bus dedupes on it; started is the pipeline's start time, or a rerun's own (design 47 @@ -105,7 +103,7 @@ func Place(p seat.Pipeline, reg catalog.Registration, entries map[string]catalog } on := a.Language if on == "" && a.Kind == "image" { - on = kindImage + on = seatdef.OnKindImage } bs, err := BuildSeat(entries, on) if err != nil { diff --git a/modules/mesh-delivery-pipeline/internal/pipeline/place_test.go b/modules/mesh-delivery-pipeline/internal/pipeline/place_test.go index e6c234dc..c1a91d44 100644 --- a/modules/mesh-delivery-pipeline/internal/pipeline/place_test.go +++ b/modules/mesh-delivery-pipeline/internal/pipeline/place_test.go @@ -13,6 +13,7 @@ import ( wants "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshwants" nodebuildgo "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/nodebuildgo" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" + "git.novox.be/novox/mesh-sdk/go/seatdef" ) func stepSeatOf(t *testing.T, name string) StepSeat { @@ -278,3 +279,19 @@ func TestAStepAskCarriesTheKeptResultsAndTheToolchain(t *testing.T) { t.Errorf("ToolchainOf = %+v, %v", tc, err) } } + +// An image artifact, which has no language, is asked of the build seat whose acting rule build is on kind:image, the form +// the seat definitions write (design 47 G §324, §397). +func TestAnImageArtifactsStepsAreAskedOfTheSeatOnKindImage(t *testing.T) { + reg := catalog.Registration{Module: "app", Policy: catalog.Policy{Steps: catalog.StepStatuses{Lint: "required"}}} + entries := map[string]catalog.CatalogEntry{ + "app": {Module: "app", Artifacts: []catalog.Artifact{{Ref: "app:server", Kind: "image"}}}, + "mesh-build-image": {Module: "mesh-build-image", Acts: []catalog.ActingRule{{Seat: "node-build-image", Step: "build", On: seatdef.OnKindImage}}}, + } + steps, _ := Place(seat.Pipeline{Pipeline: "main.4.app", Module: "app"}, reg, entries, time.Unix(0, 0), "the-runner") + for _, s := range steps { + if s.Artifact == "app:server" && (s.Outcome != seat.StepResultOutcomeRunning || s.Seat != "node-build-image") { + t.Errorf("the image's step %s is %s at %q (%s), want running at node-build-image", s.Step, s.Outcome, s.Seat, s.Why) + } + } +}