hq issue 348 (a resolver that stopped answering ran on unnoticed, and builds sent after it were blamed).
dnsmasq
Ported to Go (its TypeScript tools were never served). A root process, the watch, asks the machine's own name on every listen address over UDP and TCP every 15 s; after two failing looks it restarts dnsmasq.service (at most every 2 min, 3 an hour) and the next looks say whether that helped. dnsmasq_health is the watch's declared check (ADR 0240): a restart that helped leaves the module healthy; one that did not becomes module.dnsmasq.<machine>.unhealthy saying so. The service gets health: unit. Emits restarted. Tools: dnsmasq_health, dnsmasq_names, dnsmasq_resolve.
bind-interfaces instead of bind-dynamic: dnsmasq 2.93 closes every listener when an address re-read fails during a bridge teardown (network.c:832-875); reproduced in a network namespace (53 closings in 120 teardowns). A drop-in makes the unit wait for the private address and retry.
Departs from ADR 0240 rule 6 (nothing restarts on health): a module-local repair like ADR 0224 §5. Needs the operator's word, or a healer record.
health-undeclared 70 → 69.
docker: docker_events says where the runtime's memory of events begins and says so when the window reaches past it (measured: ~256 events, filled by health checks within minutes); new docker_resolv_conf reads a container's resolver file as it sees it.
netcheck: netcheck_dns can ask one named resolver (server, tcp); new netcheck_listening (replaces ss -lunt). netcheck is assigned only on ace and g14; assigning it on novox and shanks is the operator's.
Local merge-check.sh (MESH_GATE built from mesh-controller main + PR 179) passes: module check ok, count 69 as kept, dnsmasq/docker/netcheck tests ok.
Not merged; a person's approval decides.
hq issue 348 (a resolver that stopped answering ran on unnoticed, and builds sent after it were blamed).
**dnsmasq**
- Ported to Go (its TypeScript tools were never served). A root process, the watch, asks the machine's own name on every listen address over UDP and TCP every 15 s; after two failing looks it restarts `dnsmasq.service` (at most every 2 min, 3 an hour) and the next looks say whether that helped. `dnsmasq_health` is the watch's declared check (ADR 0240): a restart that helped leaves the module healthy; one that did not becomes `module.dnsmasq.<machine>.unhealthy` saying so. The service gets `health: unit`. Emits `restarted`. Tools: `dnsmasq_health`, `dnsmasq_names`, `dnsmasq_resolve`.
- `bind-interfaces` instead of `bind-dynamic`: dnsmasq 2.93 closes every listener when an address re-read fails during a bridge teardown (network.c:832-875); reproduced in a network namespace (53 closings in 120 teardowns). A drop-in makes the unit wait for the private address and retry.
- **Departs from ADR 0240 rule 6** (nothing restarts on health): a module-local repair like ADR 0224 §5. Needs the operator's word, or a healer record.
- health-undeclared 70 → 69.
**docker**: `docker_events` says where the runtime's memory of events begins and says so when the window reaches past it (measured: ~256 events, filled by health checks within minutes); new `docker_resolv_conf` reads a container's resolver file as it sees it.
**netcheck**: `netcheck_dns` can ask one named resolver (`server`, `tcp`); new `netcheck_listening` (replaces `ss -lunt`). netcheck is assigned only on ace and g14; assigning it on novox and shanks is the operator's.
Local `merge-check.sh` (MESH_GATE built from mesh-controller main + PR 179) passes: module check ok, count 69 as kept, dnsmasq/docker/netcheck tests ok.
Not merged; a person's approval decides.
Deliverynovox/mesh-catalog@a10f1844f2cd — delivered since 2026-10-10T15:55:24Z
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
Machines
docker on ace: passed — healthy 3 times over 2m36s
netcheck on ace: passed — judged with docker: healthy 3 times over 2m36s
docker on the rest running it: sent
netcheck on the rest running it: sent
Transitions
2026-10-10 15:46 (new) → proposed (announced): novox/mesh-catalog#161's head announced
2026-10-10 15:47 proposed → checked (checked): the verdict names this commit
2026-10-10 15:47 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-10 15:50 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-10 15:50 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-10 15:55 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-catalog@a10f1844f2cd` — **delivered** since 2026-10-10T15:55:24Z
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
**Machines**
- docker on ace: passed — healthy 3 times over 2m36s
- netcheck on ace: passed — judged with docker: healthy 3 times over 2m36s
- docker on the rest running it: sent
- netcheck on the rest running it: sent
**Transitions**
- 2026-10-10 15:46 (new) → proposed (announced): novox/mesh-catalog#161's head announced
- 2026-10-10 15:47 proposed → checked (checked): the verdict names this commit
- 2026-10-10 15:47 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-10 15:50 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-10 15:50 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-10 15:55 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/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
read by no module's build: health-undeclared
Run by the build seat on novox as build-1791546669480758956 (builds --log build-1791546669480758956).
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T11:44:53Z 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-09T11:44:53Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35275 strings of 615 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.083s
testing modules/docker
ok docker/cmd/docker-tools 1.042s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.031s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.961251ms)
✔ only HEAD and GET are used (0.224461ms)
✔ a status, its headers and a redirect not followed (27.669515ms)
✔ a refused connection is a result with its error (4.740786ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 138.865021
**Merge check** at `3e56fa51`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
- read by no module's build: health-undeclared
Run by the build seat on novox as `build-1791546669480758956` (`builds --log build-1791546669480758956`).
```
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T11:44:53Z 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-09T11:44:53Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35275 strings of 615 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.083s
testing modules/docker
ok docker/cmd/docker-tools 1.042s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.031s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.961251ms)
✔ only HEAD and GET are used (0.224461ms)
✔ a status, its headers and a redirect not followed (27.669515ms)
✔ a refused connection is a result with its error (4.740786ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 138.865021
```
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
read by no module's build: health-undeclared
Run by the build seat on shanks as build-1791547935964726662 (builds --log build-1791547935964726662).
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T12:05:01Z 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-09T12:05:01Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35535 strings of 619 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.024s
testing modules/docker
ok docker/cmd/docker-tools 1.041s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.020s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.914121ms)
✔ only HEAD and GET are used (0.239313ms)
✔ a status, its headers and a redirect not followed (25.080884ms)
✔ a refused connection is a result with its error (3.744256ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 133.568072
**Merge check** at `d372fc32`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
- read by no module's build: health-undeclared
Run by the build seat on shanks as `build-1791547935964726662` (`builds --log build-1791547935964726662`).
```
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T12:05:01Z 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-09T12:05:01Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35535 strings of 619 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.024s
testing modules/docker
ok docker/cmd/docker-tools 1.041s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.020s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.914121ms)
✔ only HEAD and GET are used (0.239313ms)
✔ a status, its headers and a redirect not followed (25.080884ms)
✔ a refused connection is a result with its error (3.744256ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 133.568072
```
On 2026-10-09 the control node's dnsmasq stayed active and running, its
journal silent, and refused every question on its private address for
twenty minutes; nothing in the module looked past the unit.
The module is now Go (its TypeScript tools were never served): a root
watch asks the machine's own name on every listen address over UDP and
TCP every 15s, restarts the unit after two failing looks (2 min apart,
3 an hour), and says whether that helped. dnsmasq_health is the watch
process's declared check, so a restart that did not help becomes the
module's unhealthy condition; the service is judged by its unit.
docker_events asked for three hours across the 2026-10-09 resolver outage on the control node answered
zero events: the runtime keeps only its last ~256 events in memory, and health-check execs filled them
with the last ten minutes. The answer now carries held, oldest_held and complete, and a history line
when the window reaches further back than what the runtime still holds. The type filter moves into the
tool, since the history's start is only known from all of it.
During the 2026-10-09 outage the control node's resolver stayed active while it no longer listened on
its private address, and nothing on the mesh could ask that address a question or show which sockets
were bound. netcheck_dns takes server (and tcp) to ask one resolver alone and say its response code;
netcheck_listening reads the kernel's socket tables, as ss -lunt does, with the owning program where
the tool's account may see it and a sentence where it may not.
On 2026-10-09 the control node's route-proxy failed every lookup against 10.10.0.1 alone for twenty
minutes while the machine's file listed both mesh resolvers; its copy lives under the runtime's
root-only directory and no tool read it. docker_resolv_conf reads /etc/resolv.conf as the container
sees it through the runtime's archive (docker cp, no exec), parses it, and says whether it lists the
same resolvers as the machine.
bind-dynamic closes every listener whose interface a re-read of the
machine's addresses did not find, and a re-read during a bridge teardown
fails (dnsmasq 2.93 network.c:832-875, reproduced in a network namespace:
53 releases in 120 parallel teardowns). bind-interfaces never closes a
listener; a drop-in makes the unit wait for the private address and retry
a start that found it missing.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
read by no module's build: health-undeclared
Run by the build seat on novox as build-1791551101030808396 (builds --log build-1791551101030808396).
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T13:02:20Z 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-09T13:02:20Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35685 strings of 620 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.124s
testing modules/docker
ok docker/cmd/docker-tools 1.050s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.028s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.952302ms)
✔ only HEAD and GET are used (0.258341ms)
✔ a status, its headers and a redirect not followed (27.639888ms)
✔ a refused connection is a result with its error (4.354966ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 157.715758
**Merge check** at `486fbd0b`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
- read by no module's build: health-undeclared
Run by the build seat on novox as `build-1791551101030808396` (`builds --log build-1791551101030808396`).
```
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T13:02:20Z 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-09T13:02:20Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35685 strings of 620 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.124s
testing modules/docker
ok docker/cmd/docker-tools 1.050s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.028s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.952302ms)
✔ only HEAD and GET are used (0.258341ms)
✔ a status, its headers and a redirect not followed (27.639888ms)
✔ a refused connection is a result with its error (4.354966ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 157.715758
```
mesh/merge-gate pass: builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person; every machine composes with the chan…
- The dnsmasq watch restarts only a unit that runs, without waiting for
its start; a unit stopped, starting or failed is held and said (C2).
- dnsmasq_resolve asks only an address the resolver listens on (C3).
- Tests for the watch loop keeping its budget, a watch that wrote nothing
or stopped looking, and a unit not running (C4).
- A restart is remembered as said only once emitted, restarts made before
the bundle started are said, and whether one helped is said (C5).
- docker_events reads the runtime's whole buffer: complete when it is not
full or reaches past the window, never a quiet machine read as lost (C6).
- netcheck: refused read with errors.Is; tests for addresses and ports,
and for a container named as docker knows it.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
read by no module's build: .gitignore, health-undeclared
Run by the build seat on novox as build-1791552386178608790 (builds --log build-1791552386178608790).
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T13:02:20Z 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-09T13:02:20Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- .gitignore and health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35685 strings of 620 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.150s
testing modules/docker
ok docker/cmd/docker-tools 1.059s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.028s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.777302ms)
✔ only HEAD and GET are used (0.20906ms)
✔ a status, its headers and a redirect not followed (22.046904ms)
✔ a refused connection is a result with its error (3.964876ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 133.616302
**Merge check** at `a6a9a818`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
- read by no module's build: .gitignore, health-undeclared
Run by the build seat on novox as `build-1791552386178608790` (`builds --log build-1791552386178608790`).
```
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T13:02:20Z 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-09T13:02:20Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- .gitignore and health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words, none in the 35685 strings of 620 files
ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.150s
testing modules/docker
ok docker/cmd/docker-tools 1.059s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.028s
--- its merge-check-typescript.sh (typescript toolchain)
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.777302ms)
✔ only HEAD and GET are used (0.20906ms)
✔ a status, its headers and a redirect not followed (22.046904ms)
✔ a refused connection is a result with its error (3.964876ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 133.616302
```
mesh/merge-gate pass: builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person; every machine composes with the chan…
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
tier 0: dnsmasq, docker, netcheck
ace: receives docker, netcheck; waits for a person: dnsmasq
g14: receives docker, netcheck
novox: receives docker; waits for a person: dnsmasq
shanks: receives docker
dnsmasq waits for a person: its policy records (module)
dnsmasq provides wildcard-resolution: its consumers are sent again after it
read by no module's build: .gitignore, health-undeclared
Run by the build seat on ace as build-1791647165417231416 (builds --log build-1791647165417231416).
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T15:36:57Z 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-10T15:36:57Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- .gitignore and health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words and 70 daemons' lines, none in the 38588 strings of 647 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.043s
testing modules/docker
ok docker/cmd/docker-tools 1.041s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.047s
--- its merge-check-typescript.sh (typescript toolchain)
Unable to find image 'novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb' locally
novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb: Pulling from mesh-tools/build
501c3e032d32: Already exists
d456d1aa143e: Already exists
60f37e2c93ec: Already exists
e53f92c42dd6: Already exists
b571db164614: Already exists
3130c230dcec: Already exists
4198e49907ef: Already exists
487f65298731: Already exists
b7c34aa97486: Already exists
8a0200dee3b4: Pulling fs layer
1724f328ad6c: Pulling fs layer
ec17680e3745: Pulling fs layer
f40ed2016c96: Pulling fs layer
33683062e5fd: Pulling fs layer
f40ed2016c96: Waiting
33683062e5fd: Waiting
8a0200dee3b4: Download complete
f40ed2016c96: Verifying Checksum
f40ed2016c96: Download complete
8a0200dee3b4: Pull complete
1724f328ad6c: Verifying Checksum
1724f328ad6c: Download complete
ec17680e3745: Verifying Checksum
ec17680e3745: Download complete
1724f328ad6c: Pull complete
ec17680e3745: Pull complete
f40ed2016c96: Pull complete
33683062e5fd: Verifying Checksum
33683062e5fd: Download complete
33683062e5fd: Pull complete
Digest: sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb
Status: Downloaded newer image for novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.877098ms)
✔ only HEAD and GET are used (0.187402ms)
✔ a status, its headers and a redirect not followed (21.913508ms)
✔ a refused connection is a result with its error (3.204621ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 116.603301
**Merge check** at `a10f1844`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
- tier 0: dnsmasq, docker, netcheck
- ace: receives docker, netcheck; waits for a person: dnsmasq
- g14: receives docker, netcheck
- novox: receives docker; waits for a person: dnsmasq
- shanks: receives docker
- dnsmasq waits for a person: its policy records (module)
- dnsmasq provides wildcard-resolution: its consumers are sent again after it
- read by no module's build: .gitignore, health-undeclared
Run by the build seat on ace as `build-1791647165417231416` (`builds --log build-1791647165417231416`).
```
--- the gate: dnsmasq, docker, netcheck
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 4 tool(s)
long-running resources without health: 3
files asking for a setting without saying whether it is trusted: 0
3 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 3 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T15:36:57Z 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-10T15:36:57Z
modules the change moves:
- dnsmasq (changed)
- docker (changed)
- netcheck (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- 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; the change adds 5 resource(s) and removes 0 (+archive:dnsmasq.bundle-tools, +directory:dnsmasq.drop-ins, +directory:dnsmasq.watch-dir, +file:dnsmasq.wait-for-address, +process:dnsmasq.watch)
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 1 tier(s): dnsmasq, docker, netcheck
notes:
- .gitignore and health-undeclared read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words and 70 daemons' lines, none in the 38588 strings of 647 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 69, as kept
testing modules/dnsmasq
ok dnsmasq/cmd/dnsmasq-tools 1.043s
testing modules/docker
ok docker/cmd/docker-tools 1.041s
testing modules/netcheck
ok netcheck/cmd/netcheck 1.047s
--- its merge-check-typescript.sh (typescript toolchain)
Unable to find image 'novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb' locally
novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb: Pulling from mesh-tools/build
501c3e032d32: Already exists
d456d1aa143e: Already exists
60f37e2c93ec: Already exists
e53f92c42dd6: Already exists
b571db164614: Already exists
3130c230dcec: Already exists
4198e49907ef: Already exists
487f65298731: Already exists
b7c34aa97486: Already exists
8a0200dee3b4: Pulling fs layer
1724f328ad6c: Pulling fs layer
ec17680e3745: Pulling fs layer
f40ed2016c96: Pulling fs layer
33683062e5fd: Pulling fs layer
f40ed2016c96: Waiting
33683062e5fd: Waiting
8a0200dee3b4: Download complete
f40ed2016c96: Verifying Checksum
f40ed2016c96: Download complete
8a0200dee3b4: Pull complete
1724f328ad6c: Verifying Checksum
1724f328ad6c: Download complete
ec17680e3745: Verifying Checksum
ec17680e3745: Download complete
1724f328ad6c: Pull complete
ec17680e3745: Pull complete
f40ed2016c96: Pull complete
33683062e5fd: Verifying Checksum
33683062e5fd: Download complete
33683062e5fd: Pull complete
Digest: sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb
Status: Downloaded newer image for novox.internal:5100/mesh-tools/build@sha256:6af966c761db958a2f021d1cb4f4b65061016545b66f38245d189ae29a004edb
type-checking modules/netcheck (TypeScript)
testing modules/netcheck (TypeScript)
✔ only http and https URLs are checked (0.877098ms)
✔ only HEAD and GET are used (0.187402ms)
✔ a status, its headers and a redirect not followed (21.913508ms)
✔ a refused connection is a result with its error (3.204621ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 116.603301
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
hq issue 348 (a resolver that stopped answering ran on unnoticed, and builds sent after it were blamed).
dnsmasq
dnsmasq.service(at most every 2 min, 3 an hour) and the next looks say whether that helped.dnsmasq_healthis the watch's declared check (ADR 0240): a restart that helped leaves the module healthy; one that did not becomesmodule.dnsmasq.<machine>.unhealthysaying so. The service getshealth: unit. Emitsrestarted. Tools:dnsmasq_health,dnsmasq_names,dnsmasq_resolve.bind-interfacesinstead ofbind-dynamic: dnsmasq 2.93 closes every listener when an address re-read fails during a bridge teardown (network.c:832-875); reproduced in a network namespace (53 closings in 120 teardowns). A drop-in makes the unit wait for the private address and retry.docker:
docker_eventssays where the runtime's memory of events begins and says so when the window reaches past it (measured: ~256 events, filled by health checks within minutes); newdocker_resolv_confreads a container's resolver file as it sees it.netcheck:
netcheck_dnscan ask one named resolver (server,tcp); newnetcheck_listening(replacesss -lunt). netcheck is assigned only on ace and g14; assigning it on novox and shanks is the operator's.Local
merge-check.sh(MESH_GATE built from mesh-controller main + PR 179) passes: module check ok, count 69 as kept, dnsmasq/docker/netcheck tests ok.Not merged; a person's approval decides.
Delivery
novox/mesh-catalog@a10f1844f2cd— delivered since 2026-10-10T15:55:24ZDelivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
3e56fa51mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Run by the build seat on novox as
build-1791546669480758956(builds --log build-1791546669480758956).3e56fa51a2tod372fc3265Merge check at
d372fc32mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Run by the build seat on shanks as
build-1791547935964726662(builds --log build-1791547935964726662).d372fc3265to486fbd0ba4Merge check at
486fbd0bmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Run by the build seat on novox as
build-1791551101030808396(builds --log build-1791551101030808396).486fbd0ba4toa6a9a818d2Merge check at
a6a9a818mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Run by the build seat on novox as
build-1791552386178608790(builds --log build-1791552386178608790).Merge check at
a10f1844mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: dnsmasq, docker, netcheck)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds dnsmasq, docker, netcheck → ace, g14, novox, shanks; no bus step; 2 wait(s) for a person
Run by the build seat on ace as
build-1791647165417231416(builds --log build-1791647165417231416).