diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go index 93a28ff..76d1583 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go @@ -58,6 +58,9 @@ type passer struct { // nodeFailed is, by node and module, the words of the condition last raised for a failure that is the node's own (ADR 0557 // §1, issue 1496): raised once per words, cleared once when it ends. nodeFailed map[string]string + // callSaid is, by the key of a refused controller call's condition, what this process raised (issue 774); nil until the + // first pass after a start, which clears what a previous process raised for a pair the two sources agree on. + callSaid map[string]*callSaid // The seat mesh-placement's holder (seat.go, ADR 0567): its calls of the controller (nil: none is made), how it says // the seat's events (nil: none is said), the proposals it said, and what Intended computed by proposal and base. seat *seatActs @@ -148,7 +151,9 @@ func (p *passer) wants(ctx context.Context) { defer p.unplacedFindings() defer p.seatHolders(ctx) defer p.policySplits(manifests, chosen) - frozen := p.sayPlacement(p.withCalls(p.w.placementDiffers())) + differ := p.withCalls(p.w.placementDiffers()) + p.sayCalls(differ) + frozen := p.sayPlacement(differ) placed := p.w.placedNodes() puts := p.putsByModule() p.staleAsks(ctx, trunk) diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go index affbf2e..bed2ef1 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass_test.go @@ -971,3 +971,72 @@ func aPlacedNodesWantsNameTheBuildAloneAndItsYesComesFromItsHave(t *testing.T) { t.Errorf("a pass after the move dropped the yes: %+v", got) } } + +// refusingBus is the assigner's process account against a controller that refuses the calls whose verb is in refuse. +type refusingBus struct { + fakeBus + refuse map[string]string +} + +func (b *refusingBus) Call(key string, body any) (json.RawMessage, error) { + for verb, words := range b.refuse { + if strings.HasSuffix(key, "."+verb) { + return nil, errors.New(words) + } + } + return json.RawMessage(`{"ok":true}`), nil +} + +// Issue 774: a call of the controller it refuses is a condition, never only a journal line: raised once, urgent, naming the verb, +// the node, the module and the refusal; cleared when a later call for the pair is answered, or, for a module's place, once the +// pair differed and the two sources agree. +func TestARefusedControllerCallIsACondition(t *testing.T) { + p := newPasser(buckets{}, time.Date(2026, 10, 30, 21, 4, 0, 0, time.UTC)) + var conds []asks.Condition + p.say = func(c asks.Condition) error { conds = append(conds, c); return nil } + bus := &refusingBus{refuse: map[string]string{"assign": `assign takes no argument "why" — it takes "build", "module", "node"; nothing was done`}} + woke := make(chan struct{}, 4) + p.seat = newSeatActs(bus, func() { woke <- struct{}{} }, func(string, ...any) {}, func() bool { return false }) + assignWeb := assign.ControllerCall{Verb: "assign", Node: "anchor", Module: "web", Args: map[string]any{"node": "anchor", "module": "web"}} + call := func(c assign.ControllerCall) { + p.seat.callAll([]assign.ControllerCall{c}) + <-woke + } + differ := []assign.Pair{{Node: "anchor", Module: "web", Only: assign.OnlyPlacement}} + + call(assignWeb) + p.sayCalls(differ) + p.sayCalls(differ) + if len(conds) != 1 || conds[0].State != asks.StateRaised || conds[0].Key != "mesh-delivery-assigner.controller-call.anchor.web" || + !strings.Contains(conds[0].Explanation, `takes no argument "why"`) || !strings.Contains(conds[0].Headline, "assign web on anchor") { + t.Fatalf("after a refused assign, said = %+v", conds) + } + + bus.refuse = nil + call(assignWeb) + p.sayCalls(nil) + if len(conds) != 2 || conds[1].State != asks.StateCleared || conds[1].Key != conds[0].Key { + t.Fatalf("after the assign is answered, said = %+v", conds) + } + + // Refused again, then assigned by hand: cleared once the pair, seen differing, agrees; not before it was seen differing. + bus.refuse = map[string]string{"assign": "refused"} + call(assignWeb) + p.sayCalls(nil) + if len(conds) != 3 || conds[2].State != asks.StateRaised { + t.Fatalf("a second refusal is not raised: %+v", conds) + } + p.sayCalls(nil) + if len(conds) != 3 { + t.Fatalf("cleared before the pair was seen differing: %+v", conds) + } + p.sayCalls(differ) + p.sayCalls(nil) + if len(conds) != 4 || conds[3].State != asks.StateCleared || !strings.Contains(conds[3].Resolved, "agree") { + t.Fatalf("the hand assign does not clear it: %+v", conds) + } + p.sayCalls(nil) + if len(conds) != 4 { + t.Fatalf("said again after the clear: %+v", conds) + } +} diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/seat.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/seat.go index 7ba0b4d..7de5f98 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/seat.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/seat.go @@ -68,10 +68,19 @@ type seatActs struct { export map[string]exportCheck // calls is, by pair (node and module, or node and provision for a pin), what the last call for it came to. calls map[string]string + // outcomes is, by the key of a call's condition, the last call made for its pair once answered or refused: refused + // "" when the controller answered it (issue 774: a refused call is a condition, never only a journal line). + outcomes map[string]callOutcome // rec records the seat's acts in the hand-act log (ADR 0565 §11). rec handacts.Recorder } +// callOutcome is what one call of the controller came to: the call, and the controller's refusal ("" when it answered). +type callOutcome struct { + call assign.ControllerCall + refused string +} + // exportCheck is the export read again for one proposal: running, its answer, or why it was not read. type exportCheck struct { running bool @@ -81,7 +90,7 @@ type exportCheck struct { func newSeatActs(bus caller, wake func(), logf func(string, ...any), leaseAway func() bool) *seatActs { return &seatActs{bus: bus, wake: wake, logf: logf, export: map[string]exportCheck{}, calls: map[string]string{}, - rec: handacts.Recorder{Ask: bus.Call, LeaseAway: leaseAway}} + outcomes: map[string]callOutcome{}, rec: handacts.Recorder{Ask: bus.Call, LeaseAway: leaseAway}} } // exportOf is the export read again for a proposal, asked once in the background. @@ -160,18 +169,115 @@ func (a *seatActs) callAll(calls []assign.ControllerCall) { go func() { defer a.wake() for _, c := range calls { - words := c.Key() + " answered" + words, refused := c.Key()+" answered", "" if _, err := a.bus.Call("seat:"+catalogue.ControllerSeatName+"."+c.Verb, c.Args); err != nil { - words = c.Key() + " refused: " + err.Error() + refused = err.Error() + words = c.Key() + " refused: " + refused } a.logf("keeping the controller in step with placement: %s", words) a.mu.Lock() a.calls[c.Node+"."+c.Module] = words + a.outcomes[assign.CallConditionKey(c)] = callOutcome{call: c, refused: refused} a.mu.Unlock() } }() } +// outcomesNow is a copy of every call's last outcome, by the key of its condition. +func (a *seatActs) outcomesNow() map[string]callOutcome { + if a == nil { + return nil + } + a.mu.Lock() + defer a.mu.Unlock() + return maps.Clone(a.outcomes) +} + +// sayCalls makes a refused call of the controller loud (issue 774): the condition of each pair whose last call was refused +// is raised once per refusal, naming the verb, the node, the module and the controller's words; it is cleared when a later +// call for the pair is answered, or, for a module's place, once the pair differed after the refusal and the two sources now +// agree (a person called the verb by hand). The first pass after a start clears what a previous process raised for a pair +// the two sources agree on; a pin's stays, since nothing here can tell it was made since. A say that fails is made again at +// the next pass. +func (p *passer) sayCalls(differ []assign.Pair) { + if p.say == nil { + return + } + differs := map[string]bool{} + for _, d := range differ { + differs[d.Node+"."+d.Module] = true + } + outcomes := p.seat.outcomesNow() + if p.callSaid == nil { + p.callSaid = map[string]*callSaid{} + if p.findings.Keys != nil { + if keys, err := p.findings.Keys(); err == nil { + for _, k := range keys { + pair, ok := strings.CutSuffix(strings.TrimPrefix(k, "module."), "."+assign.KindControllerCall) + node, module, two := strings.Cut(pair, ".") + if !ok || !two || !strings.HasPrefix(k, "module.") || differs[pair] { + continue + } + c := assign.ControllerCall{Verb: "assign", Node: node, Module: module} + if _, made := outcomes[assign.CallConditionKey(c)]; made { + continue + } + if err := p.say(assign.CallRefusedCondition(c, "", false, "the controller's assignments and the placement agree on "+module+" on "+node+".")); err != nil { + p.logf("the refused call's condition of %s on %s could not be cleared: %v", module, node, err) + } + } + } + } + } + for key, o := range outcomes { + said := p.callSaid[key] + pair := o.call.Node + "." + o.call.Module + switch { + case o.refused != "" && (said == nil || said.refused != o.refused): + if err := p.say(assign.CallRefusedCondition(o.call, o.refused, true, "")); err != nil { + p.logf("that %s was refused could not be said, and is said at the next pass: %v", o.call.Key(), err) + continue + } + p.callSaid[key] = &callSaid{refused: o.refused, differed: differs[pair]} + case o.refused != "" && o.call.CallKind() == assign.KindControllerCall: + if differs[pair] { + said.differed = true + continue + } + if !said.differed { + continue // the pair was not seen differing since the refusal: the world may not hold the write yet + } + if err := p.say(assign.CallRefusedCondition(o.call, "", false, "the controller's assignments and the placement agree on "+o.call.Module+" on "+o.call.Node+".")); err != nil { + p.logf("the condition of %s could not be cleared, and is cleared at the next pass: %v", o.call.Key(), err) + continue + } + p.seat.forgetOutcome(key, o) + delete(p.callSaid, key) + case o.refused == "" && said != nil: + if err := p.say(assign.CallRefusedCondition(o.call, "", false, o.call.Key()+" was answered.")); err != nil { + p.logf("the condition of %s could not be cleared, and is cleared at the next pass: %v", o.call.Key(), err) + continue + } + delete(p.callSaid, key) + } + } +} + +// callSaid is the refusal a raised call's condition said, and whether its pair was seen differing since. +type callSaid struct { + refused string + differed bool +} + +// forgetOutcome drops a refused call's outcome once its condition is cleared, unless a later call replaced it. +func (a *seatActs) forgetOutcome(key string, o callOutcome) { + a.mu.Lock() + defer a.mu.Unlock() + if now, ok := a.outcomes[key]; ok && now.refused == o.refused && now.call.Verb == o.call.Verb { + delete(a.outcomes, key) + } +} + // callOf is what the last call for a pair came to, "" when none was made. func (a *seatActs) callOf(node, module string) string { if a == nil { @@ -671,7 +777,7 @@ func (p *passer) followWrite(prop delivery.PlacementProposal, answer delivery.An p.seat.record(answer.Warrant) p.sayChanged(prop, answer, changes) if p.seat != nil && !p.w.handedAway() && !prop.Seed { - p.seat.callAll(assign.ControllerCalls(before, written, prop.ID, answer.Warrant)) + p.seat.callAll(assign.ControllerCalls(before, written)) } } diff --git a/modules/mesh-delivery-assigner/go.mod b/modules/mesh-delivery-assigner/go.mod index beac707..b340ced 100644 --- a/modules/mesh-delivery-assigner/go.mod +++ b/modules/mesh-delivery-assigner/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-assigner go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-assigner/go.sum b/modules/mesh-delivery-assigner/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-assigner/go.sum +++ b/modules/mesh-delivery-assigner/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-assigner/internal/assign/seat.go b/modules/mesh-delivery-assigner/internal/assign/seat.go index 05a02c6..7e9b349 100644 --- a/modules/mesh-delivery-assigner/internal/assign/seat.go +++ b/modules/mesh-delivery-assigner/internal/assign/seat.go @@ -132,11 +132,14 @@ func (c ControllerCall) Key() string { } // ControllerCalls is every call that brings the controller's assignments and pins to the placement after: assign for a -// module placed on a node before not, unassign for one taken off, pin for a pin set or changed, unpin for one removed, -// each naming the proposal and its warrant in its why. In node order, unassigns before assigns, so a module moved -// between nodes is first taken off. -func ControllerCalls(before map[string]delivery.Placement, after map[string]*delivery.Placement, proposal, warrant string) []ControllerCall { - why := fmt.Sprintf("placement proposal %s, approved (%s)", proposal, warrant) +// module placed on a node before not, unassign for one taken off, pin for a pin set or changed, unpin for one removed. In +// node order, unassigns before assigns, so a module moved between nodes is first taken off. +// +// Each call carries only the arguments the controller's seat contract declares for its verb (catalogue.ControllerVerbs): +// the controller refuses any other argument and does nothing (issue 774: a "why" added to every call had every approved +// placement refused since 2026-10-28). The proposal and its warrant are in the assigner's own record instead: the +// placement-changed event and the hand-act log. +func ControllerCalls(before map[string]delivery.Placement, after map[string]*delivery.Placement) []ControllerCall { nodes := make([]string, 0, len(after)) for node := range after { nodes = append(nodes, node) @@ -176,11 +179,50 @@ func ControllerCalls(before map[string]delivery.Placement, after map[string]*del } } } - out := append(append(off, on...), pins...) - for i := range out { - out[i].Args["why"] = why + return append(append(off, on...), pins...) +} + +// CallKind is the kind of the condition of a refused call: one for a module's place (assign, unassign), one for a pin. +func (c ControllerCall) CallKind() string { + if c.Verb == "pin" || c.Verb == "unpin" { + return KindControllerPin } - return out + return KindControllerCall +} + +// The kinds of a refused controller call's condition (and finding). +const ( + KindControllerCall = "controller-call" + KindControllerPin = "controller-pin" +) + +// CallConditionKey is the key of the condition of a call refused for its pair (node and module, or node and provision). +func CallConditionKey(c ControllerCall) string { + return delivery.AssignerModule + "." + c.CallKind() + "." + c.Node + "." + c.Module +} + +// CallRefusedCondition is the condition the assigner raises when the controller refused (or did not answer) a call that +// keeps its assignments in step with an approved placement (ADR 0567 §8, issue 774): the placement is written, the +// controller's assignments are not, so nothing new reaches the node (no bus account, no composition). It names the verb, +// the node, the module (or provision) and the controller's words, keyed by the pair, and is cleared (raised false) when a +// later call for the pair is answered, or both sources agree on it, with resolved saying which. +func CallRefusedCondition(c ControllerCall, refusal string, raised bool, resolved string) asks.Condition { + key := CallConditionKey(c) + subject := asks.Scope{Scope: "module", ID: c.Module, Machine: c.Node} + if !raised { + return asks.Condition{Key: key, Subject: subject, State: asks.StateCleared, Resolved: resolved} + } + headline := fmt.Sprintf("the controller refused %s %s on %s", c.Verb, c.Module, c.Node) + if n := len([]rune(headline)); n > asks.HeadlineLength { + headline = string([]rune(headline)[:asks.HeadlineLength]) + } + needs := fmt.Sprintf("call mesh-controller.%s for %s on %s by hand once the refusal's cause is fixed", c.Verb, c.Module, c.Node) + return asks.Condition{Key: key, Severity: asks.SeverityUrgent, Subject: subject, State: asks.StateRaised, + Summary: headline, Headline: headline, Needs: needs, + Explanation: fmt.Sprintf("%s%s. An approved placement was written, and the assigner's call %s to keep the controller's "+ + "assignments in step was refused: %s. Until the controller holds it, the placement and the assignments differ, so "+ + "the assigner writes no want for the pair and nothing new reaches %s. This clears when a call for it is answered "+ + "or both sources agree.", asks.NeedsYou, needs, c.Key(), refusal, c.Node)} } // PlacementAct is the act an approved proposal's yes binds: writing exactly its changes at its base revisions. diff --git a/modules/mesh-delivery-assigner/internal/assign/seat_test.go b/modules/mesh-delivery-assigner/internal/assign/seat_test.go index 257da34..669d124 100644 --- a/modules/mesh-delivery-assigner/internal/assign/seat_test.go +++ b/modules/mesh-delivery-assigner/internal/assign/seat_test.go @@ -8,6 +8,7 @@ import ( "time" "git.novox.be/novox/mesh-sdk/go/asks" + "git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/delivery" ) @@ -108,13 +109,10 @@ func TestThePlacementSeatDecides(t *testing.T) { pinned := *laid["laptop"] pinned.Pins = map[string]delivery.Provider{"db": {Node: "anchor", Module: "store"}} calls := ControllerCalls(map[string]delivery.Placement{"anchor": anchor, "laptop": laptop}, - map[string]*delivery.Placement{"anchor": laid["anchor"], "laptop": &pinned}, "p-one", "w1@t") + map[string]*delivery.Placement{"anchor": laid["anchor"], "laptop": &pinned}) var said []string for _, c := range calls { said = append(said, c.Key()) - if !strings.Contains(c.Args["why"].(string), "p-one") { - t.Errorf("%s does not name the proposal: %v", c.Key(), c.Args) - } } if !slices.Equal(said, []string{"mesh-controller.unassign anchor web", "mesh-controller.assign laptop web", "mesh-controller.pin laptop db"}) { t.Errorf("the controller's calls = %v", said) @@ -155,3 +153,86 @@ func quote(s string) string { raw, _ := json.Marshal(s) return string(raw) } + +// Issue 774: every call the assigner makes of the controller carries only the arguments the controller's seat contract +// declares for its verb, and every one it requires; the controller refuses any other argument and does nothing. A "why" +// added to every call (2026-10-28) had each approved placement refused. +func TestControllerCallsFollowTheContract(t *testing.T) { + declared := map[string]map[string]any{} + required := map[string][]string{} + for _, v := range catalogue.ControllerVerbs { + props, _ := v.Input["properties"].(map[string]any) + declared[v.Name] = props + switch r := v.Input["required"].(type) { + case []string: + required[v.Name] = r + } + } + db := map[string]delivery.Provider{"db": {Node: "anchor", Module: "store"}} + moved := map[string]delivery.Provider{"db": {Node: "laptop", Module: "store"}} + placed := func(node string, pins map[string]delivery.Provider, modules ...string) delivery.Placement { + p := delivery.Placement{Node: node, Pins: pins} + for _, m := range modules { + p.Modules = append(p.Modules, delivery.PlacedModule{Module: m}) + } + return p + } + ptr := func(p delivery.Placement) *delivery.Placement { return &p } + for name, c := range map[string]struct { + before map[string]delivery.Placement + after map[string]*delivery.Placement + verbs []string + }{ + "assign": {map[string]delivery.Placement{}, map[string]*delivery.Placement{"anchor": ptr(placed("anchor", nil, "web"))}, []string{"assign"}}, + "unassign": {map[string]delivery.Placement{"anchor": placed("anchor", nil, "web")}, map[string]*delivery.Placement{"anchor": ptr(placed("anchor", nil))}, []string{"unassign"}}, + "key deleted": {map[string]delivery.Placement{"anchor": placed("anchor", db, "web")}, map[string]*delivery.Placement{"anchor": nil}, []string{"unassign", "unpin"}}, + "pin set": {map[string]delivery.Placement{"anchor": placed("anchor", nil, "web")}, map[string]*delivery.Placement{"anchor": ptr(placed("anchor", db, "web"))}, []string{"pin"}}, + "pin changed": {map[string]delivery.Placement{"anchor": placed("anchor", db, "web")}, map[string]*delivery.Placement{"anchor": ptr(placed("anchor", moved, "web"))}, []string{"pin"}}, + "moved and pinned": {map[string]delivery.Placement{"anchor": placed("anchor", nil, "web")}, map[string]*delivery.Placement{"anchor": ptr(placed("anchor", nil)), "laptop": ptr(placed("laptop", db, "web"))}, []string{"unassign", "assign", "pin"}}, + } { + calls := ControllerCalls(c.before, c.after) + var verbs []string + for _, call := range calls { + verbs = append(verbs, call.Verb) + props, ok := declared[call.Verb] + if !ok { + t.Errorf("%s: the controller's seat has no verb %q", name, call.Verb) + continue + } + for arg := range call.Args { + if _, ok := props[arg]; !ok { + t.Errorf("%s: %s gives %q, which mesh-controller.%s does not take, so the controller refuses it", name, call.Key(), arg, call.Verb) + } + } + for _, arg := range required[call.Verb] { + if _, ok := call.Args[arg]; !ok { + t.Errorf("%s: %s lacks %q, which mesh-controller.%s requires", name, call.Key(), arg, call.Verb) + } + } + } + if !slices.Equal(verbs, c.verbs) { + t.Errorf("%s: the calls = %v, want %v", name, verbs, c.verbs) + } + } +} + +// Issue 774: a refused call is a condition keyed by its pair, a module's place apart from a pin, naming the verb, the node, the +// module and the refusal; its clear says why. +func TestCallRefusedCondition(t *testing.T) { + assign := ControllerCall{Verb: "assign", Node: "anchor", Module: "web"} + pin := ControllerCall{Verb: "pin", Node: "anchor", Module: "web"} + c := CallRefusedCondition(assign, `assign takes no argument "why"`, true, "") + if c.State != asks.StateRaised || c.Severity != asks.SeverityUrgent || c.Key != "mesh-delivery-assigner.controller-call.anchor.web" || + !strings.Contains(c.Headline, "assign web on anchor") || !strings.Contains(c.Explanation, `takes no argument "why"`) { + t.Errorf("the raised condition = %+v", c) + } + if CallConditionKey(pin) == c.Key { + t.Error("a pin's condition shares the key of a module's place") + } + if cl := CallRefusedCondition(assign, "", false, "answered"); cl.State != asks.StateCleared || cl.Key != c.Key || cl.Resolved != "answered" { + t.Errorf("the clear = %+v", cl) + } + if _, _, raised, err := FindingOf(c, time.Unix(0, 0)); err != nil || !raised { + t.Errorf("the condition is no finding: %v", err) + } +} diff --git a/modules/mesh-delivery-builder/go.mod b/modules/mesh-delivery-builder/go.mod index f958dc7..0c4752d 100644 --- a/modules/mesh-delivery-builder/go.mod +++ b/modules/mesh-delivery-builder/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-builder go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-builder/go.sum b/modules/mesh-delivery-builder/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-builder/go.sum +++ b/modules/mesh-delivery-builder/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-checker/go.mod b/modules/mesh-delivery-checker/go.mod index 3d9b531..cd76564 100644 --- a/modules/mesh-delivery-checker/go.mod +++ b/modules/mesh-delivery-checker/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-checker go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-checker/go.sum b/modules/mesh-delivery-checker/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-checker/go.sum +++ b/modules/mesh-delivery-checker/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-forge-bridge/go.mod b/modules/mesh-delivery-forge-bridge/go.mod index effc726..6d8375e 100644 --- a/modules/mesh-delivery-forge-bridge/go.mod +++ b/modules/mesh-delivery-forge-bridge/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-forge-bridge go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-forge-bridge/go.sum b/modules/mesh-delivery-forge-bridge/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-forge-bridge/go.sum +++ b/modules/mesh-delivery-forge-bridge/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-indexer/go.mod b/modules/mesh-delivery-indexer/go.mod index db3b91a..3e217b5 100644 --- a/modules/mesh-delivery-indexer/go.mod +++ b/modules/mesh-delivery-indexer/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-indexer go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-indexer/go.sum b/modules/mesh-delivery-indexer/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-indexer/go.sum +++ b/modules/mesh-delivery-indexer/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-teller/go.mod b/modules/mesh-delivery-teller/go.mod index 9d7e87f..3572e89 100644 --- a/modules/mesh-delivery-teller/go.mod +++ b/modules/mesh-delivery-teller/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-teller go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-teller/go.sum b/modules/mesh-delivery-teller/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-teller/go.sum +++ b/modules/mesh-delivery-teller/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-view/go.mod b/modules/mesh-delivery-view/go.mod index b8680fd..edf4553 100644 --- a/modules/mesh-delivery-view/go.mod +++ b/modules/mesh-delivery-view/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-view go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-view/go.sum b/modules/mesh-delivery-view/go.sum index 6123083..156a748 100644 --- a/modules/mesh-delivery-view/go.sum +++ b/modules/mesh-delivery-view/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= diff --git a/modules/mesh-delivery-watchman/go.mod b/modules/mesh-delivery-watchman/go.mod index a230c7d..b37d585 100644 --- a/modules/mesh-delivery-watchman/go.mod +++ b/modules/mesh-delivery-watchman/go.mod @@ -3,7 +3,7 @@ module mesh-delivery-watchman go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats-server/v2 v2.11.17 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-delivery-watchman/go.sum b/modules/mesh-delivery-watchman/go.sum index 97d3112..f59f301 100644 --- a/modules/mesh-delivery-watchman/go.sum +++ b/modules/mesh-delivery-watchman/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= 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= diff --git a/modules/mesh-grants/go.mod b/modules/mesh-grants/go.mod index be78eaa..d709dc1 100644 --- a/modules/mesh-grants/go.mod +++ b/modules/mesh-grants/go.mod @@ -3,7 +3,7 @@ module mesh-grants go 1.26.0 require ( - git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 + git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 github.com/nats-io/nats.go v1.54.0 ) diff --git a/modules/mesh-grants/go.sum b/modules/mesh-grants/go.sum index 991de7e..d88df5e 100644 --- a/modules/mesh-grants/go.sum +++ b/modules/mesh-grants/go.sum @@ -1,5 +1,5 @@ -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24 h1:s0XXZtR7CFPBbnaDygWnE4/Q827iEFt0YfEzujk4Q9g= -git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030174137-a37181261c24/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2 h1:RF73nVI1dTrrmlFosVDTMJmpUQ+rEeB7++BHH/RvZFg= +git.novox.be/novox/mesh-sdk/go v0.1.14-0.20261030201806-eff81f1220e2/go.mod h1:ouERNpZizzwZ0HLEtAypsY9FR20FyUgUYRni6J7kVCY= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op h1:Z/MZK75wC/NSrkgqeNIa7jexam9uWzhLmFTSCPI/kn0= github.com/antithesishq/antithesis-sdk-go v0.7.0-default-no-op/go.mod h1:FQyySiasQQM8735Ddel3MRojmy4dA1IqCeyJ5jmPMbI= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo=