Milestone L2 "nodes compose" (issue 1126; ADR 0547 §2, §3; ADR 0550 §5; ADR 0555 §3). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
The node record: the node's own have key <node>.node carries the public halves of its tunnel, sealing and serving keys, the certificate for its internal name, the mesh's authority, its present capabilities, networks, outward links and its node-engine's contract, written only when it differs.
The node composes its own (internal/selfcompose) once placement.<node> exists: from placement, the node records, the indexer's modules and manifests, its own slice of mesh-config's values, and the vault's own (its modules' secrets and pair credentials sealed to its key, asked only when a placed module declares one). It composes again on each input's event and on the vault's secret-changed, never on a timer. A node not yet placed follows its key and begins composing its own when it appears, with no restart.
The judgement of a move (ADR 0547 §3): a record-policy module's move waits for a yes (have phase waiting-yes, with the judgement and the digest that waits).
A refusal is loud: when the node cannot compose (a stand-in refused, an input unread), each wanted module's have says it, failed, naming why, while it keeps running what it ran; composed again, the haves are what runs.
Stable sealed values: the composer keeps the box the node already runs when it opens, with the node's own key, to the same value as the vault's box, so a composition stays unmoved at the switch and across restarts; the vault still seals anew at each ask.
Tests: unit (selfcompose, agent, link, authority), with no count risen; integration H8 TestNatsANodeThePlacementNamesComposesAndAppliesItsOwn.
Bent: H8 and the assigner's two integration tests were run once locally (embedded bus, a few seconds) to find H8's failure; the group's one check runs them as the check of record.
Milestone L2 "nodes compose" (issue 1126; ADR 0547 §2, §3; ADR 0550 §5; ADR 0555 §3). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
- **The node record**: the node's own have key `<node>.node` carries the public halves of its tunnel, sealing and serving keys, the certificate for its internal name, the mesh's authority, its present capabilities, networks, outward links and its node-engine's contract, written only when it differs.
- **The node composes its own** (internal/selfcompose) once `placement.<node>` exists: from placement, the node records, the indexer's modules and manifests, its own slice of mesh-config's values, and the vault's `own` (its modules' secrets and pair credentials sealed to its key, asked only when a placed module declares one). It composes again on each input's event and on the vault's `secret-changed`, never on a timer. A node not yet placed follows its key and begins composing its own when it appears, with no restart.
- **The judgement of a move** (ADR 0547 §3): a record-policy module's move waits for a yes (have phase waiting-yes, with the judgement and the digest that waits).
- **A refusal is loud**: when the node cannot compose (a stand-in refused, an input unread), each wanted module's have says it, failed, naming why, while it keeps running what it ran; composed again, the haves are what runs.
- **Stable sealed values**: the composer keeps the box the node already runs when it opens, with the node's own key, to the same value as the vault's box, so a composition stays unmoved at the switch and across restarts; the vault still seals anew at each ask.
- Tests: unit (selfcompose, agent, link, authority), with no count risen; integration H8 `TestNatsANodeThePlacementNamesComposesAndAppliesItsOwn`.
- Bent: H8 and the assigner's two integration tests were run once locally (embedded bus, a few seconds) to find H8's failure; the group's one check runs them as the check of record.
Reviewed-by: review-1126@shanks at 1d442885148af6bf101c0404782a7b0658249c32
Deliverynovox/mesh-host@1d442885148a — merged since 2026-10-26T21:11:39Z
Source — source.main moved to novox/mesh-host@be94d2689e. 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-host#149'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-host@1d442885148a` — **merged** since 2026-10-26T21:11:39Z
**Source** — source.main moved to novox/mesh-host@be94d2689e2f. 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-host#149'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: 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: 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: ace: novox/mesh-catalog#505: checks/placement/go.mod names mesh-sdk 91413de33516, which is neither on mesh-sdk's trunk nor the grou…
mesh/check failed: ace: novox/mesh-catalog#505 does not merge into the trunk: files in conflict: .gitignore | cdd3f3fd4f63 on ff9386dcccc2 | unit 1245…
mesh/check failed: unit: ..test: ✔ a transient empty list for four passes retires nothing; five stable passes retire, data kept (290.408814ms) | 58de6…
mesh-tools
changed title from WIP: The node agent writes its record in its own have key (issue 1126) to WIP: The node composes its own modules once the catalogue places it, and writes its record (issue 1126)2026-10-26 19:13:17 +00:00
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 0550 §5; ADR 0555 §3). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
<node>.nodecarries the public halves of its tunnel, sealing and serving keys, the certificate for its internal name, the mesh's authority, its present capabilities, networks, outward links and its node-engine's contract, written only when it differs.placement.<node>exists: from placement, the node records, the indexer's modules and manifests, its own slice of mesh-config's values, and the vault'sown(its modules' secrets and pair credentials sealed to its key, asked only when a placed module declares one). It composes again on each input's event and on the vault'ssecret-changed, never on a timer. A node not yet placed follows its key and begins composing its own when it appears, with no restart.TestNatsANodeThePlacementNamesComposesAndAppliesItsOwn.Reviewed-by: review-1126@shanks at
1d44288514Delivery
novox/mesh-host@1d442885148a— merged since 2026-10-26T21:11:39ZSource — source.main moved to novox/mesh-host@be94d2689e. 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.WIP: The node agent writes its record in its own have key (issue 1126)to WIP: The node composes its own modules once the catalogue places it, and writes its record (issue 1126)