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/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…
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.
Deliverynovox/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`.
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
```
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…
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).
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.
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…
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
```
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
```
mesh/merge-gate head 675466a8c35f merged into trunk bff5b7f0e4f8 — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
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).
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)
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
gateRuleOfincmd/mesh-controller/gate.go), which replaces the core/leaf pairgateWants: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.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.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).tallyGate, so it can be tested without a store.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 becausegateRuleOf,gateFloor,gateWitnessWindowandPlanGate.Applieddo not exist there.)gateWitnessWindowin their bounds helpers.TestASendCarryingTheCoreIsJudgedAsTheCorebecameTestASendCarryingTheToolRunnerWaitsForItsWitnessWindow. These tests skip locally because noMESH_TEST_POSTGRESis set, somesh/repo-checkis where they run.gofmt,
go vetandgo test -race ./cmd/mesh-controller ./internal/inventoryare clean locally.Delivery
novox/mesh-controller@675466a8c35f— delivered since 2026-10-13T21:19:28ZDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
52429592Judged: head
524295926f76merged into trunkbff5b7f0e4f8; read beside it: mesh-catalog7ed119995f69, mesh-controller-mainbff5b7f0e4f8, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/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
Run by the build seat on ace as
build-1791924009200722063(builds --log build-1791924009200722063).Head
c3946e5dnow 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.dueAtTheMost).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.gateSettlebecamegateWithin, the most a healthy module is held. Store-backed tests that usedgateSettle = 0to mean "three readings, no wait" now setgateWithin = time.Hour.Merge check at
c3946e5dJudged: head
c3946e5d72c2merged into trunkbff5b7f0e4f8; read beside it: mesh-catalog7ed119995f69, mesh-controller-mainbff5b7f0e4f8, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/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_app1Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791924952394236742(builds --log build-1791924952394236742).Merge check at
41eefc2fJudged: head
41eefc2f8c3emerged into trunkbff5b7f0e4f8; read beside it: mesh-catalog7ed119995f69, mesh-controller-mainbff5b7f0e4f8, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/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_app1Delivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791925137930203366(builds --log build-1791925137930203366).Merge check at
675466a8Judged: head
675466a8c35fmerged into trunkbff5b7f0e4f8; read beside it: mesh-catalog7ed119995f69, mesh-controller-mainbff5b7f0e4f8, mesh-host0e92ef3d1b21, mesh-tools954e1a53eef9mesh/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 passedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791925655416170603(builds --log build-1791925655416170603).