Builds novox/hq ADR 0169 on the controller's side. Merge first of the group feat/a-machine-joins-through-the-tunnel (mesh-controller → mesh-host → mesh-lab).
token issue --overlay-key <key>: records the machine's tunnel key, binds the token to it, assigns its address and pushes the hub with the machine as a peer before the token is shown. The token carries the hub's endpoint and key, the machine's address and the range, and the bus at its holder's address on the private network (the hub's when no holder is recorded). Enrolment refuses any other key.
The hub carries a joining machine while its token is live; an expired, unused token's peer goes at the hub's next composition.
A token verb on the controller's seat, with replaces: ["mesh-controller token issue", "wg set"] (ADR 0245); adopted is a switch; the manifest serves it.
The verb's answer is never kept in the calls kept on the bus (calls answers anyone who may call the seat): withheld on the bus always, held in memory only when the caller was told the call was still running.
Migration renumbered 0055 → 0079 (0078 is the ADR 0217 work).
Rebase onto main: one conflict, the imports of cmd/mesh-controller/nodes.go. The second commit of the old branch (a node is given how it hears its declarations as it enrols, hq issue 146) is dropped: main asserts every node's declaration consumer before every send (issue 208, assertOnSend), and D6/H3 re-assert a missing one, so it would be a second list of what the bus should hold. hq PR records why.
A token without a key stays: it is how the machine that runs the bus joins its own mesh at genesis. The ADR's row a token is refused without a tunnel key is therefore not built as written; every other machine can only join with a key, since the bus is no longer public.
Tests:sh merge-check.sh with MESH_TEST_POSTGRES, under -race: pass. New: the hub's peers with a live/expired/keyless token, a non-key refused before anything is recorded, the token's tunnel round trip, enrolment refusing another key, the token answer not kept.
Lab: mesh-lab's new joins-through-the-tunnel bed, run on this branch's image: a first node raised from the NATS bundle joins on loopback and becomes the hub; a second machine makes its key, is issued a token, and enrols over the tunnel with the bus's port (5671) closed to its own address. Both tests pass. The test of the hub being pushed before the token is shown is in code order only (it needs a bus to test).
Builds novox/hq ADR 0169 on the controller's side. **Merge first** of the group `feat/a-machine-joins-through-the-tunnel` (mesh-controller → mesh-host → mesh-lab).
- `token issue --overlay-key <key>`: records the machine's tunnel key, binds the token to it, assigns its address and pushes the hub with the machine as a peer **before** the token is shown. The token carries the hub's endpoint and key, the machine's address and the range, and the bus at its holder's address on the private network (the hub's when no holder is recorded). Enrolment refuses any other key.
- The hub carries a joining machine while its token is live; an expired, unused token's peer goes at the hub's next composition.
- A `token` verb on the controller's seat, with `replaces: ["mesh-controller token issue", "wg set"]` (ADR 0245); `adopted` is a switch; the manifest serves it.
- The verb's answer is **never kept** in the calls kept on the bus (`calls` answers anyone who may call the seat): withheld on the bus always, held in memory only when the caller was told the call was still running.
- Migration renumbered **0055 → 0079** (0078 is the ADR 0217 work).
**Rebase onto main:** one conflict, the imports of `cmd/mesh-controller/nodes.go`. The second commit of the old branch (*a node is given how it hears its declarations as it enrols*, hq issue 146) is **dropped**: main asserts every node's declaration consumer before every send (issue 208, `assertOnSend`), and D6/H3 re-assert a missing one, so it would be a second list of what the bus should hold. hq PR records why.
A token without a key stays: it is how the machine that runs the bus joins its own mesh at genesis. The ADR's row *a token is refused without a tunnel key* is therefore not built as written; every other machine can only join with a key, since the bus is no longer public.
**Tests:** `sh merge-check.sh` with `MESH_TEST_POSTGRES`, under `-race`: pass. New: the hub's peers with a live/expired/keyless token, a non-key refused before anything is recorded, the token's tunnel round trip, enrolment refusing another key, the token answer not kept.
**Lab:** mesh-lab's new `joins-through-the-tunnel` bed, run on this branch's image: a first node raised from the NATS bundle joins on loopback and becomes the hub; a second machine makes its key, is issued a token, and enrols over the tunnel with the bus's port (5671) closed to its own address. Both tests pass. The test of the hub being pushed *before* the token is shown is in code order only (it needs a bus to test).
mesh-controller on novox: passed — healthy 3 times over 4m13s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 3 times over 3m34s
build-agent on the rest running it: sent
route-proxy on ace: passed — healthy 3 times over 3m30s
route-proxy on the rest running it: sent
Transitions
2026-10-08 00:06 (new) → proposed (announced): novox/mesh-controller#132's head announced
2026-10-08 00:30 proposed → checked (checked): the verdict names this commit
2026-10-08 00:30 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 08:23 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 08:23 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 08:41 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@8bbfdb53db2b` — **delivered** since 2026-10-08T08:41:12Z
**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
**Group** `feat/a-machine-joins-through-the-tunnel`, in order: novox/mesh-lab@e80a4b1642bf
- novox/mesh-controller@8bbfdb53db2b before novox/mesh-host@86cbebd10f8a: built by
- novox/mesh-host@86cbebd10f8a before novox/mesh-controller@8bbfdb53db2b: engine before controller
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 4m13s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 3 times over 3m34s
- build-agent on the rest running it: sent
- route-proxy on ace: passed — healthy 3 times over 3m30s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-08 00:06 (new) → proposed (announced): novox/mesh-controller#132's head announced
- 2026-10-08 00:30 proposed → checked (checked): the verdict names this commit
- 2026-10-08 00:30 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 08:23 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 08:23 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 08:41 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 ace as build-1791417424489091535 (builds --log build-1791417424489091535).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-07T23:44: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-07T23:44: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.030s
ok github.com/novox/mesh-controller/cmd/mesh-controller 418.689s
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.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.109s
ok github.com/novox/mesh-controller/internal/artifacts 1.029s
ok github.com/novox/mesh-controller/internal/broker 2.409s
ok github.com/novox/mesh-controller/internal/builder 1.341s
ok github.com/novox/mesh-controller/internal/catalogue 3.759s
ok github.com/novox/mesh-controller/internal/conditions 2.004s
ok github.com/novox/mesh-controller/internal/envfile 1.058s
ok github.com/novox/mesh-controller/internal/facts 1.055s
ok github.com/novox/mesh-controller/internal/identity 42.274s
ok github.com/novox/mesh-controller/internal/inventory 245.849s
ok github.com/novox/mesh-controller/internal/lease 17.723s
ok github.com/novox/mesh-controller/internal/licences 38.665s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.051s
ok github.com/novox/mesh-controller/internal/link 77.626s
ok github.com/novox/mesh-controller/internal/lint 1.801s
ok github.com/novox/mesh-controller/internal/outward 1.107s
ok github.com/novox/mesh-controller/internal/overlay 1.095s
ok github.com/novox/mesh-controller/internal/secrets 1.403s
ok github.com/novox/mesh-controller/internal/store 10.282s
ok github.com/novox/mesh-controller/internal/testbus 1.214s
ok github.com/novox/mesh-controller/internal/token 1.015s
**Merge check** at `2d6c2345`
- `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-1791417424489091535` (`builds --log build-1791417424489091535`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-07T23:44: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-07T23:44: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.030s
ok github.com/novox/mesh-controller/cmd/mesh-controller 418.689s
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.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.109s
ok github.com/novox/mesh-controller/internal/artifacts 1.029s
ok github.com/novox/mesh-controller/internal/broker 2.409s
ok github.com/novox/mesh-controller/internal/builder 1.341s
ok github.com/novox/mesh-controller/internal/catalogue 3.759s
ok github.com/novox/mesh-controller/internal/conditions 2.004s
ok github.com/novox/mesh-controller/internal/envfile 1.058s
ok github.com/novox/mesh-controller/internal/facts 1.055s
ok github.com/novox/mesh-controller/internal/identity 42.274s
ok github.com/novox/mesh-controller/internal/inventory 245.849s
ok github.com/novox/mesh-controller/internal/lease 17.723s
ok github.com/novox/mesh-controller/internal/licences 38.665s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.051s
ok github.com/novox/mesh-controller/internal/link 77.626s
ok github.com/novox/mesh-controller/internal/lint 1.801s
ok github.com/novox/mesh-controller/internal/outward 1.107s
ok github.com/novox/mesh-controller/internal/overlay 1.095s
ok github.com/novox/mesh-controller/internal/secrets 1.403s
ok github.com/novox/mesh-controller/internal/store 10.282s
ok github.com/novox/mesh-controller/internal/testbus 1.214s
ok github.com/novox/mesh-controller/internal/token 1.015s
```
token issue --overlay-key records the key the machine made, binds the
token to it, gives the machine its address and makes it a peer of the
hub, pushing the hub before the token is shown. The token carries the
hub's tunnel and the bus at its holder's address on the private network,
and enrolment refuses any other key (novox/hq ADR 0169). The bus is no
longer public, so a machine outside the mesh can join only this way; a
token without a key is still what the machine running the bus joins its
own mesh with. Also a token verb, which says it replaces running the
command by hand and adding a peer to the hub with wg.
The calls the controller serves are kept on the bus with their answers,
and calls answers anyone who may call its seat. A token is the one-time
right to become a machine of the mesh, so the token verb's answer is kept
as withheld (novox/hq ADR 0169).
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 rows of novox/hq ADR 0169's table the controller answers for: the
hub's composed tunnel carries a machine whose live token was issued for
its key, drops it when the token expires unused, and nothing is recorded
for something that is not a tunnel key.
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-1791418900689973185 (builds --log build-1791418900689973185).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-08T00:17:39Z 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-08T00:17:39Z
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.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 428.143s
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.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.107s
ok github.com/novox/mesh-controller/internal/artifacts 1.026s
ok github.com/novox/mesh-controller/internal/broker 2.392s
ok github.com/novox/mesh-controller/internal/builder 1.372s
ok github.com/novox/mesh-controller/internal/catalogue 3.771s
ok github.com/novox/mesh-controller/internal/conditions 2.052s
ok github.com/novox/mesh-controller/internal/envfile 1.079s
ok github.com/novox/mesh-controller/internal/facts 1.081s
ok github.com/novox/mesh-controller/internal/identity 39.675s
ok github.com/novox/mesh-controller/internal/inventory 252.937s
ok github.com/novox/mesh-controller/internal/lease 17.739s
ok github.com/novox/mesh-controller/internal/licences 38.544s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.076s
ok github.com/novox/mesh-controller/internal/link 75.221s
ok github.com/novox/mesh-controller/internal/lint 1.838s
ok github.com/novox/mesh-controller/internal/outward 1.145s
ok github.com/novox/mesh-controller/internal/overlay 1.091s
ok github.com/novox/mesh-controller/internal/secrets 1.482s
ok github.com/novox/mesh-controller/internal/store 9.953s
ok github.com/novox/mesh-controller/internal/testbus 1.163s
ok github.com/novox/mesh-controller/internal/token 1.016s
**Merge check** at `8bbfdb53`
- `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-1791418900689973185` (`builds --log build-1791418900689973185`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-08T00:17:39Z 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-08T00:17:39Z
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.034s
ok github.com/novox/mesh-controller/cmd/mesh-controller 428.143s
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.014s
ok github.com/novox/mesh-controller/examples/route-proxy 1.107s
ok github.com/novox/mesh-controller/internal/artifacts 1.026s
ok github.com/novox/mesh-controller/internal/broker 2.392s
ok github.com/novox/mesh-controller/internal/builder 1.372s
ok github.com/novox/mesh-controller/internal/catalogue 3.771s
ok github.com/novox/mesh-controller/internal/conditions 2.052s
ok github.com/novox/mesh-controller/internal/envfile 1.079s
ok github.com/novox/mesh-controller/internal/facts 1.081s
ok github.com/novox/mesh-controller/internal/identity 39.675s
ok github.com/novox/mesh-controller/internal/inventory 252.937s
ok github.com/novox/mesh-controller/internal/lease 17.739s
ok github.com/novox/mesh-controller/internal/licences 38.544s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.076s
ok github.com/novox/mesh-controller/internal/link 75.221s
ok github.com/novox/mesh-controller/internal/lint 1.838s
ok github.com/novox/mesh-controller/internal/outward 1.145s
ok github.com/novox/mesh-controller/internal/overlay 1.091s
ok github.com/novox/mesh-controller/internal/secrets 1.482s
ok github.com/novox/mesh-controller/internal/store 9.953s
ok github.com/novox/mesh-controller/internal/testbus 1.163s
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-1791418000320743455 (builds --log build-1791418000320743455).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-08T00:39:30Z 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-08T00:39:30Z
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.031s
ok github.com/novox/mesh-controller/cmd/mesh-controller 200.517s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.150s
ok github.com/novox/mesh-controller/internal/artifacts 1.035s
ok github.com/novox/mesh-controller/internal/broker 2.315s
ok github.com/novox/mesh-controller/internal/builder 1.235s
ok github.com/novox/mesh-controller/internal/catalogue 3.657s
ok github.com/novox/mesh-controller/internal/conditions 1.948s
ok github.com/novox/mesh-controller/internal/envfile 1.024s
ok github.com/novox/mesh-controller/internal/facts 1.026s
ok github.com/novox/mesh-controller/internal/identity 6.300s
ok github.com/novox/mesh-controller/internal/inventory 96.836s
ok github.com/novox/mesh-controller/internal/lease 17.693s
ok github.com/novox/mesh-controller/internal/licences 5.439s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 52.674s
ok github.com/novox/mesh-controller/internal/lint 1.723s
ok github.com/novox/mesh-controller/internal/outward 1.030s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.366s
ok github.com/novox/mesh-controller/internal/store 3.695s
ok github.com/novox/mesh-controller/internal/testbus 1.163s
ok github.com/novox/mesh-controller/internal/token 1.014s
**Merge check** at `8bbfdb53`
- `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-1791418000320743455` (`builds --log build-1791418000320743455`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 47 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-08T00:39:30Z 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-08T00:39:30Z
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.031s
ok github.com/novox/mesh-controller/cmd/mesh-controller 200.517s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.150s
ok github.com/novox/mesh-controller/internal/artifacts 1.035s
ok github.com/novox/mesh-controller/internal/broker 2.315s
ok github.com/novox/mesh-controller/internal/builder 1.235s
ok github.com/novox/mesh-controller/internal/catalogue 3.657s
ok github.com/novox/mesh-controller/internal/conditions 1.948s
ok github.com/novox/mesh-controller/internal/envfile 1.024s
ok github.com/novox/mesh-controller/internal/facts 1.026s
ok github.com/novox/mesh-controller/internal/identity 6.300s
ok github.com/novox/mesh-controller/internal/inventory 96.836s
ok github.com/novox/mesh-controller/internal/lease 17.693s
ok github.com/novox/mesh-controller/internal/licences 5.439s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 52.674s
ok github.com/novox/mesh-controller/internal/lint 1.723s
ok github.com/novox/mesh-controller/internal/outward 1.030s
ok github.com/novox/mesh-controller/internal/overlay 1.021s
ok github.com/novox/mesh-controller/internal/secrets 1.366s
ok github.com/novox/mesh-controller/internal/store 3.695s
ok github.com/novox/mesh-controller/internal/testbus 1.163s
ok github.com/novox/mesh-controller/internal/token 1.014s
```
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.
Builds novox/hq ADR 0169 on the controller's side. Merge first of the group
feat/a-machine-joins-through-the-tunnel(mesh-controller → mesh-host → mesh-lab).token issue --overlay-key <key>: records the machine's tunnel key, binds the token to it, assigns its address and pushes the hub with the machine as a peer before the token is shown. The token carries the hub's endpoint and key, the machine's address and the range, and the bus at its holder's address on the private network (the hub's when no holder is recorded). Enrolment refuses any other key.tokenverb on the controller's seat, withreplaces: ["mesh-controller token issue", "wg set"](ADR 0245);adoptedis a switch; the manifest serves it.callsanswers anyone who may call the seat): withheld on the bus always, held in memory only when the caller was told the call was still running.Rebase onto main: one conflict, the imports of
cmd/mesh-controller/nodes.go. The second commit of the old branch (a node is given how it hears its declarations as it enrols, hq issue 146) is dropped: main asserts every node's declaration consumer before every send (issue 208,assertOnSend), and D6/H3 re-assert a missing one, so it would be a second list of what the bus should hold. hq PR records why.A token without a key stays: it is how the machine that runs the bus joins its own mesh at genesis. The ADR's row a token is refused without a tunnel key is therefore not built as written; every other machine can only join with a key, since the bus is no longer public.
Tests:
sh merge-check.shwithMESH_TEST_POSTGRES, under-race: pass. New: the hub's peers with a live/expired/keyless token, a non-key refused before anything is recorded, the token's tunnel round trip, enrolment refusing another key, the token answer not kept.Lab: mesh-lab's new
joins-through-the-tunnelbed, run on this branch's image: a first node raised from the NATS bundle joins on loopback and becomes the hub; a second machine makes its key, is issued a token, and enrols over the tunnel with the bus's port (5671) closed to its own address. Both tests pass. The test of the hub being pushed before the token is shown is in code order only (it needs a bus to test).Delivery
novox/mesh-controller@8bbfdb53db2b— delivered since 2026-10-08T08:41:12ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Group
feat/a-machine-joins-through-the-tunnel, in order: novox/mesh-lab@e80a4b1642Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
2d6c2345mesh/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-1791417424489091535(builds --log build-1791417424489091535).2d6c2345b8to8bbfdb53dbMerge check at
8bbfdb53mesh/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-1791418900689973185(builds --log build-1791418900689973185).Merge check at
8bbfdb53mesh/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-1791418000320743455(builds --log build-1791418000320743455).