Fixes hq issue 753: on 2026-10-14 mesh-catalog's rollout plan (#301, #304, #307) waited forever for mesh-delivery's word, because every delivery it carried was final: #301 stopped by its group for a member delivered since, waiting for a later rollout containing its merge, and the only such rollout waiting for #301's word.
(a) A delivery its group stopped for a member delivered since gives its word to the open plan that waits for a word, answers its merge and has not left the merge out (lapsedOn/lapsedTurns/lapsedOf/lapsedAnswered/lapsedBehind in answers.go, from plan() in holder.go), through the existing words(): a living delivery not at its turn still holds the plan, a stop made by a person gives no word, the word is given once per plan (in LetGoWhy). It gives its word only in its group's order: every member ordered before it must have reached the machines, unless that member is also a lapsed stop answered by the same plan; otherwise stalled walks names the member it waits for.
(c) A plan held only by lapsed stops stays under the orphans timer: past the grace stalled lists it with why (the member waited for, the last hold, the controller's refusal of the word, or the word given and not started); stalled walks and stalled name every ended delivery a plan with no living delivery carries.
(b), covering a delivery whose modules reached every machine through another repository's rollout, is not done: it needs a controller read of each running build's source, and would skip the plan's own steps (backups, resending a provider's consumers).
Tests: issue753_test.go (live shapes; group order; a refused word; a person's stop). gofmt, go vet, go test ./..., MESH_CHECK_MODULES=mesh-delivery merge-check.sh pass. Reviewed independently before push (two rounds): APPROVE at 373f339750.
Fixes hq issue 753: on 2026-10-14 mesh-catalog's rollout plan (#301, #304, #307) waited forever for mesh-delivery's word, because every delivery it carried was final: #301 stopped by its group for a member delivered since, waiting for a later rollout containing its merge, and the only such rollout waiting for #301's word.
- (a) A delivery its group stopped for a member delivered since gives its word to the open plan that waits for a word, answers its merge and has not left the merge out (`lapsedOn`/`lapsedTurns`/`lapsedOf`/`lapsedAnswered`/`lapsedBehind` in answers.go, from `plan()` in holder.go), through the existing `words()`: a living delivery not at its turn still holds the plan, a stop made by a person gives no word, the word is given once per plan (in `LetGoWhy`). It gives its word only in its group's order: every member ordered before it must have reached the machines, unless that member is also a lapsed stop answered by the same plan; otherwise `stalled walks` names the member it waits for.
- (c) A plan held only by lapsed stops stays under the orphans timer: past the grace `stalled` lists it with why (the member waited for, the last hold, the controller's refusal of the word, or the word given and not started); `stalled walks` and `stalled` name every ended delivery a plan with no living delivery carries.
- (b), covering a delivery whose modules reached every machine through another repository's rollout, is not done: it needs a controller read of each running build's source, and would skip the plan's own steps (backups, resending a provider's consumers).
Tests: issue753_test.go (live shapes; group order; a refused word; a person's stop). gofmt, go vet, go test ./..., MESH_CHECK_MODULES=mesh-delivery merge-check.sh pass. Reviewed independently before push (two rounds): APPROVE at 373f339750779fc6224a3401b3746a916216ee92.
mesh/merge-gate head 373f33975077 merged into trunk 7913b56d66f7 — pass: builds mesh-delivery → novox; no bus step; every machine composes with the change …
mesh/repo-check head 373f33975077 merged into trunk 7913b56d66f7 — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-…
A delivery its group stopped for a member delivered since waits for a later
walk of its repository that contains its merge (issue 747). When that walk
carried no living delivery, nothing gave it its word and it waited forever.
The delivery now takes its turn on the walk that answers its merge, in its
group's order. A walk owed such a word stays under the orphans' timer, so
past the grace without it `stalled` lists it with why (held, or the
controller's refusal), and a walk no living delivery holds names the ended
deliveries it carries.
Deliverynovox/mesh-catalog@373f33975077 — delivered since 2026-10-14T22:36:41Z
Delivery plan — builds mesh-delivery → novox; no bus step
tier 0: mesh-delivery
novox: receives mesh-delivery
Machines
mesh-delivery on every machine running it: sent
Transitions
2026-10-14 22:31 (new) → proposed (announced): novox/mesh-catalog#312's head announced
2026-10-14 22:35 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-14 22:35 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-14 22:35 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-14 22:35 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-14 22:36 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@373f33975077` — **delivered** since 2026-10-14T22:36:41Z
**Delivery plan** — builds mesh-delivery → novox; no bus step
- tier 0: mesh-delivery
- novox: receives mesh-delivery
**Machines**
- mesh-delivery on every machine running it: sent
**Transitions**
- 2026-10-14 22:31 (new) → proposed (announced): novox/mesh-catalog#312's head announced
- 2026-10-14 22:35 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-14 22:35 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-14 22:35 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-14 22:35 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-14 22:36 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Merge check at 373f3397
Judged: head 373f33975077 merged into trunk 7913b56d66f7; read beside it: mesh-controller 3ed08c3464e3, mesh-controller-main 3ed08c3464e3, mesh-host 1a2677882380, mesh-tools 5d70eb3e35a9
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-delivery)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds mesh-delivery → novox; no bus step
tier 0: mesh-delivery
novox: receives mesh-delivery
read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/issue753_test.go
Run by the build seat on novox as build-1792017093275012514 (builds --log build-1792017093275012514).
--- the gate: mesh-delivery
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T22:08:46Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-14T22:08:46Z
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 1 module(s) in 1 tier(s): mesh-delivery
notes:
- modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go and modules/mesh-delivery/cmd/mesh-delivery/issue753_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.003s
words: 12 retired words and 70 daemons' lines, none in the 47507 strings of 726 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.015s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/secrets 0.014s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 62, as kept
ok git.novox.be/novox/mesh-catalog/checks/deps 0.467s
testing modules/mesh-delivery
ok mesh-delivery/cmd/mesh-delivery 4.187s
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `373f3397`
Judged: head `373f33975077` merged into trunk `7913b56d66f7`; read beside it: mesh-controller `3ed08c3464e3`, mesh-controller-main `3ed08c3464e3`, mesh-host `1a2677882380`, mesh-tools `5d70eb3e35a9`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-delivery)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds mesh-delivery → novox; no bus step
- tier 0: mesh-delivery
- novox: receives mesh-delivery
- read by no module's build: modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go, modules/mesh-delivery/cmd/mesh-delivery/issue753_test.go
Run by the build seat on novox as `build-1792017093275012514` (`builds --log build-1792017093275012514`).
```
--- the gate: mesh-delivery
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, gitea.gitea_merge_pull_request, gitea.gitea_add_comment, gitea.gitea_api, keeps state deliveries, groups
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-14T22:08:46Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-14T22:08:46Z
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 1 module(s) in 1 tier(s): mesh-delivery
notes:
- modules/mesh-delivery/cmd/mesh-delivery/fakes_test.go and modules/mesh-delivery/cmd/mesh-delivery/issue753_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.003s
words: 12 retired words and 70 daemons' lines, none in the 47507 strings of 726 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.015s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/secrets 0.014s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 62, as kept
ok git.novox.be/novox/mesh-catalog/checks/deps 0.467s
testing modules/mesh-delivery
ok mesh-delivery/cmd/mesh-delivery 4.187s
--- its merge-check-typescript.sh (typescript toolchain)
```
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.
Fixes hq issue 753: on 2026-10-14 mesh-catalog's rollout plan (#301, #304, #307) waited forever for mesh-delivery's word, because every delivery it carried was final: #301 stopped by its group for a member delivered since, waiting for a later rollout containing its merge, and the only such rollout waiting for #301's word.
lapsedOn/lapsedTurns/lapsedOf/lapsedAnswered/lapsedBehindin answers.go, fromplan()in holder.go), through the existingwords(): a living delivery not at its turn still holds the plan, a stop made by a person gives no word, the word is given once per plan (inLetGoWhy). It gives its word only in its group's order: every member ordered before it must have reached the machines, unless that member is also a lapsed stop answered by the same plan; otherwisestalled walksnames the member it waits for.stalledlists it with why (the member waited for, the last hold, the controller's refusal of the word, or the word given and not started);stalled walksandstalledname every ended delivery a plan with no living delivery carries.Tests: issue753_test.go (live shapes; group order; a refused word; a person's stop). gofmt, go vet, go test ./..., MESH_CHECK_MODULES=mesh-delivery merge-check.sh pass. Reviewed independently before push (two rounds): APPROVE at
373f339750.Delivery
novox/mesh-catalog@373f33975077— delivered since 2026-10-14T22:36:41ZDelivery plan — builds mesh-delivery → novox; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.ready at
373f339750(the operator's word, 2026-10-15; independent review APPROVE at this sha).Merge check at
373f3397Judged: head
373f33975077merged into trunk7913b56d66f7; read beside it: mesh-controller3ed08c3464e3, mesh-controller-main3ed08c3464e3, mesh-host1a2677882380, mesh-tools5d70eb3e35a9mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-delivery)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds mesh-delivery → novox; no bus step
Run by the build seat on novox as
build-1792017093275012514(builds --log build-1792017093275012514).