Nodes compose: placement, node records and one composer input for three callers (issue 1126) #98

Merged
mesh-tools merged 29 commits from feat/1126-nodes-compose into main 2026-10-26 21:11:06 +00:00
Member

Milestone L2 "nodes compose" (issue 1126; ADR 0547 §2, §3; ADR 0549; ADR 0555). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; merged with main at 7187beaf (#101), taking main's test/standing.test.ts and test/retire.test.ts.

  • delivery/placement.go: the catalogue's placement file and the indexer's key placement.<node> (ADR 0549 §1, §2): the node's decided facts (endpoint, site, hub, address, public domain, accounts, adoption, the tunnel found at adoption, the hub's peer names; ADR 0555), its modules in order with host ports, bindings and config placement as two layers (mesh-wide and layer, with has-layer), pins and holdings; CheckPlacements refuses clashes, unplaced providers, a mesh seat held twice, one address on two nodes and a second hub.
  • delivery/noderecord.go: what the machine observes, riding in HaveNode.Record of its own have key <node>.node (ADR 0555 §3).
  • compose/frombus: fills compose.Input from placement, records, the indexer's manifests and mesh-config's slice; one composer for the node agent, the composition check and the grants part.
  • delivery/judge.go: the judgement of a move as a pure function (ADR 0547 §3), moved from the controller's composed_judge.go.
  • A merged message of the catalogue carries its placement files (Forge.Placements).
  • buscompose: node principals read every node's <node>.node. The copy diverges from the controller's on purpose by that read only; the test holds it to every controller grant plus exactly that.

Test budget: no net new test function (four folded into existing ones).

Reviewed-by: review-1126@shanks at 9796444201

Milestone L2 "nodes compose" (issue 1126; ADR 0547 §2, §3; ADR 0549; ADR 0555). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; merged with main at 7187beaf (#101), taking main's test/standing.test.ts and test/retire.test.ts. - `delivery/placement.go`: the catalogue's placement file and the indexer's key `placement.<node>` (ADR 0549 §1, §2): the node's decided facts (endpoint, site, hub, address, public domain, accounts, adoption, the tunnel found at adoption, the hub's peer names; ADR 0555), its modules in order with host ports, bindings and **config placement as two layers** (`mesh-wide` and `layer`, with `has-layer`), pins and holdings; `CheckPlacements` refuses clashes, unplaced providers, a mesh seat held twice, one address on two nodes and a second hub. - `delivery/noderecord.go`: what the machine observes, riding in `HaveNode.Record` of its own have key `<node>.node` (ADR 0555 §3). - `compose/frombus`: fills `compose.Input` from placement, records, the indexer's manifests and mesh-config's slice; one composer for the node agent, the composition check and the grants part. - `delivery/judge.go`: the judgement of a move as a pure function (ADR 0547 §3), moved from the controller's composed_judge.go. - A merged message of the catalogue carries its placement files (`Forge.Placements`). - `buscompose`: node principals read every node's `<node>.node`. The copy diverges from the controller's on purpose by that read only; the test holds it to every controller grant plus exactly that. Test budget: no net new test function (four folded into existing ones). Reviewed-by: review-1126@shanks at 979644420117d8d48c7228fc06a51a92a1dc5279
mesh-tools added 9 commits 2026-10-26 17:34:51 +00:00
Node principals read every node's own facts, where its record rides; the composer copy is checked to grant all the controller's grants and only that and the issue 1790 rows more (issue 1126, ADR 0555 §3)
mesh/delivery-group group feat/1126-nodes-compose checking: 1 of 3 member(s) ready
mesh/delivery closed: a newer head of the same pull request
mesh/check checking 9789c8379a74 on a7a1fbd34e1d | novox/mesh-sdk#98 in group feat/1126-nodes-compose
9789c8379a
Author
Member

Delivery novox/mesh-sdk@979644420117 — merged since 2026-10-26T21:11:09Z

Source — source.main moved to novox/mesh-sdk@823d52051f. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Group feat/1126-nodes-compose: novox/hq@28d84f31bf, novox/mesh-catalog@c085975146, novox/mesh-controller@df8ebf6a77, novox/mesh-delivery@297992a4ae, novox/mesh-host@1d44288514, novox/mesh-sdk@9796444201

Transitions

  • 2026-10-26 21:09 (new) → proposed (announced): novox/mesh-sdk#98's head announced
  • 2026-10-26 21:10 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
  • 2026-10-26 21:11 ready → merged (merged): on the trunk its modules follow: merged there

The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-sdk@979644420117` — **merged** since 2026-10-26T21:11:09Z **Source** — source.main moved to novox/mesh-sdk@823d52051f03. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Group** `feat/1126-nodes-compose`: novox/hq@28d84f31bfcb, novox/mesh-catalog@c0859751461a, novox/mesh-controller@df8ebf6a77c1, novox/mesh-delivery@297992a4ae55, novox/mesh-host@1d442885148a, novox/mesh-sdk@979644420117 **Transitions** - 2026-10-26 21:09 (new) → proposed (announced): novox/mesh-sdk#98's head announced - 2026-10-26 21:10 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false) - 2026-10-26 21:11 ready → merged (merged): on the trunk its modules follow: merged there The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
jschoubben added 3 commits 2026-10-26 17:44:26 +00:00
jschoubben added 2 commits 2026-10-26 18:04:42 +00:00
frombus reads the composing node's own secrets sealed to it, and node principals may ask the vault's own in their own name (issue 1126, ADR 0550 §5)
mesh/delivery-group group feat/1126-nodes-compose checking: 4 of 5 member(s) ready
mesh/delivery closed: a newer head of the same pull request
mesh/check checking f1d7c7377dc4 on a7a1fbd34e1d | novox/mesh-sdk#98 in group feat/1126-nodes-compose
f1d7c7377d
jschoubben added 1 commit 2026-10-26 18:11:38 +00:00
frombus exports a node's placement from a composition input, Input's inverse for what a person decides, and the controller's seat declares placement-export (issue 1126, ADR 0555 §6)
mesh/delivery closed: a newer head of the same pull request
mesh/check checking dfe3ba94750c on a7a1fbd34e1d | novox/mesh-sdk#98 in group feat/1126-nodes-compose
dfe3ba9475
jschoubben added 1 commit 2026-10-26 18:13:58 +00:00
A want the node composes itself says so (Self) and names the build alone; every other want names its composition as before, so no caller of the old form changes (issue 1126, ADR 0547 §2)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: ace: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk f1d7c7377dc4, which is neither on mesh-sdk's trunk nor the grou…
4d5f430224
jschoubben added 1 commit 2026-10-26 18:17:48 +00:00
placement-seed writes each node's first placement file from the controller's export, checked before anything is written, once (issue 1126, ADR 0549 §4, ADR 0555 §6)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: shanks: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk f1d7c7377dc4, which is neither on mesh-sdk's trunk nor the g…
6447a1c6d4
jschoubben added 1 commit 2026-10-26 18:18:49 +00:00
compose names the pair credentials a node's composition reads as consumer and provider, and frombus asks them sealed before it composes (issue 1126, ADR 0550 §5)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: g14: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk f1d7c7377dc4, which is neither on mesh-sdk's trunk nor the grou…
91413de335
jschoubben added 2 commits 2026-10-26 18:23:08 +00:00
A node's record carries the mesh's own certificate as the machine holds it, and frombus composes with the composing node's (issue 1126, ADR 0555 §3)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: shanks: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk 91413de33516, which is neither on mesh-sdk's trunk nor the g…
944a35d200
jschoubben added 1 commit 2026-10-26 18:25:12 +00:00
A node composing its own hears the vault's secret-changed, names and generations only (issue 1126, ADR 0547 §2)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed (6 tests): unit: go.gofmt: not as gofmt writes them (run gofmt -w): go/buscompose/buscompose_test.go | f55b34febc2d on a7a1fbd34e1d …
f55b34febc
jschoubben added 1 commit 2026-10-26 18:25:22 +00:00
VaultSecretChanged is a variable (its seat is), and gofmt (issue 1126)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: unit: git.novox.be/novox/mesh-catalog/checks/nobinaries.TestTheCatalogueHoldsNoCompiledProgram: modules/mesh-config/cmd/mesh-config…
53c2def1a5
jschoubben added 1 commit 2026-10-26 18:38:40 +00:00
Placement carries a settings-form module's config values, which mesh-config does not hold, and the export writes them (issue 1126, ADR 0555 §1): the media modules on one node would compose without them
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: ace: novox/mesh-catalog#505 does not merge into the trunk: files in conflict: .gitignore | 9713c3023a18 on a7a1fbd34e1d | unit 1245…
9713c3023a
jschoubben added 1 commit 2026-10-26 19:08:35 +00:00
jschoubben added 1 commit 2026-10-26 19:19:57 +00:00
A have carries the values a self-composing node's running composition holds sealed to its key, so its composer reuses them after a restart (review of L2, round 2; issue 1126, ADR 0547 §3)
mesh/delivery closed: a newer head of the same pull request
mesh/check failed (4 tests): unit: go.go vet: # git.novox.be/novox/mesh-sdk/go/delivery [git.novox.be/novox/mesh-sdk/go/delivery.test] | 2c0ab3a59288 …
2c0ab3a592
jschoubben added 1 commit 2026-10-26 19:20:15 +00:00
Compare haves with SameHave in the round-trip tests, now that a have carries a list (issue 1126)
mesh/delivery closed: a newer head of the same pull request
mesh/check checking dd9d9d5b5f01 on dae8e288d2e1 | novox/mesh-sdk#98 in group feat/1126-nodes-compose
dd9d9d5b5f
jschoubben added 1 commit 2026-10-26 19:33:25 +00:00
The standing test keeps c failing alone after its ask is dropped, so its only recovery is its retirement: clearing every failure at once raced the loop's read of the new list under load (issue 1126; the hidden failure of try-1793042418286545971, issue 1901)
mesh/delivery-group group feat/1126-nodes-compose rejected: composed together: the checker's verdict at the members' heads (0d06ff386dce): ace
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: ace: novox/mesh-sdk#98 does not merge into the trunk: files in conflict: test/standing.test.ts | 03dce1237803 on 7187beaf042b | uni…
03dce12378
mesh-tools marked the pull request as ready for review 2026-10-26 21:09:16 +00:00
jschoubben added 2 commits 2026-10-26 21:09:55 +00:00
Merge remote-tracking branch 'origin/main' into feat/1126-nodes-compose
mesh/delivery merged: source.main moved to novox/mesh-sdk@823d52051f03
mesh/delivery-group group feat/1126-nodes-compose merged: every member is merged
mesh/check checking 979644420117 on 7187beaf042b | novox/mesh-sdk#98 in group feat/1126-nodes-compose
9796444201
# Conflicts:
#	test/standing.test.ts
mesh-tools merged commit 823d52051f into main 2026-10-26 21:11:06 +00:00
mesh-tools deleted branch feat/1126-nodes-compose 2026-10-26 21:11:07 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-sdk#98