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-tools merged 3 commits from fix/1126-shadow-all into main 2026-10-27 22:44:12 +00:00
Member

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 4636261435

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
mesh-tools added 3 commits 2026-10-27 22:40:20 +00:00
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.
A failing placement read chooses neither composer, a deleting head is compared with the controller's compositions at the node's wants, and a placement watch that ends is said; pin mesh-sdk e32d777 (issue 1126, review of the shadow, round 1)
mesh/delivery merged: source.main moved to novox/mesh-host@199f6b48b1df
mesh/delivery-group group fix/1126-shadow-all merged: every member is merged
mesh/check checking 463626143567 on bb15aab50eda | novox/mesh-host#154 in group fix/1126-shadow-all
4636261435
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.
Author
Member

Delivery novox/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.

Group fix/1126-shadow-all: novox/mesh-host@4636261435, novox/mesh-sdk@e32d777530

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.

<!-- 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`.
mesh-tools merged commit 199f6b48b1 into main 2026-10-27 22:44:12 +00:00
mesh-tools deleted branch fix/1126-shadow-all 2026-10-27 22:44:12 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#154