The controller passes its first-node gate on one reading (ADR 0351) #310

Merged
mesh-admin merged 4 commits from feat/351-the-controller-passes-on-one-reading into main 2026-10-13 21:14:27 +00:00
Contributor

Builds novox/hq ADR 0351 (accepted by the operator; no issue). It changes ADR 0236 §3, ADR 0282 §4 and ADR 0304 §3 for the gate's readings only.

What changes

  • Each module is judged by its own rule (gateRuleOf in cmd/mesh-controller/gate.go), which replaces the core/leaf pair gateWants:
    • controller: one reading once it is ready, no earlier than the end of the node-engine's 60-second witness window (decision 1);
    • tool runner (node-tools): one reading once it answers, after the same window (decision 4);
    • mesh-delivery: one reading (decision 5);
    • node-engine, the resolver's holder, and the bus (never gated, kept as it was): three readings, 40 s apart, the first at least two minutes after the send (decisions 2, 6, 7);
    • leaf modules: one reading, as before.
  • A reading counts only from the module's floor (gateFloor). Before this, readings taken before the two-minute settle were counted and the verdict only waited for the settle. Now the first counted reading is at or after two minutes, as ADR 0236 §3 states. Node-engine and resolver gates therefore take about 80 s longer than before.
  • The witness window counts from the latest of three times: the send, the first applied report the gate read (new PlanGate.Applied, a JSON field with no migration), and for the controller the time the new controller took the lease. The node-engine started the build before each of these, so the window is never cut short. A controller that starts again takes the lease again, and that moves its floor on.
  • The verdict names the rule it applied, for example healthy 1 times over 1m20s, by the controller's rule: one reading once it is ready, after the node-engine's witness window (novox/hq ADR 0351).
  • The counting moved into a pure tallyGate, so it can be tested without a store.
  • No change to coreModule: delivery budgets and a core walk keeping its ground stay the same (decision 8).

Tests (gate_rule_test.go, all pure. They do not compile on main because gateRuleOf, gateFloor, gateWitnessWindow and PlanGate.Applied do not exist there.)

  • The controller passes on one reading after the window and not before it, and its verdict names the rule.
  • A controller that starts again waits out its new window.
  • A controller put back by its witness, or never ready, still fails.
  • The node-engine and the resolver need three readings, the first at least two minutes after the send.
  • The tool runner needs one reading after its window, and mesh-delivery one at once.
  • A send carrying the controller and the node-engine is judged by three readings.
  • Every former core module still counts as core for its class.
  • Store-backed gate tests now zero gateWitnessWindow in their bounds helpers. TestASendCarryingTheCoreIsJudgedAsTheCore became TestASendCarryingTheToolRunnerWaitsForItsWitnessWindow. These tests skip locally because no MESH_TEST_POSTGRES is set, so mesh/repo-check is where they run.

gofmt, go vet and go test -race ./cmd/mesh-controller ./internal/inventory are clean locally.

Builds novox/hq ADR 0351 (accepted by the operator; no issue). It changes ADR 0236 §3, ADR 0282 §4 and ADR 0304 §3 for the gate's readings only. **What changes** - Each module is judged by its own rule (`gateRuleOf` in `cmd/mesh-controller/gate.go`), which replaces the core/leaf pair `gateWants`: - controller: one reading once it is ready, no earlier than the end of the node-engine's 60-second witness window (decision 1); - tool runner (node-tools): one reading once it answers, after the same window (decision 4); - mesh-delivery: one reading (decision 5); - node-engine, the resolver's holder, and the bus (never gated, kept as it was): three readings, 40 s apart, the first at least two minutes after the send (decisions 2, 6, 7); - leaf modules: one reading, as before. - A reading counts only from the module's floor (`gateFloor`). Before this, readings taken before the two-minute settle were counted and the verdict only waited for the settle. Now the first counted reading is at or after two minutes, as ADR 0236 §3 states. Node-engine and resolver gates therefore take about 80 s longer than before. - The witness window counts from the latest of three times: the send, the first applied report the gate read (new `PlanGate.Applied`, a JSON field with no migration), and for the controller the time the new controller took the lease. The node-engine started the build before each of these, so the window is never cut short. A controller that starts again takes the lease again, and that moves its floor on. - The verdict names the rule it applied, for example `healthy 1 times over 1m20s, by the controller's rule: one reading once it is ready, after the node-engine's witness window (novox/hq ADR 0351)`. - The counting moved into a pure `tallyGate`, so it can be tested without a store. - No change to `coreModule`: delivery budgets and a core walk keeping its ground stay the same (decision 8). **Tests** (`gate_rule_test.go`, all pure. They do not compile on main because `gateRuleOf`, `gateFloor`, `gateWitnessWindow` and `PlanGate.Applied` do not exist there.) - The controller passes on one reading after the window and not before it, and its verdict names the rule. - A controller that starts again waits out its new window. - A controller put back by its witness, or never ready, still fails. - The node-engine and the resolver need three readings, the first at least two minutes after the send. - The tool runner needs one reading after its window, and mesh-delivery one at once. - A send carrying the controller and the node-engine is judged by three readings. - Every former core module still counts as core for its class. - Store-backed gate tests now zero `gateWitnessWindow` in their bounds helpers. `TestASendCarryingTheCoreIsJudgedAsTheCore` became `TestASendCarryingTheToolRunnerWaitsForItsWitnessWindow`. These tests skip locally because no `MESH_TEST_POSTGRES` is set, so `mesh/repo-check` is where they run. gofmt, `go vet` and `go test -race ./cmd/mesh-controller ./internal/inventory` are clean locally.
mesh-admin added 1 commit 2026-10-13 20:39:48 +00:00
Pass the controller's first-node gate on one reading after the witness window
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate head 524295926f76 merged into trunk bff5b7f0e4f8 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 524295926f76 merged into trunk bff5b7f0e4f8 — fail: its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNo…
524295926f
The controller runs on one machine, so three readings over two minutes guarded no
other machine and held every walk behind it. Judge each module by its own rule:
one reading for the controller and the tool runner once the node-engine's witness
window has ended, one for mesh-delivery, three for the node-engine and the
resolver with the first two minutes after the send (novox/hq ADR 0351). The
gate's verdict names the rule it applied.
Author
Contributor

Delivery novox/mesh-controller@675466a8c35f — delivered since 2026-10-13T21:19:28Z

Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • ace: receives build-agent
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine

Machines

  • mesh-controller on novox: passed — healthy 1 times over 1m39s, by the controller's rule: one reading once it is ready, after the node-engine's witness window (novox/hq ADR 0351)
  • mesh-controller on the rest running it: sent
  • build-agent on ace: passed — healthy 1 times over 29s, by a leaf module's rule: one reading (novox/hq ADR 0304)
  • build-agent on the rest running it: sent

Transitions

  • 2026-10-13 21:07 (new) → proposed (announced): novox/mesh-controller#310's head announced
  • 2026-10-13 21:13 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
  • 2026-10-13 21:13 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-13 21:14 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
  • 2026-10-13 21:14 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
  • 2026-10-13 21:19 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says

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

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@675466a8c35f` — **delivered** since 2026-10-13T21:19:28Z **Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - ace: receives build-agent - g14: receives build-agent - novox: receives mesh-controller, build-agent - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine **Machines** - mesh-controller on novox: passed — healthy 1 times over 1m39s, by the controller's rule: one reading once it is ready, after the node-engine's witness window (novox/hq ADR 0351) - mesh-controller on the rest running it: sent - build-agent on ace: passed — healthy 1 times over 29s, by a leaf module's rule: one reading (novox/hq ADR 0304) - build-agent on the rest running it: sent **Transitions** - 2026-10-13 21:07 (new) → proposed (announced): novox/mesh-controller#310's head announced - 2026-10-13 21:13 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit - 2026-10-13 21:13 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-13 21:14 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move - 2026-10-13 21:14 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit - 2026-10-13 21:19 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at 52429592
Judged: head 524295926f76 merged into trunk bff5b7f0e4f8; read beside it: mesh-catalog 7ed119995f69, mesh-controller-main bff5b7f0e4f8, mesh-host 0e92ef3d1b21, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s)

Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • ace: receives build-agent
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
  • read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go

Run by the build seat on ace as build-1791924009200722063 (builds --log build-1791924009200722063).

  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
  + places.data.owner
  + places.data.path
  + x
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
  ~ x
  the layer it replaced is kept: settings show notes --node laptop --history
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
  "places": {
    "data": {
      "owner": "1001:1001",
      "path": "/srv/notes"
    }
  },
  "x": 1
}
  set by an unnamed account at a shell on Ace through settings at 2026-10-13 20:45
keycloak on anchor:
  + issuer
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
  + lid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
  ~ x
  the layer it replaced is kept: settings show keycloak --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
  + managed_settings.permissions.allow
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
  + mcp_servers.listener.type
  + mcp_servers.listener.url
  run `push --behind` to send it to the machines running it
{
  "managed_settings": {
    "permissions": {
      "allow": [
        "Bash"
      ]
    }
  }
}
  set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 20:45
keycloak on anchor:
  + url
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
  "url": "https://id.example"
}
  set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 20:45
notifier on anchor:
  + font
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
mailer on the whole mesh:
  + tags.todo.name
  run `push --behind` to send it to the machines running it
sonarr on anchor:
  + pgid
  + puid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
sonarr on anchor:
  ~ x
  the layer it replaced is kept: settings show sonarr --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, the first 0s after the send); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent
plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
  tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent
plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass
plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791924327853162281; the plan goes on from there as any plan does
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
release-1791924328230514553: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged
release-1791924328230514553 releases it; `plans release-1791924328230514553` says where it is
build-1791924328554024136:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked
cancelled build-1791924328554024136 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
took the controller lease at epoch 1 (controller@Ace pid 2265 since 2026-10-13T20:42:22Z)
build-1791924328644659701:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-clear: a failed to build in tier 0; the tiers after it are not asked
  cancelled build-1791924328644659701 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
1 waiting ask(s) cancelled
gave the controller lease back (epoch 1)
  tier 0: rebuild asked as build-1791924329062921002, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
  tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
plan-308-again-plans retried at tier 0 of 2: asked a as build-1791924329382637018; the plan goes on from there as any plan does
plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
rebuild asked as build-1791924329498112572, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked
FAIL
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	187.227s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.032s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.041s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.029s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.143s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.078s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
ok  	github.com/novox/mesh-controller/internal/broker	4.081s
ok  	github.com/novox/mesh-controller/internal/builder	44.025s
ok  	github.com/novox/mesh-controller/internal/catalogue	7.949s
ok  	github.com/novox/mesh-controller/internal/conditions	2.608s
ok  	github.com/novox/mesh-controller/internal/envfile	1.035s
ok  	github.com/novox/mesh-controller/internal/facts	1.043s
ok  	github.com/novox/mesh-controller/internal/identity	4.554s
ok  	github.com/novox/mesh-controller/internal/inventory	32.888s
ok  	github.com/novox/mesh-controller/internal/lease	17.707s
ok  	github.com/novox/mesh-controller/internal/licences	3.750s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.041s
ok  	github.com/novox/mesh-controller/internal/link	59.102s
ok  	github.com/novox/mesh-controller/internal/lint	2.346s
ok  	github.com/novox/mesh-controller/internal/outward	1.109s
ok  	github.com/novox/mesh-controller/internal/overlay	1.043s
ok  	github.com/novox/mesh-controller/internal/secrets	1.419s
ok  	github.com/novox/mesh-controller/internal/store	3.378s
ok  	github.com/novox/mesh-controller/internal/testbus	1.215s
ok  	github.com/novox/mesh-controller/internal/token	1.018s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	187.227s
**Merge check** at `52429592` Judged: head `524295926f76` merged into trunk `bff5b7f0e4f8`; read beside it: mesh-catalog `7ed119995f69`, mesh-controller-main `bff5b7f0e4f8`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s) **Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - ace: receives build-agent - g14: receives build-agent - novox: receives mesh-controller, build-agent - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine - read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go Run by the build seat on ace as `build-1791924009200722063` (`builds --log build-1791924009200722063`). ``` - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node notes on laptop: + places.data.owner + places.data.path + x run `plan laptop --diff` to see what it changes, `push laptop` to send it notes on laptop: ~ x the layer it replaced is kept: settings show notes --node laptop --history run `plan laptop --diff` to see what it changes, `push laptop` to send it { "places": { "data": { "owner": "1001:1001", "path": "/srv/notes" } }, "x": 1 } set by an unnamed account at a shell on Ace through settings at 2026-10-13 20:45 keycloak on anchor: + issuer + x run `plan anchor --diff` to see what it changes, `push anchor` to send it power on anchor: + lid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it keycloak on anchor: ~ x the layer it replaced is kept: settings show keycloak --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it claude-code on laptop: + managed_settings.permissions.allow run `plan laptop --diff` to see what it changes, `push laptop` to send it claude-code on the whole mesh: + mcp_servers.listener.type + mcp_servers.listener.url run `push --behind` to send it to the machines running it { "managed_settings": { "permissions": { "allow": [ "Bash" ] } } } set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 20:45 keycloak on anchor: + url run `plan anchor --diff` to see what it changes, `push anchor` to send it { "url": "https://id.example" } set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 20:45 notifier on anchor: + font run `plan anchor --diff` to see what it changes, `push anchor` to send it mailer on the whole mesh: + tags.todo.name run `push --behind` to send it to the machines running it sonarr on anchor: + pgid + puid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it sonarr on anchor: ~ x the layer it replaced is kept: settings show sonarr --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, the first 0s after the send); the rest are sent plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s) tier_send_test.go:232: sent [[anchor] [laptop]] plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791924327853162281; the plan goes on from there as any plan does this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found release-1791924328230514553: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged release-1791924328230514553 releases it; `plans release-1791924328230514553` says where it is build-1791924328554024136: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791924328554024136 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that took the controller lease at epoch 1 (controller@Ace pid 2265 since 2026-10-13T20:42:22Z) build-1791924328644659701: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-clear: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791924328644659701 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that 1 waiting ask(s) cancelled gave the controller lease back (epoch 1) tier 0: rebuild asked as build-1791924329062921002, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches plan-308-again-plans retried at tier 0 of 2: asked a as build-1791924329382637018; the plan goes on from there as any plan does plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches rebuild asked as build-1791924329498112572, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked FAIL FAIL github.com/novox/mesh-controller/cmd/mesh-controller 187.227s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.032s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.041s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.029s ok github.com/novox/mesh-controller/examples/route-proxy 1.143s ok github.com/novox/mesh-controller/internal/artifacts 1.078s ? github.com/novox/mesh-controller/internal/beside [no test files] ok github.com/novox/mesh-controller/internal/broker 4.081s ok github.com/novox/mesh-controller/internal/builder 44.025s ok github.com/novox/mesh-controller/internal/catalogue 7.949s ok github.com/novox/mesh-controller/internal/conditions 2.608s ok github.com/novox/mesh-controller/internal/envfile 1.035s ok github.com/novox/mesh-controller/internal/facts 1.043s ok github.com/novox/mesh-controller/internal/identity 4.554s ok github.com/novox/mesh-controller/internal/inventory 32.888s ok github.com/novox/mesh-controller/internal/lease 17.707s ok github.com/novox/mesh-controller/internal/licences 3.750s ok github.com/novox/mesh-controller/internal/licences/adapters 1.041s ok github.com/novox/mesh-controller/internal/link 59.102s ok github.com/novox/mesh-controller/internal/lint 2.346s ok github.com/novox/mesh-controller/internal/outward 1.109s ok github.com/novox/mesh-controller/internal/overlay 1.043s ok github.com/novox/mesh-controller/internal/secrets 1.419s ok github.com/novox/mesh-controller/internal/store 3.378s ok github.com/novox/mesh-controller/internal/testbus 1.215s ok github.com/novox/mesh-controller/internal/token 1.018s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.41s) tier_send_test.go:232: sent [[anchor] [laptop]] FAIL github.com/novox/mesh-controller/cmd/mesh-controller 187.227s ```
jschoubben added 1 commit 2026-10-13 20:55:48 +00:00
Pass the node-engine and resolver on their third reading, at most two minutes
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate head c3946e5d72c2 merged into trunk bff5b7f0e4f8 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head c3946e5d72c2 merged into trunk bff5b7f0e4f8 — fail: its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNo…
c3946e5d72
The operator wants these gates as fast as they can be: counting readings only after
two minutes added about 80 s to every node-engine rollout for no safety. Count
from the send, pass on the third healthy reading, and pass a module healthy at
every reading at two minutes on what it has (novox/hq ADR 0352).
Author
Contributor

Head c3946e5d now builds ADR 0352 as well (the operator's decision of 2026-10-13: "as fast as possible, but with a max of 2 minutes"). This replaces the description's bullet about the two-minute floor.

  • The node-engine and the resolver count readings from the send, 40 s apart. Each passes on its third healthy reading, which is about 95 s after the send for a healthy build.
  • A module that was healthy at every reading passes at two minutes on whatever readings it has. The one judging that falls due at two minutes is not held back by the 40 s spacing (dueAtTheMost).
  • A reading that is not healthy after a healthy one (new PlanGate.Faulted) takes away the two-minute pass. A reading that is not healthy before the first healthy one does not, because the build is still starting.
  • The 10-minute failure bound, and putting back a failed build, are unchanged.
  • gateSettle became gateWithin, the most a healthy module is held. Store-backed tests that used gateSettle = 0 to mean "three readings, no wait" now set gateWithin = time.Hour.
  • New tests: a module passes at its third reading before two minutes; one with late readings passes at two minutes; one still starting keeps its two minutes; a failed or broken reading still fails, and the module is put back.
Head c3946e5d now builds ADR 0352 as well (the operator's decision of 2026-10-13: "as fast as possible, but with a max of 2 minutes"). This replaces the description's bullet about the two-minute floor. - The node-engine and the resolver count readings from the send, 40 s apart. Each passes on its third healthy reading, which is about 95 s after the send for a healthy build. - A module that was healthy at every reading passes at two minutes on whatever readings it has. The one judging that falls due at two minutes is not held back by the 40 s spacing (`dueAtTheMost`). - A reading that is not healthy after a healthy one (new `PlanGate.Faulted`) takes away the two-minute pass. A reading that is not healthy before the first healthy one does not, because the build is still starting. - The 10-minute failure bound, and putting back a failed build, are unchanged. - `gateSettle` became `gateWithin`, the most a healthy module is held. Store-backed tests that used `gateSettle = 0` to mean "three readings, no wait" now set `gateWithin = time.Hour`. - New tests: a module passes at its third reading before two minutes; one with late readings passes at two minutes; one still starting keeps its two minutes; a failed or broken reading still fails, and the module is put back.
jschoubben added 1 commit 2026-10-13 20:58:40 +00:00
Test that a healthy node-engine passes at two minutes on one reading
mesh/merge-gate head 41eefc2f8c3e merged into trunk bff5b7f0e4f8 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 41eefc2f8c3e merged into trunk bff5b7f0e4f8 — fail: its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNo…
mesh/delivery superseded: a newer head of the same pull request
41eefc2f8c
Author
Contributor

Merge check at c3946e5d
Judged: head c3946e5d72c2 merged into trunk bff5b7f0e4f8; read beside it: mesh-catalog 7ed119995f69, mesh-controller-main bff5b7f0e4f8, mesh-host 0e92ef3d1b21, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s); and TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools, TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1

Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • ace: receives build-agent
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
  • read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go

Run by the build seat on novox as build-1791924952394236742 (builds --log build-1791924952394236742).

anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
  + places.data.owner
  + places.data.path
  + x
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
  ~ x
  the layer it replaced is kept: settings show notes --node laptop --history
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
  "places": {
    "data": {
      "owner": "1001:1001",
      "path": "/srv/notes"
    }
  },
  "x": 1
}
  set by an unnamed account at a shell on novox-be through settings at 2026-10-13 21:02
keycloak on anchor:
  + issuer
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
  + lid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
  ~ x
  the layer it replaced is kept: settings show keycloak --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
  + managed_settings.permissions.allow
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
  + mcp_servers.listener.type
  + mcp_servers.listener.url
  run `push --behind` to send it to the machines running it
{
  "managed_settings": {
    "permissions": {
      "allow": [
        "Bash"
      ]
    }
  }
}
  set at the controller's terminal by an unnamed account at a shell on novox-be at 2026-10-13 21:02
keycloak on anchor:
  + url
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
  "url": "https://id.example"
}
  set at the controller's terminal by an unnamed account at a shell on novox-be at 2026-10-13 21:02
notifier on anchor:
  + font
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
mailer on the whole mesh:
  + tags.todo.name
  run `push --behind` to send it to the machines running it
sonarr on anchor:
  + pgid
  + puid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
sonarr on anchor:
  ~ x
  the layer it replaced is kept: settings show sonarr --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent
plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
  tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
--- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.83s)
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.42s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.41s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent
plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass
plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791925344785077049; the plan goes on from there as any plan does
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
release-1791925345156524286: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged
release-1791925345156524286 releases it; `plans release-1791925345156524286` says where it is
build-1791925345482815534:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked
cancelled build-1791925345482815534 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
took the controller lease at epoch 1 (controller@novox-be pid 984 since 2026-10-13T20:58:46Z)
build-1791925345565244492:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-clear: a failed to build in tier 0; the tiers after it are not asked
  cancelled build-1791925345565244492 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
1 waiting ask(s) cancelled
gave the controller lease back (epoch 1)
  tier 0: rebuild asked as build-1791925346057196327, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
  tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
plan-308-again-plans retried at tier 0 of 2: asked a as build-1791925346403085885; the plan goes on from there as any plan does
plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
rebuild asked as build-1791925346536032730, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked
FAIL
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	220.285s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.020s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.030s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.023s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.141s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.058s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
ok  	github.com/novox/mesh-controller/internal/broker	5.815s
ok  	github.com/novox/mesh-controller/internal/builder	58.971s
ok  	github.com/novox/mesh-controller/internal/catalogue	11.393s
ok  	github.com/novox/mesh-controller/internal/conditions	3.654s
ok  	github.com/novox/mesh-controller/internal/envfile	1.036s
ok  	github.com/novox/mesh-controller/internal/facts	1.033s
ok  	github.com/novox/mesh-controller/internal/identity	7.844s
ok  	github.com/novox/mesh-controller/internal/inventory	57.446s
ok  	github.com/novox/mesh-controller/internal/lease	17.764s
ok  	github.com/novox/mesh-controller/internal/licences	5.967s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.012s
ok  	github.com/novox/mesh-controller/internal/link	66.811s
ok  	github.com/novox/mesh-controller/internal/lint	2.801s
ok  	github.com/novox/mesh-controller/internal/outward	1.034s
ok  	github.com/novox/mesh-controller/internal/overlay	1.033s
ok  	github.com/novox/mesh-controller/internal/secrets	1.844s
ok  	github.com/novox/mesh-controller/internal/store	3.987s
ok  	github.com/novox/mesh-controller/internal/testbus	1.294s
ok  	github.com/novox/mesh-controller/internal/token	1.022s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
--- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.83s)
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.42s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.41s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	220.285s
**Merge check** at `c3946e5d` Judged: head `c3946e5d72c2` merged into trunk `bff5b7f0e4f8`; read beside it: mesh-catalog `7ed119995f69`, mesh-controller-main `bff5b7f0e4f8`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s); and TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools, TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 **Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - ace: receives build-agent - g14: receives build-agent - novox: receives mesh-controller, build-agent - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine - read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go Run by the build seat on novox as `build-1791924952394236742` (`builds --log build-1791924952394236742`). ``` anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node notes on laptop: + places.data.owner + places.data.path + x run `plan laptop --diff` to see what it changes, `push laptop` to send it notes on laptop: ~ x the layer it replaced is kept: settings show notes --node laptop --history run `plan laptop --diff` to see what it changes, `push laptop` to send it { "places": { "data": { "owner": "1001:1001", "path": "/srv/notes" } }, "x": 1 } set by an unnamed account at a shell on novox-be through settings at 2026-10-13 21:02 keycloak on anchor: + issuer + x run `plan anchor --diff` to see what it changes, `push anchor` to send it power on anchor: + lid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it keycloak on anchor: ~ x the layer it replaced is kept: settings show keycloak --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it claude-code on laptop: + managed_settings.permissions.allow run `plan laptop --diff` to see what it changes, `push laptop` to send it claude-code on the whole mesh: + mcp_servers.listener.type + mcp_servers.listener.url run `push --behind` to send it to the machines running it { "managed_settings": { "permissions": { "allow": [ "Bash" ] } } } set at the controller's terminal by an unnamed account at a shell on novox-be at 2026-10-13 21:02 keycloak on anchor: + url run `plan anchor --diff` to see what it changes, `push anchor` to send it { "url": "https://id.example" } set at the controller's terminal by an unnamed account at a shell on novox-be at 2026-10-13 21:02 notifier on anchor: + font run `plan anchor --diff` to see what it changes, `push anchor` to send it mailer on the whole mesh: + tags.todo.name run `push --behind` to send it to the machines running it sonarr on anchor: + pgid + puid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it sonarr on anchor: ~ x the layer it replaced is kept: settings show sonarr --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); the rest are sent plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s) tier_send_test.go:232: sent [[anchor] [laptop]] plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was --- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.83s) --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.42s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.41s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791925344785077049; the plan goes on from there as any plan does this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found release-1791925345156524286: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged release-1791925345156524286 releases it; `plans release-1791925345156524286` says where it is build-1791925345482815534: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791925345482815534 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that took the controller lease at epoch 1 (controller@novox-be pid 984 since 2026-10-13T20:58:46Z) build-1791925345565244492: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-clear: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791925345565244492 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that 1 waiting ask(s) cancelled gave the controller lease back (epoch 1) tier 0: rebuild asked as build-1791925346057196327, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches plan-308-again-plans retried at tier 0 of 2: asked a as build-1791925346403085885; the plan goes on from there as any plan does plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches rebuild asked as build-1791925346536032730, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked FAIL FAIL github.com/novox/mesh-controller/cmd/mesh-controller 220.285s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.030s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.023s ok github.com/novox/mesh-controller/examples/route-proxy 1.141s ok github.com/novox/mesh-controller/internal/artifacts 1.058s ? github.com/novox/mesh-controller/internal/beside [no test files] ok github.com/novox/mesh-controller/internal/broker 5.815s ok github.com/novox/mesh-controller/internal/builder 58.971s ok github.com/novox/mesh-controller/internal/catalogue 11.393s ok github.com/novox/mesh-controller/internal/conditions 3.654s ok github.com/novox/mesh-controller/internal/envfile 1.036s ok github.com/novox/mesh-controller/internal/facts 1.033s ok github.com/novox/mesh-controller/internal/identity 7.844s ok github.com/novox/mesh-controller/internal/inventory 57.446s ok github.com/novox/mesh-controller/internal/lease 17.764s ok github.com/novox/mesh-controller/internal/licences 5.967s ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s ok github.com/novox/mesh-controller/internal/link 66.811s ok github.com/novox/mesh-controller/internal/lint 2.801s ok github.com/novox/mesh-controller/internal/outward 1.034s ok github.com/novox/mesh-controller/internal/overlay 1.033s ok github.com/novox/mesh-controller/internal/secrets 1.844s ok github.com/novox/mesh-controller/internal/store 3.987s ok github.com/novox/mesh-controller/internal/testbus 1.294s ok github.com/novox/mesh-controller/internal/token 1.022s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.39s) tier_send_test.go:232: sent [[anchor] [laptop]] --- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.83s) --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.42s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.41s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first FAIL github.com/novox/mesh-controller/cmd/mesh-controller 220.285s ```
Author
Contributor

Merge check at 41eefc2f
Judged: head 41eefc2f8c3e merged into trunk bff5b7f0e4f8; read beside it: mesh-catalog 7ed119995f69, mesh-controller-main bff5b7f0e4f8, mesh-host 0e92ef3d1b21, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s); and TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools, TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1

Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • ace: receives build-agent
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
  • read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go

Run by the build seat on ace as build-1791925137930203366 (builds --log build-1791925137930203366).

anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
anchor is not counted as on the network: it does not resolve: these assignments cannot be applied:
  - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node
notes on laptop:
  + places.data.owner
  + places.data.path
  + x
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
notes on laptop:
  ~ x
  the layer it replaced is kept: settings show notes --node laptop --history
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
{
  "places": {
    "data": {
      "owner": "1001:1001",
      "path": "/srv/notes"
    }
  },
  "x": 1
}
  set by an unnamed account at a shell on Ace through settings at 2026-10-13 21:03
keycloak on anchor:
  + issuer
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
power on anchor:
  + lid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
keycloak on anchor:
  ~ x
  the layer it replaced is kept: settings show keycloak --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
claude-code on laptop:
  + managed_settings.permissions.allow
  run `plan laptop --diff` to see what it changes, `push laptop` to send it
claude-code on the whole mesh:
  + mcp_servers.listener.type
  + mcp_servers.listener.url
  run `push --behind` to send it to the machines running it
{
  "managed_settings": {
    "permissions": {
      "allow": [
        "Bash"
      ]
    }
  }
}
  set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 21:03
keycloak on anchor:
  + url
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
{
  "url": "https://id.example"
}
  set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 21:03
notifier on anchor:
  + font
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
mailer on the whole mesh:
  + tags.todo.name
  run `push --behind` to send it to the machines running it
sonarr on anchor:
  + pgid
  + puid
  + x
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
sonarr on anchor:
  ~ x
  the layer it replaced is kept: settings show sonarr --node anchor --history
  run `plan anchor --diff` to see what it changes, `push anchor` to send it
plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes
plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); the rest are sent
plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes
plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent
plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes
app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full
plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was
plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back
plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was
  tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes
node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer
plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts
plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was
--- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.73s)
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.36s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.36s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first
plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes
plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent
plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each
plan-tier: done — novox/mesh-catalog at c2, 1 tier(s)
plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass
plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791925439319012182; the plan goes on from there as any plan does
this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found
release-1791925439646476028: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged
release-1791925439646476028 releases it; `plans release-1791925439646476028` says where it is
build-1791925439915024601:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked
cancelled build-1791925439915024601 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
took the controller lease at epoch 1 (controller@Ace pid 1388 since 2026-10-13T21:01:11Z)
build-1791925439986930365:  could not build https://forge.example/novox/a.git:
cancelled by hand
plan-308-clear: a failed to build in tier 0; the tiers after it are not asked
  cancelled build-1791925439986930365 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that
1 waiting ask(s) cancelled
gave the controller lease back (epoch 1)
  tier 0: rebuild asked as build-1791925440370940919, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
  tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
plan-308-again-plans retried at tier 0 of 2: asked a as build-1791925440672276466; the plan goes on from there as any plan does
plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked
the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison
this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound
plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked
  tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches
rebuild asked as build-1791925440772760528, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier
plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked
FAIL
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	169.218s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.016s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.021s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.016s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.154s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.051s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
ok  	github.com/novox/mesh-controller/internal/broker	4.218s
ok  	github.com/novox/mesh-controller/internal/builder	39.640s
ok  	github.com/novox/mesh-controller/internal/catalogue	8.491s
ok  	github.com/novox/mesh-controller/internal/conditions	2.686s
ok  	github.com/novox/mesh-controller/internal/envfile	1.087s
ok  	github.com/novox/mesh-controller/internal/facts	1.048s
ok  	github.com/novox/mesh-controller/internal/identity	4.986s
ok  	github.com/novox/mesh-controller/internal/inventory	35.075s
ok  	github.com/novox/mesh-controller/internal/lease	17.683s
ok  	github.com/novox/mesh-controller/internal/licences	4.096s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.045s
ok  	github.com/novox/mesh-controller/internal/link	59.173s
ok  	github.com/novox/mesh-controller/internal/lint	2.506s
ok  	github.com/novox/mesh-controller/internal/outward	1.136s
ok  	github.com/novox/mesh-controller/internal/overlay	1.106s
ok  	github.com/novox/mesh-controller/internal/secrets	1.464s
ok  	github.com/novox/mesh-controller/internal/store	3.562s
ok  	github.com/novox/mesh-controller/internal/testbus	1.269s
ok  	github.com/novox/mesh-controller/internal/token	1.019s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s)
    tier_send_test.go:232: sent [[anchor] [laptop]]
--- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.73s)
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.36s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first
    --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.36s)
        tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first
FAIL	github.com/novox/mesh-controller/cmd/mesh-controller	169.218s
**Merge check** at `41eefc2f` Judged: head `41eefc2f8c3e` merged into trunk `bff5b7f0e4f8`; read beside it: mesh-catalog `7ed119995f69`, mesh-controller-main `bff5b7f0e4f8`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s); and TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools, TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 **Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - ace: receives build-agent - g14: receives build-agent - novox: receives mesh-controller, build-agent - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine - read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go Run by the build seat on ace as `build-1791925137930203366` (`builds --log build-1791925137930203366`). ``` anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is left out of the rest of the mesh: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node anchor is not counted as on the network: it does not resolve: these assignments cannot be applied: - rival-one and rival-two both claim "the-seat", and only one thing may hold it per node notes on laptop: + places.data.owner + places.data.path + x run `plan laptop --diff` to see what it changes, `push laptop` to send it notes on laptop: ~ x the layer it replaced is kept: settings show notes --node laptop --history run `plan laptop --diff` to see what it changes, `push laptop` to send it { "places": { "data": { "owner": "1001:1001", "path": "/srv/notes" } }, "x": 1 } set by an unnamed account at a shell on Ace through settings at 2026-10-13 21:03 keycloak on anchor: + issuer + x run `plan anchor --diff` to see what it changes, `push anchor` to send it power on anchor: + lid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it keycloak on anchor: ~ x the layer it replaced is kept: settings show keycloak --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it claude-code on laptop: + managed_settings.permissions.allow run `plan laptop --diff` to see what it changes, `push laptop` to send it claude-code on the whole mesh: + mcp_servers.listener.type + mcp_servers.listener.url run `push --behind` to send it to the machines running it { "managed_settings": { "permissions": { "allow": [ "Bash" ] } } } set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 21:03 keycloak on anchor: + url run `plan anchor --diff` to see what it changes, `push anchor` to send it { "url": "https://id.example" } set at the controller's terminal by an unnamed account at a shell on Ace at 2026-10-13 21:03 notifier on anchor: + font run `plan anchor --diff` to see what it changes, `push anchor` to send it mailer on the whole mesh: + tags.todo.name run `push --behind` to send it to the machines running it sonarr on anchor: + pgid + puid + x run `plan anchor --diff` to see what it changes, `push anchor` to send it sonarr on anchor: ~ x the layer it replaced is kept: settings show sonarr --node anchor --history run `plan anchor --diff` to see what it changes, `push anchor` to send it plan-tier: tier 0 built; sent 12 module(s) to anchor first in one send (m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12), the rest once its gate passes plan-tier: m01 passed its gate on anchor (healthy 3 times over 0s, by a leaf module's rule, judged as the core: 3 readings, or healthy throughout 1h0m0s after the send); the rest are sent plan-tier: tier 0 built; sent m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, node-tools), the rest once its gate passes plan-tier: app1 passed its gate on anchor (healthy 1 times over 0s, by a leaf module's rule: one reading (novox/hq ADR 0304)); the rest are sent plan-tier: tier 0 built; sent app1, app2, node-tools to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s) tier_send_test.go:232: sent [[anchor] [laptop]] plan-tier: tier 0 built; sent 3 module(s) to anchor first in one send (app1, app2, app3), the rest once its gate passes app1's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app2's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full app3's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full plan-tier: app1 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app2 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; app3 failed its gate on anchor in tier 0: not healthy within -1s of its apply: anchor as a whole: raised since it was sent: machine.anchor.disk-full — anchor's root file system is full; put back app1 to c1, app2 to c1, app3 to c1 on anchor, in one send; none reported left as it was plan-gate: tier 0 built; sent 1 module(s) to anchor first in one send (app), the rest once its gate passes plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back plan-gate: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: anchor has not reported on what it was sent; app was left as it was — anchor already ran app c2, or a build identical to it, before the send, so nothing of it moved and nothing is put back; none reported left as it was tier 0: plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (app1, node-tools), the rest once its gate passes node-tools's build c2 failed its gate on anchor and was put back to c1: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer plan-tier: put back at once: node-tools (the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer); the rest of the send judged to their own verdicts plan-tier: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was --- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.73s) --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.36s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.36s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first plan-tier: tier 0 built; sent 2 module(s) to anchor first in one send (node-tools, app1), the rest once its gate passes plan-tier: node-tools passed its gate on anchor (healthy 1 times over 0s, by the tool runner's rule: one reading once it answers, after the node-engine's witness window (novox/hq ADR 0351)); the rest are sent plan-tier: tier 0 built; sent node-tools, app1 to laptop, one send each plan-tier: done — novox/mesh-catalog at c2, 1 tier(s) plan-308-live (novox/mesh-catalog at c8c8c8c8) is let go by mesh-delivery; its first tier is asked at the next pass plan-308-live stopped by a person at tier 0 of 1; what was asked still builds and registers, nothing further is asked or sent this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-stop stopped at tier 0 of 1; what was asked still builds and registers, nothing further is asked this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found plan-308-close closed at tier 0 of 1; what was asked still builds and registers, nothing further is asked tier 0: plan-308-retry retried at tier 0 of 2: asked a as build-1791925439319012182; the plan goes on from there as any plan does this act by hand could NOT be recorded in the hand-act log, and is done anyway: the hand-act log mesh-controller_hand-acts is not on the bus — the controller asserts it at its start, so one older than this has not: nats: bucket not found release-1791925439646476028: 2 build(s) wait for a gate on anchor, laptop; one machine at a time, each judged release-1791925439646476028 releases it; `plans release-1791925439646476028` says where it is build-1791925439915024601: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-cancel: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791925439915024601 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that took the controller lease at epoch 1 (controller@Ace pid 1388 since 2026-10-13T21:01:11Z) build-1791925439986930365: could not build https://forge.example/novox/a.git: cancelled by hand plan-308-clear: a failed to build in tier 0; the tiers after it are not asked cancelled build-1791925439986930365 (https://forge.example/novox/a.git, waiting): deleted from the node-build-agent queue and recorded failed, cancelled by hand — a plan that asked for it fails with that 1 waiting ask(s) cancelled gave the controller lease back (epoch 1) tier 0: rebuild asked as build-1791925440370940919, joining plan-308-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-plans: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-plans stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison tier 0: plan-308-again-plans: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches plan-308-again-plans retried at tier 0 of 2: asked a as build-1791925440672276466; the plan goes on from there as any plan does plan-308-again-plans: a failed to build in tier 0; the tiers after it are not asked the bus cannot be reached (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): what this does is not said, and is found by comparison this act by hand could NOT be recorded in the hand-act log, and is done anyway: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus plan-308-again-rebuild: its end is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router holds what it touched until its bound plan-308-again-rebuild stopped at tier 0 of 2; what was asked still builds and registers, nothing further is asked tier 0: plan-308-again-rebuild: its start is kept and could NOT be said as plan-moved (this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus): the router does not hold what it touches rebuild asked as build-1791925440772760528, joining plan-308-again-rebuild at tier 0 (novox/a at c0ffee): the plan takes this build as a's outcome; the plan had failed and builds again from this tier plan-308-again-rebuild: a failed to build in tier 0; the tiers after it are not asked FAIL FAIL github.com/novox/mesh-controller/cmd/mesh-controller 169.218s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.021s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.016s ok github.com/novox/mesh-controller/examples/route-proxy 1.154s ok github.com/novox/mesh-controller/internal/artifacts 1.051s ? github.com/novox/mesh-controller/internal/beside [no test files] ok github.com/novox/mesh-controller/internal/broker 4.218s ok github.com/novox/mesh-controller/internal/builder 39.640s ok github.com/novox/mesh-controller/internal/catalogue 8.491s ok github.com/novox/mesh-controller/internal/conditions 2.686s ok github.com/novox/mesh-controller/internal/envfile 1.087s ok github.com/novox/mesh-controller/internal/facts 1.048s ok github.com/novox/mesh-controller/internal/identity 4.986s ok github.com/novox/mesh-controller/internal/inventory 35.075s ok github.com/novox/mesh-controller/internal/lease 17.683s ok github.com/novox/mesh-controller/internal/licences 4.096s ok github.com/novox/mesh-controller/internal/licences/adapters 1.045s ok github.com/novox/mesh-controller/internal/link 59.173s ok github.com/novox/mesh-controller/internal/lint 2.506s ok github.com/novox/mesh-controller/internal/outward 1.136s ok github.com/novox/mesh-controller/internal/overlay 1.106s ok github.com/novox/mesh-controller/internal/secrets 1.464s ok github.com/novox/mesh-controller/internal/store 3.562s ok github.com/novox/mesh-controller/internal/testbus 1.269s ok github.com/novox/mesh-controller/internal/token 1.019s FAIL --- what failed, picked from the whole of its output (the whole is in the build's log) --- FAIL: TestACoreBehindWhileTheNodeToolsSettleFailsNoOtherModule (0.36s) tier_send_test.go:232: sent [[anchor] [laptop]] --- FAIL: TestATierPutsABrokenModuleBackAtOnce (0.73s) --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_node-tools (0.36s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; node-tools was put back when it broke; passed on their own and kept: app1; none reported left as it was; want it judging app1 first --- FAIL: TestATierPutsABrokenModuleBackAtOnce/gate_kept_on_app1 (0.36s) tier_send_test.go:423: the plan failed at once: the send to anchor in tier 0 failed its gate: the witness on anchor judged the node-tools c2 and rolled-back: the node tools did not answer; app1 passed on its own and is kept; none reported left as it was; want it judging app1 first FAIL github.com/novox/mesh-controller/cmd/mesh-controller 169.218s ```
jschoubben added 1 commit 2026-10-13 21:07:18 +00:00
Hold the store tests' modules as the settle time did, and fault a dip after any healthy reading
mesh/delivery delivered
mesh/merge-gate head 675466a8c35f merged into trunk bff5b7f0e4f8 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 675466a8c35f merged into trunk bff5b7f0e4f8 — pass: its merge-check.sh passed
675466a8c3
Two tier tests relied on the two-minute settle to keep a module unjudged; the
witness window and the gate's spacing now hold it. A healthy reading taken
before the controller's floor counted no pass, so a dip after it did not take
the two-minute pass away (novox/hq ADR 0352 decision 3).
Author
Contributor

Merge check at 675466a8
Judged: head 675466a8c35f merged into trunk bff5b7f0e4f8; read beside it: mesh-catalog 7ed119995f69, mesh-controller-main bff5b7f0e4f8, mesh-host 0e92ef3d1b21, mesh-tools 954e1a53eef9

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller)
  • mesh/repo-check: PASS — its merge-check.sh passed

Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step

  • tier 0: mesh-controller
  • tier 1: build-agent
  • ace: receives build-agent
  • g14: receives build-agent
  • novox: receives mesh-controller, build-agent
  • shanks: receives build-agent
  • build-agent keeps data (ADR 0233): what it holds is backed up before it moves
  • grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine
  • read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go

Run by the build seat on shanks as build-1791925655416170603 (builds --log build-1791925655416170603).

--- the gate: build-agent, mesh-controller
mesh-controller: ok, 58 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); 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: 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-13T20:17:05Z 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-13T20:17:05Z

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 2 module(s) in 2 tier(s): build-agent, mesh-controller

notes:
  - cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go and cmd/mesh-controller/tier_send_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok  	github.com/novox/mesh-controller/cmd/mesh-builder	1.043s
ok  	github.com/novox/mesh-controller/cmd/mesh-controller	182.499s
ok  	github.com/novox/mesh-controller/examples/objectstore-provisioner	1.037s
ok  	github.com/novox/mesh-controller/examples/postgres-provisioner	1.061s
ok  	github.com/novox/mesh-controller/examples/redis-provisioner	1.028s
ok  	github.com/novox/mesh-controller/examples/route-proxy	1.253s
ok  	github.com/novox/mesh-controller/internal/artifacts	1.089s
?   	github.com/novox/mesh-controller/internal/beside	[no test files]
ok  	github.com/novox/mesh-controller/internal/broker	4.659s
ok  	github.com/novox/mesh-controller/internal/builder	42.819s
ok  	github.com/novox/mesh-controller/internal/catalogue	9.110s
ok  	github.com/novox/mesh-controller/internal/conditions	2.989s
ok  	github.com/novox/mesh-controller/internal/envfile	1.049s
ok  	github.com/novox/mesh-controller/internal/facts	1.057s
ok  	github.com/novox/mesh-controller/internal/identity	5.244s
ok  	github.com/novox/mesh-controller/internal/inventory	37.003s
ok  	github.com/novox/mesh-controller/internal/lease	17.748s
ok  	github.com/novox/mesh-controller/internal/licences	4.379s
ok  	github.com/novox/mesh-controller/internal/licences/adapters	1.064s
ok  	github.com/novox/mesh-controller/internal/link	59.454s
ok  	github.com/novox/mesh-controller/internal/lint	2.645s
ok  	github.com/novox/mesh-controller/internal/outward	1.118s
ok  	github.com/novox/mesh-controller/internal/overlay	1.086s
ok  	github.com/novox/mesh-controller/internal/secrets	1.554s
ok  	github.com/novox/mesh-controller/internal/store	3.585s
ok  	github.com/novox/mesh-controller/internal/testbus	1.290s
ok  	github.com/novox/mesh-controller/internal/token	1.019s
store tests, each run against the store:
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s)
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.24s)
  ./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
  ./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s)
  ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.21s)
  ./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
  ./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
  ./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.26s)
  ./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
  ./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.27s)
  ./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s)
  ./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s)
  ./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s)
  ./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s)
  ./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.22s)
  ./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s)
  ./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
  ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.21s)
  ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.21s)
  ./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s)
  ./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
  ./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s)
  ./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
  ./cmd/mesh-controller --- PASS: TestReplay201 (0.17s)
  ./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s)
  ./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.17s)
  ./cmd/mesh-controller --- PASS: TestReplay401 (0.30s)
  ./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s)
  ./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s)
  ./cmd/mesh-controller --- PASS: TestReplay340 (0.25s)
  ./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.21s)
  ./cmd/mesh-controller --- PASS: TestReplay349 (0.21s)
  ./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
  ./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s)
  ./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.20s)
  ./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s)
  ./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s)
  ./cmd/mesh-controller --- PASS: TestReplay164 (0.29s)
  ./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.20s)
  ./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.21s)
  ./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.20s)
  ./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.20s)
  ./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.57s)
  ./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.19s)
  ./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s)
  ./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.24s)
  ./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
  ./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s)
  ./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s)
  ./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s)
  ./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s)
  ./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s)
  ./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s)
  ./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s)
  ./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s)
  ./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s)
  ./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
  ./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
**Merge check** at `675466a8` Judged: head `675466a8c35f` merged into trunk `bff5b7f0e4f8`; read beside it: mesh-catalog `7ed119995f69`, mesh-controller-main `bff5b7f0e4f8`, mesh-host `0e92ef3d1b21`, mesh-tools `954e1a53eef9` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller) - `mesh/repo-check`: **PASS** — its merge-check.sh passed **Delivery plan** — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step - tier 0: mesh-controller - tier 1: build-agent - ace: receives build-agent - g14: receives build-agent - novox: receives mesh-controller, build-agent - shanks: receives build-agent - build-agent keeps data (ADR 0233): what it holds is backed up before it moves - grants step: if this changes what the bus's user list says (a new tool, subject or user), novox is sent that list alone, every build there kept, before build-agent is judged on its first machine - read by no module's build: cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go, cmd/mesh-controller/tier_send_test.go Run by the build seat on shanks as `build-1791925655416170603` (`builds --log build-1791925655416170603`). ``` --- the gate: build-agent, mesh-controller mesh-controller: ok, 58 tool(s); WARNING: merge-window ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); 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: 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 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-13T20:17:05Z 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-13T20:17:05Z 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 2 module(s) in 2 tier(s): build-agent, mesh-controller notes: - cmd/mesh-controller/found_wait_test.go, cmd/mesh-controller/gate_followup_test.go, cmd/mesh-controller/gate_rule_test.go, cmd/mesh-controller/gate_test.go, cmd/mesh-controller/release_test.go, cmd/mesh-controller/replay318_test.go, cmd/mesh-controller/replays_test.go, cmd/mesh-controller/settings_walk_test.go and cmd/mesh-controller/tier_send_test.go read by no module's build, and rebuild nothing (issue 280) --- its merge-check.sh (go toolchain) ok github.com/novox/mesh-controller/cmd/mesh-builder 1.043s ok github.com/novox/mesh-controller/cmd/mesh-controller 182.499s ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.037s ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.061s ok github.com/novox/mesh-controller/examples/redis-provisioner 1.028s ok github.com/novox/mesh-controller/examples/route-proxy 1.253s ok github.com/novox/mesh-controller/internal/artifacts 1.089s ? github.com/novox/mesh-controller/internal/beside [no test files] ok github.com/novox/mesh-controller/internal/broker 4.659s ok github.com/novox/mesh-controller/internal/builder 42.819s ok github.com/novox/mesh-controller/internal/catalogue 9.110s ok github.com/novox/mesh-controller/internal/conditions 2.989s ok github.com/novox/mesh-controller/internal/envfile 1.049s ok github.com/novox/mesh-controller/internal/facts 1.057s ok github.com/novox/mesh-controller/internal/identity 5.244s ok github.com/novox/mesh-controller/internal/inventory 37.003s ok github.com/novox/mesh-controller/internal/lease 17.748s ok github.com/novox/mesh-controller/internal/licences 4.379s ok github.com/novox/mesh-controller/internal/licences/adapters 1.064s ok github.com/novox/mesh-controller/internal/link 59.454s ok github.com/novox/mesh-controller/internal/lint 2.645s ok github.com/novox/mesh-controller/internal/outward 1.118s ok github.com/novox/mesh-controller/internal/overlay 1.086s ok github.com/novox/mesh-controller/internal/secrets 1.554s ok github.com/novox/mesh-controller/internal/store 3.585s ok github.com/novox/mesh-controller/internal/testbus 1.290s ok github.com/novox/mesh-controller/internal/token 1.019s store tests, each run against the store: ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.23s) ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.24s) ./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s) ./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.23s) ./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.21s) ./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s) ./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s) ./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.26s) ./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s) ./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.27s) ./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.27s) ./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.22s) ./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.22s) ./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.27s) ./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.22s) ./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s) ./cmd/mesh-controller --- PASS: TestReplay237 (0.21s) ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.21s) ./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.21s) ./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s) ./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s) ./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.30s) ./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s) ./cmd/mesh-controller --- PASS: TestReplay201 (0.17s) ./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.16s) ./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.17s) ./cmd/mesh-controller --- PASS: TestReplay401 (0.30s) ./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.24s) ./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s) ./cmd/mesh-controller --- PASS: TestReplay340 (0.25s) ./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.21s) ./cmd/mesh-controller --- PASS: TestReplay349 (0.21s) ./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s) ./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.16s) ./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.20s) ./cmd/mesh-controller --- PASS: TestReplay614ANewSDKPlansTheToolchainAndThenItsBundles (0.08s) ./cmd/mesh-controller --- PASS: TestOneAcceptForAProviderIsPlacedForEveryConsumer (0.46s) ./cmd/mesh-controller --- PASS: TestReplay164 (0.29s) ./cmd/mesh-controller --- PASS: TestAnApprovedLayerOpensTheWalkThatSendsIt (0.20s) ./cmd/mesh-controller --- PASS: TestASettingsWalkSendsOneMachineAtATimeEachJudged (0.21s) ./cmd/mesh-controller --- PASS: TestAFailedSettingsWalkStopsAndHoldsNothingBack (0.20s) ./cmd/mesh-controller --- PASS: TestASettingsWalkSendsTheLayerAloneEveryBuildKept (0.20s) ./cmd/mesh-controller --- PASS: TestASettingsWalkStopsBeforeADataMoveAndPassesOverAMachineAway (0.57s) ./cmd/mesh-controller --- PASS: TestACrossingSendSupersedesASettingsGate (0.19s) ./cmd/mesh-controller --- PASS: TestASettingsWalkFailsOnARefusalThatCannotClear (0.19s) ./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.24s) ./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s) ./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.09s) ./internal/inventory --- PASS: TestAnIssuedValueIsSealedToEveryHolderOnceAndNotAgain (0.10s) ./internal/inventory --- PASS: TestAnIssuedValueIsSealedAgainAfterAKeyChangeOrAnAcceptance (0.09s) ./internal/inventory --- PASS: TestAConditionsLooksAreKeptBesideTheBucket (0.07s) ./internal/inventory --- PASS: TestAPlanIdHoldingAQuoteIsReadAsAPlainId (0.07s) ./internal/inventory --- PASS: TestAWalksStartIsKeptAndARefusedSaveLeavesItUnsaid (0.07s) ./internal/inventory --- PASS: TestAWalksRestIsReadFromEachMachinesOwnSend (0.08s) ./internal/inventory --- PASS: TestAStoredBuildWithASilentMergeableFileIsStillReadAndComposed (0.07s) ./internal/inventory --- PASS: TestACredentialIssuedOutsideIsNeverMade (0.09s) ./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s) ./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s) ```
mesh-admin merged commit 372faebf28 into main 2026-10-13 21:14:27 +00:00
mesh-admin deleted branch feat/351-the-controller-passes-on-one-reading 2026-10-13 21:14:27 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#310