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-toolsmerged 4 commits from fix/1945-ask-again-and-why into main2026-10-25 21:43:11 +00:00
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.
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
Deliverynovox/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.
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`.
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.
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.
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 1945. Three faults met live on 2026-10-25:
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
4628ba26b4Delivery
novox/mesh-delivery@4628ba26b41a— merged since 2026-10-25T21:43:14ZSource — source.main moved to novox/mesh-delivery@db53ec975f. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/1945-ask-again-and-why: novox/mesh-delivery@4628ba26b4, novox/mesh-sdk@e0d1de0475Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.8ac165213ato4628ba26b4