Milestone L2 "nodes compose" (issue 1126; ADR 0549 §1, §2, §3, §5; ADR 0550 §5; ADR 0555). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; checks/placement pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
gitea: gitea_commit_trees takes listed and answers the files directly under each named directory, from the same one listing, so the forge bridge finds the placement files at a merge.
checks/placement: every placement/<node>.json reads as its node's placement (mesh-sdk #98's layout, with its config placement layers and a settings-form module's values), and the files together refuse two modules of one node on one host port, a pin, binding or holding naming a provider not placed there, a mesh seat held twice, one address on two nodes and a second hub. The tree holds no placement file yet; the seed pull request comes later (ADR 0549 §4, ADR 0555 §6).
mesh-config: resolves the values of every module the catalogue's placement or the controller's assignments name on a node, while both stand (ADR 0549 §5); placement not readable yet is said and the assignments alone are resolved.
mesh-vault: the verb own answers a machine's node-engine, about its own machine alone, the own secrets of its modules and the pair credentials it asks for (as consumer or provider), each sealed to the key that engine stated; a credential the vault does not hold is named missing.
A rule bent (rules-are-weighed). how-work-is-done asks that a change to how a module runs carry an integration test starting the module whole against the real bus and store. The vault's own is not proven that way here: the vault has no harness that starts it as a process, and building one is new work for this one verb. What covers the risk instead: TestOnARealBusANodeEngineStatesOnlyItsOwnKey runs the vault's tools against a real NATS server with per-account permissions as the grants give them, and shows node.ace asking own over the bus and getting its secret sealed to its stated key, node.g14 unable to ask in ace's name, and the controller refused. The node's side over a real bus is mesh-host's H8 integration test.
The branch was rewritten once on 2026-10-26 19:51 with the operator's leave, to drop two compiled programs; compiled programs are refused by main's checks/nobinaries.
Milestone L2 "nodes compose" (issue 1126; ADR 0549 §1, §2, §3, §5; ADR 0550 §5; ADR 0555). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; checks/placement pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
- gitea: `gitea_commit_trees` takes `listed` and answers the files directly under each named directory, from the same one listing, so the forge bridge finds the placement files at a merge.
- `checks/placement`: every `placement/<node>.json` reads as its node's placement (mesh-sdk #98's layout, with its config placement layers and a settings-form module's values), and the files together refuse two modules of one node on one host port, a pin, binding or holding naming a provider not placed there, a mesh seat held twice, one address on two nodes and a second hub. The tree holds no placement file yet; the seed pull request comes later (ADR 0549 §4, ADR 0555 §6).
- mesh-config: resolves the values of every module the catalogue's placement or the controller's assignments name on a node, while both stand (ADR 0549 §5); placement not readable yet is said and the assignments alone are resolved.
- mesh-vault: the verb `own` answers a machine's node-engine, about its own machine alone, the own secrets of its modules and the pair credentials it asks for (as consumer or provider), each sealed to the key that engine stated; a credential the vault does not hold is named missing.
**A rule bent (rules-are-weighed).** how-work-is-done asks that a change to how a module runs carry an integration test starting the module whole against the real bus and store. The vault's `own` is not proven that way here: the vault has no harness that starts it as a process, and building one is new work for this one verb. What covers the risk instead: `TestOnARealBusANodeEngineStatesOnlyItsOwnKey` runs the vault's tools against a real NATS server with per-account permissions as the grants give them, and shows node.ace asking `own` over the bus and getting its secret sealed to its stated key, node.g14 unable to ask in ace's name, and the controller refused. The node's side over a real bus is mesh-host's H8 integration test.
The branch was rewritten once on 2026-10-26 19:51 with the operator's leave, to drop two compiled programs; compiled programs are refused by main's checks/nobinaries.
Reviewed-by: review-1126@shanks at c0859751461aa112c60a163b25b5694cfd402b06
Deliverynovox/mesh-catalog@c0859751461a — merged since 2026-10-26T21:11:19Z
Source — source.main moved to novox/mesh-catalog@78d7ef71cc. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-10-26 21:10 (new) → proposed (announced): novox/mesh-catalog#505'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-catalog@c0859751461a` — **merged** since 2026-10-26T21:11:19Z
**Source** — source.main moved to novox/mesh-catalog@78d7ef71cc27. 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:10 (new) → proposed (announced): novox/mesh-catalog#505'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`.
One commit for the branch feat/1126-nodes-compose of mesh-catalog: its 15 commits squashed so its history does not carry two compiled programs committed by mistake and removed later, mesh-config (5.5 MB) and checks/placement (6.2 MB) (issue 1577). The tree equals the former head 2db56067. The operator allowed this rewrite of the feature branch on 2026-10-26.
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 0549 §1, §2, §3, §5; ADR 0550 §5; ADR 0555). Member of the delivery group feat/1126-nodes-compose, which the milestone's one review approved; checks/placement pins mesh-sdk 979644420117 (mesh-sdk #98's head) exactly.
gitea_commit_treestakeslistedand answers the files directly under each named directory, from the same one listing, so the forge bridge finds the placement files at a merge.checks/placement: everyplacement/<node>.jsonreads as its node's placement (mesh-sdk #98's layout, with its config placement layers and a settings-form module's values), and the files together refuse two modules of one node on one host port, a pin, binding or holding naming a provider not placed there, a mesh seat held twice, one address on two nodes and a second hub. The tree holds no placement file yet; the seed pull request comes later (ADR 0549 §4, ADR 0555 §6).ownanswers a machine's node-engine, about its own machine alone, the own secrets of its modules and the pair credentials it asks for (as consumer or provider), each sealed to the key that engine stated; a credential the vault does not hold is named missing.A rule bent (rules-are-weighed). how-work-is-done asks that a change to how a module runs carry an integration test starting the module whole against the real bus and store. The vault's
ownis not proven that way here: the vault has no harness that starts it as a process, and building one is new work for this one verb. What covers the risk instead:TestOnARealBusANodeEngineStatesOnlyItsOwnKeyruns the vault's tools against a real NATS server with per-account permissions as the grants give them, and shows node.ace askingownover the bus and getting its secret sealed to its stated key, node.g14 unable to ask in ace's name, and the controller refused. The node's side over a real bus is mesh-host's H8 integration test.The branch was rewritten once on 2026-10-26 19:51 with the operator's leave, to drop two compiled programs; compiled programs are refused by main's checks/nobinaries.
Reviewed-by: review-1126@shanks at
c085975146Delivery
novox/mesh-catalog@c0859751461a— merged since 2026-10-26T21:11:19ZSource — source.main moved to novox/mesh-catalog@78d7ef71cc. 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.2db5606721to851e8782d5