The node agent folds what it runs at no new-form build into its own composition, judged from its haves, so the first composition after a restart keeps the bus (issue 1126)
#152
Merged
mesh-toolsmerged 2 commits from fix/1126-fold into main2026-10-27 08:09:07 +00:00
The self-composer and the shadow fold every placed module whose have on this node is not removed and names no src2 fingerprint (nats, mesh-wireguard and the other seven today: all have such a have, read live by the reviewer). Haves outlast an agent or node-engine restart, so the first composition after the seed's switch keeps nats (review round 1: inOwn taken from what the agent applied was empty on a fresh agent).
The composer watches every have ('>'); a module have recomposes only when that set changes. shadowBuilds gives folded modules no trunk build.
Why not 'every placed module': it would fold a module whose want was removed and a new-form module whose want is still on the way; the controller folds only modules registered at no new-form build.
Safety: selfComposer runs only once the node's placement key exists (none today), so this changes nothing a node runs before the seed.
Tests: TestTheNodeComposesItsWantsFromTheBus row: a placed module with no want and an old-form have is in the first node composition (fails without); the removed-want case still passes; whole suite + integration vet pass; no new test functions.
Notes kept for later (review): a have that cannot be decoded counts as not folded (keep the last value instead); folded modules' haves never update their health in agent mode.
Issue 1126, notes 22-23. Delivery group fix/1126-fold; pins mesh-sdk 05b67831 exactly.
- The self-composer and the shadow fold every placed module whose have on this node is not removed and names no src2 fingerprint (nats, mesh-wireguard and the other seven today: all have such a have, read live by the reviewer). Haves outlast an agent or node-engine restart, so the first composition after the seed's switch keeps nats (review round 1: inOwn taken from what the agent applied was empty on a fresh agent).
- The composer watches every have ('>'); a module have recomposes only when that set changes. shadowBuilds gives folded modules no trunk build.
- Why not 'every placed module': it would fold a module whose want was removed and a new-form module whose want is still on the way; the controller folds only modules registered at no new-form build.
Safety: selfComposer runs only once the node's placement key exists (none today), so this changes nothing a node runs before the seed.
Tests: TestTheNodeComposesItsWantsFromTheBus row: a placed module with no want and an old-form have is in the first node composition (fails without); the removed-want case still passes; whole suite + integration vet pass; no new test functions.
Notes kept for later (review): a have that cannot be decoded counts as not folded (keep the last value instead); folded modules' haves never update their health in agent mode.
Reviewed-by: review-fold@shanks at 69b845c0f7b2de782da35d7b81d60d5b7a6df7bf
Pins mesh-sdk 05b67831, whose compositions fold a module no new-form build
names into the node's own. The shadow composed a placed module it runs inside
its own composition (nats, photos) at the trunk's build, as if the candidate
added it; shadowBuilds now leaves those to the fold, and both paths pass
frombus.InOwn of what runs.
A fresh agent composes before it has applied anything (Running empty), so
InOwn of Running folded only mesh-wireguard and the switch would drop nats.
The composer now watches the node's haves: a placed module whose have names no
new-form fingerprint is folded; one with a new-form have whose want is removed
is not folded. The shadow uses the same set, over the candidate's placement.
Deliverynovox/mesh-host@69b845c0f7b2 — merged since 2026-10-27T08:09:08Z
Source — source.main moved to novox/mesh-host@50c229f905. 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-host#152'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-host@69b845c0f7b2` — **merged** since 2026-10-27T08:09:08Z
**Source** — source.main moved to novox/mesh-host@50c229f90568. 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-host#152'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`.
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; pins mesh-sdk 05b67831 exactly.
Safety: selfComposer runs only once the node's placement key exists (none today), so this changes nothing a node runs before the seed.
Tests: TestTheNodeComposesItsWantsFromTheBus row: a placed module with no want and an old-form have is in the first node composition (fails without); the removed-want case still passes; whole suite + integration vet pass; no new test functions.
Notes kept for later (review): a have that cannot be decoded counts as not folded (keep the last value instead); folded modules' haves never update their health in agent mode.
Reviewed-by: review-fold@shanks at
69b845c0f7Delivery
novox/mesh-host@69b845c0f7b2— merged since 2026-10-27T08:09:08ZSource — source.main moved to novox/mesh-host@50c229f905. 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.