Why. A base copied from a public registry (<module>/on-<arg>) was named only in built_against, and nowhere when the build failed, so the sweep could never let one go: 374 unrecorded manifests in 27 repositories. Letting an index go deleted only the index, and its platform manifests kept every byte.
What.
builder: one repository per upstream image, upstream/<host>/<path>; a copy the module's former on- repository holds is copied from the store itself with blobs mounted (MirrorBase), upstream not asked. Result.Mirrored / BuildResult.mirrored is said in every outcome, failed builds too. Source fingerprint unchanged (reads digests).
inventory: migration 0081 artifact_mirrored (+ backfill of every on- reference built_against already names, by its earliest build); RecordBuild records copies; keep reason stood-on = a copy one of the five kept builds of a held module stood on; a definition never keeps a copy; a collected copy stays collected; KeptImages. Copies' repositories draw no build edge.
artifacts/sweep: LetGo of an index deletes the platform manifests no kept index of the repository names, platforms first, index last; a Spare that cannot be read keeps the index; the sweep stops before deleting if the kept images cannot be read.
new verb mirrors (dry run unless confirm + why, hand act): lists recorded copies; records copies no record names, only in a repository the copy step writes and only if the store holds them. Deletes nothing.
Cherry-picks d0e0519 (same change as 7df72ed on feat/plain-notifications): the forge tests failed on main since the catalogue's forge builds npm-registry.
Tests. builder (repository naming, mount from former repo with upstream gone, failed build says what it mirrored), inventory (failed-build copy eligible, stood-on keeps / definition does not, module base not a copy, person's record stands, migration backfill, no edge), artifacts (index with platforms, kept index spares, Gone, unreadable spare keeps), verb (composition, refusal, dry vs real record). merge-check.sh passes locally against a throwaway PostgreSQL.
Do not merge before novox/hq#207. No collection, no recording run: each is the operator's.
hq ADR 0257 / issue 321 (novox/hq#207).
**Why.** A base copied from a public registry (`<module>/on-<arg>`) was named only in `built_against`, and nowhere when the build failed, so the sweep could never let one go: 374 unrecorded manifests in 27 repositories. Letting an index go deleted only the index, and its platform manifests kept every byte.
**What.**
- builder: one repository per upstream image, `upstream/<host>/<path>`; a copy the module's former `on-` repository holds is copied from the store itself with blobs mounted (`MirrorBase`), upstream not asked. `Result.Mirrored` / `BuildResult.mirrored` is said in every outcome, failed builds too. Source fingerprint unchanged (reads digests).
- inventory: migration 0081 `artifact_mirrored` (+ backfill of every `on-` reference `built_against` already names, by its earliest build); `RecordBuild` records copies; keep reason `stood-on` = a copy one of the five kept builds of a held module stood on; a definition never keeps a copy; a collected copy stays collected; `KeptImages`. Copies' repositories draw no build edge.
- artifacts/sweep: `LetGo` of an index deletes the platform manifests no kept index of the repository names, platforms first, index last; a `Spare` that cannot be read keeps the index; the sweep stops before deleting if the kept images cannot be read.
- new verb `mirrors` (dry run unless `confirm` + `why`, hand act): lists recorded copies; records copies no record names, only in a repository the copy step writes and only if the store holds them. Deletes nothing.
- Cherry-picks d0e0519 (same change as 7df72ed on feat/plain-notifications): the forge tests failed on main since the catalogue's forge builds npm-registry.
**Tests.** builder (repository naming, mount from former repo with upstream gone, failed build says what it mirrored), inventory (failed-build copy eligible, stood-on keeps / definition does not, module base not a copy, person's record stands, migration backfill, no edge), artifacts (index with platforms, kept index spares, Gone, unreadable spare keeps), verb (composition, refusal, dry vs real record). `merge-check.sh` passes locally against a throwaway PostgreSQL.
**Do not merge before novox/hq#207.** No collection, no recording run: each is the operator's.
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 3m41s
mesh-controller on the rest running it: sent
build-agent on ace: judging — 0 healthy judging(s) so far
Transitions
2026-10-08 13:47 (new) → proposed (announced): novox/mesh-controller#144's head announced
2026-10-08 13:53 proposed → checked (checked): the verdict names this commit
2026-10-08 13:53 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 14:03 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 14:03 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 14:09 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@c6e372896b10` — **superseded** since 2026-10-08T14:09:45Z
**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 3m41s
- mesh-controller on the rest running it: sent
- build-agent on ace: judging — 0 healthy judging(s) so far
**Transitions**
- 2026-10-08 13:47 (new) → proposed (announced): novox/mesh-controller#144's head announced
- 2026-10-08 13:53 proposed → checked (checked): the verdict names this commit
- 2026-10-08 13:53 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 14:03 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 14:03 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 14:09 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
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-1791461528390342019 (builds --log build-1791461528390342019).
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T11:31:31Z 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-08T11:31:31Z
modules the change moves:
- mesh-controller (changed)
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.036s
ok github.com/novox/mesh-controller/cmd/mesh-controller 174.956s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.030s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.116s
ok github.com/novox/mesh-controller/internal/artifacts 1.055s
ok github.com/novox/mesh-controller/internal/broker 2.815s
ok github.com/novox/mesh-controller/internal/builder 2.613s
ok github.com/novox/mesh-controller/internal/catalogue 4.828s
ok github.com/novox/mesh-controller/internal/conditions 2.374s
ok github.com/novox/mesh-controller/internal/envfile 1.032s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 5.045s
ok github.com/novox/mesh-controller/internal/inventory 86.747s
ok github.com/novox/mesh-controller/internal/lease 17.662s
ok github.com/novox/mesh-controller/internal/licences 4.579s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 46.965s
ok github.com/novox/mesh-controller/internal/lint 2.002s
ok github.com/novox/mesh-controller/internal/outward 1.037s
ok github.com/novox/mesh-controller/internal/overlay 1.019s
ok github.com/novox/mesh-controller/internal/secrets 1.451s
ok github.com/novox/mesh-controller/internal/store 3.365s
ok github.com/novox/mesh-controller/internal/testbus 1.204s
ok github.com/novox/mesh-controller/internal/token 1.022s
**Merge check** at `56597490`
- `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 novox as `build-1791461528390342019` (`builds --log build-1791461528390342019`).
```
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T11:31:31Z 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-08T11:31:31Z
modules the change moves:
- mesh-controller (changed)
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.036s
ok github.com/novox/mesh-controller/cmd/mesh-controller 174.956s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.030s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s
ok github.com/novox/mesh-controller/examples/route-proxy 1.116s
ok github.com/novox/mesh-controller/internal/artifacts 1.055s
ok github.com/novox/mesh-controller/internal/broker 2.815s
ok github.com/novox/mesh-controller/internal/builder 2.613s
ok github.com/novox/mesh-controller/internal/catalogue 4.828s
ok github.com/novox/mesh-controller/internal/conditions 2.374s
ok github.com/novox/mesh-controller/internal/envfile 1.032s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 5.045s
ok github.com/novox/mesh-controller/internal/inventory 86.747s
ok github.com/novox/mesh-controller/internal/lease 17.662s
ok github.com/novox/mesh-controller/internal/licences 4.579s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 46.965s
ok github.com/novox/mesh-controller/internal/lint 2.002s
ok github.com/novox/mesh-controller/internal/outward 1.037s
ok github.com/novox/mesh-controller/internal/overlay 1.019s
ok github.com/novox/mesh-controller/internal/secrets 1.451s
ok github.com/novox/mesh-controller/internal/store 3.365s
ok github.com/novox/mesh-controller/internal/testbus 1.204s
ok github.com/novox/mesh-controller/internal/token 1.022s
```
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 g14 as build-1791463903934971450 (builds --log build-1791463903934971450).
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:46:24Z 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-08T12:46:24Z
modules the change moves:
- mesh-controller (changed)
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.053s
ok github.com/novox/mesh-controller/cmd/mesh-controller 185.815s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.172s
ok github.com/novox/mesh-controller/internal/artifacts 1.053s
ok github.com/novox/mesh-controller/internal/broker 2.567s
ok github.com/novox/mesh-controller/internal/builder 2.955s
ok github.com/novox/mesh-controller/internal/catalogue 4.881s
ok github.com/novox/mesh-controller/internal/conditions 2.353s
ok github.com/novox/mesh-controller/internal/envfile 1.022s
ok github.com/novox/mesh-controller/internal/facts 1.029s
ok github.com/novox/mesh-controller/internal/identity 5.393s
ok github.com/novox/mesh-controller/internal/inventory 85.477s
ok github.com/novox/mesh-controller/internal/lease 17.619s
ok github.com/novox/mesh-controller/internal/licences 4.641s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 46.906s
ok github.com/novox/mesh-controller/internal/lint 2.257s
ok github.com/novox/mesh-controller/internal/outward 1.051s
ok github.com/novox/mesh-controller/internal/overlay 1.036s
ok github.com/novox/mesh-controller/internal/secrets 1.619s
ok github.com/novox/mesh-controller/internal/store 3.523s
ok github.com/novox/mesh-controller/internal/testbus 1.208s
ok github.com/novox/mesh-controller/internal/token 1.023s
**Merge check** at `80a928e4`
- `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 g14 as `build-1791463903934971450` (`builds --log build-1791463903934971450`).
```
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T12:46:24Z 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-08T12:46:24Z
modules the change moves:
- mesh-controller (changed)
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.053s
ok github.com/novox/mesh-controller/cmd/mesh-controller 185.815s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.172s
ok github.com/novox/mesh-controller/internal/artifacts 1.053s
ok github.com/novox/mesh-controller/internal/broker 2.567s
ok github.com/novox/mesh-controller/internal/builder 2.955s
ok github.com/novox/mesh-controller/internal/catalogue 4.881s
ok github.com/novox/mesh-controller/internal/conditions 2.353s
ok github.com/novox/mesh-controller/internal/envfile 1.022s
ok github.com/novox/mesh-controller/internal/facts 1.029s
ok github.com/novox/mesh-controller/internal/identity 5.393s
ok github.com/novox/mesh-controller/internal/inventory 85.477s
ok github.com/novox/mesh-controller/internal/lease 17.619s
ok github.com/novox/mesh-controller/internal/licences 4.641s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 46.906s
ok github.com/novox/mesh-controller/internal/lint 2.257s
ok github.com/novox/mesh-controller/internal/outward 1.051s
ok github.com/novox/mesh-controller/internal/overlay 1.036s
ok github.com/novox/mesh-controller/internal/secrets 1.619s
ok github.com/novox/mesh-controller/internal/store 3.523s
ok github.com/novox/mesh-controller/internal/testbus 1.208s
ok github.com/novox/mesh-controller/internal/token 1.023s
```
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-1791466489229891166 (builds --log build-1791466489229891166).
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T13:34:12Z 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-08T13:34:12Z
modules the change moves:
- mesh-controller (changed)
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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 145.343s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.061s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.044s
ok github.com/novox/mesh-controller/examples/route-proxy 1.143s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
ok github.com/novox/mesh-controller/internal/broker 2.461s
ok github.com/novox/mesh-controller/internal/builder 1.826s
ok github.com/novox/mesh-controller/internal/catalogue 3.999s
ok github.com/novox/mesh-controller/internal/conditions 2.185s
ok github.com/novox/mesh-controller/internal/envfile 1.041s
ok github.com/novox/mesh-controller/internal/facts 1.061s
ok github.com/novox/mesh-controller/internal/identity 4.042s
ok github.com/novox/mesh-controller/internal/inventory 68.931s
ok github.com/novox/mesh-controller/internal/lease 17.679s
ok github.com/novox/mesh-controller/internal/licences 3.683s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.057s
ok github.com/novox/mesh-controller/internal/link 43.692s
ok github.com/novox/mesh-controller/internal/lint 1.894s
ok github.com/novox/mesh-controller/internal/outward 1.071s
ok github.com/novox/mesh-controller/internal/overlay 1.058s
ok github.com/novox/mesh-controller/internal/secrets 1.436s
ok github.com/novox/mesh-controller/internal/store 3.257s
ok github.com/novox/mesh-controller/internal/testbus 1.169s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `1cdd9df5`
- `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-1791466489229891166` (`builds --log build-1791466489229891166`).
```
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T13:34:12Z 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-08T13:34:12Z
modules the change moves:
- mesh-controller (changed)
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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 145.343s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.035s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.061s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.044s
ok github.com/novox/mesh-controller/examples/route-proxy 1.143s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
ok github.com/novox/mesh-controller/internal/broker 2.461s
ok github.com/novox/mesh-controller/internal/builder 1.826s
ok github.com/novox/mesh-controller/internal/catalogue 3.999s
ok github.com/novox/mesh-controller/internal/conditions 2.185s
ok github.com/novox/mesh-controller/internal/envfile 1.041s
ok github.com/novox/mesh-controller/internal/facts 1.061s
ok github.com/novox/mesh-controller/internal/identity 4.042s
ok github.com/novox/mesh-controller/internal/inventory 68.931s
ok github.com/novox/mesh-controller/internal/lease 17.679s
ok github.com/novox/mesh-controller/internal/licences 3.683s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.057s
ok github.com/novox/mesh-controller/internal/link 43.692s
ok github.com/novox/mesh-controller/internal/lint 1.894s
ok github.com/novox/mesh-controller/internal/outward 1.071s
ok github.com/novox/mesh-controller/internal/overlay 1.058s
ok github.com/novox/mesh-controller/internal/secrets 1.436s
ok github.com/novox/mesh-controller/internal/store 3.257s
ok github.com/novox/mesh-controller/internal/testbus 1.169s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
A copied base was named only in what a build stood on, and nowhere when the build failed,
so the store's sweep could never let one go (hq issue 321). One repository per upstream
image stops each module asking the public registry for the same image again, and letting
an index go now takes its own platform manifests, which otherwise kept every byte. A
person can record the copies no record names through the new mirrors verb (hq ADR 0257).
The forge test fix is the same commit as on feat/plain-notifications: main fails without it.
An unrecorded index or a copy in progress can name a platform the records do not see, so
only a person's collect, after its dry run, takes an index's platforms, and only once every
kept index of each repository it touches was read. A copy missing a platform is copied
again, and a copy a build holds again is no longer recorded as collected (review of #144).
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…
Let go of alone after a build, an index's platforms stayed for ever under a record that
said collected, so no later collect could reach them (re-review of #144).
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-1791467274379131301 (builds --log build-1791467274379131301).
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T13:43:12Z 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-08T13:43:12Z
modules the change moves:
- mesh-controller (changed)
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.052s
ok github.com/novox/mesh-controller/cmd/mesh-controller 203.450s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.113s
ok github.com/novox/mesh-controller/internal/artifacts 1.047s
ok github.com/novox/mesh-controller/internal/broker 2.653s
ok github.com/novox/mesh-controller/internal/builder 2.464s
ok github.com/novox/mesh-controller/internal/catalogue 5.022s
ok github.com/novox/mesh-controller/internal/conditions 2.172s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.024s
ok github.com/novox/mesh-controller/internal/identity 4.880s
ok github.com/novox/mesh-controller/internal/inventory 97.853s
ok github.com/novox/mesh-controller/internal/lease 17.682s
ok github.com/novox/mesh-controller/internal/licences 4.418s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 51.050s
ok github.com/novox/mesh-controller/internal/lint 2.134s
ok github.com/novox/mesh-controller/internal/outward 1.038s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.493s
ok github.com/novox/mesh-controller/internal/store 3.442s
ok github.com/novox/mesh-controller/internal/testbus 1.184s
ok github.com/novox/mesh-controller/internal/token 1.015s
**Merge check** at `c6e37289`
- `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 novox as `build-1791467274379131301` (`builds --log build-1791467274379131301`).
```
--- 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T13:43:12Z 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-08T13:43:12Z
modules the change moves:
- mesh-controller (changed)
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.052s
ok github.com/novox/mesh-controller/cmd/mesh-controller 203.450s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.113s
ok github.com/novox/mesh-controller/internal/artifacts 1.047s
ok github.com/novox/mesh-controller/internal/broker 2.653s
ok github.com/novox/mesh-controller/internal/builder 2.464s
ok github.com/novox/mesh-controller/internal/catalogue 5.022s
ok github.com/novox/mesh-controller/internal/conditions 2.172s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.024s
ok github.com/novox/mesh-controller/internal/identity 4.880s
ok github.com/novox/mesh-controller/internal/inventory 97.853s
ok github.com/novox/mesh-controller/internal/lease 17.682s
ok github.com/novox/mesh-controller/internal/licences 4.418s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 51.050s
ok github.com/novox/mesh-controller/internal/lint 2.134s
ok github.com/novox/mesh-controller/internal/outward 1.038s
ok github.com/novox/mesh-controller/internal/overlay 1.028s
ok github.com/novox/mesh-controller/internal/secrets 1.493s
ok github.com/novox/mesh-controller/internal/store 3.442s
ok github.com/novox/mesh-controller/internal/testbus 1.184s
ok github.com/novox/mesh-controller/internal/token 1.015s
```
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 ADR 0257 / issue 321 (novox/hq#207).
Why. A base copied from a public registry (
<module>/on-<arg>) was named only inbuilt_against, and nowhere when the build failed, so the sweep could never let one go: 374 unrecorded manifests in 27 repositories. Letting an index go deleted only the index, and its platform manifests kept every byte.What.
upstream/<host>/<path>; a copy the module's formeron-repository holds is copied from the store itself with blobs mounted (MirrorBase), upstream not asked.Result.Mirrored/BuildResult.mirroredis said in every outcome, failed builds too. Source fingerprint unchanged (reads digests).artifact_mirrored(+ backfill of everyon-referencebuilt_againstalready names, by its earliest build);RecordBuildrecords copies; keep reasonstood-on= a copy one of the five kept builds of a held module stood on; a definition never keeps a copy; a collected copy stays collected;KeptImages. Copies' repositories draw no build edge.LetGoof an index deletes the platform manifests no kept index of the repository names, platforms first, index last; aSparethat cannot be read keeps the index; the sweep stops before deleting if the kept images cannot be read.mirrors(dry run unlessconfirm+why, hand act): lists recorded copies; records copies no record names, only in a repository the copy step writes and only if the store holds them. Deletes nothing.d0e0519(same change as7df72edon feat/plain-notifications): the forge tests failed on main since the catalogue's forge builds npm-registry.Tests. builder (repository naming, mount from former repo with upstream gone, failed build says what it mirrored), inventory (failed-build copy eligible, stood-on keeps / definition does not, module base not a copy, person's record stands, migration backfill, no edge), artifacts (index with platforms, kept index spares, Gone, unreadable spare keeps), verb (composition, refusal, dry vs real record).
merge-check.shpasses locally against a throwaway PostgreSQL.Do not merge before novox/hq#207. No collection, no recording run: each is the operator's.
Delivery
novox/mesh-controller@c6e372896b10— superseded since 2026-10-08T14:09:45ZDelivery 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
56597490mesh/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 novox as
build-1791461528390342019(builds --log build-1791461528390342019).565974901ato80a928e4c1Merge check at
80a928e4mesh/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 g14 as
build-1791463903934971450(builds --log build-1791463903934971450).80a928e4c1to1cdd9df581Merge check at
1cdd9df5mesh/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-1791466489229891166(builds --log build-1791466489229891166).1cdd9df581toc6e372896bMerge check at
c6e37289mesh/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 novox as
build-1791467274379131301(builds --log build-1791467274379131301).