The node-engine's side of novox/hq ADR 0169. Merge second, after novox/mesh-controller#132 (same branch name, one group).
nox-mesh-host key: makes the machine's tunnel key, or reads the one made, and prints the public half for the token to be issued for.
enrol with a token that carries a tunnel: takes that key and refuses another, writes mesh0 with the hub as its one peer, starts it, waits for the hub's handshake (and says so in the tunnel's words when there is none), then dials the bus over it.
The installer places the controller's composed bus accounts beside the bus it raised, before and after the enrolment (hq issue 146, fault 5).
Rebased onto main (109 commits behind; no conflicts). Re-tested against the current node-engine: the rebase did not pass as the review expected — go vet refused internal/bootstrap/enrol.go (the enrolment's timeout context could leak, since the account placement returned between making it and cancelling it). Fixed by placing the accounts before the wait begins. Words: the added texts say controller, per the glossary.
Tests:sh merge-check.sh (race detector on): pass.
Lab: mesh-lab's joins-through-the-tunnel bed (novox/mesh-lab, same branch) ran this host: the joiner made its key, enrolled through the tunnel with the bus's port closed to its own address, and shook hands with the hub. Pass.
The node-engine's side of novox/hq ADR 0169. **Merge second**, after novox/mesh-controller#132 (same branch name, one group).
- `nox-mesh-host key`: makes the machine's tunnel key, or reads the one made, and prints the public half for the token to be issued for.
- `enrol` with a token that carries a tunnel: takes that key and refuses another, writes `mesh0` with the hub as its one peer, starts it, waits for the hub's handshake (and says so in the tunnel's words when there is none), then dials the bus over it.
- The installer places the controller's composed bus accounts beside the bus it raised, before and after the enrolment (hq issue 146, fault 5).
**Rebased onto main** (109 commits behind; no conflicts). Re-tested against the current node-engine: the rebase did **not** pass as the review expected — `go vet` refused `internal/bootstrap/enrol.go` (the enrolment's timeout context could leak, since the account placement returned between making it and cancelling it). Fixed by placing the accounts before the wait begins. Words: the added texts say *controller*, per the glossary.
**Tests:** `sh merge-check.sh` (race detector on): pass.
**Lab:** mesh-lab's `joins-through-the-tunnel` bed (novox/mesh-lab, same branch) ran this host: the joiner made its key, enrolled through the tunnel with the bus's port closed to its own address, and shook hands with the hub. Pass.
nox-mesh-host key makes the tunnel key, or reads the one made, and
prints its public half for the token to be issued for. enrol with a
token that carries a tunnel takes that key, refuses another, writes
mesh0 with the hub as its one peer and starts it, then reaches the bus
over it (novox/hq ADR 0169). Tokens without a tunnel enrol as before.
At genesis the bus's users reach it in no declaration, because the
machine running it has not enrolled. The installer, which raised the
bus from its bundle, places the control plane's composed list beside it
and makes it re-read it: before the machine enrols, for the token's
account, and after, for the node's own (novox/hq issue 146).
Issuing the token sends the hub its new peer, and the hub applies it on
its own time; a bus dialled before then timed out naming the bus. The
first tunnel now waits for a handshake with the hub, and says so in the
tunnel's words when there is none (novox/hq ADR 0169).
The installer placed them between making the enrolment's deadline and
using it, so a failure returned without cancelling it, and go vet refused
the package.
mesh/merge-gate pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh-host on ace: passed — healthy 3 times over 2m19s
mesh-host on the rest running it: sent
Transitions
2026-10-07 23:57 (new) → proposed (announced): novox/mesh-host#52's head announced
2026-10-07 23:59 proposed → checked (checked): the verdict names this commit
2026-10-07 23:59 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 08:24 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:24 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:28 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-host@86cbebd10f8a` — **delivered** since 2026-10-08T08:28:11Z
**Delivery plan** — builds mesh-host → ace, g14, novox, shanks; no bus step
- tier 0: mesh-host
- ace: receives mesh-host
- g14: receives mesh-host
- novox: receives mesh-host
- shanks: receives mesh-host
**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-host on ace: passed — healthy 3 times over 2m19s
- mesh-host on the rest running it: sent
**Transitions**
- 2026-10-07 23:57 (new) → proposed (announced): novox/mesh-host#52's head announced
- 2026-10-07 23:59 proposed → checked (checked): the verdict names this commit
- 2026-10-07 23:59 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 08:24 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:24 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:28 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/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-host)
mesh/repo-check: PASS — its merge-check.sh passed
Delivery plan — builds mesh-host → ace, g14, novox, shanks; no bus step
tier 0: mesh-host
ace: receives mesh-host
g14: receives mesh-host
novox: receives mesh-host
shanks: receives mesh-host
Run by the build seat on g14 as build-1791417425560348155 (builds --log build-1791417425560348155).
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 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-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
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 1 module(s) in 1 tier(s): mesh-host
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.015s
ok github.com/novox/mesh-host/cmd/mesh-host 5.263s
ok github.com/novox/mesh-host/examples 1.019s
ok github.com/novox/mesh-host/internal/apply 2.163s
ok github.com/novox/mesh-host/internal/bootstrap 1.311s
ok github.com/novox/mesh-host/internal/bundle 1.020s
ok github.com/novox/mesh-host/internal/declaration 1.044s
ok github.com/novox/mesh-host/internal/firewall 1.679s
ok github.com/novox/mesh-host/internal/identity 1.044s
ok github.com/novox/mesh-host/internal/image 1.020s
ok github.com/novox/mesh-host/internal/inventory 1.020s
ok github.com/novox/mesh-host/internal/link 10.389s
ok github.com/novox/mesh-host/internal/liveness 2.039s
ok github.com/novox/mesh-host/internal/network 1.031s
ok github.com/novox/mesh-host/internal/outward 1.023s
ok github.com/novox/mesh-host/internal/profile 1.497s
ok github.com/novox/mesh-host/internal/reachable 1.021s
ok github.com/novox/mesh-host/internal/store 1.093s
ok github.com/novox/mesh-host/internal/system 1.015s
ok github.com/novox/mesh-host/internal/tunnel 1.020s
ok github.com/novox/mesh-host/internal/upgrade 1.038s
ok github.com/novox/mesh-host/internal/witness 1.446s
ok github.com/novox/mesh-host/packaging 1.012s
ok github.com/novox/mesh-host/validate 1.013s
**Merge check** at `86cbebd1`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-host)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds mesh-host → ace, g14, novox, shanks; no bus step
- tier 0: mesh-host
- ace: receives mesh-host
- g14: receives mesh-host
- novox: receives mesh-host
- shanks: receives mesh-host
Run by the build seat on g14 as `build-1791417425560348155` (`builds --log build-1791417425560348155`).
```
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 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-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
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 1 module(s) in 1 tier(s): mesh-host
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.015s
ok github.com/novox/mesh-host/cmd/mesh-host 5.263s
ok github.com/novox/mesh-host/examples 1.019s
ok github.com/novox/mesh-host/internal/apply 2.163s
ok github.com/novox/mesh-host/internal/bootstrap 1.311s
ok github.com/novox/mesh-host/internal/bundle 1.020s
ok github.com/novox/mesh-host/internal/declaration 1.044s
ok github.com/novox/mesh-host/internal/firewall 1.679s
ok github.com/novox/mesh-host/internal/identity 1.044s
ok github.com/novox/mesh-host/internal/image 1.020s
ok github.com/novox/mesh-host/internal/inventory 1.020s
ok github.com/novox/mesh-host/internal/link 10.389s
ok github.com/novox/mesh-host/internal/liveness 2.039s
ok github.com/novox/mesh-host/internal/network 1.031s
ok github.com/novox/mesh-host/internal/outward 1.023s
ok github.com/novox/mesh-host/internal/profile 1.497s
ok github.com/novox/mesh-host/internal/reachable 1.021s
ok github.com/novox/mesh-host/internal/store 1.093s
ok github.com/novox/mesh-host/internal/system 1.015s
ok github.com/novox/mesh-host/internal/tunnel 1.020s
ok github.com/novox/mesh-host/internal/upgrade 1.038s
ok github.com/novox/mesh-host/internal/witness 1.446s
ok github.com/novox/mesh-host/packaging 1.012s
ok github.com/novox/mesh-host/validate 1.013s
```
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 node-engine's side of novox/hq ADR 0169. Merge second, after novox/mesh-controller#132 (same branch name, one group).
nox-mesh-host key: makes the machine's tunnel key, or reads the one made, and prints the public half for the token to be issued for.enrolwith a token that carries a tunnel: takes that key and refuses another, writesmesh0with the hub as its one peer, starts it, waits for the hub's handshake (and says so in the tunnel's words when there is none), then dials the bus over it.Rebased onto main (109 commits behind; no conflicts). Re-tested against the current node-engine: the rebase did not pass as the review expected —
go vetrefusedinternal/bootstrap/enrol.go(the enrolment's timeout context could leak, since the account placement returned between making it and cancelling it). Fixed by placing the accounts before the wait begins. Words: the added texts say controller, per the glossary.Tests:
sh merge-check.sh(race detector on): pass.Lab: mesh-lab's
joins-through-the-tunnelbed (novox/mesh-lab, same branch) ran this host: the joiner made its key, enrolled through the tunnel with the bus's port closed to its own address, and shook hands with the hub. Pass.Delivery
novox/mesh-host@86cbebd10f8a— delivered since 2026-10-08T08:28:11ZDelivery plan — builds mesh-host → 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
86cbebd1mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mesh-host)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds mesh-host → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791417425560348155(builds --log build-1791417425560348155).