The review's follow-ups to hq issue 339 (after #168). Do not merge without review.
PEM exception narrowed: lines are taken only in module step-ca, top-level key root, when the value is one or more blocks that encoding/pem decodes with label CERTIFICATE and no headers, x509.ParseCertificate parses, and nothing else surrounds them (no \r). Any other module, key, label, depth or non-certificate is refused like any line break. The co-located tests' fake root is replaced by a real self-signed test certificate (key thrown away).
Every line end refused:\n \r \v \f NUL U+0085 U+2028 U+2029. Keys with one are quoted in the refusal. (I read the review's two blank characters as U+2028 and U+2029, the line and paragraph separators.)
systemPath:/var/spool, /var/lib/docker, /var/lib/containers and /opt are now trees (refused at and below; /opt and /var/spool were refused only as exact paths before), and any path with a .ssh component is refused.
Fail first: on main (522f225) the three new tests failed: another label, base64 that is no certificate, another key, another module and a nested certificate were all accepted; \v \f \u0085 were accepted; /var/spool/cron, /var/lib/docker…, /var/lib/containers/storage, /opt/app and every .ssh were accepted.
No live layer is affected: the 15 layers with places/accesses are under /var/lib/<module>, /mnt/plex, /storage, /data and /home/restic, and no live layer sets step-ca's root (step-ca's consumers fetch its roots over HTTP). The merge gate composes every layer with the stricter line rule.
merge-check.sh passes locally (race-checked, against a throwaway postgres).
The review's follow-ups to hq issue 339 (after #168). Do not merge without review.
- **PEM exception narrowed:** lines are taken only in module `step-ca`, top-level key `root`, when the value is one or more blocks that `encoding/pem` decodes with label `CERTIFICATE` and no headers, `x509.ParseCertificate` parses, and nothing else surrounds them (no `\r`). Any other module, key, label, depth or non-certificate is refused like any line break. The co-located tests' fake root is replaced by a real self-signed test certificate (key thrown away).
- **Every line end refused:** `\n \r \v \f NUL U+0085 U+2028 U+2029`. Keys with one are quoted in the refusal. (I read the review's two blank characters as U+2028 and U+2029, the line and paragraph separators.)
- **systemPath:** `/var/spool`, `/var/lib/docker`, `/var/lib/containers` and `/opt` are now trees (refused at and below; `/opt` and `/var/spool` were refused only as exact paths before), and any path with a `.ssh` component is refused.
**Fail first:** on main (522f225) the three new tests failed: another label, base64 that is no certificate, another key, another module and a nested certificate were all accepted; `\v \f \u0085 ` were accepted; `/var/spool/cron`, `/var/lib/docker…`, `/var/lib/containers/storage`, `/opt/app` and every `.ssh` were accepted.
No live layer is affected: the 15 layers with `places`/`accesses` are under `/var/lib/<module>`, `/mnt/plex`, `/storage`, `/data` and `/home/restic`, and no live layer sets step-ca's `root` (step-ca's consumers fetch its roots over HTTP). The merge gate composes every layer with the stricter line rule.
`merge-check.sh` passes locally (race-checked, against a throwaway postgres).
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…
The review of hq issue 339 found the PEM exception too wide (any module, any
key, any label, anything base64), \v, \f, NEL and the Unicode separators
still let a value end a line in some readers, and the spool, /opt, the
container runtimes' data and an account's .ssh still placeable. Lines are now
taken only in step-ca's root setting, as certificates encoding/pem decodes and
x509 parses; every line end is refused; and those paths are the machine's own.
The test certificate is a real one, made for the tests with its key thrown away.
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 3m39s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 3 times over 3m33s
build-agent on the rest running it: sent
route-proxy on ace: passed — healthy 3 times over 3m39s
route-proxy on the rest running it: sent
Transitions
2026-10-08 23:45 (new) → proposed (announced): novox/mesh-controller#170's head announced
2026-10-08 23:52 proposed → checked (checked): the verdict names this commit
2026-10-08 23:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 23:55 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 23:55 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-09 00:11 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@0f58602c740f` — **delivered** since 2026-10-09T00:11:14Z
**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 3m39s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 3 times over 3m33s
- build-agent on the rest running it: sent
- route-proxy on ace: passed — healthy 3 times over 3m39s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-08 23:45 (new) → proposed (announced): novox/mesh-controller#170's head announced
- 2026-10-08 23:52 proposed → checked (checked): the verdict names this commit
- 2026-10-08 23:52 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 23:55 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 23:55 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-09 00:11 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 shanks as build-1791498555198436098 (builds --log build-1791498555198436098).
--- 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-08T22:22:56Z 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-08T22:22:56Z
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.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 192.526s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.055s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.060s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.029s
ok github.com/novox/mesh-controller/examples/route-proxy 1.232s
ok github.com/novox/mesh-controller/internal/artifacts 1.094s
ok github.com/novox/mesh-controller/internal/broker 2.744s
ok github.com/novox/mesh-controller/internal/builder 2.238s
ok github.com/novox/mesh-controller/internal/catalogue 4.927s
==================
WARNING: DATA RACE
Write at 0x00c000133230 by goroutine 257:
github.com/novox/mesh-controller/internal/conditions.TestAnUnreadableStoreClearsNothing()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:202 +0x2ba
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/usr/local/go/src/testing/testing.go:2101 +0x38
Previous read at 0x00c000133230 by goroutine 258:
github.com/novox/mesh-controller/internal/conditions.(*InMemory).Append()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/memory.go:93 +0xb6
github.com/novox/mesh-controller/internal/conditions.(*Keeper).telling()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:625 +0x4fc
github.com/novox/mesh-controller/internal/conditions.NewKeeper.gowrap1()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:132 +0x2e
Goroutine 257 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/usr/local/go/src/testing/testing.go:2585 +0x84
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.runTests()
/usr/local/go/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/usr/local/go/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:92 +0x164
Goroutine 258 (running) created at:
github.com/novox/mesh-controller/internal/conditions.NewKeeper()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:132 +0x739
github.com/novox/mesh-controller/internal/conditions.keeper()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:21 +0x417
github.com/novox/mesh-controller/internal/conditions.TestAnUnreadableStoreClearsNothing()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:197 +0x3e
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/usr/local/go/src/testing/testing.go:2101 +0x38
==================
--- FAIL: TestAnUnreadableStoreClearsNothing (0.01s)
testing.go:1712: race detected during execution of test
FAIL
FAIL github.com/novox/mesh-controller/internal/conditions 1.253s
ok github.com/novox/mesh-controller/internal/envfile 1.063s
ok github.com/novox/mesh-controller/internal/facts 1.061s
ok github.com/novox/mesh-controller/internal/identity 4.798s
ok github.com/novox/mesh-controller/internal/inventory 84.615s
ok github.com/novox/mesh-controller/internal/lease 17.714s
ok github.com/novox/mesh-controller/internal/licences 4.369s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.042s
ok github.com/novox/mesh-controller/internal/link 53.310s
ok github.com/novox/mesh-controller/internal/lint 2.181s
ok github.com/novox/mesh-controller/internal/outward 1.082s
ok github.com/novox/mesh-controller/internal/overlay 1.092s
ok github.com/novox/mesh-controller/internal/secrets 1.563s
ok github.com/novox/mesh-controller/internal/store 3.541s
ok github.com/novox/mesh-controller/internal/testbus 1.250s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
**Merge check** at `1b502a37`
- `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: TestAnUnreadableStoreClearsNothing (0.01s)
**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 shanks as `build-1791498555198436098` (`builds --log build-1791498555198436098`).
```
--- 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-08T22:22:56Z 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-08T22:22:56Z
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.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 192.526s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.055s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.060s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.029s
ok github.com/novox/mesh-controller/examples/route-proxy 1.232s
ok github.com/novox/mesh-controller/internal/artifacts 1.094s
ok github.com/novox/mesh-controller/internal/broker 2.744s
ok github.com/novox/mesh-controller/internal/builder 2.238s
ok github.com/novox/mesh-controller/internal/catalogue 4.927s
==================
WARNING: DATA RACE
Write at 0x00c000133230 by goroutine 257:
github.com/novox/mesh-controller/internal/conditions.TestAnUnreadableStoreClearsNothing()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:202 +0x2ba
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/usr/local/go/src/testing/testing.go:2101 +0x38
Previous read at 0x00c000133230 by goroutine 258:
github.com/novox/mesh-controller/internal/conditions.(*InMemory).Append()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/memory.go:93 +0xb6
github.com/novox/mesh-controller/internal/conditions.(*Keeper).telling()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:625 +0x4fc
github.com/novox/mesh-controller/internal/conditions.NewKeeper.gowrap1()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:132 +0x2e
Goroutine 257 (running) created at:
testing.(*T).Run()
/usr/local/go/src/testing/testing.go:2101 +0xb12
testing.runTests.func1()
/usr/local/go/src/testing/testing.go:2585 +0x84
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.runTests()
/usr/local/go/src/testing/testing.go:2583 +0x9e9
testing.(*M).Run()
/usr/local/go/src/testing/testing.go:2443 +0xf4b
main.main()
_testmain.go:92 +0x164
Goroutine 258 (running) created at:
github.com/novox/mesh-controller/internal/conditions.NewKeeper()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store.go:132 +0x739
github.com/novox/mesh-controller/internal/conditions.keeper()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:21 +0x417
github.com/novox/mesh-controller/internal/conditions.TestAnUnreadableStoreClearsNothing()
/var/lib/build-agent/workspace/check/mesh-controller/internal/conditions/store_test.go:197 +0x3e
testing.tRunner()
/usr/local/go/src/testing/testing.go:2036 +0x21c
testing.(*T).Run.gowrap1()
/usr/local/go/src/testing/testing.go:2101 +0x38
==================
--- FAIL: TestAnUnreadableStoreClearsNothing (0.01s)
testing.go:1712: race detected during execution of test
FAIL
FAIL github.com/novox/mesh-controller/internal/conditions 1.253s
ok github.com/novox/mesh-controller/internal/envfile 1.063s
ok github.com/novox/mesh-controller/internal/facts 1.061s
ok github.com/novox/mesh-controller/internal/identity 4.798s
ok github.com/novox/mesh-controller/internal/inventory 84.615s
ok github.com/novox/mesh-controller/internal/lease 17.714s
ok github.com/novox/mesh-controller/internal/licences 4.369s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.042s
ok github.com/novox/mesh-controller/internal/link 53.310s
ok github.com/novox/mesh-controller/internal/lint 2.181s
ok github.com/novox/mesh-controller/internal/outward 1.082s
ok github.com/novox/mesh-controller/internal/overlay 1.092s
ok github.com/novox/mesh-controller/internal/secrets 1.563s
ok github.com/novox/mesh-controller/internal/store 3.541s
ok github.com/novox/mesh-controller/internal/testbus 1.250s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
```
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…
TestAnUnreadableStoreClearsNothing wrote InMemory.Fail and its values unguarded
while the keeper's teller appended to the same store, and the race detector
failed mesh/repo-check on #170 (a test race on main, not the change).
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-1791499099436590718 (builds --log build-1791499099436590718).
--- 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-08T22:31:56Z 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-08T22:31:56Z
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 187.195s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.022s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.214s
ok github.com/novox/mesh-controller/internal/artifacts 1.050s
ok github.com/novox/mesh-controller/internal/broker 2.461s
ok github.com/novox/mesh-controller/internal/builder 1.798s
ok github.com/novox/mesh-controller/internal/catalogue 4.208s
ok github.com/novox/mesh-controller/internal/conditions 2.108s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.030s
ok github.com/novox/mesh-controller/internal/identity 3.993s
ok github.com/novox/mesh-controller/internal/inventory 71.243s
ok github.com/novox/mesh-controller/internal/lease 17.667s
ok github.com/novox/mesh-controller/internal/licences 3.641s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 51.322s
ok github.com/novox/mesh-controller/internal/lint 1.873s
ok github.com/novox/mesh-controller/internal/outward 1.033s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.390s
ok github.com/novox/mesh-controller/internal/store 3.159s
ok github.com/novox/mesh-controller/internal/testbus 1.173s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `0f1e1b09`
- `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-1791499099436590718` (`builds --log build-1791499099436590718`).
```
--- 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-08T22:31:56Z 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-08T22:31:56Z
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 187.195s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.022s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.214s
ok github.com/novox/mesh-controller/internal/artifacts 1.050s
ok github.com/novox/mesh-controller/internal/broker 2.461s
ok github.com/novox/mesh-controller/internal/builder 1.798s
ok github.com/novox/mesh-controller/internal/catalogue 4.208s
ok github.com/novox/mesh-controller/internal/conditions 2.108s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.030s
ok github.com/novox/mesh-controller/internal/identity 3.993s
ok github.com/novox/mesh-controller/internal/inventory 71.243s
ok github.com/novox/mesh-controller/internal/lease 17.667s
ok github.com/novox/mesh-controller/internal/licences 3.641s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 51.322s
ok github.com/novox/mesh-controller/internal/lint 1.873s
ok github.com/novox/mesh-controller/internal/outward 1.033s
ok github.com/novox/mesh-controller/internal/overlay 1.022s
ok github.com/novox/mesh-controller/internal/secrets 1.390s
ok github.com/novox/mesh-controller/internal/store 3.159s
ok github.com/novox/mesh-controller/internal/testbus 1.173s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
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…
The review of #170: step-ca's root, roots and path and the identity
provider's issuer are what every consumer trusts, and any caller of the
settings verb could replace them; they are now terminal keys like places and
accesses (hq issue 339). /var/lib/containerd joins the runtimes' data. And a
directory the node-engine uses as found failed its module's gate and rolled
its builds back; found before the send, it is now a wait for a person the
gate passes with, as a relogin is (ADR 0254), and only one the send itself
found holds the module.
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-1791500248202624874 (builds --log build-1791500248202624874).
--- 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-08T22:54: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-08T22:54: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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 188.998s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.218s
ok github.com/novox/mesh-controller/internal/artifacts 1.038s
ok github.com/novox/mesh-controller/internal/broker 2.583s
ok github.com/novox/mesh-controller/internal/builder 2.596s
ok github.com/novox/mesh-controller/internal/catalogue 4.104s
ok github.com/novox/mesh-controller/internal/conditions 2.112s
ok github.com/novox/mesh-controller/internal/envfile 1.021s
ok github.com/novox/mesh-controller/internal/facts 1.024s
ok github.com/novox/mesh-controller/internal/identity 4.509s
ok github.com/novox/mesh-controller/internal/inventory 71.841s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 4.204s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 50.736s
ok github.com/novox/mesh-controller/internal/lint 1.865s
ok github.com/novox/mesh-controller/internal/outward 1.032s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.395s
ok github.com/novox/mesh-controller/internal/store 3.183s
ok github.com/novox/mesh-controller/internal/testbus 1.171s
ok github.com/novox/mesh-controller/internal/token 1.018s
**Merge check** at `ec7b8bcd`
- `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-1791500248202624874` (`builds --log build-1791500248202624874`).
```
--- 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-08T22:54: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-08T22:54: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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 188.998s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.218s
ok github.com/novox/mesh-controller/internal/artifacts 1.038s
ok github.com/novox/mesh-controller/internal/broker 2.583s
ok github.com/novox/mesh-controller/internal/builder 2.596s
ok github.com/novox/mesh-controller/internal/catalogue 4.104s
ok github.com/novox/mesh-controller/internal/conditions 2.112s
ok github.com/novox/mesh-controller/internal/envfile 1.021s
ok github.com/novox/mesh-controller/internal/facts 1.024s
ok github.com/novox/mesh-controller/internal/identity 4.509s
ok github.com/novox/mesh-controller/internal/inventory 71.841s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 4.204s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 50.736s
ok github.com/novox/mesh-controller/internal/lint 1.865s
ok github.com/novox/mesh-controller/internal/outward 1.032s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.395s
ok github.com/novox/mesh-controller/internal/store 3.183s
ok github.com/novox/mesh-controller/internal/testbus 1.171s
ok github.com/novox/mesh-controller/internal/token 1.018s
```
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…
The third review of #170 (hq issue 339): a setting overrides any key a
provider serves, so any caller of the settings verb could move a database's
port, a registry's port or an issuer to a listener of its own and collect
what consumers present. TerminalKeys now derives from the manifest: places,
accesses, every served key and every setting a served value asks for, and
every setting a file marked `trusted` asks for. `trusted` is the catalogue's
word, taken out before the declaration; `module check` warns of a file that
asks for a setting without saying, and refuses it from 2026-10-30. The hand
list is gone. A directory used as found is now its own condition kind, the
operator's, never urgent, and the gate exempts it where it exempts a relogin.
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-1791501851110737152 (builds --log build-1791501851110737152).
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:23: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-08T23:23: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.058s
ok github.com/novox/mesh-controller/cmd/mesh-controller 214.276s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.022s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/route-proxy 1.133s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 2.989s
ok github.com/novox/mesh-controller/internal/builder 2.601s
ok github.com/novox/mesh-controller/internal/catalogue 5.112s
ok github.com/novox/mesh-controller/internal/conditions 2.224s
ok github.com/novox/mesh-controller/internal/envfile 1.027s
ok github.com/novox/mesh-controller/internal/facts 1.035s
ok github.com/novox/mesh-controller/internal/identity 4.805s
ok github.com/novox/mesh-controller/internal/inventory 91.480s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 4.359s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 53.893s
ok github.com/novox/mesh-controller/internal/lint 2.126s
ok github.com/novox/mesh-controller/internal/outward 1.039s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.453s
ok github.com/novox/mesh-controller/internal/store 3.322s
ok github.com/novox/mesh-controller/internal/testbus 1.194s
ok github.com/novox/mesh-controller/internal/token 1.014s
**Merge check** at `b9fc09c3`
- `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-1791501851110737152` (`builds --log build-1791501851110737152`).
```
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:23: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-08T23:23: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.058s
ok github.com/novox/mesh-controller/cmd/mesh-controller 214.276s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.022s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/route-proxy 1.133s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 2.989s
ok github.com/novox/mesh-controller/internal/builder 2.601s
ok github.com/novox/mesh-controller/internal/catalogue 5.112s
ok github.com/novox/mesh-controller/internal/conditions 2.224s
ok github.com/novox/mesh-controller/internal/envfile 1.027s
ok github.com/novox/mesh-controller/internal/facts 1.035s
ok github.com/novox/mesh-controller/internal/identity 4.805s
ok github.com/novox/mesh-controller/internal/inventory 91.480s
ok github.com/novox/mesh-controller/internal/lease 17.692s
ok github.com/novox/mesh-controller/internal/licences 4.359s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s
ok github.com/novox/mesh-controller/internal/link 53.893s
ok github.com/novox/mesh-controller/internal/lint 2.126s
ok github.com/novox/mesh-controller/internal/outward 1.039s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.453s
ok github.com/novox/mesh-controller/internal/store 3.322s
ok github.com/novox/mesh-controller/internal/testbus 1.194s
ok github.com/novox/mesh-controller/internal/token 1.014s
```
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/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…
The fourth review (hq issue 339): the safe reading of a file that asks for a
setting and does not say is that root or a consumer trusts it, so its
settings are the terminal's; `"trusted": false` is the opt-out. With that,
nothing unsafe is left to refuse: `module check` lists and counts the
unmarked files and never refuses them.
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-1791502667821291286 (builds --log build-1791502667821291286).
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:38:08Z 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-08T23:38:08Z
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.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 166.036s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.107s
ok github.com/novox/mesh-controller/internal/artifacts 1.041s
ok github.com/novox/mesh-controller/internal/broker 2.531s
ok github.com/novox/mesh-controller/internal/builder 1.838s
ok github.com/novox/mesh-controller/internal/catalogue 4.308s
ok github.com/novox/mesh-controller/internal/conditions 2.177s
ok github.com/novox/mesh-controller/internal/envfile 1.053s
ok github.com/novox/mesh-controller/internal/facts 1.075s
ok github.com/novox/mesh-controller/internal/identity 4.065s
ok github.com/novox/mesh-controller/internal/inventory 71.067s
ok github.com/novox/mesh-controller/internal/lease 17.678s
ok github.com/novox/mesh-controller/internal/licences 3.715s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.048s
ok github.com/novox/mesh-controller/internal/link 50.742s
ok github.com/novox/mesh-controller/internal/lint 1.985s
ok github.com/novox/mesh-controller/internal/outward 1.096s
ok github.com/novox/mesh-controller/internal/overlay 1.065s
ok github.com/novox/mesh-controller/internal/secrets 1.435s
ok github.com/novox/mesh-controller/internal/store 3.304s
ok github.com/novox/mesh-controller/internal/testbus 1.175s
ok github.com/novox/mesh-controller/internal/token 1.016s
**Merge check** at `c3ae3f3e`
- `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-1791502667821291286` (`builds --log build-1791502667821291286`).
```
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:38:08Z 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-08T23:38:08Z
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.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 166.036s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.107s
ok github.com/novox/mesh-controller/internal/artifacts 1.041s
ok github.com/novox/mesh-controller/internal/broker 2.531s
ok github.com/novox/mesh-controller/internal/builder 1.838s
ok github.com/novox/mesh-controller/internal/catalogue 4.308s
ok github.com/novox/mesh-controller/internal/conditions 2.177s
ok github.com/novox/mesh-controller/internal/envfile 1.053s
ok github.com/novox/mesh-controller/internal/facts 1.075s
ok github.com/novox/mesh-controller/internal/identity 4.065s
ok github.com/novox/mesh-controller/internal/inventory 71.067s
ok github.com/novox/mesh-controller/internal/lease 17.678s
ok github.com/novox/mesh-controller/internal/licences 3.715s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.048s
ok github.com/novox/mesh-controller/internal/link 50.742s
ok github.com/novox/mesh-controller/internal/lint 1.985s
ok github.com/novox/mesh-controller/internal/outward 1.096s
ok github.com/novox/mesh-controller/internal/overlay 1.065s
ok github.com/novox/mesh-controller/internal/secrets 1.435s
ok github.com/novox/mesh-controller/internal/store 3.304s
ok github.com/novox/mesh-controller/internal/testbus 1.175s
ok github.com/novox/mesh-controller/internal/token 1.016s
```
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-1791503123620043752 (builds --log build-1791503123620043752).
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:38:08Z 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-08T23:38:08Z
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 188.265s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.201s
ok github.com/novox/mesh-controller/internal/artifacts 1.041s
ok github.com/novox/mesh-controller/internal/broker 2.466s
ok github.com/novox/mesh-controller/internal/builder 1.791s
ok github.com/novox/mesh-controller/internal/catalogue 4.197s
ok github.com/novox/mesh-controller/internal/conditions 2.109s
ok github.com/novox/mesh-controller/internal/envfile 1.030s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 4.047s
ok github.com/novox/mesh-controller/internal/inventory 71.023s
ok github.com/novox/mesh-controller/internal/lease 17.714s
ok github.com/novox/mesh-controller/internal/licences 3.637s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 50.763s
ok github.com/novox/mesh-controller/internal/lint 1.861s
ok github.com/novox/mesh-controller/internal/outward 1.035s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.420s
ok github.com/novox/mesh-controller/internal/store 3.135s
ok github.com/novox/mesh-controller/internal/testbus 1.171s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `0f58602c`
- `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-1791503123620043752` (`builds --log build-1791503123620043752`).
```
--- 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T23:38:08Z 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-08T23:38:08Z
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 188.265s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.201s
ok github.com/novox/mesh-controller/internal/artifacts 1.041s
ok github.com/novox/mesh-controller/internal/broker 2.466s
ok github.com/novox/mesh-controller/internal/builder 1.791s
ok github.com/novox/mesh-controller/internal/catalogue 4.197s
ok github.com/novox/mesh-controller/internal/conditions 2.109s
ok github.com/novox/mesh-controller/internal/envfile 1.030s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 4.047s
ok github.com/novox/mesh-controller/internal/inventory 71.023s
ok github.com/novox/mesh-controller/internal/lease 17.714s
ok github.com/novox/mesh-controller/internal/licences 3.637s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 50.763s
ok github.com/novox/mesh-controller/internal/lint 1.861s
ok github.com/novox/mesh-controller/internal/outward 1.035s
ok github.com/novox/mesh-controller/internal/overlay 1.029s
ok github.com/novox/mesh-controller/internal/secrets 1.420s
ok github.com/novox/mesh-controller/internal/store 3.135s
ok github.com/novox/mesh-controller/internal/testbus 1.171s
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.
The review's follow-ups to hq issue 339 (after #168). Do not merge without review.
step-ca, top-level keyroot, when the value is one or more blocks thatencoding/pemdecodes with labelCERTIFICATEand no headers,x509.ParseCertificateparses, and nothing else surrounds them (no\r). Any other module, key, label, depth or non-certificate is refused like any line break. The co-located tests' fake root is replaced by a real self-signed test certificate (key thrown away).\n \r \v \f NUL U+0085 U+2028 U+2029. Keys with one are quoted in the refusal. (I read the review's two blank characters as U+2028 and U+2029, the line and paragraph separators.)/var/spool,/var/lib/docker,/var/lib/containersand/optare now trees (refused at and below;/optand/var/spoolwere refused only as exact paths before), and any path with a.sshcomponent is refused.Fail first: on main (
522f225) the three new tests failed: another label, base64 that is no certificate, another key, another module and a nested certificate were all accepted;\v \f \u0085were accepted;/var/spool/cron,/var/lib/docker…,/var/lib/containers/storage,/opt/appand every.sshwere accepted.No live layer is affected: the 15 layers with
places/accessesare under/var/lib/<module>,/mnt/plex,/storage,/dataand/home/restic, and no live layer sets step-ca'sroot(step-ca's consumers fetch its roots over HTTP). The merge gate composes every layer with the stricter line rule.merge-check.shpasses locally (race-checked, against a throwaway postgres).Delivery
novox/mesh-controller@0f58602c740f— delivered since 2026-10-09T00:11:14ZDelivery 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
1b502a37mesh/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: TestAnUnreadableStoreClearsNothing (0.01s)Delivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791498555198436098(builds --log build-1791498555198436098).Merge check at
0f1e1b09mesh/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-1791499099436590718(builds --log build-1791499099436590718).Merge check at
ec7b8bcdmesh/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-1791500248202624874(builds --log build-1791500248202624874).Merge check at
b9fc09c3mesh/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-1791501851110737152(builds --log build-1791501851110737152).Merge check at
c3ae3f3emesh/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-1791502667821291286(builds --log build-1791502667821291286).Merge check at
0f58602cmesh/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-1791503123620043752(builds --log build-1791503123620043752).