Delivery parts keep running when the bus refuses a bucket they can work without; the builder asks a lost build again; the assigner says why a node gets no want (issue 1945) #51

Merged
mesh-tools merged 4 commits from fix/1945-ask-again-and-why into main 2026-10-25 21:43:11 +00:00
Member

Issue 1945. Three faults met live on 2026-10-25:

  • A part exits on a bucket it can work without (met three times: the builder of #48 on gate_source, review of this branch on reasks, the assigner of #49 on puts). Every part's startup opens are now essential (stop, the error naming the bucket and its grant) or optional (log what is not heard, keep running, and where possible open it again at the next event that needs it), through mesh-sdk's process helpers (the group's mesh-sdk PR #84). Builder: builds/modules/manifests essential; candidates, gate_source, instances, reasks, toolchains, assignments optional. Indexer: candidates/modules/manifests/forge consumer essential; controller builds, gate_source, previews, toolchains, assignments optional. Checker: its own states, previews, candidates, modules, manifests, tries essential; builder builds, presence, gate_source, toolchains, assignments optional. Teller: gate asks/answers/asked essential. Forge bridge: heads/performed/events essential; gate owed and merges optional. Watchman: presence/pulse/stuck essential; wants/haves/steps optional. Assigner: all essential except its puts (from #50, kept on rebase). The review checked that no optional part does something wrong when degraded, only less.
  • A build ask lost on its stream is never asked again (mesh-build-node's newest build stuck since 19:06; seven at 18:44). When an ask has waited for the step bound, the builder reads its place on the stream and the build module's steps; if no step exists and the stream no longer holds it, or a later step started after it, it asks again under a new id, logs it and emits build.asked-again; after 3 askings the key fails with why. Tools: builder_stuck {module?} and builder_ask_again {module, fp, why} (a running step asked again is built twice: wasted work, never a wrong key).
  • The assigner held a first want back silently. It now logs ' on gets no want: rule : ' when a reason appears or changes, and writes the reason into an existing removed want's words, read with mesh-delivery-view.assigner_want.

Checked: go test -race and go vet -tags integration in all 8 modules; the whole integration level of the 8 modules run locally, green (and the assigner's again after the rebase onto 73be3df). The first group check failed only on a merge conflict with #50 (assigner main.go), resolved keeping both. No new top-level tests.

Review: round 1 blocked (the builder exited on a missing reasks grant: the kind above); round 2 approved both repositories; the rebase's conflict resolution confirmed.

Reviewed-by: review-reask@shanks at 4628ba26b4

Issue 1945. Three faults met live on 2026-10-25: - **A part exits on a bucket it can work without** (met three times: the builder of #48 on gate_source, review of this branch on reasks, the assigner of #49 on puts). Every part's startup opens are now essential (stop, the error naming the bucket and its grant) or optional (log what is not heard, keep running, and where possible open it again at the next event that needs it), through mesh-sdk's process helpers (the group's mesh-sdk PR #84). Builder: builds/modules/manifests essential; candidates, gate_source, instances, reasks, toolchains, assignments optional. Indexer: candidates/modules/manifests/forge consumer essential; controller builds, gate_source, previews, toolchains, assignments optional. Checker: its own states, previews, candidates, modules, manifests, tries essential; builder builds, presence, gate_source, toolchains, assignments optional. Teller: gate asks/answers/asked essential. Forge bridge: heads/performed/events essential; gate owed and merges optional. Watchman: presence/pulse/stuck essential; wants/haves/steps optional. Assigner: all essential except its puts (from #50, kept on rebase). The review checked that no optional part does something wrong when degraded, only less. - **A build ask lost on its stream is never asked again** (mesh-build-node's newest build stuck since 19:06; seven at 18:44). When an ask has waited for the step bound, the builder reads its place on the stream and the build module's steps; if no step exists and the stream no longer holds it, or a later step started after it, it asks again under a new id, logs it and emits build.asked-again; after 3 askings the key fails with why. Tools: builder_stuck {module?} and builder_ask_again {module, fp, why} (a running step asked again is built twice: wasted work, never a wrong key). - **The assigner held a first want back silently.** It now logs '<module> on <node> gets no want: rule <n>: <words>' when a reason appears or changes, and writes the reason into an existing removed want's words, read with mesh-delivery-view.assigner_want. Checked: go test -race and go vet -tags integration in all 8 modules; the whole integration level of the 8 modules run locally, green (and the assigner's again after the rebase onto 73be3df). The first group check failed only on a merge conflict with #50 (assigner main.go), resolved keeping both. No new top-level tests. Review: round 1 blocked (the builder exited on a missing reasks grant: the kind above); round 2 approved both repositories; the rebase's conflict resolution confirmed. Reviewed-by: review-reask@shanks at 4628ba26b41aae8e40d59f835ecdf13d85842926
Author
Member

Delivery novox/mesh-delivery@4628ba26b41a — merged since 2026-10-25T21:43:14Z

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

Group fix/1945-ask-again-and-why: novox/mesh-delivery@4628ba26b4, novox/mesh-sdk@e0d1de0475

  • composed together: pass — the checker's verdict at the members' heads (d82312ace546)

Transitions

  • 2026-10-25 21:30 (new) → proposed (announced): novox/mesh-delivery#51's head announced
  • 2026-10-25 21:39 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
  • 2026-10-25 21:43 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-delivery@4628ba26b41a` — **merged** since 2026-10-25T21:43:14Z **Source** — source.main moved to novox/mesh-delivery@db53ec975f01. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Group** `fix/1945-ask-again-and-why`: novox/mesh-delivery@4628ba26b41a, novox/mesh-sdk@e0d1de047585 - composed together: pass — the checker's verdict at the members' heads (d82312ace546) **Transitions** - 2026-10-25 21:30 (new) → proposed (announced): novox/mesh-delivery#51's head announced - 2026-10-25 21:39 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 - 2026-10-25 21:43 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 4 commits 2026-10-25 21:30:47 +00:00
A build ask its seat's stream gave up on, dropped or ended with no step was
waited for with no end, and on restart taken over and waited for again: no
build node would ever answer it, and nothing could ask it again (trunk key
of mesh-build-node at 4e7b118e, building since 19:06; seven keys at 18:44).

At the step bound, a context's bound and no timer of its own, the builder
reads what the bus says of an ask with no step: gone from its stream, or
first in line while a node took a later ask. Such an ask is asked again
under a new id the key names, logged and said as build.asked-again, at most
three askings, then the key fails with why. The bus's max-deliveries
advisory would tell it sooner, but the builder is granted neither it nor the
workers' information, and the controller is not changed here.

builder_stuck reads every waiting key with its asks, askings and steps;
builder_ask_again writes the new reasks state, which the builder watches
and answers.
A new assignment whose trunk build was not done fell through the rules
with nothing said: no want, no neither-list entry, no log line, and the
rule holding it back was computed and dropped. The pass now logs the rule
when a node's reason appears or changes and when it has a want again, one
line per change. A node whose want is removed and that does not run the
module gets the reason in that removed want's words, so assigner_want
answers why; a node with no key gets no removed want, since its node agent
would then remove the module and stop holding its resources back.
Met twice on 2026-10-25: the builder of #48 exited on a refused read of
the gate's source and crash-looped, and its new reasks bucket would have
done the same. A grant reaches the bus with a delivery, so a refusal or a
timeout at start is often only a grant not there yet; exiting for it
stopped the whole part until a hand step on the bus.

Every startup open in the parts is now essential or optional. Essential
ones (a part's own state and the input it exists for) still stop the
start, with an error naming the bucket and its grant. Optional ones are
said and left: watches the bus refuses too. The builder builds trunk keys
without the gate's source, which it opens again at the next candidate
that asks a trunk head; toolchains and previews open again at their next
event, as a missing bucket did. builder_ask_again says that asking a
running step again builds it twice.
Delivery parts: take the essential and optional bucket opens from mesh-sdk (issue 1945)
mesh/delivery merged: source.main moved to novox/mesh-delivery@db53ec975f01
mesh/delivery-group group fix/1945-ask-again-and-why merged: every member is merged
mesh/check pass 4628ba26b41a on 73be3df28cd4 | unit 167 run, 443 kept | integration 177 run, 509 kept | composition passed on 3 machines
4628ba26b4
The open helpers were copied into seven parts; code shared between
modules lives in mesh-sdk, so they are mesh-sdk process's now and the
parts are pinned at fix/1945-optional-buckets (e0d1de04), moved to its
main once it merges, one delivery group with mesh-sdk.
jschoubben force-pushed fix/1945-ask-again-and-why from 8ac165213a to 4628ba26b4 2026-10-25 21:30:47 +00:00 Compare
mesh-tools merged commit db53ec975f into main 2026-10-25 21:43:11 +00:00
mesh-tools deleted branch fix/1945-ask-again-and-why 2026-10-25 21:43:12 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-delivery#51