From 7ae4f2bb7f8f210b63f699b0e959df8bc316ff71 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 15:12:13 +0100 Subject: [PATCH] Join item 6: the builder says version.numbered as delivery.VersionNumbered and reads out-of-step by BuildAnswer's field versions.NumberedBody and NumberedEvent are mesh-sdk's delivery.VersionNumbered and VersionNumberedEvent now (J3), the contract a build module consumes for BG2's late publish; the body's JSON is unchanged. The lane reads a step's out-of-step files through delivery.BuildAnswer.OutOfStep, a failed step's result too (as before, A2k's d15d66fc: read before the step's state; its three rows hold it), in place of a local decode by name. The integration test hears version.numbered on delivery.VersionNumberedSubject and reads it with DecodeVersionNumbered, as a build module does. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig --- .../mesh-delivery-builder/integration_test.go | 8 ++--- .../cmd/mesh-delivery-builder/main.go | 2 +- .../cmd/mesh-delivery-builder/versions.go | 6 ++-- .../internal/build/plan_test.go | 5 +-- .../internal/build/round4_test.go | 3 +- .../internal/build/run.go | 7 ++--- .../internal/versions/again.go | 4 ++- .../internal/versions/claim.go | 4 ++- .../internal/versions/tools.go | 31 +++++-------------- .../internal/versions/versions_test.go | 13 ++++---- 10 files changed, 35 insertions(+), 48 deletions(-) diff --git a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/integration_test.go b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/integration_test.go index 75b7359f..6eed853c 100644 --- a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/integration_test.go +++ b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/integration_test.go @@ -1141,7 +1141,7 @@ type registry struct { b *bed versions, findings, reasks jetstream.KeyValue mu sync.Mutex - numbered []versions.NumberedBody + numbered []delivery.VersionNumbered removes []map[string]any } @@ -1189,9 +1189,9 @@ func (b *bed) registry(t *testing.T, node string, seatVersions ...string) *regis t.Fatal(err) } nc := b.js.Conn() - sub, err := nc.Subscribe("mesh.mod."+delivery.BuilderModule+".event."+versions.NumberedEvent, func(m *nats.Msg) { - var nb versions.NumberedBody - if json.Unmarshal(m.Data, &nb) == nil { + // As a build module hears it: on the contract's subject, read by the contract's decoder (BG2's late publish). + sub, err := nc.Subscribe(delivery.VersionNumberedSubject, func(m *nats.Msg) { + if nb, err := delivery.DecodeVersionNumbered(m.Data); err == nil { r.mu.Lock() r.numbered = append(r.numbered, nb) r.mu.Unlock() diff --git a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/main.go b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/main.go index 2adfd338..bbd2cdd0 100644 --- a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/main.go +++ b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/main.go @@ -148,7 +148,7 @@ func run(ctx context.Context, getenv func(string) string, logOut io.Writer) erro packagesKV := process.AwaitBucket(ctx, js, conn, delivery.PackagesBucket, "no package is numbered: each is built unnumbered and said", logger.Printf) numberer := &versions.Numberer{Versions: versions.Versions{Store: awaitedVersions{versionsKV}}, Floor: floorVia(calls.Call), Waits: floorWaits, Names: versions.NamesIn(indexerPackages{packagesKV}), - Said: func(nb versions.NumberedBody) { + Said: func(nb delivery.VersionNumbered) { if err := emitNumbered(context.WithoutCancel(ctx), js, cred, nb); err != nil { logger.Printf("%v", err) } diff --git a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/versions.go b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/versions.go index feabc77b..a1fab218 100644 --- a/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/versions.go +++ b/modules/mesh-delivery-builder/cmd/mesh-delivery-builder/versions.go @@ -186,13 +186,13 @@ func floorVia(call toolCaller) versions.FloorSources { // emitNumbered says the builder's event version.numbered (design 51 *Events of the builder*), on its own family apart // from its builds' ends; the name and version are the bus's dedup id. -func emitNumbered(ctx context.Context, js jetstream.JetStream, cred process.Account, b versions.NumberedBody) error { +func emitNumbered(ctx context.Context, js jetstream.JetStream, cred process.Account, b delivery.VersionNumbered) error { id := "numbered-" + versions.Key(b.Name, b.Version) if b.Again != "" { id += "-again-" + b.Again } - if err := emitEvent(ctx, js, cred, versions.NumberedEvent, id, b); err != nil { - return fmt.Errorf("saying %s for %s@%s: %w", versions.NumberedEvent, b.Name, b.Version, err) + if err := emitEvent(ctx, js, cred, delivery.VersionNumberedEvent, id, b); err != nil { + return fmt.Errorf("saying %s for %s@%s: %w", delivery.VersionNumberedEvent, b.Name, b.Version, err) } return nil } diff --git a/modules/mesh-delivery-builder/internal/build/plan_test.go b/modules/mesh-delivery-builder/internal/build/plan_test.go index 05608e98..9914ca92 100644 --- a/modules/mesh-delivery-builder/internal/build/plan_test.go +++ b/modules/mesh-delivery-builder/internal/build/plan_test.go @@ -3,11 +3,12 @@ package build import ( "errors" - "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" - "git.novox.be/novox/mesh-sdk/go/delivery" "strings" "testing" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" + "git.novox.be/novox/mesh-sdk/go/delivery" + "git.novox.be/novox/mesh-sdk/go/catalogue" ) diff --git a/modules/mesh-delivery-builder/internal/build/round4_test.go b/modules/mesh-delivery-builder/internal/build/round4_test.go index 1f1673ec..f09fa154 100644 --- a/modules/mesh-delivery-builder/internal/build/round4_test.go +++ b/modules/mesh-delivery-builder/internal/build/round4_test.go @@ -2,9 +2,10 @@ package build import ( "context" - "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" "testing" + "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" + "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" ) diff --git a/modules/mesh-delivery-builder/internal/build/run.go b/modules/mesh-delivery-builder/internal/build/run.go index 8504b0ec..fecf91c8 100644 --- a/modules/mesh-delivery-builder/internal/build/run.go +++ b/modules/mesh-delivery-builder/internal/build/run.go @@ -905,11 +905,8 @@ func (b *Builder) runLane(ctx context.Context, l *lane, repository string, m del } l.node = step.Node // The build module's compare of a contracts module's generated files (design 26, CAT-BG5/BN2) answers the files out - // of step as `out-of-step`, in a failed step's result too. Read beside the build's answer: the SDK's BuildAnswer - // names no such field yet (a request for mesh-sdk), so it is read by its name and shape here. - var compared struct { - OutOfStep []string `json:"out-of-step"` - } + // of step as delivery.BuildAnswer.OutOfStep, in a failed step's result too: read before the step's state is. + var compared delivery.BuildAnswer if len(step.Result) > 0 && json.Unmarshal(step.Result, &compared) == nil { l.outOfStep = compared.OutOfStep } diff --git a/modules/mesh-delivery-builder/internal/versions/again.go b/modules/mesh-delivery-builder/internal/versions/again.go index c298beac..7c0e12d0 100644 --- a/modules/mesh-delivery-builder/internal/versions/again.go +++ b/modules/mesh-delivery-builder/internal/versions/again.go @@ -8,6 +8,8 @@ import ( "sort" "strings" "time" + + "git.novox.be/novox/mesh-sdk/go/delivery" ) // What builder_publish_again does with one fingerprint of a name (design 51 *Tools of the builder*), after a holder failed. @@ -289,7 +291,7 @@ func (a Acts) PublishAgain(ctx context.Context, name, fp, why, by string, at tim b.Again = at.UTC().Format(time.RFC3339Nano) a.Numberer.Said(b) } - answer += "; " + NumberedEvent + " said for " + ag.Entry.Version + answer += "; " + delivery.VersionNumberedEvent + " said for " + ag.Entry.Version } return ag, answer, nil } diff --git a/modules/mesh-delivery-builder/internal/versions/claim.go b/modules/mesh-delivery-builder/internal/versions/claim.go index 957ec6b1..e5222387 100644 --- a/modules/mesh-delivery-builder/internal/versions/claim.go +++ b/modules/mesh-delivery-builder/internal/versions/claim.go @@ -6,6 +6,8 @@ import ( "sort" "strings" "time" + + "git.novox.be/novox/mesh-sdk/go/delivery" ) // The registry seats a version is published to (design 51 *The seats*), by what is published. @@ -133,7 +135,7 @@ type Numberer struct { // Holder is the module holding a seat, whose health condition's clear wakes a silent seat source; nil names none. Holder func(seat string) string // Said is told each version newly numbered; nil tells nobody. - Said func(NumberedBody) + Said func(delivery.VersionNumbered) // Names answers a package's name in its ecosystem; nil numbers a package as NameOf names it. Names PackageNames Now func() time.Time diff --git a/modules/mesh-delivery-builder/internal/versions/tools.go b/modules/mesh-delivery-builder/internal/versions/tools.go index bfe00f39..b5152ba8 100644 --- a/modules/mesh-delivery-builder/internal/versions/tools.go +++ b/modules/mesh-delivery-builder/internal/versions/tools.go @@ -6,6 +6,8 @@ import ( "errors" "fmt" "strings" + + "git.novox.be/novox/mesh-sdk/go/delivery" ) // The builder's tools of its versions (design 51 *Events of the builder*, *Tools of the builder*). @@ -17,33 +19,14 @@ const ( TagAsksTool = "builder_tag_asks" UntagTool = "builder_untag" OldFormTool = "builder_old_form" - // NumberedEvent and OldFormClosedEvent are the builder's own family `version`, kept seven days, apart from its builds' - // ends, so a waiter on a build's end does not wake on them. - NumberedEvent = "version.numbered" + // OldFormClosedEvent is, with delivery.VersionNumberedEvent, the builder's own family `version`, kept seven days, + // apart from its builds' ends, so a waiter on a build's end does not wake on them. OldFormClosedEvent = "version.old-form-closed" ) -// NumberedBody is the body of NumberedEvent: what a build module consumes to publish a build's version with the held digest, -// which stores nothing (design 51 *The floor*). -type NumberedBody struct { - Name string `json:"name"` - Kind string `json:"kind"` - Version string `json:"version"` - Tag string `json:"tag,omitempty"` - Module string `json:"module"` - Fingerprint string `json:"fingerprint"` - Commit string `json:"commit,omitempty"` - Digest string `json:"digest,omitempty"` - Seat string `json:"seat,omitempty"` - // Head is the head the version answers, when it answers a tag ask. - Head string `json:"head,omitempty"` - // Again is when builder_publish_again said it once more, so the bus's dedup does not drop it. - Again string `json:"again,omitempty"` -} - -// NumberedOf is the event of an entry. -func NumberedOf(e Entry, head string) NumberedBody { - return NumberedBody{Name: e.Name, Kind: e.Kind, Version: e.Version, Tag: e.Tag, Module: e.Module, Fingerprint: e.Fingerprint, +// NumberedOf is the version.numbered body of an entry (delivery.VersionNumbered, the contract a build module reads). +func NumberedOf(e Entry, head string) delivery.VersionNumbered { + return delivery.VersionNumbered{Name: e.Name, Kind: e.Kind, Version: e.Version, Tag: e.Tag, Module: e.Module, Fingerprint: e.Fingerprint, Commit: e.Commit, Digest: e.Digest, Seat: e.Seat, Head: head} } diff --git a/modules/mesh-delivery-builder/internal/versions/versions_test.go b/modules/mesh-delivery-builder/internal/versions/versions_test.go index 651ca516..37a7abf0 100644 --- a/modules/mesh-delivery-builder/internal/versions/versions_test.go +++ b/modules/mesh-delivery-builder/internal/versions/versions_test.go @@ -13,6 +13,7 @@ import ( "time" "git.novox.be/novox/mesh-delivery/sdk/forms" + "git.novox.be/novox/mesh-sdk/go/delivery" ) // mem is a Store in memory; before runs once before the next Create, to stage a race. @@ -379,9 +380,9 @@ func TestTheBuildersVersions(t *testing.T) { }, Requirements: func(context.Context, string) ([]string, error) { return nil, nil }, } - var said []NumberedBody + var said []delivery.VersionNumbered fw := &FloorWaits{} - n := &Numberer{Versions: Versions{Store: newMem()}, Floor: src, Waits: fw, Said: func(b NumberedBody) { said = append(said, b) }} + n := &Numberer{Versions: Versions{Store: newMem()}, Floor: src, Waits: fw, Said: func(b delivery.VersionNumbered) { said = append(said, b) }} c := BuildClaim{Module: "m", Path: "go", Repository: "novox/m", Fingerprint: "fp1", Commit: "c1", Revision: "7", Merge: 7, Artifacts: []ClaimArtifact{{Artifact: "program", Kind: KindBundle, Language: "go"}, {Artifact: "base", Kind: "upstream"}}} got, err := n.Number(ctx, c) @@ -473,8 +474,8 @@ func TestTheBuildersVersions(t *testing.T) { return nil, nil }, } - var said []NumberedBody - n := &Numberer{Versions: Versions{Store: newMem()}, Floor: src, Names: NamesIn(state), Said: func(b NumberedBody) { said = append(said, b) }} + var said []delivery.VersionNumbered + n := &Numberer{Versions: Versions{Store: newMem()}, Floor: src, Names: NamesIn(state), Said: func(b delivery.VersionNumbered) { said = append(said, b) }} c := BuildClaim{Module: "mesh-sdk", Path: "go", Repository: "novox/mesh-sdk", Fingerprint: "fp1", Commit: "c1", Revision: "3", Merge: 3, Artifacts: []ClaimArtifact{{Artifact: "go", Kind: KindPackage, Language: "go"}, {Artifact: "ts", Kind: KindPackage, Language: "typescript"}, {Artifact: "new", Kind: KindPackage, Language: "go"}, {Artifact: "program", Kind: KindBundle, Language: "go"}}} @@ -599,10 +600,10 @@ func TestTheBuildersVersions(t *testing.T) { t.Error("a version refused for other bytes is published again") } _, _ = v.Mark(ctx, "m/p", "0.1.4", func(e *Entry) { e.State = Published }) - var said []NumberedBody + var said []delivery.VersionNumbered var rebuilt []string done := true - acts := Acts{Numberer: &Numberer{Versions: v, Said: func(b NumberedBody) { said = append(said, b) }, Waits: &FloorWaits{}}, + acts := Acts{Numberer: &Numberer{Versions: v, Said: func(b delivery.VersionNumbered) { said = append(said, b) }, Waits: &FloorWaits{}}, Done: func(context.Context, string, string) (bool, error) { return done, nil }, BuildAgain: func(_ context.Context, m, fp, _, _ string) (string, bool) { rebuilt = append(rebuilt, m+" "+fp)