Build and register a new module when its merge lands (hq issue 300) #122

Merged
mesh-admin merged 1 commits from fix/a-new-module-is-built-on-merge into main 2026-10-07 21:01:40 +00:00
Contributor

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-admin added 1 commit 2026-10-07 20:39:44 +00:00
Build and register a new module when its merge lands (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/repo-check pass: its merge-check.sh passed
mesh/delivery covered after its stop: a later walk that contains it was delivered: plan-1791658180097457523 (novox/mesh-controller at a2a671ad into main,…
ea09f074db
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.
Author
Contributor

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 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`.
Author
Contributor

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
**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 ```
mesh-admin merged commit e7dca6c280 into main 2026-10-07 21:01:40 +00:00
mesh-admin deleted branch fix/a-new-module-is-built-on-merge 2026-10-07 21:01:41 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#122