Node-engine: composition comparison, seals and differing paths are the engine's own package, internal/compositions, with the tests moved from mesh-sdk's delivery (H-1, ADR 0634 §1; issue 1966)

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
This commit is contained in:
2026-11-05 14:53:06 +01:00
parent dcbdc70919
commit df44d21c82
15 changed files with 967 additions and 44 deletions
+8 -7
View File
@@ -19,6 +19,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/novox/mesh-host/internal/compositions"
"maps"
"reflect"
"slices"
@@ -66,7 +67,7 @@ type Env struct {
Refused func(why string, held map[string]string)
// Running is what the node runs now (agent.Everything), and Unseal opens a value sealed to this machine: a secret
// the vault seals again for each ask is kept as the box the node already runs at the same slot (the same field of
// the same resource of the same module, delivery.KeepSeals) when that box opens to the same value, so neither the
// the same resource of the same module, compositions.KeepSeals) when that box opens to the same value, so neither the
// switch to composing its own nor a restart changes a composition (ADR 0547 §3); a box held at another slot is
// never taken, though it opens to the same value (issue 1126, C1: a provider's grant and its consumer's secret).
// Either nil keeps the vault's box.
@@ -77,7 +78,7 @@ type Env struct {
// (delivery.Have.SealedAt); legacy is the list a have written before slots holds (delivery.Have.Sealed), reused
// only within its own module.
// An error is a have the bus did not answer for, never one absent: the pass is then tried again (BusFailed).
Held func(module string) (slots delivery.Seals, legacy []string, err error)
Held func(module string) (slots compositions.Seals, legacy []string, err error)
// Kept is told, after each pass that composed, what the node keeps of each module as it runs because its manifest does
// not yet say it (ADR 0601 §4), by module, so each module's have carries it (agent.KeptNow). Nil tells nobody.
Kept func(kept map[string][]string)
@@ -1093,7 +1094,7 @@ func (c *Composer) heldNow() []string {
}
// keepRunning is comp with each sealed value the node already runs at the same slot kept, where it opens to the same
// value (delivery.KeepSeals, issue 1126, C1): of what runs (running, the agent's), else of what its module's have says
// value (compositions.KeepSeals, issue 1126, C1): of what runs (running, the agent's), else of what its module's have says
// it runs (Held). A have written before slots names no slot: its boxes are reused within their own module alone, at a
// slot no box is kept for, and only one opening to the slot's value.
func (c *Composer) keepRunning(comp delivery.Composed, running []delivery.Composed) delivery.Composed {
@@ -1104,7 +1105,7 @@ func (c *Composer) keepRunning(comp delivery.Composed, running []delivery.Compos
if module == "" {
module = agent.NodeModule
}
kept := delivery.Seals{}
kept := compositions.Seals{}
var legacy []string
if c.env.Held != nil {
slots, old, err := c.env.Held(module)
@@ -1116,12 +1117,12 @@ func (c *Composer) keepRunning(comp delivery.Composed, running []delivery.Compos
}
for _, r := range running {
if r.Module == comp.Module {
for slot, box := range delivery.SealsIn(r) {
for slot, box := range compositions.SealsIn(r) {
kept[slot] = box
}
}
}
for slot, box := range delivery.SealsIn(comp) {
for slot, box := range compositions.SealsIn(comp) {
if _, ok := kept[slot]; ok {
continue
}
@@ -1132,7 +1133,7 @@ func (c *Composer) keepRunning(comp delivery.Composed, running []delivery.Compos
}
}
}
return delivery.KeepSeals(comp, kept, c.sameValue)
return compositions.KeepSeals(comp, kept, c.sameValue)
}
// waitLog is what a composer waited on: how many waits ended, the longest and what it was, and the last.