Node agent: a failed placement read picks no owner, a deleted placement returns the node to the controller without a restart (issue 1126, group fix/1126-shadow-all)
#154
Merged
mesh-toolsmerged 3 commits from fix/1126-shadow-all into main2026-10-27 22:44:12 +00:00
Delivery group fix/1126-shadow-all with mesh-sdk; pins mesh-sdk e32d777 exactly. Issue 1126 (L2 of design 47).
Runs on live node agents that compose their own modules since the seed (22:02Z).
selfcompose.Placed: only a successful read decides (no key, a delete marker or no placement bucket yet = the controller's compositions; a value = its own); a failing read chooses neither, retries with link.Backoff and says each distinct error once. Before this, a read error at a reconnect sent a self-composing node to the controller for a run (journals: did not happen tonight).
endWhenUnplaced: a node whose placement key is deleted ends its run and begins again on the controller's compositions without a restart, said in its journal and in its have (composes, composes-why). This is the revert path of the seed.
The shadow compares a deleting head: the controller's composition at each want vs what runs (Returns with Same/Differs/Added/Removed), a missing one refused by name.
The composer passes what runs (the fold of old-form builds); a templates archive read is bounded at 30 s.
Say lines when a placement watch ends while the link stays.
Tests: rows in TestTheNodeComposesItsWantsFromTheBus (two failing-read rows fail on the old code) and the selfcompose shadow table; H8 ends with the revert step (a deleted placement returns the node, its have says composes=controller, web keeps its composition), failing without endWhenUnplaced; H8 18.8-20.7 s.
Delivery group fix/1126-shadow-all with mesh-sdk; pins mesh-sdk e32d777 exactly. Issue 1126 (L2 of design 47).
Runs on live node agents that compose their own modules since the seed (22:02Z).
- selfcompose.Placed: only a successful read decides (no key, a delete marker or no placement bucket yet = the controller's compositions; a value = its own); a failing read chooses neither, retries with link.Backoff and says each distinct error once. Before this, a read error at a reconnect sent a self-composing node to the controller for a run (journals: did not happen tonight).
- endWhenUnplaced: a node whose placement key is deleted ends its run and begins again on the controller's compositions without a restart, said in its journal and in its have (composes, composes-why). This is the revert path of the seed.
- The shadow compares a deleting head: the controller's composition at each want vs what runs (Returns with Same/Differs/Added/Removed), a missing one refused by name.
- The composer passes what runs (the fold of old-form builds); a templates archive read is bounded at 30 s.
- Say lines when a placement watch ends while the link stays.
Tests: rows in TestTheNodeComposesItsWantsFromTheBus (two failing-read rows fail on the old code) and the selfcompose shadow table; H8 ends with the revert step (a deleted placement returns the node, its have says composes=controller, web keeps its composition), failing without endWhenUnplaced; H8 18.8-20.7 s.
Review: round 1 CHANGES, round 2 APPROVED.
Reviewed-by: review-shadow@shanks at 463626143567a75e7ae5b78ddfdb13a546c5f3a9
novox refused its own composition and its answer on de-spiegel, a module it runs
folded into its own composition at a build only the controller holds. The
composer now gives frombus what the node runs (Scope.Running), so such a module
is carried as it runs. The shadow's answer names every refusal (mesh-sdk). A
templates archive read is bounded at 30 s: nothing else held an unanswered store.
The seed's revert (mesh-catalog #526) was refused on 'would stop running node',
while a self-composing node would have refused its placement's absence, kept
what runs and marked every have failed until a restart. endWhenUnplaced ends the
agent's run when the key goes, so it begins again on the controller's
compositions, as at a start without a key; the composer refuses nothing while
unplaced; the node's have says whose compositions it applies (Composes); the
shadow answers a deleted placement Returns, verdict same.
selfComposer took a KVHistory error for 'not placed': at any restart a timeout
or a bus not ready flipped a self-composing node to the controller's
compositions for a whole run. selfcompose.Placed chooses only on a read that
succeeds (a missing placement state is one), and tries again otherwise, said
once. The shadow's answer to a head deleting the placement reads the
controller's composition at each want in the node's bucket and compares it with
what runs; a want with none refuses, without returning.
Deliverynovox/mesh-host@463626143567 — merged since 2026-10-27T22:44:13Z
Source — source.main moved to novox/mesh-host@199f6b48b1. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
2026-10-27 22:40 (new) → proposed (announced): novox/mesh-host#154's head announced
2026-10-27 22:40 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 22:44 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@463626143567` — **merged** since 2026-10-27T22:44:13Z
**Source** — source.main moved to novox/mesh-host@199f6b48b1df. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/1126-shadow-all`: novox/mesh-host@463626143567, novox/mesh-sdk@e32d77753024
**Transitions**
- 2026-10-27 22:40 (new) → proposed (announced): novox/mesh-host#154's head announced
- 2026-10-27 22:40 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 22:44 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.
Delivery group fix/1126-shadow-all with mesh-sdk; pins mesh-sdk e32d777 exactly. Issue 1126 (L2 of design 47).
Runs on live node agents that compose their own modules since the seed (22:02Z).
Tests: rows in TestTheNodeComposesItsWantsFromTheBus (two failing-read rows fail on the old code) and the selfcompose shadow table; H8 ends with the revert step (a deleted placement returns the node, its have says composes=controller, web keeps its composition), failing without endWhenUnplaced; H8 18.8-20.7 s.
Review: round 1 CHANGES, round 2 APPROVED.
Reviewed-by: review-shadow@shanks at
4636261435Delivery
novox/mesh-host@463626143567— merged since 2026-10-27T22:44:13ZSource — source.main moved to novox/mesh-host@199f6b48b1. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1126-shadow-all: novox/mesh-host@4636261435, novox/mesh-sdk@e32d777530Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.