Issue 774 (L3). On 2026-10-31 00:43 ace's node-engine failed a pass on the vault's deadline, retried at 00:45:50, then ran five minutes without a line before composing at 00:51; its haves never said a retry was coming, and no tool could make a node compose. Group fix/compose-retries-transient, mesh-sdk first:
mesh-sdk: the optional node-engine seat verb compose (module optional) in the contract.
mesh-host: a pass refused because a seat or read did not answer says "; the node composes again at HH:MM:SS (try N)" (same backoff 5s..5m, now in the composer); a journal line before each retry and every minute a pass runs ("has run for X and waits on "); verb compose: a pass now, bounded (a pass ended under 5 s ago is answered, not repeated; tries not reset), refusing when the node applies the controller's compositions; with module, retries only a failed apply that is not held (never releases a backup hold, never re-applies a running module).
Quick vs thorough: quick = the retry words and journal lines; thorough (chosen) = plus the recovery verb, so a recovery needs no restart (tools-are-how-a-module-is-spoken-to). The verb needs the grants part to grant its subject (being fixed separately, as for composition).
Tests: rows in existing tests; -race clean on selfcompose, agent, link, cmd/mesh-host. mesh-host pins mesh-sdk dfd5d82 exactly.
Issue 774 (L3). On 2026-10-31 00:43 ace's node-engine failed a pass on the vault's deadline, retried at 00:45:50, then ran five minutes without a line before composing at 00:51; its haves never said a retry was coming, and no tool could make a node compose. Group fix/compose-retries-transient, mesh-sdk first:
- mesh-sdk: the optional node-engine seat verb compose (module optional) in the contract.
- mesh-host: a pass refused because a seat or read did not answer says "; the node composes again at HH:MM:SS (try N)" (same backoff 5s..5m, now in the composer); a journal line before each retry and every minute a pass runs ("has run for X and waits on <what>"); verb compose: a pass now, bounded (a pass ended under 5 s ago is answered, not repeated; tries not reset), refusing when the node applies the controller's compositions; with module, retries only a failed apply that is not held (never releases a backup hold, never re-applies a running module).
Quick vs thorough: quick = the retry words and journal lines; thorough (chosen) = plus the recovery verb, so a recovery needs no restart (tools-are-how-a-module-is-spoken-to). The verb needs the grants part to grant its subject (being fixed separately, as for composition).
Tests: rows in existing tests; -race clean on selfcompose, agent, link, cmd/mesh-host. mesh-host pins mesh-sdk dfd5d82 exactly.
Reviewed-by: rev-compose@shanks at b0d6684d373192a7b55a9407e368d7ada14f82d0
On 2026-10-31 ace's route-proxy said only that the vault could not be asked, and ace said nothing for five minutes
while a pass waited after the vault restarted; the retry that already existed was invisible. A refusal for a seat or
a read that did not answer now says when the node composes again ("the node composes again at HH:MM:SS (try N)"), a
retry pass says it starts, a pass that runs on says every minute what it waits on, and the node-engine's verb
compose makes a pass now and says how it went, so a person recovers without a restart.
The verb compose has no warrant (ADR 0563 §2): Agent.Retry released a module held for a failed backup and re-applied
one already running its want. RetryFailed tries again only a failed apply not held, and refuses in words otherwise.
A hand ask no longer restarts the growing bound, and a pass less than askedWithin old is the answer, so a caller in a
loop drives no passes against the vault. A composer whose loop ended refuses at once. The retry line said try N+1.
The test's first shadow now ends before slowAfter is set, a race the race detector found under the new timing.
Deliverynovox/mesh-host@b0d6684d3731 — merged since 2026-10-31T00:21:37Z
Source — source.main moved to novox/mesh-host@3d1465606b. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
composed together: pass — the checker's verdict at the members' heads (4295264dfd90)
Transitions
2026-10-31 00:12 (new) → proposed (announced): novox/mesh-host#185's head announced
2026-10-31 00:12 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-31 00:21 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@b0d6684d3731` — **merged** since 2026-10-31T00:21:37Z
**Source** — source.main moved to novox/mesh-host@3d1465606bed. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/compose-retries-transient`: novox/mesh-host@b0d6684d3731, novox/mesh-sdk@dfd5d8295e0a
- composed together: pass — the checker's verdict at the members' heads (4295264dfd90)
**Transitions**
- 2026-10-31 00:12 (new) → proposed (announced): novox/mesh-host#185's head announced
- 2026-10-31 00:12 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-31 00:21 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 774 (L3). On 2026-10-31 00:43 ace's node-engine failed a pass on the vault's deadline, retried at 00:45:50, then ran five minutes without a line before composing at 00:51; its haves never said a retry was coming, and no tool could make a node compose. Group fix/compose-retries-transient, mesh-sdk first:
Quick vs thorough: quick = the retry words and journal lines; thorough (chosen) = plus the recovery verb, so a recovery needs no restart (tools-are-how-a-module-is-spoken-to). The verb needs the grants part to grant its subject (being fixed separately, as for composition).
Tests: rows in existing tests; -race clean on selfcompose, agent, link, cmd/mesh-host. mesh-host pins mesh-sdk dfd5d82 exactly.
Reviewed-by: rev-compose@shanks at
b0d6684d37On 2026-10-31 ace's route-proxy said only that the vault could not be asked, and ace said nothing for five minutes while a pass waited after the vault restarted; the retry that already existed was invisible. A refusal for a seat or a read that did not answer now says when the node composes again ("the node composes again at HH:MM:SS (try N)"), a retry pass says it starts, a pass that runs on says every minute what it waits on, and the node-engine's verb compose makes a pass now and says how it went, so a person recovers without a restart.Delivery
novox/mesh-host@b0d6684d3731— merged since 2026-10-31T00:21:37ZSource — source.main moved to novox/mesh-host@3d1465606b. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/compose-retries-transient: novox/mesh-host@b0d6684d37, novox/mesh-sdk@dfd5d8295eTransitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.