A node folds a placed module with no new-form build into its own composition, as the controller does, so the tunnel and the bus are not dropped when nodes compose themselves (issue 1126)
#107
Merged
mesh-toolsmerged 1 commits from fix/1126-fold into main2026-10-27 08:09:04 +00:00
Issue 1126, notes 22-23. Delivery group fix/1126-fold with mesh-host.
Found by the seed's review: nine placed modules have no new-form (src2) build and no want (mesh-wireguard on every node; nats, photos, de-spiegel, link2pay on novox; f1-circuits, snake, txt-game on ace; systemd-resolved on shanks). The controller folds their resources into the node's own composition (mesh-controller composed_writer.go compositionsOf); compose.compositions cut them out, so after the placement seed a self-composing node would drop the tunnel everywhere and the bus on novox.
compose.Node.InOwn: compositions() folds a module in InOwn with no src2 fingerprint into the node's own composition (resources keep their place, module key deleted, filled paths appended in declaration order), exactly as compositionsOf; a want naming a src2 build still moves the module out.
frombus.Scope.InOwn (+ frombus.InOwn, unused by mesh-host now; to remove with the next sdk change).
Quick vs thorough: quick = new-form builds and wants for the eight old modules (leaves mesh-wireguard, which the indexer does not hold); thorough chosen = the controller's fold rule in the shared composer.
Safety: no node composes itself before the seed (indexer_placement empty), so delivering this changes nothing a node runs today.
Tests: frombus Answer row (mesh-wireguard + an old-form module answer 'same' against an independently written controller-style fold; fails without), composed_test fold row; whole suite + integration vet pass; no new test functions.
Issue 1126, notes 22-23. Delivery group fix/1126-fold with mesh-host.
Found by the seed's review: nine placed modules have no new-form (src2) build and no want (mesh-wireguard on every node; nats, photos, de-spiegel, link2pay on novox; f1-circuits, snake, txt-game on ace; systemd-resolved on shanks). The controller folds their resources into the node's own composition (mesh-controller composed_writer.go compositionsOf); compose.compositions cut them out, so after the placement seed a self-composing node would drop the tunnel everywhere and the bus on novox.
- compose.Node.InOwn: compositions() folds a module in InOwn with no src2 fingerprint into the node's own composition (resources keep their place, module key deleted, filled paths appended in declaration order), exactly as compositionsOf; a want naming a src2 build still moves the module out.
- frombus.Scope.InOwn (+ frombus.InOwn, unused by mesh-host now; to remove with the next sdk change).
Quick vs thorough: quick = new-form builds and wants for the eight old modules (leaves mesh-wireguard, which the indexer does not hold); thorough chosen = the controller's fold rule in the shared composer.
Safety: no node composes itself before the seed (indexer_placement empty), so delivering this changes nothing a node runs today.
Tests: frombus Answer row (mesh-wireguard + an old-form module answer 'same' against an independently written controller-style fold; fails without), composed_test fold row; whole suite + integration vet pass; no new test functions.
Reviewed-by: review-fold@shanks at 05b6783103665207162d278543ffa9ec2a6ed7b1
mesh-wireguard (built by nobody) and every module a node runs inside its own
composition (Node.InOwn, from frombus.InOwn of what it runs) were cut out as
skipped: every node's shadow answered differs to the placement seed, and a node
composing itself after it would drop their resources. compositions now folds
them in place, module taken off, filled paths with them, as mesh-controller's
compositionsOf does; a want naming a new-form build still moves one out.
Deliverynovox/mesh-sdk@05b678310366 — merged since 2026-10-27T08:09:05Z
Source — source.main moved to novox/mesh-sdk@a262c7dbe0. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-10-27 08:06 (new) → proposed (announced): novox/mesh-sdk#107's head announced
2026-10-27 08:06 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-27 08:09 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@05b678310366` — **merged** since 2026-10-27T08:09:05Z
**Source** — source.main moved to novox/mesh-sdk@a262c7dbe0ff. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/1126-fold`: novox/mesh-host@69b845c0f7b2, novox/mesh-sdk@05b678310366
**Transitions**
- 2026-10-27 08:06 (new) → proposed (announced): novox/mesh-sdk#107's head announced
- 2026-10-27 08:06 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-27 08:09 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: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
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.
Issue 1126, notes 22-23. Delivery group fix/1126-fold with mesh-host.
Found by the seed's review: nine placed modules have no new-form (src2) build and no want (mesh-wireguard on every node; nats, photos, de-spiegel, link2pay on novox; f1-circuits, snake, txt-game on ace; systemd-resolved on shanks). The controller folds their resources into the node's own composition (mesh-controller composed_writer.go compositionsOf); compose.compositions cut them out, so after the placement seed a self-composing node would drop the tunnel everywhere and the bus on novox.
Quick vs thorough: quick = new-form builds and wants for the eight old modules (leaves mesh-wireguard, which the indexer does not hold); thorough chosen = the controller's fold rule in the shared composer.
Safety: no node composes itself before the seed (indexer_placement empty), so delivering this changes nothing a node runs today.
Tests: frombus Answer row (mesh-wireguard + an old-form module answer 'same' against an independently written controller-style fold; fails without), composed_test fold row; whole suite + integration vet pass; no new test functions.
Reviewed-by: review-fold@shanks at
05b6783103Delivery
novox/mesh-sdk@05b678310366— merged since 2026-10-27T08:09:05ZSource — source.main moved to novox/mesh-sdk@a262c7dbe0. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1126-fold: novox/mesh-host@69b845c0f7, novox/mesh-sdk@05b6783103Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.