internal/outward: Networks(links, addressesOf) gives every network on the links facing outside (the same Links the filter is written around), as link and masked network (192.168.1.0/24), sorted, no repeats. A link gone since it was listed has none; a link whose addresses cannot be read fails the whole, so the fact is said unknown rather than partial.
internal/profile: Machine.Networks (networks on the wire), among issue 160's facts. Every network is said, public and link-local included: which count is the controller's judgement, shown with why. None on an outward link is said unknown with why (networks), never an empty list.
cmd/mesh-host: the networks are part of the reconcile's fingerprint, so a changed network (a laptop on another network, a moved lease) is said unasked at the next reconcile; the same networks are not news.
Tests (fail on main: outward.Networks, Machine.Networks and attachedNetworksOf do not exist there)
internal/outward networks_test.go: each outward link says its networks, masked, the bridge not asked; an unreadable link is not a partial account; a gone link has none.
internal/profile machine_test.go: the networks are among the facts; none is said unknown with why; an unreadable source is unknown (the issue 160 acceptance test now covers networks).
cmd/mesh-host local_network_test.go: a changed network is said unasked, the same one is not.
gofmt, go vet ./... and go test ./... pass (without -race, by the coordinator's load limit on g14).
Fixes issue 154 (with the mesh-controller PR).
after: none
Issue 154; decision: novox/hq ADR 0340 (§7). Companion: mesh-controller (after this).
**What it does**
- `internal/outward`: `Networks(links, addressesOf)` gives every network on the links facing outside (the same `Links` the filter is written around), as link and masked network (`192.168.1.0/24`), sorted, no repeats. A link gone since it was listed has none; a link whose addresses cannot be read fails the whole, so the fact is said unknown rather than partial.
- `internal/profile`: `Machine.Networks` (`networks` on the wire), among issue 160's facts. Every network is said, public and link-local included: which count is the controller's judgement, shown with why. None on an outward link is said unknown with why (`networks`), never an empty list.
- `cmd/mesh-host`: the networks are part of the reconcile's fingerprint, so a changed network (a laptop on another network, a moved lease) is said unasked at the next reconcile; the same networks are not news.
**Tests (fail on main: `outward.Networks`, `Machine.Networks` and `attachedNetworksOf` do not exist there)**
- internal/outward networks_test.go: each outward link says its networks, masked, the bridge not asked; an unreadable link is not a partial account; a gone link has none.
- internal/profile machine_test.go: the networks are among the facts; none is said unknown with why; an unreadable source is unknown (the issue 160 acceptance test now covers `networks`).
- cmd/mesh-host local_network_test.go: a changed network is said unasked, the same one is not.
gofmt, `go vet ./...` and `go test ./...` pass (without -race, by the coordinator's load limit on g14).
Fixes issue 154 (with the mesh-controller PR).
mesh/merge-gate head cb7b71dcc568 merged into trunk 12bc6a56a38a — pass: builds mesh-host → ace, g14, novox, shanks; no bus step; every machine composes wi…
A port reached from local-network is admitted from the private networks the machine is attached to, and only the machine can say which those are. Every network on a link facing outside is said among its facts, and a change is said at the next reconcile.
Deliverynovox/mesh-host@cb7b71dcc568 — delivered since 2026-10-13T13:26:37Z
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
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
Machines
mesh-host on ace: passed — judged with build-agent: healthy 3 times over 2m40s
build-agent on ace: passed — healthy 3 times over 2m40s
mesh-host on g14: judging — carried by release-1791896974742967198
mesh-host on shanks: judging — carried by release-1791896974742967198
mesh-host on novox: judging — carried by release-1791896974742967198
mesh-controller on novox: passed — healthy 3 times over 3m32s
build-agent on the rest running it: sent
mesh-host on the rest running it: sent
mesh-controller on the rest running it: sent
Transitions
2026-10-13 09:20 (new) → proposed (announced): novox/mesh-host#107's head announced
2026-10-13 09:23 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 09:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 09:23 ready → proposed (trunk moved): out of date: judged against trunk f0d39b4a4a, the trunk is now 130c5d98a601; judged again on a recheck or when it is merged
2026-10-13 12:58 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 12:58 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 13:09 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-13 13:09 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 — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-13 13:26 delivering → delivered (done): its walk is done, carrying its own commit: 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@cb7b71dcc568` — **delivered** since 2026-10-13T13:26:37Z
**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
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
**Group** `fix/154-local-network`, in order: novox/mesh-host@cb7b71dcc568 → novox/mesh-controller@4cc8588afb87
- novox/mesh-host@cb7b71dcc568 before novox/mesh-controller@4cc8588afb87: declared, over built by
- composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
**Machines**
- mesh-host on ace: passed — judged with build-agent: healthy 3 times over 2m40s
- build-agent on ace: passed — healthy 3 times over 2m40s
- mesh-host on g14: judging — carried by release-1791896974742967198
- mesh-host on shanks: judging — carried by release-1791896974742967198
- mesh-host on novox: judging — carried by release-1791896974742967198
- mesh-controller on novox: passed — healthy 3 times over 3m32s
- build-agent on the rest running it: sent
- mesh-host on the rest running it: sent
- mesh-controller on the rest running it: sent
**Transitions**
- 2026-10-13 09:20 (new) → proposed (announced): novox/mesh-host#107's head announced
- 2026-10-13 09:23 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 09:23 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 09:23 ready → proposed (trunk moved): out of date: judged against trunk f0d39b4a4ab0, the trunk is now 130c5d98a601; judged again on a recheck or when it is merged
- 2026-10-13 12:58 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 12:58 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 13:09 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-13 13:09 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 — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-13 13:26 delivering → delivered (done): its walk is done, carrying its own commit: 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`.
Merge check at cb7b71dc
Judged: head cb7b71dcc568 merged into trunk f0d39b4a4ab0; read beside it: mesh-catalog 45d01e77c26d, mesh-controller 1826b68a22b5, mesh-controller-main 1826b68a22b5, mesh-tools 954e1a53eef9
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
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
read by no module's build: cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go, internal/profile/machine_test.go
Run by the build seat on shanks as build-1791883285642980044 (builds --log build-1791883285642980044).
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 0
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-13T09:19:10Z 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-13T09:19:10Z
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
notes:
- cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go and internal/profile/machine_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.011s
ok github.com/novox/mesh-host/cmd/mesh-host 5.815s
ok github.com/novox/mesh-host/examples 1.030s
ok github.com/novox/mesh-host/internal/accounts 1.579s
ok github.com/novox/mesh-host/internal/apply 4.862s
ok github.com/novox/mesh-host/internal/bootstrap 4.441s
ok github.com/novox/mesh-host/internal/bundle 1.051s
ok github.com/novox/mesh-host/internal/declaration 1.097s
ok github.com/novox/mesh-host/internal/firewall 1.856s
ok github.com/novox/mesh-host/internal/identity 1.134s
ok github.com/novox/mesh-host/internal/image 1.040s
ok github.com/novox/mesh-host/internal/inventory 1.075s
ok github.com/novox/mesh-host/internal/link 10.516s
ok github.com/novox/mesh-host/internal/liveness 2.148s
ok github.com/novox/mesh-host/internal/meshcli 1.579s
ok github.com/novox/mesh-host/internal/network 1.069s
ok github.com/novox/mesh-host/internal/outward 1.055s
ok github.com/novox/mesh-host/internal/profile 1.652s
ok github.com/novox/mesh-host/internal/reachable 1.055s
ok github.com/novox/mesh-host/internal/store 1.239s
ok github.com/novox/mesh-host/internal/system 1.052s
ok github.com/novox/mesh-host/internal/tunnel 1.058s
ok github.com/novox/mesh-host/internal/units 1.047s
ok github.com/novox/mesh-host/internal/upgrade 1.177s
ok github.com/novox/mesh-host/internal/witness 4.515s
ok github.com/novox/mesh-host/packaging 1.052s
? github.com/novox/mesh-host/rootsearch [no test files]
ok github.com/novox/mesh-host/validate 1.009s
Out of date when it landed: out of date: judged against trunk f0d39b4a4a, the trunk is now 130c5d98a601; judged again on a recheck or when it is merged
**Merge check** at `cb7b71dc`
Judged: head `cb7b71dcc568` merged into trunk `f0d39b4a4ab0`; read beside it: mesh-catalog `45d01e77c26d`, mesh-controller `1826b68a22b5`, mesh-controller-main `1826b68a22b5`, mesh-tools `954e1a53eef9`
- `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
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
- read by no module's build: cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go, internal/profile/machine_test.go
Run by the build seat on shanks as `build-1791883285642980044` (`builds --log build-1791883285642980044`).
```
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 0
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-13T09:19:10Z 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-13T09:19:10Z
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
notes:
- cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go and internal/profile/machine_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-host/cmd/mesh-bootstrap 1.011s
ok github.com/novox/mesh-host/cmd/mesh-host 5.815s
ok github.com/novox/mesh-host/examples 1.030s
ok github.com/novox/mesh-host/internal/accounts 1.579s
ok github.com/novox/mesh-host/internal/apply 4.862s
ok github.com/novox/mesh-host/internal/bootstrap 4.441s
ok github.com/novox/mesh-host/internal/bundle 1.051s
ok github.com/novox/mesh-host/internal/declaration 1.097s
ok github.com/novox/mesh-host/internal/firewall 1.856s
ok github.com/novox/mesh-host/internal/identity 1.134s
ok github.com/novox/mesh-host/internal/image 1.040s
ok github.com/novox/mesh-host/internal/inventory 1.075s
ok github.com/novox/mesh-host/internal/link 10.516s
ok github.com/novox/mesh-host/internal/liveness 2.148s
ok github.com/novox/mesh-host/internal/meshcli 1.579s
ok github.com/novox/mesh-host/internal/network 1.069s
ok github.com/novox/mesh-host/internal/outward 1.055s
ok github.com/novox/mesh-host/internal/profile 1.652s
ok github.com/novox/mesh-host/internal/reachable 1.055s
ok github.com/novox/mesh-host/internal/store 1.239s
ok github.com/novox/mesh-host/internal/system 1.052s
ok github.com/novox/mesh-host/internal/tunnel 1.058s
ok github.com/novox/mesh-host/internal/units 1.047s
ok github.com/novox/mesh-host/internal/upgrade 1.177s
ok github.com/novox/mesh-host/internal/witness 4.515s
ok github.com/novox/mesh-host/packaging 1.052s
? github.com/novox/mesh-host/rootsearch [no test files]
ok github.com/novox/mesh-host/validate 1.009s
```
**Out of date when it landed**: out of date: judged against trunk f0d39b4a4ab0, the trunk is now 130c5d98a601; judged again on a recheck or when it is merged
This PR builds only ADR 0340 §7 (the node-engine reports its subnets), and it does that correctly and completely.
internal/outward.Networks reports every network on each outward link — public, link-local and loopback included — without judging any of them, matching §7's own words ("Every one is said, and the machine judges none of them"); judging is left entirely to the controller, as ADR 0340 §2 assigns it there. The container bridge (docker0) is never asked, because it is not in the outward link list. An unreadable link fails the whole read with an error, so the fact is said unknown rather than reported as a partial account (TestAnUnreadableLinkIsNotAPartialAccount); a link gone since the route table was read yields no networks for that link alone, without failing the rest (TestALinkGoneSinceItWasListedHasNoNetworks).
internal/profile.DescribeMachine distinguishes three states on the Networks fact: no Sources.Networks function given, Networks() erroring, and Networks() returning an empty list because no outward link carries an address — all three are said unknown (with a reason), never reported as an empty array that a reader could misread as "attached to nothing." This is the state the controller-side PR (mesh-controller #299) needs to tell "older node-engine / never reported" apart from "reported, has none," and the two sides agree on the shape of the fact.
cmd/mesh-host's adoption fingerprint folds the reported networks in, so a changed network (a laptop joining another network, a moved DHCP lease) is said unasked at the next reconcile, and the same networks again are not news (TestAChangedNetworkIsSaidUnasked) — satisfying §7's "after every apply and on its own daily schedule, and again whenever its uplink's addresses change."
Checked and confirmed:
None of outward.Networks, Machine.Networks or attachedNetworksOf exist on main (checked by git show main:internal/outward/networks.go, which fails, and by grep), so the new tests cannot even compile there, let alone pass — they fail on main as the PR body claims.
go vet ./... is clean.
go test ./... passes every package.
go test -race on the touched packages (internal/outward, internal/profile, cmd/mesh-host) passes.
./merge-check.sh exits 0 (bus-dependent tests skipped for lack of a nats-server in this toolchain, which the script itself says, not a failure).
No changes requested.
Verdict: approve at cb7b71dcc56808dc382c20295356c06870a98c3c
This PR builds only ADR 0340 §7 (the node-engine reports its subnets), and it does that correctly and completely.
internal/outward.Networks reports every network on each outward link — public, link-local and loopback included — without judging any of them, matching §7's own words ("Every one is said, and the machine judges none of them"); judging is left entirely to the controller, as ADR 0340 §2 assigns it there. The container bridge (docker0) is never asked, because it is not in the outward link list. An unreadable link fails the whole read with an error, so the fact is said unknown rather than reported as a partial account (TestAnUnreadableLinkIsNotAPartialAccount); a link gone since the route table was read yields no networks for that link alone, without failing the rest (TestALinkGoneSinceItWasListedHasNoNetworks).
internal/profile.DescribeMachine distinguishes three states on the Networks fact: no Sources.Networks function given, Networks() erroring, and Networks() returning an empty list because no outward link carries an address — all three are said unknown (with a reason), never reported as an empty array that a reader could misread as "attached to nothing." This is the state the controller-side PR (mesh-controller #299) needs to tell "older node-engine / never reported" apart from "reported, has none," and the two sides agree on the shape of the fact.
cmd/mesh-host's adoption fingerprint folds the reported networks in, so a changed network (a laptop joining another network, a moved DHCP lease) is said unasked at the next reconcile, and the same networks again are not news (TestAChangedNetworkIsSaidUnasked) — satisfying §7's "after every apply and on its own daily schedule, and again whenever its uplink's addresses change."
Checked and confirmed:
- None of outward.Networks, Machine.Networks or attachedNetworksOf exist on main (checked by `git show main:internal/outward/networks.go`, which fails, and by grep), so the new tests cannot even compile there, let alone pass — they fail on main as the PR body claims.
- `go vet ./...` is clean.
- `go test ./...` passes every package.
- `go test -race` on the touched packages (internal/outward, internal/profile, cmd/mesh-host) passes.
- `./merge-check.sh` exits 0 (bus-dependent tests skipped for lack of a nats-server in this toolchain, which the script itself says, not a failure).
No changes requested.
Merge check at cb7b71dc
Judged: head cb7b71dcc568 merged into trunk 12bc6a56a38a; read beside it: mesh-catalog 0d723484a84a, mesh-controller 0a1dc5f93fcb, mesh-controller-main 0a1dc5f93fcb, mesh-tools 954e1a53eef9
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
grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
read by no module's build: cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go, internal/profile/machine_test.go
Run by the build seat on shanks as build-1791896191583389448 (builds --log build-1791896191583389448).
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 0
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-13T12:48:29Z 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-13T12:48:29Z
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
notes:
- cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go and internal/profile/machine_test.go read by no module's build, and rebuild nothing (issue 280)
--- 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.733s
ok github.com/novox/mesh-host/examples 1.032s
ok github.com/novox/mesh-host/internal/accounts 1.518s
ok github.com/novox/mesh-host/internal/apply 4.637s
ok github.com/novox/mesh-host/internal/bootstrap 4.553s
ok github.com/novox/mesh-host/internal/bundle 1.037s
ok github.com/novox/mesh-host/internal/declaration 1.093s
ok github.com/novox/mesh-host/internal/firewall 1.859s
ok github.com/novox/mesh-host/internal/identity 1.128s
ok github.com/novox/mesh-host/internal/image 1.044s
ok github.com/novox/mesh-host/internal/inventory 1.068s
ok github.com/novox/mesh-host/internal/link 10.494s
ok github.com/novox/mesh-host/internal/liveness 2.129s
ok github.com/novox/mesh-host/internal/meshcli 1.575s
ok github.com/novox/mesh-host/internal/network 1.064s
ok github.com/novox/mesh-host/internal/outward 1.047s
ok github.com/novox/mesh-host/internal/profile 1.646s
ok github.com/novox/mesh-host/internal/reachable 1.057s
ok github.com/novox/mesh-host/internal/store 1.240s
ok github.com/novox/mesh-host/internal/system 1.057s
ok github.com/novox/mesh-host/internal/tunnel 1.063s
ok github.com/novox/mesh-host/internal/units 1.028s
ok github.com/novox/mesh-host/internal/upgrade 1.167s
ok github.com/novox/mesh-host/internal/witness 4.366s
ok github.com/novox/mesh-host/packaging 1.029s
? github.com/novox/mesh-host/rootsearch [no test files]
ok github.com/novox/mesh-host/validate 1.009s
**Merge check** at `cb7b71dc`
Judged: head `cb7b71dcc568` merged into trunk `12bc6a56a38a`; read beside it: mesh-catalog `0d723484a84a`, mesh-controller `0a1dc5f93fcb`, mesh-controller-main `0a1dc5f93fcb`, mesh-tools `954e1a53eef9`
- `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
- grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before mesh-host is judged on its first machine
- read by no module's build: cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go, internal/profile/machine_test.go
Run by the build seat on shanks as `build-1791896191583389448` (`builds --log build-1791896191583389448`).
```
--- the gate: mesh-host
mesh-host: ok
long-running resources without health: 0
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-13T12:48:29Z 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-13T12:48:29Z
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
notes:
- cmd/mesh-host/local_network_test.go, internal/outward/networks_test.go and internal/profile/machine_test.go read by no module's build, and rebuild nothing (issue 280)
--- 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.733s
ok github.com/novox/mesh-host/examples 1.032s
ok github.com/novox/mesh-host/internal/accounts 1.518s
ok github.com/novox/mesh-host/internal/apply 4.637s
ok github.com/novox/mesh-host/internal/bootstrap 4.553s
ok github.com/novox/mesh-host/internal/bundle 1.037s
ok github.com/novox/mesh-host/internal/declaration 1.093s
ok github.com/novox/mesh-host/internal/firewall 1.859s
ok github.com/novox/mesh-host/internal/identity 1.128s
ok github.com/novox/mesh-host/internal/image 1.044s
ok github.com/novox/mesh-host/internal/inventory 1.068s
ok github.com/novox/mesh-host/internal/link 10.494s
ok github.com/novox/mesh-host/internal/liveness 2.129s
ok github.com/novox/mesh-host/internal/meshcli 1.575s
ok github.com/novox/mesh-host/internal/network 1.064s
ok github.com/novox/mesh-host/internal/outward 1.047s
ok github.com/novox/mesh-host/internal/profile 1.646s
ok github.com/novox/mesh-host/internal/reachable 1.057s
ok github.com/novox/mesh-host/internal/store 1.240s
ok github.com/novox/mesh-host/internal/system 1.057s
ok github.com/novox/mesh-host/internal/tunnel 1.063s
ok github.com/novox/mesh-host/internal/units 1.028s
ok github.com/novox/mesh-host/internal/upgrade 1.167s
ok github.com/novox/mesh-host/internal/witness 4.366s
ok github.com/novox/mesh-host/packaging 1.029s
? github.com/novox/mesh-host/rootsearch [no test files]
ok github.com/novox/mesh-host/validate 1.009s
```
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.
after: none
Issue 154; decision: novox/hq ADR 0340 (§7). Companion: mesh-controller (after this).
What it does
internal/outward:Networks(links, addressesOf)gives every network on the links facing outside (the sameLinksthe filter is written around), as link and masked network (192.168.1.0/24), sorted, no repeats. A link gone since it was listed has none; a link whose addresses cannot be read fails the whole, so the fact is said unknown rather than partial.internal/profile:Machine.Networks(networkson the wire), among issue 160's facts. Every network is said, public and link-local included: which count is the controller's judgement, shown with why. None on an outward link is said unknown with why (networks), never an empty list.cmd/mesh-host: the networks are part of the reconcile's fingerprint, so a changed network (a laptop on another network, a moved lease) is said unasked at the next reconcile; the same networks are not news.Tests (fail on main:
outward.Networks,Machine.NetworksandattachedNetworksOfdo not exist there)networks).gofmt,
go vet ./...andgo test ./...pass (without -race, by the coordinator's load limit on g14).Fixes issue 154 (with the mesh-controller PR).
Delivery
novox/mesh-host@cb7b71dcc568— delivered since 2026-10-13T13:26:37ZDelivery plan — builds mesh-host → ace, g14, novox, shanks; no bus step
Group
fix/154-local-network, in order: novox/mesh-host@cb7b71dcc5 → novox/mesh-controller@4cc8588afbMachines
Transitions
f0d39b4a4a, the trunk is now 130c5d98a601; judged again on a recheck or when it is mergedThe commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
cb7b71dcJudged: head
cb7b71dcc568merged into trunkf0d39b4a4ab0; read beside it: mesh-catalog45d01e77c26d, mesh-controller1826b68a22b5, mesh-controller-main1826b68a22b5, mesh-tools954e1a53eef9mesh/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 shanks as
build-1791883285642980044(builds --log build-1791883285642980044).Out of date when it landed: out of date: judged against trunk
f0d39b4a4a, the trunk is now 130c5d98a601; judged again on a recheck or when it is mergedVerdict: approve at
cb7b71dcc5This PR builds only ADR 0340 §7 (the node-engine reports its subnets), and it does that correctly and completely.
internal/outward.Networks reports every network on each outward link — public, link-local and loopback included — without judging any of them, matching §7's own words ("Every one is said, and the machine judges none of them"); judging is left entirely to the controller, as ADR 0340 §2 assigns it there. The container bridge (docker0) is never asked, because it is not in the outward link list. An unreadable link fails the whole read with an error, so the fact is said unknown rather than reported as a partial account (TestAnUnreadableLinkIsNotAPartialAccount); a link gone since the route table was read yields no networks for that link alone, without failing the rest (TestALinkGoneSinceItWasListedHasNoNetworks).
internal/profile.DescribeMachine distinguishes three states on the Networks fact: no Sources.Networks function given, Networks() erroring, and Networks() returning an empty list because no outward link carries an address — all three are said unknown (with a reason), never reported as an empty array that a reader could misread as "attached to nothing." This is the state the controller-side PR (mesh-controller #299) needs to tell "older node-engine / never reported" apart from "reported, has none," and the two sides agree on the shape of the fact.
cmd/mesh-host's adoption fingerprint folds the reported networks in, so a changed network (a laptop joining another network, a moved DHCP lease) is said unasked at the next reconcile, and the same networks again are not news (TestAChangedNetworkIsSaidUnasked) — satisfying §7's "after every apply and on its own daily schedule, and again whenever its uplink's addresses change."
Checked and confirmed:
git show main:internal/outward/networks.go, which fails, and by grep), so the new tests cannot even compile there, let alone pass — they fail on main as the PR body claims.go vet ./...is clean.go test ./...passes every package.go test -raceon the touched packages (internal/outward, internal/profile, cmd/mesh-host) passes../merge-check.shexits 0 (bus-dependent tests skipped for lack of a nats-server in this toolchain, which the script itself says, not a failure).No changes requested.
Merge check at
cb7b71dcJudged: head
cb7b71dcc568merged into trunk12bc6a56a38a; read beside it: mesh-catalog0d723484a84a, mesh-controller0a1dc5f93fcb, mesh-controller-main0a1dc5f93fcb, mesh-tools954e1a53eef9mesh/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 shanks as
build-1791896191583389448(builds --log build-1791896191583389448).