Urgent: a false alarm is live now. Since 19:25 UTC on 2026-10-07, D3 has held seat.node-uplink.<node>.silent open on all four machines: "node-uplink's holder on does not answer the bus".
Cause.#116 gave node-uplink its first verbs, resolvers and links. Both are optional, because the holders (networkmanager, systemd-networkd) do not serve them yet; mesh-catalog #107 adds them. D3 (probeHolders) skipped a seat only when it had no verbs at all, so it started expecting every holder to answer discovery for the seat, and none did.
Fix. Silence is now judged only on required verbs. A seat is expected to have answering holders only when at least one of its verbs is not optional (holdingNeedsAnAnswer). The expectation and the judgement are pulled out into the pure functions holdersToHear and silentHolders. This brings D3 in line with hq ADR 0246 and design 33 §7: "a holder that does not yet serve it still holds the seat".
Tests
TestAHolderOfASeatWhoseVerbsAreAllOptionalIsNotSilent replays the live case: seat rows read back through UseSeats without the mark, node-uplink held on four machines, nothing answering. It fails without the rule and passes with it.
TestAHolderServingNoRequiredVerbIsStillSilent: a seat with one required verb and one optional verb, whose holder answers nothing, is still silent.
TestHoldingNeedsAnAnswer.
The local MESH_TEST_POSTGRES=… sh merge-check.sh run passed: gofmt, vet, and the full suite under -race.
Recorded as novox/hq issue 299.
**Urgent: a false alarm is live now.** Since 19:25 UTC on 2026-10-07, D3 has held `seat.node-uplink.<node>.silent` open on all four machines: "node-uplink's holder on <node> does not answer the bus".
**Cause.** #116 gave `node-uplink` its first verbs, `resolvers` and `links`. Both are optional, because the holders (networkmanager, systemd-networkd) do not serve them yet; mesh-catalog #107 adds them. D3 (`probeHolders`) skipped a seat only when it had no verbs at all, so it started expecting every holder to answer discovery for the seat, and none did.
**Fix.** Silence is now judged only on required verbs. A seat is expected to have answering holders only when at least one of its verbs is not optional (`holdingNeedsAnAnswer`). The expectation and the judgement are pulled out into the pure functions `holdersToHear` and `silentHolders`. This brings D3 in line with hq ADR 0246 and design 33 §7: "a holder that does not yet serve it still holds the seat".
**Tests**
- `TestAHolderOfASeatWhoseVerbsAreAllOptionalIsNotSilent` replays the live case: seat rows read back through `UseSeats` without the mark, node-uplink held on four machines, nothing answering. It fails without the rule and passes with it.
- `TestAHolderServingNoRequiredVerbIsStillSilent`: a seat with one required verb and one optional verb, whose holder answers nothing, is still silent.
- `TestHoldingNeedsAnAnswer`.
The local `MESH_TEST_POSTGRES=… sh merge-check.sh` run passed: gofmt, vet, and the full suite under `-race`.
Recorded as novox/hq issue 299.
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
node-uplink gained its first verbs in #116, both optional while its holders
catch up (ADR 0246). D3 read any verb as one the holder must answer for, and
raised a silent condition on every machine holding the seat. A seat whose
verbs are all optional now asks nothing of its holders' silence.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Machines
mesh-controller on novox: judging — 0 healthy judging(s) so far
Transitions
2026-10-07 20:29 (new) → proposed (announced): novox/mesh-controller#121's head announced
2026-10-07 20:35 proposed → checked (checked): the verdict names this commit
2026-10-07 20:35 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-07 21:01 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-07 21:01 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path
2026-10-07 21:02 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@dd668ec88776` — **superseded** since 2026-10-07T21:02:24Z
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Machines**
- mesh-controller on novox: judging — 0 healthy judging(s) so far
**Transitions**
- 2026-10-07 20:29 (new) → proposed (announced): novox/mesh-controller#121's head announced
- 2026-10-07 20:35 proposed → checked (checked): the verdict names this commit
- 2026-10-07 20:35 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-07 21:01 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-07 21:01 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path
- 2026-10-07 21:02 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on g14 as build-1791404961657982553 (builds --log build-1791404961657982553).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-07T20:27: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-07T20:27:57Z
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.036s
ok github.com/novox/mesh-controller/cmd/mesh-controller 227.023s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.196s
ok github.com/novox/mesh-controller/internal/artifacts 1.035s
ok github.com/novox/mesh-controller/internal/broker 2.648s
ok github.com/novox/mesh-controller/internal/builder 1.356s
ok github.com/novox/mesh-controller/internal/catalogue 4.218s
ok github.com/novox/mesh-controller/internal/conditions 1.996s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 7.904s
ok github.com/novox/mesh-controller/internal/inventory 144.327s
ok github.com/novox/mesh-controller/internal/lease 17.694s
ok github.com/novox/mesh-controller/internal/licences 7.075s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 60.825s
ok github.com/novox/mesh-controller/internal/lint 1.860s
ok github.com/novox/mesh-controller/internal/outward 1.035s
ok github.com/novox/mesh-controller/internal/overlay 1.023s
ok github.com/novox/mesh-controller/internal/secrets 1.400s
ok github.com/novox/mesh-controller/internal/store 4.218s
ok github.com/novox/mesh-controller/internal/testbus 1.191s
ok github.com/novox/mesh-controller/internal/token 1.022s
**Merge check** at `dd668ec8`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on g14 as `build-1791404961657982553` (`builds --log build-1791404961657982553`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-07T20:27: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-07T20:27:57Z
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.036s
ok github.com/novox/mesh-controller/cmd/mesh-controller 227.023s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.196s
ok github.com/novox/mesh-controller/internal/artifacts 1.035s
ok github.com/novox/mesh-controller/internal/broker 2.648s
ok github.com/novox/mesh-controller/internal/builder 1.356s
ok github.com/novox/mesh-controller/internal/catalogue 4.218s
ok github.com/novox/mesh-controller/internal/conditions 1.996s
ok github.com/novox/mesh-controller/internal/envfile 1.028s
ok github.com/novox/mesh-controller/internal/facts 1.031s
ok github.com/novox/mesh-controller/internal/identity 7.904s
ok github.com/novox/mesh-controller/internal/inventory 144.327s
ok github.com/novox/mesh-controller/internal/lease 17.694s
ok github.com/novox/mesh-controller/internal/licences 7.075s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 60.825s
ok github.com/novox/mesh-controller/internal/lint 1.860s
ok github.com/novox/mesh-controller/internal/outward 1.035s
ok github.com/novox/mesh-controller/internal/overlay 1.023s
ok github.com/novox/mesh-controller/internal/secrets 1.400s
ok github.com/novox/mesh-controller/internal/store 4.218s
ok github.com/novox/mesh-controller/internal/testbus 1.191s
ok github.com/novox/mesh-controller/internal/token 1.022s
```
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.
Urgent: a false alarm is live now. Since 19:25 UTC on 2026-10-07, D3 has held
seat.node-uplink.<node>.silentopen on all four machines: "node-uplink's holder on does not answer the bus".Cause. #116 gave
node-uplinkits first verbs,resolversandlinks. Both are optional, because the holders (networkmanager, systemd-networkd) do not serve them yet; mesh-catalog #107 adds them. D3 (probeHolders) skipped a seat only when it had no verbs at all, so it started expecting every holder to answer discovery for the seat, and none did.Fix. Silence is now judged only on required verbs. A seat is expected to have answering holders only when at least one of its verbs is not optional (
holdingNeedsAnAnswer). The expectation and the judgement are pulled out into the pure functionsholdersToHearandsilentHolders. This brings D3 in line with hq ADR 0246 and design 33 §7: "a holder that does not yet serve it still holds the seat".Tests
TestAHolderOfASeatWhoseVerbsAreAllOptionalIsNotSilentreplays the live case: seat rows read back throughUseSeatswithout the mark, node-uplink held on four machines, nothing answering. It fails without the rule and passes with it.TestAHolderServingNoRequiredVerbIsStillSilent: a seat with one required verb and one optional verb, whose holder answers nothing, is still silent.TestHoldingNeedsAnAnswer.The local
MESH_TEST_POSTGRES=… sh merge-check.shrun passed: gofmt, vet, and the full suite under-race.Recorded as novox/hq issue 299.
Delivery
novox/mesh-controller@dd668ec88776— superseded since 2026-10-07T21:02:24ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
dd668ec8mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791404961657982553(builds --log build-1791404961657982553).