From 72f22b11ec6b659d253c04b150ad208872498164 Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 5 Nov 2026 16:00:39 +0100 Subject: [PATCH] =?UTF-8?q?mesh-delivery-gate=20reads=20and=20writes=20its?= =?UTF-8?q?=20values=20through=20the=20seat's=20types=20and=20meshdelivery?= =?UTF-8?q?client's=20codecs,=20the=20view's=20reach,=20the=20checker's=20?= =?UTF-8?q?verdict=20key;=20the=20holder=20names=20are=20its=20own=20const?= =?UTF-8?q?ants;=20no=20go/delivery=20left=20(B5h;=20ADR=200634=20=C2=A71,?= =?UTF-8?q?=20=C2=A72;=20issue=201966)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i --- .../cmd/mesh-delivery-gate/adr548_test.go | 14 +- .../cmd/mesh-delivery-gate/approval.go | 56 ++--- .../cmd/mesh-delivery-gate/approval_test.go | 32 +-- .../cmd/mesh-delivery-gate/bridge_test.go | 48 ++--- .../cmd/mesh-delivery-gate/bus_test.go | 52 ++--- .../mesh-delivery-gate/checked_shim_test.go | 4 +- .../cmd/mesh-delivery-gate/checkerbus_test.go | 8 +- .../cmd/mesh-delivery-gate/helpers_test.go | 8 +- .../cmd/mesh-delivery-gate/holder.go | 10 +- .../cmd/mesh-delivery-gate/issue1275_test.go | 10 +- .../issue1275_whole_test.go | 10 +- .../cmd/mesh-delivery-gate/issue1348_test.go | 30 +-- .../cmd/mesh-delivery-gate/issue1349_test.go | 24 +-- .../issue1726_trunk_test.go | 8 +- .../cmd/mesh-delivery-gate/issue888_test.go | 8 +- .../cmd/mesh-delivery-gate/main.go | 3 +- .../cmd/mesh-delivery-gate/manifest_test.go | 2 +- .../cmd/mesh-delivery-gate/merges.go | 80 +++---- .../cmd/mesh-delivery-gate/model.go | 2 +- .../cmd/mesh-delivery-gate/onestatus.go | 26 +-- .../mesh-delivery-gate/onestatus_bus_test.go | 8 +- .../cmd/mesh-delivery-gate/onestatus_test.go | 10 +- .../cmd/mesh-delivery-gate/operator_test.go | 19 +- .../cmd/mesh-delivery-gate/owed.go | 36 ++-- .../cmd/mesh-delivery-gate/reached.go | 11 +- .../cmd/mesh-delivery-gate/reached_test.go | 21 +- .../cmd/mesh-delivery-gate/ready.go | 8 +- .../cmd/mesh-delivery-gate/ready_test.go | 4 +- .../cmd/mesh-delivery-gate/settle.go | 28 +-- .../cmd/mesh-delivery-gate/settle_test.go | 8 +- .../cmd/mesh-delivery-gate/turns.go | 53 ++--- .../cmd/mesh-delivery-gate/values.go | 199 ++++++++++++++++++ .../cmd/mesh-delivery-gate/values_test.go | 81 +++++++ modules/mesh-delivery-gate/go.mod | 4 + 34 files changed, 604 insertions(+), 321 deletions(-) create mode 100644 modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values.go create mode 100644 modules/mesh-delivery-gate/cmd/mesh-delivery-gate/values_test.go diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/adr548_test.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/adr548_test.go index 862b274fc..fdcaacc0a 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/adr548_test.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/adr548_test.go @@ -6,8 +6,6 @@ import ( "sync" "testing" "time" - - sdk "git.novox.be/novox/mesh-sdk/go/delivery" ) // One check per delivery (novox/hq ADR 0548), the gate's part: nothing merges into a repository while a check of other heads @@ -30,27 +28,27 @@ func approvedLone(w *world) string { // memTurns is the bucket turns in memory; it logs each write with the merges the fake bridge had made by then. type memTurns struct { mu sync.Mutex - m map[string]sdk.Turn + m map[string]Turn log []string merges func() int } func newMemTurns(w *world) *memTurns { - return &memTurns{m: map[string]sdk.Turn{}, merges: func() int { return len(w.forge.merges) }} + return &memTurns{m: map[string]Turn{}, merges: func() int { return len(w.forge.merges) }} } -func (f *memTurns) All() (map[string]sdk.Turn, error) { +func (f *memTurns) All() (map[string]Turn, error) { f.mu.Lock() defer f.mu.Unlock() - out := map[string]sdk.Turn{} + out := map[string]Turn{} for k, v := range f.m { out[k] = v } return out, nil } -func (f *memTurns) Put(t sdk.Turn) error { - if _, err := sdk.EncodeTurn(t); err != nil { +func (f *memTurns) Put(t Turn) error { + if _, err := EncodeTurn(t); err != nil { return err } f.mu.Lock() diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/approval.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/approval.go index 4ce4c2328..cbd99faf1 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/approval.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/approval.go @@ -11,8 +11,8 @@ import ( 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" + mdc "git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliveryclient" stdio "git.novox.be/novox/mesh-sdk/go" - sdk "git.novox.be/novox/mesh-sdk/go/delivery" ) // A merge into main waits for the operator's Approve (novox/hq ADR 0398 §3, issue 948, ADR 0421). @@ -51,12 +51,12 @@ const AskLasts = occ.ApproveLasts - 10*time.Minute // Operator is how this owner asks the operator: through the keys of its bucket asks and the teller's answers. kvOperator in // the running module. type Operator interface { - // Ask writes the ask under its key (sdk.MergeAskKey); it writes nothing when that key holds the same ask already. - Ask(key string, a sdk.Ask) error + // Ask writes the ask under its key (mdc.MergeAskKey); it writes nothing when that key holds the same ask already. + Ask(key string, a Ask) error // Cancel takes the ask at a key away, which the teller reads as the ask withdrawn. Cancel(key string) error // Where is the teller's answer to the ask at a key, or nil when there is none. - Where(key string) (*sdk.Answer, error) + Where(key string) (*Answer, error) } // askGroup is the name a delivery's ask and merge are kept under: its group's, or, for a lone pull request, a group of one @@ -459,18 +459,18 @@ func (h *Holder) approval(d *Delivery, now time.Time) (string, func()) { group = d.Group } heads := map[string]string{} - var covered []sdk.Head + var covered []mdc.Head for _, m := range members { heads[m.ID] = m.Commit - covered = append(covered, sdk.Head{Repository: m.Repository, Number: m.Number, Head: m.Commit}) + covered = append(covered, mdc.Head{Repository: m.Repository, Number: m.Number, Head: m.Commit}) } name := askGroup(d) - id, err := sdk.MergeAskKey(name, covered) + id, err := mdc.MergeAskKey(name, covered) if err != nil { return "the operator cannot be asked: " + err.Error(), nil } r.Asks++ - // Each asking at these heads has its own router id (sdk.AskingID): the router keeps an ask by its id and drops a second ask + // Each asking at these heads has its own router id (mdc.AskingID): the router keeps an ask by its id and drops a second ask // under it as a redelivery, so an ask written again at unchanged heads (a lapse, a status or the review record changing) is // the next asking, with a new id (review round 1, G2; issue 1370). asking := 1 @@ -480,7 +480,7 @@ func (h *Holder) approval(d *Delivery, now time.Time) (string, func()) { } } check := h.checkAt(members) - ask := composeMergeAsk(sdk.AskingID(id, asking), d, group, members, heads, check, now) + ask := composeMergeAsk(mdc.AskingID(id, asking), d, group, members, heads, check, now) taken := []*Delivery{} var reads []memberRead for _, m := range members { @@ -726,7 +726,7 @@ func (h *Holder) hearAsks() { // held the warrant to the ask (novox/hq ADR 0437 §6); this owner acts on the answer only if the key it was written under is // still the key of the heads asked: an answer to an ask taken away, or to other heads, merges nothing (ADR 0441 §1). It // returns what to say on the pull requests. -func (h *Holder) answered(key string, ans sdk.Answer) []func() { +func (h *Holder) answered(key string, ans Answer) []func() { var covered []*Delivery for _, d := range h.deliveries { if d.Ready != nil && d.Ready.AskID == key { @@ -747,24 +747,24 @@ func (h *Holder) answered(key string, ans sdk.Answer) []func() { h.keep(d) } } - var heads []sdk.Head + var heads []mdc.Head for id, sha := range first.Heads { m := h.deliveries[id] if m == nil { refuse("the head " + id + " it covers is no delivery of this owner") return nil } - heads = append(heads, sdk.Head{Repository: m.Repository, Number: m.Number, Head: sha}) + heads = append(heads, mdc.Head{Repository: m.Repository, Number: m.Number, Head: sha}) } - if want, err := sdk.MergeAskKey(askGroup(covered[0]), heads); err != nil || want != key { + if want, err := mdc.MergeAskKey(askGroup(covered[0]), heads); err != nil || want != key { refuse(fmt.Sprintf("its key %s is not the key %s of the heads asked", key, want)) return nil } // The answer is to the asking asked now: the teller names the router id it was given in the warrant's id (`@