Judge a seat's holder silent only on verbs it must serve (hq issue 299) #121

Merged
mesh-admin merged 1 commits from fix/optional-verbs-are-not-silence into main 2026-10-07 21:01:32 +00:00
Contributor

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-admin added 1 commit 2026-10-07 20:28:50 +00:00
Judge a seat's holder silent only on verbs it must serve (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…
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery superseded: a newer delivery to the same trunk took over its walk
dd668ec887
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.
Author
Contributor

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.

<!-- 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`.
Author
Contributor

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
**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 ```
mesh-admin merged commit c37d7742ba into main 2026-10-07 21:01:32 +00:00
mesh-admin deleted branch fix/optional-verbs-are-not-silence 2026-10-07 21:01:33 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#121