hq issue 335: on 2026-10-08 dunst's new build passed its gate on the laptop (healthy 3 times over 2m5s). Twenty-eight minutes later the plan marked it failed at its gate, with the pass's own words as the reason, and put it back.
Cause.advanceOnce ran nextRollout (the check of the first machine's report) on every step, also after the gate had passed.
The send to the rest was refused at first, because another walk's build waited for its gate on the workstation.
Two minutes later that other walk sent the laptop a new declaration, and the laptop did not report on it.
nextRollout then read the laptop's report as not current and waited. At 30 minutes after the first send (planWaitBound) it returned failed: laptop did not report it applied within 30m0s.
failFirstSend took the len(g.Failing) == 0 branch into gateFailed. That kept the passed verdict's why (healthy 3 times over 2m5s), recorded the build as failed and put it back.
Fix.
nextRollout returns the rest to send once the module's gate has passed. The first machine's later reports are about later sends, not this build.
advanceOnce reads the step after a carried module takes over its lead's pass (passedWith), so that pass counts too.
A guard in failFirstSend: a module whose gate passed is never put back. With the two changes above it is not reached. It is there so a path added later cannot overturn a verdict. If reached, the plan stops with the reason, the build is not marked failed, and the module is left a stopped rollout, which plans retry sends again.
Tests.
TestReplay335 (replay335_test.go) uses only what the controller had before the fix. It fails on main (laptop did not report it applied within 30m0s, and the passed build reaches gateFailed) and passes here. It is registered as R335 in mesh-lab.
TestACarriedModuleTakesItsLeadsPassBeforeItsStepIsRead drives advancePlans over a two-module tier. The lead has passed, the carried module has no gate yet, another send has reached the first machine unreported, and the first send is past the 30-minute bound. It expects the rest sent and nothing put back. With only the reorder reverted it fails: the walk stops on "anchor did not report it applied within 30m0s", caught by the guard.
Locally: gofmt and go vet are clean. go test ./cmd/mesh-controller/ against a throwaway PostgreSQL passes (103 s).
Check status.mesh/repo-check fails on TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (internal/broker) until #159 merges. mesh-host main already carries #159's dead-letter grants. This repository's main fails that test the same way.
hq issue 335: on 2026-10-08 dunst's new build passed its gate on the laptop (healthy 3 times over 2m5s). Twenty-eight minutes later the plan marked it failed at its gate, with the pass's own words as the reason, and put it back.
**Cause.** `advanceOnce` ran `nextRollout` (the check of the first machine's report) on every step, also after the gate had passed.
- The send to the rest was refused at first, because another walk's build waited for its gate on the workstation.
- Two minutes later that other walk sent the laptop a new declaration, and the laptop did not report on it.
- `nextRollout` then read the laptop's report as not current and waited. At 30 minutes after the first send (`planWaitBound`) it returned `failed: laptop did not report it applied within 30m0s`.
- `failFirstSend` took the `len(g.Failing) == 0` branch into `gateFailed`. That kept the passed verdict's why (`healthy 3 times over 2m5s`), recorded the build as failed and put it back.
**Fix.**
- `nextRollout` returns the rest to send once the module's gate has passed. The first machine's later reports are about later sends, not this build.
- `advanceOnce` reads the step after a carried module takes over its lead's pass (`passedWith`), so that pass counts too.
- **A guard** in `failFirstSend`: a module whose gate passed is never put back. With the two changes above it is not reached. It is there so a path added later cannot overturn a verdict. If reached, the plan stops with the reason, the build is not marked failed, and the module is left a stopped rollout, which `plans retry` sends again.
**Tests.**
- `TestReplay335` (`replay335_test.go`) uses only what the controller had before the fix. It fails on main (`laptop did not report it applied within 30m0s`, and the passed build reaches `gateFailed`) and passes here. It is registered as R335 in mesh-lab.
- `TestACarriedModuleTakesItsLeadsPassBeforeItsStepIsRead` drives `advancePlans` over a two-module tier. The lead has passed, the carried module has no gate yet, another send has reached the first machine unreported, and the first send is past the 30-minute bound. It expects the rest sent and nothing put back. With only the reorder reverted it fails: the walk stops on "anchor did not report it applied within 30m0s", caught by the guard.
Locally: `gofmt` and `go vet` are clean. `go test ./cmd/mesh-controller/` against a throwaway PostgreSQL passes (103 s).
**Check status.** `mesh/repo-check` fails on `TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose` (internal/broker) until #159 merges. mesh-host main already carries #159's dead-letter grants. This repository's main fails that test the same way.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Machines
mesh-controller on novox: passed — healthy 3 times over 3m37s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 3 times over 3m54s
build-agent on the rest running it: sent
route-proxy on ace: passed — healthy 3 times over 3m37s
route-proxy on the rest running it: sent
Transitions
2026-10-08 19:12 (new) → proposed (announced): novox/mesh-controller#165's head announced
2026-10-08 19:23 proposed → checked (checked): the verdict names this commit
2026-10-08 19:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 19:48 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-08 19:48 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
2026-10-08 20:04 delivering → delivered (done): its walk is done: 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-controller@81e5458cbf81` — **delivered** since 2026-10-08T20:04:04Z
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 3m37s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 3 times over 3m54s
- build-agent on the rest running it: sent
- route-proxy on ace: passed — healthy 3 times over 3m37s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-08 19:12 (new) → proposed (announced): novox/mesh-controller#165's head announced
- 2026-10-08 19:23 proposed → checked (checked): the verdict names this commit
- 2026-10-08 19:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 19:48 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-08 19:48 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
- 2026-10-08 20:04 delivering → delivered (done): its walk is done: 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`.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as build-1791483974074966168 (builds --log build-1791483974074966168).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T18:08:48Z 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-08T18:08:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.048s
ok github.com/novox/mesh-controller/cmd/mesh-controller 204.081s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.114s
ok github.com/novox/mesh-controller/internal/artifacts 1.045s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.74s)
genesis_template_test.go:46: the installer's user list lets the controller publish [$JS.ACK.DEAD_LETTER_NOTICES.controller.> mesh.again.> mesh.events.dead.>], which it does not derive
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 1.848s
ok github.com/novox/mesh-controller/internal/builder 3.093s
ok github.com/novox/mesh-controller/internal/catalogue 5.026s
ok github.com/novox/mesh-controller/internal/conditions 2.258s
ok github.com/novox/mesh-controller/internal/envfile 1.030s
ok github.com/novox/mesh-controller/internal/facts 1.022s
ok github.com/novox/mesh-controller/internal/identity 5.067s
ok github.com/novox/mesh-controller/internal/inventory 90.850s
ok github.com/novox/mesh-controller/internal/lease 17.683s
ok github.com/novox/mesh-controller/internal/licences 4.629s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.016s
ok github.com/novox/mesh-controller/internal/link 46.998s
ok github.com/novox/mesh-controller/internal/lint 2.138s
ok github.com/novox/mesh-controller/internal/outward 1.061s
ok github.com/novox/mesh-controller/internal/overlay 1.030s
ok github.com/novox/mesh-controller/internal/secrets 1.459s
ok github.com/novox/mesh-controller/internal/store 3.373s
ok github.com/novox/mesh-controller/internal/testbus 1.200s
ok github.com/novox/mesh-controller/internal/token 1.021s
FAIL
**Merge check** at `becd40be`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.74s)
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as `build-1791483974074966168` (`builds --log build-1791483974074966168`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T18:08:48Z 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-08T18:08:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.048s
ok github.com/novox/mesh-controller/cmd/mesh-controller 204.081s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.114s
ok github.com/novox/mesh-controller/internal/artifacts 1.045s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.74s)
genesis_template_test.go:46: the installer's user list lets the controller publish [$JS.ACK.DEAD_LETTER_NOTICES.controller.> mesh.again.> mesh.events.dead.>], which it does not derive
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 1.848s
ok github.com/novox/mesh-controller/internal/builder 3.093s
ok github.com/novox/mesh-controller/internal/catalogue 5.026s
ok github.com/novox/mesh-controller/internal/conditions 2.258s
ok github.com/novox/mesh-controller/internal/envfile 1.030s
ok github.com/novox/mesh-controller/internal/facts 1.022s
ok github.com/novox/mesh-controller/internal/identity 5.067s
ok github.com/novox/mesh-controller/internal/inventory 90.850s
ok github.com/novox/mesh-controller/internal/lease 17.683s
ok github.com/novox/mesh-controller/internal/licences 4.629s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.016s
ok github.com/novox/mesh-controller/internal/link 46.998s
ok github.com/novox/mesh-controller/internal/lint 2.138s
ok github.com/novox/mesh-controller/internal/outward 1.061s
ok github.com/novox/mesh-controller/internal/overlay 1.030s
ok github.com/novox/mesh-controller/internal/secrets 1.459s
ok github.com/novox/mesh-controller/internal/store 3.373s
ok github.com/novox/mesh-controller/internal/testbus 1.200s
ok github.com/novox/mesh-controller/internal/token 1.021s
FAIL
```
mesh/repo-check is red on TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (internal/broker), and this change does not cause it. The test reads the installer's user list from the mesh-host checkout beside this one. mesh-host main already carries the dead-letter grants of issue 330 (mesh-host ccbfa9b), but the controller code that derives them is still on #159, unmerged. I ran that test locally against mesh-host main on this repository's main (7f65e62), without this change, and it fails the same way. It clears once #159 merges; then a recheck of this head should be green. Every other package passed in the check, including cmd/mesh-controller (204 s, with the store-backed tests).
`mesh/repo-check` is red on `TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose` (internal/broker), and this change does not cause it. The test reads the installer's user list from the mesh-host checkout beside this one. mesh-host main already carries the dead-letter grants of issue 330 (mesh-host ccbfa9b), but the controller code that derives them is still on #159, unmerged. I ran that test locally against mesh-host main on this repository's main (7f65e62), without this change, and it fails the same way. It clears once #159 merges; then a recheck of this head should be green. Every other package passed in the check, including cmd/mesh-controller (204 s, with the store-backed tests).
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as build-1791485335973831758 (builds --log build-1791485335973831758).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T18:28:48Z 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-08T18:28:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.093s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.586s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.110s
ok github.com/novox/mesh-controller/internal/artifacts 1.046s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)
genesis_template_test.go:46: the installer's user list lets the controller publish [$JS.ACK.DEAD_LETTER_NOTICES.controller.> mesh.again.> mesh.events.dead.>], which it does not derive
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 5.342s
ok github.com/novox/mesh-controller/internal/builder 10.846s
ok github.com/novox/mesh-controller/internal/catalogue 4.651s
ok github.com/novox/mesh-controller/internal/conditions 2.198s
ok github.com/novox/mesh-controller/internal/envfile 1.026s
ok github.com/novox/mesh-controller/internal/facts 1.028s
ok github.com/novox/mesh-controller/internal/identity 11.442s
ok github.com/novox/mesh-controller/internal/inventory 97.478s
ok github.com/novox/mesh-controller/internal/lease 17.685s
ok github.com/novox/mesh-controller/internal/licences 10.522s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 49.650s
ok github.com/novox/mesh-controller/internal/lint 1.978s
ok github.com/novox/mesh-controller/internal/outward 1.036s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.434s
ok github.com/novox/mesh-controller/internal/store 7.256s
ok github.com/novox/mesh-controller/internal/testbus 1.178s
ok github.com/novox/mesh-controller/internal/token 1.017s
FAIL
**Merge check** at `c15b79aa`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as `build-1791485335973831758` (`builds --log build-1791485335973831758`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T18:28:48Z 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-08T18:28:48Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.093s
ok github.com/novox/mesh-controller/cmd/mesh-controller 216.586s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.110s
ok github.com/novox/mesh-controller/internal/artifacts 1.046s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)
genesis_template_test.go:46: the installer's user list lets the controller publish [$JS.ACK.DEAD_LETTER_NOTICES.controller.> mesh.again.> mesh.events.dead.>], which it does not derive
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 5.342s
ok github.com/novox/mesh-controller/internal/builder 10.846s
ok github.com/novox/mesh-controller/internal/catalogue 4.651s
ok github.com/novox/mesh-controller/internal/conditions 2.198s
ok github.com/novox/mesh-controller/internal/envfile 1.026s
ok github.com/novox/mesh-controller/internal/facts 1.028s
ok github.com/novox/mesh-controller/internal/identity 11.442s
ok github.com/novox/mesh-controller/internal/inventory 97.478s
ok github.com/novox/mesh-controller/internal/lease 17.685s
ok github.com/novox/mesh-controller/internal/licences 10.522s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 49.650s
ok github.com/novox/mesh-controller/internal/lint 1.978s
ok github.com/novox/mesh-controller/internal/outward 1.036s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.434s
ok github.com/novox/mesh-controller/internal/store 7.256s
ok github.com/novox/mesh-controller/internal/testbus 1.178s
ok github.com/novox/mesh-controller/internal/token 1.017s
FAIL
```
A build that passed on its first machine was judged again from that
machine's next reports while its send to the rest waited; another walk's
unreported send there then failed the passed build at the wait's bound
and put it back.
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on ace as build-1791486736684589818 (builds --log build-1791486736684589818).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T19:18:42Z 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-08T19:18:42Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.032s
ok github.com/novox/mesh-controller/cmd/mesh-controller 162.281s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.011s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.011s
ok github.com/novox/mesh-controller/examples/route-proxy 1.114s
ok github.com/novox/mesh-controller/internal/artifacts 1.092s
ok github.com/novox/mesh-controller/internal/broker 2.569s
ok github.com/novox/mesh-controller/internal/builder 1.791s
ok github.com/novox/mesh-controller/internal/catalogue 4.135s
ok github.com/novox/mesh-controller/internal/conditions 2.185s
ok github.com/novox/mesh-controller/internal/envfile 1.070s
ok github.com/novox/mesh-controller/internal/facts 1.074s
ok github.com/novox/mesh-controller/internal/identity 4.116s
ok github.com/novox/mesh-controller/internal/inventory 71.373s
ok github.com/novox/mesh-controller/internal/lease 17.735s
ok github.com/novox/mesh-controller/internal/licences 3.769s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.103s
ok github.com/novox/mesh-controller/internal/link 50.643s
ok github.com/novox/mesh-controller/internal/lint 1.976s
ok github.com/novox/mesh-controller/internal/outward 1.090s
ok github.com/novox/mesh-controller/internal/overlay 1.118s
ok github.com/novox/mesh-controller/internal/secrets 1.454s
ok github.com/novox/mesh-controller/internal/store 3.302s
ok github.com/novox/mesh-controller/internal/testbus 1.245s
ok github.com/novox/mesh-controller/internal/token 1.016s
**Merge check** at `81e5458c`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on ace as `build-1791486736684589818` (`builds --log build-1791486736684589818`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T19:18:42Z 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-08T19:18:42Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.032s
ok github.com/novox/mesh-controller/cmd/mesh-controller 162.281s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.011s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.011s
ok github.com/novox/mesh-controller/examples/route-proxy 1.114s
ok github.com/novox/mesh-controller/internal/artifacts 1.092s
ok github.com/novox/mesh-controller/internal/broker 2.569s
ok github.com/novox/mesh-controller/internal/builder 1.791s
ok github.com/novox/mesh-controller/internal/catalogue 4.135s
ok github.com/novox/mesh-controller/internal/conditions 2.185s
ok github.com/novox/mesh-controller/internal/envfile 1.070s
ok github.com/novox/mesh-controller/internal/facts 1.074s
ok github.com/novox/mesh-controller/internal/identity 4.116s
ok github.com/novox/mesh-controller/internal/inventory 71.373s
ok github.com/novox/mesh-controller/internal/lease 17.735s
ok github.com/novox/mesh-controller/internal/licences 3.769s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.103s
ok github.com/novox/mesh-controller/internal/link 50.643s
ok github.com/novox/mesh-controller/internal/lint 1.976s
ok github.com/novox/mesh-controller/internal/outward 1.090s
ok github.com/novox/mesh-controller/internal/overlay 1.118s
ok github.com/novox/mesh-controller/internal/secrets 1.454s
ok github.com/novox/mesh-controller/internal/store 3.302s
ok github.com/novox/mesh-controller/internal/testbus 1.245s
ok github.com/novox/mesh-controller/internal/token 1.016s
```
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.
hq issue 335: on 2026-10-08 dunst's new build passed its gate on the laptop (healthy 3 times over 2m5s). Twenty-eight minutes later the plan marked it failed at its gate, with the pass's own words as the reason, and put it back.
Cause.
advanceOncerannextRollout(the check of the first machine's report) on every step, also after the gate had passed.nextRolloutthen read the laptop's report as not current and waited. At 30 minutes after the first send (planWaitBound) it returnedfailed: laptop did not report it applied within 30m0s.failFirstSendtook thelen(g.Failing) == 0branch intogateFailed. That kept the passed verdict's why (healthy 3 times over 2m5s), recorded the build as failed and put it back.Fix.
nextRolloutreturns the rest to send once the module's gate has passed. The first machine's later reports are about later sends, not this build.advanceOncereads the step after a carried module takes over its lead's pass (passedWith), so that pass counts too.failFirstSend: a module whose gate passed is never put back. With the two changes above it is not reached. It is there so a path added later cannot overturn a verdict. If reached, the plan stops with the reason, the build is not marked failed, and the module is left a stopped rollout, whichplans retrysends again.Tests.
TestReplay335(replay335_test.go) uses only what the controller had before the fix. It fails on main (laptop did not report it applied within 30m0s, and the passed build reachesgateFailed) and passes here. It is registered as R335 in mesh-lab.TestACarriedModuleTakesItsLeadsPassBeforeItsStepIsReaddrivesadvancePlansover a two-module tier. The lead has passed, the carried module has no gate yet, another send has reached the first machine unreported, and the first send is past the 30-minute bound. It expects the rest sent and nothing put back. With only the reorder reverted it fails: the walk stops on "anchor did not report it applied within 30m0s", caught by the guard.Locally:
gofmtandgo vetare clean.go test ./cmd/mesh-controller/against a throwaway PostgreSQL passes (103 s).Check status.
mesh/repo-checkfails onTestTheInstallersFirstUserListIsWhatTheControllerWouldCompose(internal/broker) until #159 merges. mesh-host main already carries #159's dead-letter grants. This repository's main fails that test the same way.Delivery
novox/mesh-controller@81e5458cbf81— delivered since 2026-10-08T20:04:04ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
becd40bemesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.74s)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791483974074966168(builds --log build-1791483974074966168).mesh/repo-checkis red onTestTheInstallersFirstUserListIsWhatTheControllerWouldCompose(internal/broker), and this change does not cause it. The test reads the installer's user list from the mesh-host checkout beside this one. mesh-host main already carries the dead-letter grants of issue 330 (mesh-host ccbfa9b), but the controller code that derives them is still on #159, unmerged. I ran that test locally against mesh-host main on this repository's main (7f65e62), without this change, and it fails the same way. It clears once #159 merges; then a recheck of this head should be green. Every other package passed in the check, including cmd/mesh-controller (204 s, with the store-backed tests).Merge check at
c15b79aamesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791485335973831758(builds --log build-1791485335973831758).c15b79aa21to81e5458cbfMerge check at
81e5458cmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791486736684589818(builds --log build-1791486736684589818).