From 8af822e3fd5b96596e75a6323c54a233a47549e2 Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 13 Nov 2026 02:33:38 +0100 Subject: [PATCH] SDK (A-324, A-325): one PackedOrFetched for the seed and the runner The rule of an artifact the builder packs or fetches itself was written twice, in the indexer's seed and in the runner's placing; both now read the one in mesh-delivery-sdk's buildstep, the contract of a build step every delivery part reads. Builds: design 47 G A-324, A-325 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../internal/index/seed_steps.go | 11 +++-------- .../internal/pipeline/place.go | 10 ++-------- modules/mesh-delivery-sdk/buildstep/packed.go | 9 +++++++++ modules/mesh-delivery-sdk/buildstep/step_test.go | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 modules/mesh-delivery-sdk/buildstep/packed.go diff --git a/modules/mesh-delivery-indexer/internal/index/seed_steps.go b/modules/mesh-delivery-indexer/internal/index/seed_steps.go index adbe12b8..934fbe62 100644 --- a/modules/mesh-delivery-indexer/internal/index/seed_steps.go +++ b/modules/mesh-delivery-indexer/internal/index/seed_steps.go @@ -13,6 +13,7 @@ import ( mcc "git.novox.be/novox/mesh-contracts/health-and-repair/go/clients/meshconditionsclient" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-contracts/go/seats/meshcatalog" "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/keys" "git.novox.be/novox/mesh-sdk/go/seatdef" ) @@ -77,7 +78,7 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. unbuilt := map[string][]string{} // module -> each artifact of it no build seat builds, with its language or kind for _, e := range entries { for _, a := range e.Artifacts { - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { continue } seat, err := buildSeatOf(defs, a) @@ -103,7 +104,7 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. } for _, a := range e.Artifacts { name := artifactName(a.Ref) - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { // The builder packs or fetches it: no steps call, and its lint, unit and integration are bypass (A-324). m.Artifacts = append(m.Artifacts, SeedArtifact{Name: name, Answered: true}) continue @@ -135,12 +136,6 @@ func (ix *Indexer) SeedModulesFrom(ctx context.Context, defs map[string]seatdef. return out, nil } -// packedOrFetched says the artifact is one the builder packs or fetches itself, of kind archive or upstream with no -// language: it has no lint, unit or integration step, so no build seat's steps is called for it (design 47 G A-324). -func packedOrFetched(a meshcatalog.Artifact) bool { - return a.Language == "" && (a.Kind == "archive" || a.Kind == "upstream") -} - // unbuiltWords names an artifact no build seat builds, with its language, else its kind. func unbuiltWords(a meshcatalog.Artifact) string { if a.Language != "" { diff --git a/modules/mesh-delivery-pipeline/internal/pipeline/place.go b/modules/mesh-delivery-pipeline/internal/pipeline/place.go index 48feee34..b4037762 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" + sdkstep "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-sdk/buildstep" "git.novox.be/novox/mesh-sdk/go/seatdef" ) @@ -96,7 +97,7 @@ func Place(p seat.Pipeline, reg catalog.Registration, entries map[string]catalog for _, step := range buildSteps { status := Status(reg, name, step) why := "bypassed by the module's policy" - if packedOrFetched(a) { + if sdkstep.PackedOrFetched(a.Language, a.Kind) { status, why = seat.StepResultStatusBypass, fmt.Sprintf("an artifact of kind %s has no %s step: the builder packs or fetches it", a.Kind, step) } s := seat.StepResult{Step: step, Artifact: a.Ref, Status: status, Fingerprint: p.Fingerprint} @@ -147,13 +148,6 @@ func Place(p seat.Pipeline, reg catalog.Registration, entries map[string]catalog return steps, asks } -// packedOrFetched says the artifact is one the builder packs or fetches itself, of kind archive or upstream with no language: -// it has no lint, unit or integration step, so those are bypass whatever the policy says and no build seat is asked -// (design 47 G A-324, A-325). -func packedOrFetched(a catalog.Artifact) bool { - return a.Language == "" && (a.Kind == "archive" || a.Kind == "upstream") -} - // Asked is one ask to put on a build seat's work queue. type Asked struct { Seat string diff --git a/modules/mesh-delivery-sdk/buildstep/packed.go b/modules/mesh-delivery-sdk/buildstep/packed.go new file mode 100644 index 00000000..807ca36c --- /dev/null +++ b/modules/mesh-delivery-sdk/buildstep/packed.go @@ -0,0 +1,9 @@ +package buildstep + +// PackedOrFetched says an artifact of language and kind (its catalog entry's) is one the builder packs or fetches itself, +// of kind archive or upstream with no language: it has no lint, unit or integration step, so the seed calls no build seat's +// steps for it and the runner places those steps bypassed, whatever the policy says (design 47 G A-324, A-325). The +// indexer's seed and the runner read this one rule. +func PackedOrFetched(language, kind string) bool { + return language == "" && (kind == "archive" || kind == "upstream") +} diff --git a/modules/mesh-delivery-sdk/buildstep/step_test.go b/modules/mesh-delivery-sdk/buildstep/step_test.go index bc93f2b0..284e6290 100644 --- a/modules/mesh-delivery-sdk/buildstep/step_test.go +++ b/modules/mesh-delivery-sdk/buildstep/step_test.go @@ -87,3 +87,17 @@ func TestParseStepKeyReadsBothFormsAndRefusesAThird(t *testing.T) { } } } + +// Design 47 G A-324, A-325: only an artifact of kind archive or upstream with no language is packed or fetched by the builder. +func TestPackedOrFetchedIsAnArchiveOrUpstreamWithNoLanguage(t *testing.T) { + for _, c := range []struct { + language, kind string + want bool + }{ + {"", "archive", true}, {"", "upstream", true}, {"go", "archive", false}, {"", "image", false}, {"go", "", false}, {"", "", false}, + } { + if got := PackedOrFetched(c.language, c.kind); got != c.want { + t.Errorf("PackedOrFetched(%q, %q) = %v, want %v", c.language, c.kind, got, c.want) + } + } +}