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).
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
Deliverynovox/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.
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`.
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…
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…
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…
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…
mesh/check failed (6 tests): unit: go.gofmt: not as gofmt writes them (run gofmt -w): go/buscompose/buscompose_test.go | f55b34febc2d on a7a1fbd34e1d …
mesh/check failed: ace: novox/mesh-catalog#505 does not merge into the trunk: files in conflict: .gitignore | 9713c3023a18 on a7a1fbd34e1d | unit 1245…
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…
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 keyplacement.<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-wideandlayer, withhas-layer), pins and holdings;CheckPlacementsrefuses 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 inHaveNode.Recordof its own have key<node>.node(ADR 0555 §3).compose/frombus: fillscompose.Inputfrom 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.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
9796444201Delivery
novox/mesh-sdk@979644420117— merged since 2026-10-26T21:11:09ZSource — source.main moved to novox/mesh-sdk@823d52051f. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.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@9796444201Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.