Live case, 2026-10-07. The delivery plan for mesh-catalog #113 said "builds new: modules/systemd-resolved, sent nowhere". At the merge, 20:14:37 UTC, the controller logged "it changed nothing any module the mesh holds is built from". The module was never built or registered, so assign refused it with "no module of that name". It took a hand mesh-controller.build to register it.
Cause.SourceMoved went through whatTheMergeTouched, which keeps only touchedBy's touched modules and drops added. added holds the new module directories that the change plan and the PR check already count as built.
Fix. On a merge, askNewModules asks the build seat for every added directory. It builds at the merged branch, using the repository spelling and seat of the modules already built from it, and does not wait. The build's take-in registers the module, the same way a hand build does. The build runs outside the plan: nothing is assigned, so nothing is sent, and assignment stays a person's act. A merge read as history, or a merge of a branch no module follows, builds nothing new. The touchedBy doc is updated to match.
Not covered (said in the issue). The catch-up for merges the bus skipped (issue 266) still judges only held modules. Counting added there would ask again on every pass until the build lands.
Tests. Both use postgres.
TestAMergeBuildsTheNewModuleItAdds replays the live case: one ask for modules/systemd-resolved at main, and no plan. It fails on the commit before the fix.
TestAMergeBuildsItsNewModuleBesideItsPlan: a merge with a held module and a new one plans the held one and also asks for the new one. A merge that adds no module asks for nothing.
The local MESH_TEST_POSTGRES=… sh merge-check.sh run passed under -race.
Recorded as novox/hq issue 300.
**Live case, 2026-10-07.** The delivery plan for mesh-catalog #113 said "builds new: modules/systemd-resolved, sent nowhere". At the merge, 20:14:37 UTC, the controller logged "it changed nothing any module the mesh holds is built from". The module was never built or registered, so `assign` refused it with "no module of that name". It took a hand `mesh-controller.build` to register it.
**Cause.** `SourceMoved` went through `whatTheMergeTouched`, which keeps only `touchedBy`'s touched modules and drops `added`. `added` holds the new module directories that the change plan and the PR check already count as built.
**Fix.** On a merge, `askNewModules` asks the build seat for every added directory. It builds at the merged branch, using the repository spelling and seat of the modules already built from it, and does not wait. The build's take-in registers the module, the same way a hand `build` does. The build runs outside the plan: nothing is assigned, so nothing is sent, and assignment stays a person's act. A merge read as history, or a merge of a branch no module follows, builds nothing new. The `touchedBy` doc is updated to match.
**Not covered (said in the issue).** The catch-up for merges the bus skipped (issue 266) still judges only held modules. Counting `added` there would ask again on every pass until the build lands.
**Tests.** Both use postgres.
- `TestAMergeBuildsTheNewModuleItAdds` replays the live case: one ask for `modules/systemd-resolved` at main, and no plan. It fails on the commit before the fix.
- `TestAMergeBuildsItsNewModuleBesideItsPlan`: a merge with a held module and a new one plans the held one and also asks for the new one. A merge that adds no module asks for nothing.
The local `MESH_TEST_POSTGRES=… sh merge-check.sh` run passed under `-race`.
Recorded as novox/hq issue 300.
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…
mesh/delivery covered after its stop: a later walk that contains it was delivered: plan-1791658180097457523 (novox/mesh-controller at a2a671ad into main,…
The delivery plan said a merge adding a module builds it, sent nowhere;
the merge built nothing, so the module was never registered and assign
refused it. The merge now asks for the build of every directory it adds,
outside the plan, and the take-in registers it like a hand build.
Deliverynovox/mesh-controller@ea09f074db01 — stopped since 2026-10-08T23:33:01Z
Covered: covered after its stop: a later walk that contains it was delivered: plan-1791658180097457523 (novox/mesh-controller at a2a671ad into main, done, contains its merge e7dca6c2)
Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
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
Transitions
2026-10-07 20:39 (new) → proposed (announced): novox/mesh-controller#122's head announced
2026-10-07 20:49 proposed → checked (checked): the verdict names this commit
2026-10-07 20:49 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-07 21:11 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it
2026-10-08 23:33 held → stopped (stop): covered: its merge e7dca6c280 is contained in cec797e996 which is delivered (walk plan-1791499975016484055); closed on the operator's word 2026-10-09; the held state came from no walk being opened for it — see hq issue to follow
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@ea09f074db01` — **stopped** since 2026-10-08T23:33:01Z
**Covered**: covered after its stop: a later walk that contains it was delivered: plan-1791658180097457523 (novox/mesh-controller at a2a671ad into main, done, contains its merge e7dca6c2)
**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
**Transitions**
- 2026-10-07 20:39 (new) → proposed (announced): novox/mesh-controller#122's head announced
- 2026-10-07 20:49 proposed → checked (checked): the verdict names this commit
- 2026-10-07 20:49 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-07 21:11 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it
- 2026-10-08 23:33 held → stopped (stop): covered: its merge e7dca6c280bd is contained in cec797e996b2 which is delivered (walk plan-1791499975016484055); closed on the operator's word 2026-10-09; the held state came from no walk being opened for it — see hq issue to follow
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 ace as build-1791405595231957982 (builds --log build-1791405595231957982).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T20:27:57Z 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-07T20:27:57Z
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.038s
ok github.com/novox/mesh-controller/cmd/mesh-controller 447.536s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.040s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/route-proxy 1.136s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 2.459s
ok github.com/novox/mesh-controller/internal/builder 1.344s
ok github.com/novox/mesh-controller/internal/catalogue 3.965s
ok github.com/novox/mesh-controller/internal/conditions 1.994s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.037s
ok github.com/novox/mesh-controller/internal/identity 45.217s
ok github.com/novox/mesh-controller/internal/inventory 283.309s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 45.216s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.029s
ok github.com/novox/mesh-controller/internal/link 78.056s
ok github.com/novox/mesh-controller/internal/lint 1.860s
ok github.com/novox/mesh-controller/internal/outward 1.059s
ok github.com/novox/mesh-controller/internal/overlay 1.088s
ok github.com/novox/mesh-controller/internal/secrets 1.442s
ok github.com/novox/mesh-controller/internal/store 11.860s
ok github.com/novox/mesh-controller/internal/testbus 1.250s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `ea09f074`
- `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-1791405595231957982` (`builds --log build-1791405595231957982`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T20:27:57Z 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-07T20:27:57Z
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.038s
ok github.com/novox/mesh-controller/cmd/mesh-controller 447.536s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.040s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/route-proxy 1.136s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 2.459s
ok github.com/novox/mesh-controller/internal/builder 1.344s
ok github.com/novox/mesh-controller/internal/catalogue 3.965s
ok github.com/novox/mesh-controller/internal/conditions 1.994s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.037s
ok github.com/novox/mesh-controller/internal/identity 45.217s
ok github.com/novox/mesh-controller/internal/inventory 283.309s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 45.216s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.029s
ok github.com/novox/mesh-controller/internal/link 78.056s
ok github.com/novox/mesh-controller/internal/lint 1.860s
ok github.com/novox/mesh-controller/internal/outward 1.059s
ok github.com/novox/mesh-controller/internal/overlay 1.088s
ok github.com/novox/mesh-controller/internal/secrets 1.442s
ok github.com/novox/mesh-controller/internal/store 11.860s
ok github.com/novox/mesh-controller/internal/testbus 1.250s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
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.
Live case, 2026-10-07. The delivery plan for mesh-catalog #113 said "builds new: modules/systemd-resolved, sent nowhere". At the merge, 20:14:37 UTC, the controller logged "it changed nothing any module the mesh holds is built from". The module was never built or registered, so
assignrefused it with "no module of that name". It took a handmesh-controller.buildto register it.Cause.
SourceMovedwent throughwhatTheMergeTouched, which keeps onlytouchedBy's touched modules and dropsadded.addedholds the new module directories that the change plan and the PR check already count as built.Fix. On a merge,
askNewModulesasks the build seat for every added directory. It builds at the merged branch, using the repository spelling and seat of the modules already built from it, and does not wait. The build's take-in registers the module, the same way a handbuilddoes. The build runs outside the plan: nothing is assigned, so nothing is sent, and assignment stays a person's act. A merge read as history, or a merge of a branch no module follows, builds nothing new. ThetouchedBydoc is updated to match.Not covered (said in the issue). The catch-up for merges the bus skipped (issue 266) still judges only held modules. Counting
addedthere would ask again on every pass until the build lands.Tests. Both use postgres.
TestAMergeBuildsTheNewModuleItAddsreplays the live case: one ask formodules/systemd-resolvedat main, and no plan. It fails on the commit before the fix.TestAMergeBuildsItsNewModuleBesideItsPlan: a merge with a held module and a new one plans the held one and also asks for the new one. A merge that adds no module asks for nothing.The local
MESH_TEST_POSTGRES=… sh merge-check.shrun passed under-race.Recorded as novox/hq issue 300.
Delivery
novox/mesh-controller@ea09f074db01— stopped since 2026-10-08T23:33:01ZCovered: covered after its stop: a later walk that contains it was delivered: plan-1791658180097457523 (novox/mesh-controller at
a2a671adinto main, done, contains its mergee7dca6c2)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Transitions
e7dca6c280is contained incec797e996which is delivered (walk plan-1791499975016484055); closed on the operator's word 2026-10-09; the held state came from no walk being opened for it — see hq issue to followThe commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
ea09f074mesh/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-1791405595231957982(builds --log build-1791405595231957982).