The controller asks the operator and acts on the warrant (hq ADR 0259 §6) #157

Closed
mesh-admin wants to merge 0 commits from feat/the-controller-asks-the-operator into main
Contributor

Step 5 of hq ADR 0259 (hq #211). The controller asks the router like any other module, and performs the answer the operator chose with its own grant. It holds no channel, identity or factor, and nothing in it is Telegram-specific.

Stacked on #154 (head a1b7be8). Review the two commits after it: 7ea2ba4 (the asker) and 9877837 (the changes after review).

What

  • conditions.Action gains Level (acknowledge or approve). Silence acknowledges. These producers offer approve-level actions again:
    • a held delivery: Release and Stop (mesh-delivery.release and stop);
    • a walk past its bound: Start and Stop (mesh-controller.plans go and stop, with cause operator-answer);
    • a module with a failed unit: Restart (node-service-manager.restart on its machine).
  • The asker (asker.go, asker_wire.go):
    • It publishes one ask per open, unsilenced condition that needs the operator and names actions, on accept.ask.mesh-controller, with About set to the condition key.
    • It cancels the ask when the condition clears, is silenced, or its answers change.
    • It asks again after an expiry. It does not ask again for an hour after an answer.
    • Asks are kept in the bucket mesh-controller_asked.
    • A warrant missed while away is read from the router's record.
  • On a warrant (decided.mesh-controller), it acts once per ask, through the verb the action names. The hand-act is recorded under warrant (by, via, ask, proofs, requested-by), as a person's decision.
  • Grants: ask, cancel and decided, derived from the seat's declaration. Also release, stop, restart and plans.

Changed after review (9877837)

  • The condition's own needs keep "from the mesh MCP server; this notification cannot do it.". Only the ask's text drops it (askText). This resolves the conflict with #155's test, and the three plain_words_test.go expectations are back to the suffix, now with the action labels.
  • An ask the router refused is not asked again until the condition's answers or the channels change. The channels fingerprint covers which module holds which kind, where, with what capabilities and whether on its own account.
  • At most 3 asks are open at once: urgent first, then the oldest.
  • No asking unless a router is assigned that declares operator-channel with ask named by its caller. Its absence is said once.
  • An approve ask lasts 23 h 50 min, so the SDK's 24 h bound never refuses it.
  • mesh-sdk is a direct dependency, vendored at 55090da (go/asks). Move to the tag once mesh-sdk #12 merges.
  • Security finding 9:
    • before acting, the controller claims the ask by compare-and-set on its key's revision (open to acting), and acts only if that write stands;
    • a warrant for an ask that is not open in the controller's own record is refused;
    • a warrant given after the ask expired is refused (the SDK's Warrant.For).
  • The asked bucket's bounds are tested: history 1, 30 days, a byte cap.

Tests

  • asker_test.go, after review:
    • TestAnAskTheRouterRefusedWaitsUntilSomethingChanges
    • TestAtMostThreeAsksAreOpenTheMostUrgentFirst
    • TestNothingIsAskedWithoutARouter
    • TestTheAskDropsWhereItIsAnsweredAndTheConditionKeepsIt
    • TestAWarrantIsActedOnlyForAnOpenAskItClaimsBeforeItExpired (late warrant, lost claim, cancelled ask)
  • internal/broker/controller_buckets_test.go: TestWhatTheControllerAskedIsBounded.
  • The earlier asker, grant and plain-words tests stand.
  • sh merge-check.sh passes locally, with mesh-host #59 beside it. The grants are unchanged from #59, so #59 needs no change.

Merge order: after #154, and together with mesh-host #59 (the installer's first user list carries these grants; the genesis test fails without it). After mesh-tools #23, the mesh-sdk #12 tag, and mesh-catalog #133 live. Do not merge without review.

Step 5 of hq ADR 0259 (hq #211). The controller asks the router like any other module, and performs the answer the operator chose with its own grant. It holds no channel, identity or factor, and nothing in it is Telegram-specific. Stacked on #154 (head a1b7be8). Review the two commits after it: 7ea2ba4 (the asker) and 9877837 (the changes after review). **What** - `conditions.Action` gains `Level` (acknowledge or approve). Silence acknowledges. These producers offer approve-level actions again: - a held delivery: Release and Stop (`mesh-delivery.release` and `stop`); - a walk past its bound: Start and Stop (`mesh-controller.plans` go and stop, with cause operator-answer); - a module with a failed unit: Restart (`node-service-manager.restart` on its machine). - **The asker** (`asker.go`, `asker_wire.go`): - It publishes one ask per open, unsilenced condition that needs the operator and names actions, on `accept.ask.mesh-controller`, with About set to the condition key. - It cancels the ask when the condition clears, is silenced, or its answers change. - It asks again after an expiry. It does not ask again for an hour after an answer. - Asks are kept in the bucket `mesh-controller_asked`. - A warrant missed while away is read from the router's record. - **On a warrant** (`decided.mesh-controller`), it acts once per ask, through the verb the action names. The hand-act is recorded under `warrant` (by, via, ask, proofs, requested-by), as a person's decision. - **Grants:** ask, cancel and decided, derived from the seat's declaration. Also release, stop, restart and `plans`. **Changed after review (9877837)** - The condition's own needs keep "from the mesh MCP server; this notification cannot do it.". Only the ask's text drops it (`askText`). This resolves the conflict with #155's test, and the three `plain_words_test.go` expectations are back to the suffix, now with the action labels. - An ask the router refused is not asked again until the condition's answers or the channels change. The channels fingerprint covers which module holds which kind, where, with what capabilities and whether on its own account. - At most 3 asks are open at once: urgent first, then the oldest. - No asking unless a router is assigned that declares `operator-channel` with `ask` named by its caller. Its absence is said once. - An approve ask lasts 23 h 50 min, so the SDK's 24 h bound never refuses it. - mesh-sdk is a direct dependency, vendored at 55090da (`go/asks`). Move to the tag once mesh-sdk #12 merges. - **Security finding 9:** - before acting, the controller claims the ask by compare-and-set on its key's revision (open to acting), and acts only if that write stands; - a warrant for an ask that is not open in the controller's own record is refused; - a warrant given after the ask expired is refused (the SDK's `Warrant.For`). - The `asked` bucket's bounds are tested: history 1, 30 days, a byte cap. **Tests** - `asker_test.go`, after review: - `TestAnAskTheRouterRefusedWaitsUntilSomethingChanges` - `TestAtMostThreeAsksAreOpenTheMostUrgentFirst` - `TestNothingIsAskedWithoutARouter` - `TestTheAskDropsWhereItIsAnsweredAndTheConditionKeepsIt` - `TestAWarrantIsActedOnlyForAnOpenAskItClaimsBeforeItExpired` (late warrant, lost claim, cancelled ask) - `internal/broker/controller_buckets_test.go`: `TestWhatTheControllerAskedIsBounded`. - The earlier asker, grant and plain-words tests stand. - `sh merge-check.sh` passes locally, with mesh-host #59 beside it. The grants are unchanged from #59, so #59 needs no change. **Merge order:** after #154, and together with mesh-host #59 (the installer's first user list carries these grants; the genesis test fails without it). After mesh-tools #23, the mesh-sdk #12 tag, and mesh-catalog #133 live. Do not merge without review.
Author
Contributor

Delivery novox/mesh-controller@0559b808874b — stopped since 2026-10-09T17:34:15Z

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

Transitions

  • 2026-10-09 14:23 (new) → proposed (announced): novox/mesh-controller#157's head announced
  • 2026-10-09 14:29 proposed → checked (checked): the verdict names this commit
  • 2026-10-09 14:29 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
  • 2026-10-09 17:34 rejected → stopped (closed): the pull request closed unmerged

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@0559b808874b` — **stopped** since 2026-10-09T17:34:15Z **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 **Transitions** - 2026-10-09 14:23 (new) → proposed (announced): novox/mesh-controller#157's head announced - 2026-10-09 14:29 proposed → checked (checked): the verdict names this commit - 2026-10-09 14:29 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed - 2026-10-09 17:34 rejected → stopped (closed): the pull request closed unmerged The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at 48aa8f68

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s)

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 ace as build-1791472527719622571 (builds --log build-1791472527719622571).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 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-08T15:11:36Z 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-08T15:11:36Z

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.033s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	159.613s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.012s
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.106s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.042s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	1.461s
ok  	github.com/novox/mesh-controller/internal/builder	1.804s
ok  	github.com/novox/mesh-controller/internal/catalogue	4.079s
ok  	github.com/novox/mesh-controller/internal/conditions	2.167s
ok  	github.com/novox/mesh-controller/internal/envfile	1.044s
ok  	github.com/novox/mesh-controller/internal/facts	1.046s
ok  	github.com/novox/mesh-controller/internal/identity	4.047s
ok  	github.com/novox/mesh-controller/internal/inventory	70.909s
ok  	github.com/novox/mesh-controller/internal/lease	17.701s
ok  	github.com/novox/mesh-controller/internal/licences	3.689s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.065s
ok  	github.com/novox/mesh-controller/internal/link	44.097s
ok  	github.com/novox/mesh-controller/internal/lint	1.964s
ok  	github.com/novox/mesh-controller/internal/outward	1.069s
ok  	github.com/novox/mesh-controller/internal/overlay	1.079s
ok  	github.com/novox/mesh-controller/internal/secrets	1.439s
ok  	github.com/novox/mesh-controller/internal/store	3.239s
ok  	github.com/novox/mesh-controller/internal/testbus	1.212s
ok  	github.com/novox/mesh-controller/internal/token	1.015s
FAIL
**Merge check** at `48aa8f68` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s) **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 ace as `build-1791472527719622571` (`builds --log build-1791472527719622571`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 51 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-08T15:11:36Z 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-08T15:11:36Z 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.033s ok github.com/novox/mesh-controller/cmd/mesh-controller 159.613s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s 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.106s ok github.com/novox/mesh-controller/internal/artifacts 1.042s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.62s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 1.461s ok github.com/novox/mesh-controller/internal/builder 1.804s ok github.com/novox/mesh-controller/internal/catalogue 4.079s ok github.com/novox/mesh-controller/internal/conditions 2.167s ok github.com/novox/mesh-controller/internal/envfile 1.044s ok github.com/novox/mesh-controller/internal/facts 1.046s ok github.com/novox/mesh-controller/internal/identity 4.047s ok github.com/novox/mesh-controller/internal/inventory 70.909s ok github.com/novox/mesh-controller/internal/lease 17.701s ok github.com/novox/mesh-controller/internal/licences 3.689s ok github.com/novox/mesh-controller/internal/licences/adapters 1.065s ok github.com/novox/mesh-controller/internal/link 44.097s ok github.com/novox/mesh-controller/internal/lint 1.964s ok github.com/novox/mesh-controller/internal/outward 1.069s ok github.com/novox/mesh-controller/internal/overlay 1.079s ok github.com/novox/mesh-controller/internal/secrets 1.439s ok github.com/novox/mesh-controller/internal/store 3.239s ok github.com/novox/mesh-controller/internal/testbus 1.212s ok github.com/novox/mesh-controller/internal/token 1.015s FAIL ```
Author
Contributor

The first mesh/repo-check failed on one test only: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose. It compares the controller's derived grants with the installer's template in mesh-host. That template now carries the new grants in mesh-host #59. With #59 beside this branch the test passes locally. Merge #59 first, then recheck this PR. Every other package passed, and mesh/merge-gate passed (4 of 4 machines compose).

The first `mesh/repo-check` failed on one test only: `TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose`. It compares the controller's derived grants with the installer's template in mesh-host. That template now carries the new grants in mesh-host #59. With #59 beside this branch the test passes locally. Merge #59 first, then recheck this PR. Every other package passed, and `mesh/merge-gate` passed (4 of 4 machines compose).
jschoubben force-pushed feat/the-controller-asks-the-operator from 48aa8f68d6 to 98778376ca 2026-10-08 16:37:32 +00:00 Compare
Author
Contributor

Merge check at 98778376

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s)

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-1791477469485950442 (builds --log build-1791477469485950442).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 51 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-08T16:26:42Z 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-08T16:26:42Z

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.042s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	198.595s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.015s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.023s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.017s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.210s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.048s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	2.765s
ok  	github.com/novox/mesh-controller/internal/builder	1.996s
ok  	github.com/novox/mesh-controller/internal/catalogue	4.265s
ok  	github.com/novox/mesh-controller/internal/conditions	2.161s
ok  	github.com/novox/mesh-controller/internal/envfile	1.017s
ok  	github.com/novox/mesh-controller/internal/facts	1.033s
ok  	github.com/novox/mesh-controller/internal/identity	6.278s
ok  	github.com/novox/mesh-controller/internal/inventory	79.257s
ok  	github.com/novox/mesh-controller/internal/lease	17.678s
ok  	github.com/novox/mesh-controller/internal/licences	5.850s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.011s
ok  	github.com/novox/mesh-controller/internal/link	44.847s
ok  	github.com/novox/mesh-controller/internal/lint	1.792s
ok  	github.com/novox/mesh-controller/internal/outward	1.038s
ok  	github.com/novox/mesh-controller/internal/overlay	1.027s
ok  	github.com/novox/mesh-controller/internal/secrets	1.374s
ok  	github.com/novox/mesh-controller/internal/store	5.193s
ok  	github.com/novox/mesh-controller/internal/testbus	1.159s
ok  	github.com/novox/mesh-controller/internal/token	1.016s
FAIL
**Merge check** at `98778376` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s) **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-1791477469485950442` (`builds --log build-1791477469485950442`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 51 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-08T16:26:42Z 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-08T16:26:42Z 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.042s ok github.com/novox/mesh-controller/cmd/mesh-controller 198.595s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.023s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s ok github.com/novox/mesh-controller/examples/route-proxy 1.210s ok github.com/novox/mesh-controller/internal/artifacts 1.048s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.66s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 2.765s ok github.com/novox/mesh-controller/internal/builder 1.996s ok github.com/novox/mesh-controller/internal/catalogue 4.265s ok github.com/novox/mesh-controller/internal/conditions 2.161s ok github.com/novox/mesh-controller/internal/envfile 1.017s ok github.com/novox/mesh-controller/internal/facts 1.033s ok github.com/novox/mesh-controller/internal/identity 6.278s ok github.com/novox/mesh-controller/internal/inventory 79.257s ok github.com/novox/mesh-controller/internal/lease 17.678s ok github.com/novox/mesh-controller/internal/licences 5.850s ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s ok github.com/novox/mesh-controller/internal/link 44.847s ok github.com/novox/mesh-controller/internal/lint 1.792s ok github.com/novox/mesh-controller/internal/outward 1.038s ok github.com/novox/mesh-controller/internal/overlay 1.027s ok github.com/novox/mesh-controller/internal/secrets 1.374s ok github.com/novox/mesh-controller/internal/store 5.193s ok github.com/novox/mesh-controller/internal/testbus 1.159s ok github.com/novox/mesh-controller/internal/token 1.016s FAIL ```
jschoubben force-pushed feat/the-controller-asks-the-operator from 98778376ca to 1e361a17a9 2026-10-09 09:09:08 +00:00 Compare
Author
Contributor

Merge check at 1e361a17

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.65s)

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 ace as build-1791536951915878830 (builds --log build-1791536951915878830).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z

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.047s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	182.336s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.017s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.017s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.141s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.053s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.65s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	1.737s
ok  	github.com/novox/mesh-controller/internal/builder	2.112s
ok  	github.com/novox/mesh-controller/internal/catalogue	4.715s
ok  	github.com/novox/mesh-controller/internal/conditions	2.542s
ok  	github.com/novox/mesh-controller/internal/envfile	1.084s
ok  	github.com/novox/mesh-controller/internal/facts	1.076s
ok  	github.com/novox/mesh-controller/internal/identity	4.604s
ok  	github.com/novox/mesh-controller/internal/inventory	74.416s
ok  	github.com/novox/mesh-controller/internal/lease	17.730s
ok  	github.com/novox/mesh-controller/internal/licences	4.210s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.067s
ok  	github.com/novox/mesh-controller/internal/link	51.420s
ok  	github.com/novox/mesh-controller/internal/lint	2.190s
ok  	github.com/novox/mesh-controller/internal/outward	1.114s
ok  	github.com/novox/mesh-controller/internal/overlay	1.096s
ok  	github.com/novox/mesh-controller/internal/secrets	1.495s
ok  	github.com/novox/mesh-controller/internal/store	3.583s
ok  	github.com/novox/mesh-controller/internal/testbus	1.271s
ok  	github.com/novox/mesh-controller/internal/token	1.021s
FAIL
**Merge check** at `1e361a17` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.65s) **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 ace as `build-1791536951915878830` (`builds --log build-1791536951915878830`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 52 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 files asking for a setting without saying whether it is trusted: 0 1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z 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.047s ok github.com/novox/mesh-controller/cmd/mesh-controller 182.336s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.017s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.021s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s ok github.com/novox/mesh-controller/examples/route-proxy 1.141s ok github.com/novox/mesh-controller/internal/artifacts 1.053s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.65s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 1.737s ok github.com/novox/mesh-controller/internal/builder 2.112s ok github.com/novox/mesh-controller/internal/catalogue 4.715s ok github.com/novox/mesh-controller/internal/conditions 2.542s ok github.com/novox/mesh-controller/internal/envfile 1.084s ok github.com/novox/mesh-controller/internal/facts 1.076s ok github.com/novox/mesh-controller/internal/identity 4.604s ok github.com/novox/mesh-controller/internal/inventory 74.416s ok github.com/novox/mesh-controller/internal/lease 17.730s ok github.com/novox/mesh-controller/internal/licences 4.210s ok github.com/novox/mesh-controller/internal/licences/adapters 1.067s ok github.com/novox/mesh-controller/internal/link 51.420s ok github.com/novox/mesh-controller/internal/lint 2.190s ok github.com/novox/mesh-controller/internal/outward 1.114s ok github.com/novox/mesh-controller/internal/overlay 1.096s ok github.com/novox/mesh-controller/internal/secrets 1.495s ok github.com/novox/mesh-controller/internal/store 3.583s ok github.com/novox/mesh-controller/internal/testbus 1.271s ok github.com/novox/mesh-controller/internal/token 1.021s FAIL ```
Author
Contributor

Merge check at ec4f42bc

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)

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 novox as build-1791537439632477729 (builds --log build-1791537439632477729).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z

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.045s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	213.598s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.017s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.025s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.019s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.115s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.053s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	1.863s
ok  	github.com/novox/mesh-controller/internal/builder	2.407s
ok  	github.com/novox/mesh-controller/internal/catalogue	5.228s
ok  	github.com/novox/mesh-controller/internal/conditions	2.589s
ok  	github.com/novox/mesh-controller/internal/envfile	1.029s
ok  	github.com/novox/mesh-controller/internal/facts	1.031s
ok  	github.com/novox/mesh-controller/internal/identity	4.953s
ok  	github.com/novox/mesh-controller/internal/inventory	90.444s
ok  	github.com/novox/mesh-controller/internal/lease	17.687s
ok  	github.com/novox/mesh-controller/internal/licences	4.564s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.014s
ok  	github.com/novox/mesh-controller/internal/link	54.262s
ok  	github.com/novox/mesh-controller/internal/lint	2.190s
ok  	github.com/novox/mesh-controller/internal/outward	1.037s
ok  	github.com/novox/mesh-controller/internal/overlay	1.026s
ok  	github.com/novox/mesh-controller/internal/secrets	1.472s
ok  	github.com/novox/mesh-controller/internal/store	3.485s
ok  	github.com/novox/mesh-controller/internal/testbus	1.189s
ok  	github.com/novox/mesh-controller/internal/token	1.023s
FAIL
**Merge check** at `ec4f42bc` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s) **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 novox as `build-1791537439632477729` (`builds --log build-1791537439632477729`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 52 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 files asking for a setting without saying whether it is trusted: 0 1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z 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.045s ok github.com/novox/mesh-controller/cmd/mesh-controller 213.598s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.017s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.025s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.019s ok github.com/novox/mesh-controller/examples/route-proxy 1.115s ok github.com/novox/mesh-controller/internal/artifacts 1.053s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 1.863s ok github.com/novox/mesh-controller/internal/builder 2.407s ok github.com/novox/mesh-controller/internal/catalogue 5.228s ok github.com/novox/mesh-controller/internal/conditions 2.589s ok github.com/novox/mesh-controller/internal/envfile 1.029s ok github.com/novox/mesh-controller/internal/facts 1.031s ok github.com/novox/mesh-controller/internal/identity 4.953s ok github.com/novox/mesh-controller/internal/inventory 90.444s ok github.com/novox/mesh-controller/internal/lease 17.687s ok github.com/novox/mesh-controller/internal/licences 4.564s ok github.com/novox/mesh-controller/internal/licences/adapters 1.014s ok github.com/novox/mesh-controller/internal/link 54.262s ok github.com/novox/mesh-controller/internal/lint 2.190s ok github.com/novox/mesh-controller/internal/outward 1.037s ok github.com/novox/mesh-controller/internal/overlay 1.026s ok github.com/novox/mesh-controller/internal/secrets 1.472s ok github.com/novox/mesh-controller/internal/store 3.485s ok github.com/novox/mesh-controller/internal/testbus 1.189s ok github.com/novox/mesh-controller/internal/token 1.023s FAIL ```
jschoubben force-pushed feat/the-controller-asks-the-operator from ec4f42bc5c to 411049a655 2026-10-09 10:38:20 +00:00 Compare
Author
Contributor

Review of 2026-10-09 addressed at head 411049a (on #154 0c828fb):

  • M1: an acknowledgement (Silence) is never in the same ask as an approval. A condition offering both is asked twice: the approval about the condition, and Silence apart, about <key>.acknowledge. Test: TestAnAcknowledgementNeverSharesAnAskWithAnApproval (fails on the old head).
  • L2: the asked store creates once and changes only by compare-and-set over the revision it read. Test: TestAStaleCancelDoesNotWriteOverAnAct on a real bus (fails on the old head).
  • L3: every ask is kept before it is published, and one that could not be published is marked unsent and asked again. A cancel is kept before it is said. The terminal-only test question is now mesh-controller rehearse, with both answers at the approve level. Its hand-act reads warrant rehearsal rehearsal=approve.
  • L7: two deliveries of one warrant to two controllers at once perform the act once. Test: TestTwoAnswersAtOnceActOnce on a real bus. This test also passes on the old head, because its claim was already a compare-and-set.
  • L1: warrants are deduplicated on the controller's own record by compare-and-set, never on a message id. Only the router may publish event.decided; the existing grant tests cover that.
  • Re-vendored on mesh-sdk 76902998 (canonical digests).
  • The lab's bus fixture composes verified-sender only with MESH_LAB_ASKS_ROOT_FREE=true.

merge-check.sh passes locally with mesh-host #59 checked out beside it.

Review of 2026-10-09 addressed at head 411049a (on #154 0c828fb): - **M1**: an acknowledgement (Silence) is never in the same ask as an approval. A condition offering both is asked twice: the approval about the condition, and Silence apart, about `<key>.acknowledge`. Test: `TestAnAcknowledgementNeverSharesAnAskWithAnApproval` (fails on the old head). - **L2**: the asked store creates once and changes only by compare-and-set over the revision it read. Test: `TestAStaleCancelDoesNotWriteOverAnAct` on a real bus (fails on the old head). - **L3**: every ask is kept before it is published, and one that could not be published is marked unsent and asked again. A cancel is kept before it is said. The terminal-only test question is now `mesh-controller rehearse`, with both answers at the approve level. Its hand-act reads `warrant rehearsal rehearsal=approve`. - **L7**: two deliveries of one warrant to two controllers at once perform the act once. Test: `TestTwoAnswersAtOnceActOnce` on a real bus. This test also passes on the old head, because its claim was already a compare-and-set. - **L1**: warrants are deduplicated on the controller's own record by compare-and-set, never on a message id. Only the router may publish `event.decided`; the existing grant tests cover that. - Re-vendored on mesh-sdk 76902998 (canonical digests). - The lab's bus fixture composes `verified-sender` only with `MESH_LAB_ASKS_ROOT_FREE=true`. `merge-check.sh` passes locally with mesh-host #59 checked out beside it.
Author
Contributor

Merge check at 411049a6

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)

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 novox as build-1791542326843304564 (builds --log build-1791542326843304564).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 53 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z

modules the change moves:
  - mesh-controller (changed)

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.042s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	219.457s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.027s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.034s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.131s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.065s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	2.126s
ok  	github.com/novox/mesh-controller/internal/builder	3.664s
ok  	github.com/novox/mesh-controller/internal/catalogue	5.212s
ok  	github.com/novox/mesh-controller/internal/conditions	2.656s
ok  	github.com/novox/mesh-controller/internal/envfile	1.029s
ok  	github.com/novox/mesh-controller/internal/facts	1.030s
ok  	github.com/novox/mesh-controller/internal/identity	5.462s
ok  	github.com/novox/mesh-controller/internal/inventory	90.848s
ok  	github.com/novox/mesh-controller/internal/lease	17.676s
ok  	github.com/novox/mesh-controller/internal/licences	5.007s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.012s
ok  	github.com/novox/mesh-controller/internal/link	54.731s
ok  	github.com/novox/mesh-controller/internal/lint	2.151s
ok  	github.com/novox/mesh-controller/internal/outward	1.037s
ok  	github.com/novox/mesh-controller/internal/overlay	1.027s
ok  	github.com/novox/mesh-controller/internal/secrets	1.460s
ok  	github.com/novox/mesh-controller/internal/store	3.401s
ok  	github.com/novox/mesh-controller/internal/testbus	1.198s
ok  	github.com/novox/mesh-controller/internal/token	1.016s
FAIL
**Merge check** at `411049a6` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s) **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 novox as `build-1791542326843304564` (`builds --log build-1791542326843304564`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 53 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 files asking for a setting without saying whether it is trusted: 0 1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T08:07:39Z 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-09T08:07:39Z modules the change moves: - mesh-controller (changed) 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.042s ok github.com/novox/mesh-controller/cmd/mesh-controller 219.457s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.027s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.034s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s ok github.com/novox/mesh-controller/examples/route-proxy 1.131s ok github.com/novox/mesh-controller/internal/artifacts 1.065s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.73s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 2.126s ok github.com/novox/mesh-controller/internal/builder 3.664s ok github.com/novox/mesh-controller/internal/catalogue 5.212s ok github.com/novox/mesh-controller/internal/conditions 2.656s ok github.com/novox/mesh-controller/internal/envfile 1.029s ok github.com/novox/mesh-controller/internal/facts 1.030s ok github.com/novox/mesh-controller/internal/identity 5.462s ok github.com/novox/mesh-controller/internal/inventory 90.848s ok github.com/novox/mesh-controller/internal/lease 17.676s ok github.com/novox/mesh-controller/internal/licences 5.007s ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s ok github.com/novox/mesh-controller/internal/link 54.731s ok github.com/novox/mesh-controller/internal/lint 2.151s ok github.com/novox/mesh-controller/internal/outward 1.037s ok github.com/novox/mesh-controller/internal/overlay 1.027s ok github.com/novox/mesh-controller/internal/secrets 1.460s ok github.com/novox/mesh-controller/internal/store 3.401s ok github.com/novox/mesh-controller/internal/testbus 1.198s ok github.com/novox/mesh-controller/internal/token 1.016s FAIL ```
jschoubben force-pushed feat/the-controller-asks-the-operator from 411049a655 to 29d6495cab 2026-10-09 12:54:40 +00:00 Compare
Author
Contributor

Confirmation-review round (2026-10-09), restacked on #154 c544c2a. New:

  • M1: a silence no longer takes an approval back: an open approval ask about a condition silenced since stays until answered or expired. The test now silences the condition as the controller does; it failed before (0 open) and passes, and the kept Restart is performed on its warrant.
  • rehearse asks startedAtTheTerminal (an ordinary mesh-cli line, #176, read as the terminal before); test failed before.
  • main's mesh-cli test helper asked renamed cliAsked (it clashed with the asker's type).
  • mesh-sdk at 16984aa (rebased SDK; refuses a warrant with no time or an ask with no expiry).
    merge-check.sh passed locally on the head with mesh-host #59 beside it. Merge with mesh-host #59.
**Confirmation-review round (2026-10-09)**, restacked on #154 c544c2a. New: - M1: a silence no longer takes an approval back: an open approval ask about a condition silenced since stays until answered or expired. The test now silences the condition as the controller does; it failed before (0 open) and passes, and the kept Restart is performed on its warrant. - rehearse asks `startedAtTheTerminal` (an ordinary mesh-cli line, #176, read as the terminal before); test failed before. - main's mesh-cli test helper `asked` renamed `cliAsked` (it clashed with the asker's type). - mesh-sdk at 16984aa (rebased SDK; refuses a warrant with no time or an ask with no expiry). merge-check.sh passed locally on the head with mesh-host #59 beside it. Merge with mesh-host #59.
Author
Contributor

Merge check at 29d6495c

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.77s)

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 novox as build-1791550489261439965 (builds --log build-1791550489261439965).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 53 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T12:52: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-09T12:52:20Z

modules the change moves:
  - mesh-controller (changed)

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.040s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	244.497s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.016s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.023s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.015s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.140s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.059s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.77s)
    genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried
    genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller]
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	1.992s
ok  	github.com/novox/mesh-controller/internal/builder	2.343s
ok  	github.com/novox/mesh-controller/internal/catalogue	5.622s
ok  	github.com/novox/mesh-controller/internal/conditions	2.590s
ok  	github.com/novox/mesh-controller/internal/envfile	1.031s
ok  	github.com/novox/mesh-controller/internal/facts	1.033s
ok  	github.com/novox/mesh-controller/internal/identity	5.243s
ok  	github.com/novox/mesh-controller/internal/inventory	104.103s
ok  	github.com/novox/mesh-controller/internal/lease	17.736s
ok  	github.com/novox/mesh-controller/internal/licences	4.782s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.018s
ok  	github.com/novox/mesh-controller/internal/link	57.177s
ok  	github.com/novox/mesh-controller/internal/lint	2.366s
ok  	github.com/novox/mesh-controller/internal/outward	1.047s
ok  	github.com/novox/mesh-controller/internal/overlay	1.034s
ok  	github.com/novox/mesh-controller/internal/secrets	1.550s
ok  	github.com/novox/mesh-controller/internal/store	3.590s
ok  	github.com/novox/mesh-controller/internal/testbus	1.205s
ok  	github.com/novox/mesh-controller/internal/token	1.024s
FAIL
**Merge check** at `29d6495c` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.77s) **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 novox as `build-1791550489261439965` (`builds --log build-1791550489261439965`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 53 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 files asking for a setting without saying whether it is trusted: 0 1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T12:52: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-09T12:52:20Z modules the change moves: - mesh-controller (changed) 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.040s ok github.com/novox/mesh-controller/cmd/mesh-controller 244.497s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.023s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s ok github.com/novox/mesh-controller/examples/route-proxy 1.140s ok github.com/novox/mesh-controller/internal/artifacts 1.059s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.77s) genesis_template_test.go:37: the installer's user list does not let the controller publish [$KV.mesh-controller_asked.> mesh.seat.mesh-controller.tool.plans mesh.seat.mesh-delivery.tool.release mesh.seat.mesh-delivery.tool.stop mesh.seat.node-service-manager.tool.restart.*] — it would come up and be refused on the first thing it tried genesis_template_test.go:41: the installer's user list does not let the controller subscribe [mesh.seat.operator-channel.event.decided.mesh-controller] FAIL FAIL github.com/novox/mesh-controller/internal/broker 1.992s ok github.com/novox/mesh-controller/internal/builder 2.343s ok github.com/novox/mesh-controller/internal/catalogue 5.622s ok github.com/novox/mesh-controller/internal/conditions 2.590s ok github.com/novox/mesh-controller/internal/envfile 1.031s ok github.com/novox/mesh-controller/internal/facts 1.033s ok github.com/novox/mesh-controller/internal/identity 5.243s ok github.com/novox/mesh-controller/internal/inventory 104.103s ok github.com/novox/mesh-controller/internal/lease 17.736s ok github.com/novox/mesh-controller/internal/licences 4.782s ok github.com/novox/mesh-controller/internal/licences/adapters 1.018s ok github.com/novox/mesh-controller/internal/link 57.177s ok github.com/novox/mesh-controller/internal/lint 2.366s ok github.com/novox/mesh-controller/internal/outward 1.047s ok github.com/novox/mesh-controller/internal/overlay 1.034s ok github.com/novox/mesh-controller/internal/secrets 1.550s ok github.com/novox/mesh-controller/internal/store 3.590s ok github.com/novox/mesh-controller/internal/testbus 1.205s ok github.com/novox/mesh-controller/internal/token 1.024s FAIL ```
jschoubben added 10 commits 2026-10-09 14:23:01 +00:00
Every option the controller asks with carries the digest of its verb, machine, arguments and level
(the SDK's Option.Binds). A warrant must name the digest of the ask the controller keeps, and before
acting the controller checks that the act it is about to perform is the one the option bound: a
record changed after the ask is refused, never performed. mesh-sdk moves to d4077b4.
mesh-lab's asks proof runs the router, the Telegram channel and an asker on a real bus. Its accounts,
streams, workers, buckets and memberships come from this test at the controller's commit, so the lab
proves the composition and not a copy of it. Skipped unless the lab asks.
The live acceptance needs an approval the operator can ask for at will and that changes nothing. A
drill is asked like any condition's ask, bound to its own act, claimed once on its warrant and recorded
as a warrant hand-act with who answered, through which channel and the proofs. A verb's process may not
start one, so no agent asks the operator a question they did not start.
With no router, or an ask the router refused and nothing changed since, the controller asked nothing
and said it only in its own log. It now keeps a condition of its own, asks-undelivered, naming the
conditions not asked and why, cleared once each can be asked again.
- M1: a condition offering both kinds of answer is asked twice: its authorising answers about the
  condition, its acknowledging ones (Silence) apart, so an answer from a channel that only acknowledges
  never ends an approval.
- L2: the asked store creates once and changes only over the revision it read, deciding again on what it
  reads; a stale cancel no longer writes over an act.
- L3: every ask is kept before it is published, one whose publishing failed is marked unsent and asked
  again, and a cancel is kept before it is said. The terminal's test question is now `rehearse`, so it is
  not called what the glossary calls a drill; its two answers are both approve-level.
- L7: two deliveries of one warrant to two controllers at once act exactly once, on a real bus.
- Re-vendored onto mesh-sdk 76902998 (canonical digests): an option binds an asks.Act with each argument
  as arg.<name>.
- The lab's bus fixture composes verified-sender only where the lab says its machine is root-free
  (MESH_LAB_ASKS_ROOT_FREE=true).
rehearse refused only a verb's process. Since mesh-cli (ADR 0272 §4) the serving controller runs an
ordinary mesh-cli line without a verb, naming its caller: such a line, from an agent's account, read as
the terminal and could start a question the operator did not ask. rehearse now asks
startedAtTheTerminal. And main's mesh-cli test helper asked is cliAsked, beside the asker's asked.
Choosing Silence silenced the condition, the condition was no longer wanted, and the next reconcile
cancelled the Restart or Release ask beside it: an acknowledgement, which any desk click may give,
took an approval back. An open approval ask now stays until it is answered or expires while its
condition is open and silenced with the same answers. The test silences as the controller does; it
failed before (0 open) and passes, and the kept Restart is performed on its warrant.
Move to mesh-sdk 16984aa, rebased on its main, which refuses a warrant with no time or for an ask with no expiry
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 fail: its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.56s)
mesh/delivery stopped: the pull request closed unmerged
0559b80887
jschoubben force-pushed feat/the-controller-asks-the-operator from 29d6495cab to 0559b80887 2026-10-09 14:23:01 +00:00 Compare
Author
Contributor

Merge check at 0559b808

  • 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: FAIL — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.56s)

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-1791555802690511487 (builds --log build-1791555802690511487).

--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 53 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
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T14:22:44Z 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-09T14:22:44Z

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.032s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	211.114s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.010s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.020s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.009s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.155s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.046s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.56s)
    genesis_template_test.go:46: the installer's user list lets the controller publish [mesh.seat.node-launcher.tool.secret.*], which it does not derive
FAIL
FAIL	github.com/novox/mesh-controller/internal/broker	1.776s
ok  	github.com/novox/mesh-controller/internal/builder	3.397s
ok  	github.com/novox/mesh-controller/internal/catalogue	5.611s
ok  	github.com/novox/mesh-controller/internal/conditions	2.362s
ok  	github.com/novox/mesh-controller/internal/envfile	1.023s
ok  	github.com/novox/mesh-controller/internal/facts	1.027s
ok  	github.com/novox/mesh-controller/internal/identity	8.581s
ok  	github.com/novox/mesh-controller/internal/inventory	80.642s
ok  	github.com/novox/mesh-controller/internal/lease	17.699s
ok  	github.com/novox/mesh-controller/internal/licences	8.174s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.006s
ok  	github.com/novox/mesh-controller/internal/link	52.705s
ok  	github.com/novox/mesh-controller/internal/lint	1.898s
ok  	github.com/novox/mesh-controller/internal/outward	1.028s
ok  	github.com/novox/mesh-controller/internal/overlay	1.016s
ok  	github.com/novox/mesh-controller/internal/secrets	1.371s
ok  	github.com/novox/mesh-controller/internal/store	6.423s
ok  	github.com/novox/mesh-controller/internal/testbus	1.167s
ok  	github.com/novox/mesh-controller/internal/token	1.011s
FAIL
**Merge check** at `0559b808` - `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`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.56s) **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-1791555802690511487` (`builds --log build-1791555802690511487`). ``` --- the gate: build-agent, mesh-controller, route-proxy mesh-controller: ok, 53 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 files asking for a setting without saying whether it is trusted: 0 1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here judging 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-09T14:22:44Z 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-09T14:22:44Z 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.032s ok github.com/novox/mesh-controller/cmd/mesh-controller 211.114s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.010s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.009s ok github.com/novox/mesh-controller/examples/route-proxy 1.155s ok github.com/novox/mesh-controller/internal/artifacts 1.046s --- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.56s) genesis_template_test.go:46: the installer's user list lets the controller publish [mesh.seat.node-launcher.tool.secret.*], which it does not derive FAIL FAIL github.com/novox/mesh-controller/internal/broker 1.776s ok github.com/novox/mesh-controller/internal/builder 3.397s ok github.com/novox/mesh-controller/internal/catalogue 5.611s ok github.com/novox/mesh-controller/internal/conditions 2.362s ok github.com/novox/mesh-controller/internal/envfile 1.023s ok github.com/novox/mesh-controller/internal/facts 1.027s ok github.com/novox/mesh-controller/internal/identity 8.581s ok github.com/novox/mesh-controller/internal/inventory 80.642s ok github.com/novox/mesh-controller/internal/lease 17.699s ok github.com/novox/mesh-controller/internal/licences 8.174s ok github.com/novox/mesh-controller/internal/licences/adapters 1.006s ok github.com/novox/mesh-controller/internal/link 52.705s ok github.com/novox/mesh-controller/internal/lint 1.898s ok github.com/novox/mesh-controller/internal/outward 1.028s ok github.com/novox/mesh-controller/internal/overlay 1.016s ok github.com/novox/mesh-controller/internal/secrets 1.371s ok github.com/novox/mesh-controller/internal/store 6.423s ok github.com/novox/mesh-controller/internal/testbus 1.167s ok github.com/novox/mesh-controller/internal/token 1.011s FAIL ```
mesh-admin closed this pull request 2026-10-09 17:21:58 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
2 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#157