compose-candidate reads each manifest once and answers within its bound, from each ask's arrival #200

Merged
mesh-tools merged 4 commits from fix/1126-compose-wait into main 2026-11-03 01:02:32 +00:00
Member

Under issue 1126 (notes 140-142). Asked to compose a candidate, the node-engines away from the broker node took about 60 s: each ask composed twice on throwaway copies of the shadow that cached nothing, reading about 110 manifests one by one over the bus; their answers came past the checker's wait and the bus's one-minute reply window.

  • The shadow keeps what it read (manifests by digest, archives by verified sha256, done builds by fingerprint); missing manifests are read 8 at a time; the candidate's copy reuses the plain composition's reads.
  • The engine answers within candidateWithin (50 s) counted from the ask's arrival: compose-candidate is answered in its own goroutine, at most 4 at once, a 5th refused at once with a reason (the checker names it, ADR 0593 §9); past the bound it answers unready with what it waits on.
  • One journal line per answer: verdict, time taken, reads waited on and the longest.
  • The sandbox composition (a mesh-host candidate composed with its own code) failed twice on fields it filled differently from the bus reader, both faults already on main (mesh-host #199 merged on a failed-check Approve): the mesh's provided module ('nothing provides mesh-wireguard / mesh-addressing'), then the node's own modules taken in from their builds and its kept manifests ('postgres: its own secret reader is handed to the provisioner and the module is not'). Second of a kind, so the kind is fixed: the engine sends its input through composer.SentInput (taken-in manifests and kept builds), the sandbox lays them over the cases' manifests, and a conformance subtest composes one node through the bus reader and through the sandbox and requires the same declared paths. An input over 900 KiB is refused in words (the bus carries 1 MiB).

Quick fix: the checker alone (mesh-delivery #144, merged). Thorough: this. Tests: subtests of TestTheNodeComposesACandidateOnAsk, TestALinkThatHearsHandOversIsGivenTheQueues and TestARequestItCannotRunIsRefused; each fails without its change; no new test function. Kept for later (reviewer): the sandbox composes the whole node while the engine holds a failing module alone, which bites only while an engine holds a module; kept reads are never pruned; micro's respondError may race on a failed Respond at stop; mesh-sdk's Request.Input doc is now out of date.

Reviewed-by: review-1126-compose@shanks at df13a83a91

https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL

Under issue 1126 (notes 140-142). Asked to compose a candidate, the node-engines away from the broker node took about 60 s: each ask composed twice on throwaway copies of the shadow that cached nothing, reading about 110 manifests one by one over the bus; their answers came past the checker's wait and the bus's one-minute reply window. - The shadow keeps what it read (manifests by digest, archives by verified sha256, done builds by fingerprint); missing manifests are read 8 at a time; the candidate's copy reuses the plain composition's reads. - The engine answers within candidateWithin (50 s) counted from the ask's arrival: compose-candidate is answered in its own goroutine, at most 4 at once, a 5th refused at once with a reason (the checker names it, ADR 0593 §9); past the bound it answers unready with what it waits on. - One journal line per answer: verdict, time taken, reads waited on and the longest. - The sandbox composition (a mesh-host candidate composed with its own code) failed twice on fields it filled differently from the bus reader, both faults already on main (mesh-host #199 merged on a failed-check Approve): the mesh's provided module ('nothing provides mesh-wireguard / mesh-addressing'), then the node's own modules taken in from their builds and its kept manifests ('postgres: its own secret reader is handed to the provisioner and the module is not'). Second of a kind, so the kind is fixed: the engine sends its input through composer.SentInput (taken-in manifests and kept builds), the sandbox lays them over the cases' manifests, and a conformance subtest composes one node through the bus reader and through the sandbox and requires the same declared paths. An input over 900 KiB is refused in words (the bus carries 1 MiB). Quick fix: the checker alone (mesh-delivery #144, merged). Thorough: this. Tests: subtests of TestTheNodeComposesACandidateOnAsk, TestALinkThatHearsHandOversIsGivenTheQueues and TestARequestItCannotRunIsRefused; each fails without its change; no new test function. Kept for later (reviewer): the sandbox composes the whole node while the engine holds a failing module alone, which bites only while an engine holds a module; kept reads are never pruned; micro's respondError may race on a failed Respond at stop; mesh-sdk's Request.Input doc is now out of date. Reviewed-by: review-1126-compose@shanks at df13a83a91176735bddf0883e9bd1ae23a950f0b https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
mesh-tools added 2 commits 2026-11-03 00:29:57 +00:00
Off the control-node an ask of compose-candidate ran into its 60 s bound: each of
its two compositions read every manifest in the mesh one key at a time over the
bus, on scratch copies of the shadow that kept nothing, so each ask read them all
twice again (about 35 s per composition on ace, g14 and shanks; 2 s on novox).
The answer at 60 s then came after the bus's one-minute reply window
(allow_responses ttl), so the bus refused it and the checker heard nothing.

Now the manifests are read eight at a time into the shadow before either
composition, a scratch copy keeps what never changes (manifest, archive, done
build) in the shadow too, the candidate is laid over a copy taken after the
composition without it, and the engine answers within 50 s: unready, naming what
it waits on, when not done. Every answer is said in one journal line with its
reads and its longest wait.

Issue 1126.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
compose-candidate is answered off its subscription, so its bound counts from the ask
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: novox: not composed on novox: these assignments cannot be applied: | b8158affa7af on 27a956448c0a
b8158affa7
An endpoint's subscription hands its asks over one at a time: two checks asking
one node at once queued, and the second answered at about 100 s, past the
checker's bound and the bus's one-minute reply window. compose-candidate is now
answered in a goroutine of its own, at most four at once, one more refused in
words. The new cases are rows of the existing tests (test budget).

Issue 1126, review round 1.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Author
Member

Delivery novox/mesh-host@df13a83a9117 — merged since 2026-11-03T01:02:33Z

Source — source.main moved to novox/mesh-host@798d73eb11. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Transitions

  • 2026-11-03 00:57 (new) → proposed (announced): novox/mesh-host#200's head announced
  • 2026-11-03 00:57 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-11-03 01:02 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@df13a83a9117` — **merged** since 2026-11-03T01:02:33Z **Source** — source.main moved to novox/mesh-host@798d73eb11e9. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Transitions** - 2026-11-03 00:57 (new) → proposed (announced): novox/mesh-host#200's head announced - 2026-11-03 00:57 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-11-03 01:02 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`.
jschoubben added 1 commit 2026-11-03 00:45:27 +00:00
The sandbox composer carries the module the mesh provides itself
mesh/delivery closed: a newer head of the same pull request
mesh/check failed: novox: not composed on novox: postgres: its own secret reader is handed to the provisioner and the m… | 61a3bd996dd4 on 27a956448c0a
61a3bd996d
A check that composes with a candidate's own composer (any mesh-host change)
gave it the indexer's manifests alone, and the input carries no catalogue, so
mesh-wireguard (shipped with mesh-sdk, no repository) was missing: "nothing
provides mesh-wireguard / mesh-addressing" on novox for mesh-host #200. Each case
now lays the provided module's manifest over its shelf, as the bus reader does.

Issue 1126.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Author
Member

mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head b8158affa7 is no longer the pull request's head, or the pull request closed. 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: its head b8158affa7af is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
jschoubben added 1 commit 2026-11-03 00:57:01 +00:00
The sandbox composes a node from the input its engine took in, through one shape
mesh/delivery merged: source.main moved to novox/mesh-host@798d73eb11e9
mesh/check checking df13a83a9117 on 798d73eb11e9
df13a83a91
The second sandbox fault of the same kind on mesh-host #200 (postgres's secret
reader handed, the module not): the engine stripped the whole catalogue from
the input it answers, so the sandbox composed the node's own modules from the
indexer's source manifests while the bus reader composes them taken in from
their builds (artifacts, templates archive texts, what is handed). Both sides
now go through composer.SentInput: the node's own taken-in manifests and kept
builds stay in the input, and the sandbox composes them over the cases'. An
input past what one bus answer carries is refused in words. A conformance row
composes one node through the bus reader and through the sandbox and requires
the same declaration.

Issue 1126.

Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Author
Member

mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 61a3bd996d is no longer the pull request's head, or the pull request closed. 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: its head 61a3bd996dd4 is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-tools merged commit 798d73eb11 into main 2026-11-03 01:02:32 +00:00
mesh-tools deleted branch fix/1126-compose-wait 2026-11-03 01:02:33 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#200