Implements novox/hq ADR 0353 (proposed, waiting for the operator's Approve).
The rest at once (§1-§4). A release sends its first machine and judges it as before; once it passes, every other machine heard from is sent in one step, each judged by its own gate (PlanRelease.Gates). A build that passed no gate goes to one machine of a step only (restStep). A machine of the rest that fails is put back at once without stopping the others; the build is still marked failed and goes back wherever it was sent, and the other gates stop judging it (Returned). A machine silent on its send past ApplySilentAfter is left, not failed. The walk ends failed if any machine failed.
A gate survives a new controller (§5-§8). A release keeps a send (gate Pending) before it makes it; a controller that takes over reads the machine's last send and does not send again. A walk's first send to a machine whose last send already carries the build (lost save, or another walk's send) sends nothing, counts from that send, and takes over another open gate's readings of the same build there (PlanGate.TakeReadings). Seen 2026-10-14: plan-1791930084567936961 re-sent the control node the controller build the release had just applied and judged it from zero.
Not run locally against a store (none on this machine): the store tests are proven by mesh/repo-check.
Implements novox/hq ADR 0353 (proposed, waiting for the operator's Approve).
**The rest at once (§1-§4).** A release sends its first machine and judges it as before; once it passes, every other machine heard from is sent in one step, each judged by its own gate (`PlanRelease.Gates`). A build that passed no gate goes to one machine of a step only (`restStep`). A machine of the rest that fails is put back at once without stopping the others; the build is still marked failed and goes back wherever it was sent, and the other gates stop judging it (`Returned`). A machine silent on its send past `ApplySilentAfter` is left, not failed. The walk ends failed if any machine failed.
**A gate survives a new controller (§5-§8).** A release keeps a send (gate `Pending`) before it makes it; a controller that takes over reads the machine's last send and does not send again. A walk's first send to a machine whose last send already carries the build (lost save, or another walk's send) sends nothing, counts from that send, and takes over another open gate's readings of the same build there (`PlanGate.TakeReadings`). Seen 2026-10-14: plan-1791930084567936961 re-sent the control node the controller build the release had just applied and judged it from zero.
Tests (store tests listed in testdata/store-tests): TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses, TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn, TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere, TestAFirstSendMadeAndNotKeptIsNotSentAgain, TestAReleaseSendKeptAndMadeIsNotMadeAgain; pure: TestABuildThatPassedNoGateGoesToOneMachineOfAStep.
Not run locally against a store (none on this machine): the store tests are proven by mesh/repo-check.
mesh/repo-check head c2ea9b4c5187 merged into trunk 1601cb17432e — fail: its merge-check.sh failed: --- FAIL: TestAReleaseSendsTheRestAtOnceAfterTheFirstPa…
mesh/merge-gate head c2ea9b4c5187 merged into trunk 1601cb17432e — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
A release now sends every other machine in one step once its first machine
passed, each judged by its own gate; a failing one is put back without
stopping the others, a silent one is left. A send is kept before it is made,
and a machine already sent what a gate is for is not sent again: the gate
counts from that send and takes over another walk's readings of the same
build there.
Deliverynovox/mesh-controller@b482122d6646 — delivered since 2026-10-13T23:47:02Z
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 novox: passed — healthy 1 times over 2m31s, by a leaf module's rule: one reading (novox/hq ADR 0304)
build-agent on the rest running it: sent
Transitions
2026-10-13 23:26 (new) → proposed (announced): novox/mesh-controller#312's head announced
2026-10-13 23:32 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-13 23:32 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-13 23:43 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 23:43 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 23:47 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@b482122d6646` — **delivered** since 2026-10-13T23:47:02Z
**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 novox: passed — healthy 1 times over 2m31s, by a leaf module's rule: one reading (novox/hq ADR 0304)
- build-agent on the rest running it: sent
**Transitions**
- 2026-10-13 23:26 (new) → proposed (announced): novox/mesh-controller#312's head announced
- 2026-10-13 23:32 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-13 23:32 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-13 23:43 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 23:43 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 23:47 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 c2ea9b4c
Judged: head c2ea9b4c5187 merged into trunk 1601cb17432e; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 1601cb17432e, mesh-host 1a2677882380, 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: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.33s); and TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn, TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried
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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on ace as build-1791932831004732727 (builds --log build-1791932831004732727).
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 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 23:11
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 23:11
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 23:11
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
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
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; anchor already runs app's build: nothing sent again, judged from that send
--- FAIL: TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried (0.28s)
tier_send_test.go:352: what anchor ran before the send: &{State:built AskedAt:<nil> BuiltAt:2026-10-13 23:11:42.612109556 +0000 UTC SentAt:<nil> First:[anchor] FirstAt:2026-10-13 23:11:42.613903 +0000 UTC Commit:c2 Why: Made: Build:build-2 Previous: Gate:0xc000776a80 GatedBy: Rest:map[]}
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-1791933106944115997; 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-1791933107242466981: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1791933107242466981 releases it; `plans release-1791933107242466981` says where it is
build-1791933107497968964: 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-1791933107497968964 (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 1421 since 2026-10-13T23:09:03Z)
build-1791933107563763306: 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-1791933107563763306 (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-1791933107904629652, 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-1791933108174282088; 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-1791933108272773857, 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 164.941s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.108s
ok github.com/novox/mesh-controller/internal/artifacts 1.036s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.043s
ok github.com/novox/mesh-controller/internal/builder 44.817s
ok github.com/novox/mesh-controller/internal/catalogue 7.611s
ok github.com/novox/mesh-controller/internal/conditions 2.534s
ok github.com/novox/mesh-controller/internal/envfile 1.062s
ok github.com/novox/mesh-controller/internal/facts 1.062s
ok github.com/novox/mesh-controller/internal/identity 4.283s
ok github.com/novox/mesh-controller/internal/inventory 40.592s
ok github.com/novox/mesh-controller/internal/lease 17.745s
ok github.com/novox/mesh-controller/internal/licences 3.550s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.059s
ok github.com/novox/mesh-controller/internal/link 61.022s
ok github.com/novox/mesh-controller/internal/lint 2.313s
ok github.com/novox/mesh-controller/internal/outward 1.136s
ok github.com/novox/mesh-controller/internal/overlay 1.113s
ok github.com/novox/mesh-controller/internal/secrets 1.476s
ok github.com/novox/mesh-controller/internal/store 3.308s
ok github.com/novox/mesh-controller/internal/testbus 1.281s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.33s)
rest_at_once_test.go:74: the release is rolling: waiting before desk, laptop: another walk judges a build it carries &{Order:[anchor desk laptop] Next:1 Gate:<nil> Rest:true Gates:map[desk:0xc000c38540 laptop:0xc000c38700] Failed:[] Silent:[] Done:[anchor] Skipped:[] By: Settings:<nil>}
--- FAIL: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.34s)
rest_at_once_test.go:103: the release is rolling: waiting before desk, laptop: another walk judges a build it carries &{Order:[anchor desk laptop] Next:1 Gate:<nil> Rest:true Gates:map[desk:0xc0016bf180 laptop:0xc0016bf340] Failed:[] Silent:[] Done:[anchor] Skipped:[] By: Settings:<nil>}
--- FAIL: TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried (0.28s)
tier_send_test.go:352: what anchor ran before the send: &{State:built AskedAt:<nil> BuiltAt:2026-10-13 23:11:42.612109556 +0000 UTC SentAt:<nil> First:[anchor] FirstAt:2026-10-13 23:11:42.613903 +0000 UTC Commit:c2 Why: Made: Build:build-2 Previous: Gate:0xc000776a80 GatedBy: Rest:map[]}
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 164.941s
**Merge check** at `c2ea9b4c`
Judged: head `c2ea9b4c5187` merged into trunk `1601cb17432e`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `1601cb17432e`, mesh-host `1a2677882380`, 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: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.33s); and TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn, TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried
**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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on ace as `build-1791932831004732727` (`builds --log build-1791932831004732727`).
```
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 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 23:11
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 23:11
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 23:11
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
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
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; anchor already runs app's build: nothing sent again, judged from that send
--- FAIL: TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried (0.28s)
tier_send_test.go:352: what anchor ran before the send: &{State:built AskedAt:<nil> BuiltAt:2026-10-13 23:11:42.612109556 +0000 UTC SentAt:<nil> First:[anchor] FirstAt:2026-10-13 23:11:42.613903 +0000 UTC Commit:c2 Why: Made: Build:build-2 Previous: Gate:0xc000776a80 GatedBy: Rest:map[]}
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-1791933106944115997; 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-1791933107242466981: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1791933107242466981 releases it; `plans release-1791933107242466981` says where it is
build-1791933107497968964: 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-1791933107497968964 (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 1421 since 2026-10-13T23:09:03Z)
build-1791933107563763306: 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-1791933107563763306 (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-1791933107904629652, 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-1791933108174282088; 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-1791933108272773857, 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 164.941s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.012s
ok github.com/novox/mesh-controller/examples/route-proxy 1.108s
ok github.com/novox/mesh-controller/internal/artifacts 1.036s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.043s
ok github.com/novox/mesh-controller/internal/builder 44.817s
ok github.com/novox/mesh-controller/internal/catalogue 7.611s
ok github.com/novox/mesh-controller/internal/conditions 2.534s
ok github.com/novox/mesh-controller/internal/envfile 1.062s
ok github.com/novox/mesh-controller/internal/facts 1.062s
ok github.com/novox/mesh-controller/internal/identity 4.283s
ok github.com/novox/mesh-controller/internal/inventory 40.592s
ok github.com/novox/mesh-controller/internal/lease 17.745s
ok github.com/novox/mesh-controller/internal/licences 3.550s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.059s
ok github.com/novox/mesh-controller/internal/link 61.022s
ok github.com/novox/mesh-controller/internal/lint 2.313s
ok github.com/novox/mesh-controller/internal/outward 1.136s
ok github.com/novox/mesh-controller/internal/overlay 1.113s
ok github.com/novox/mesh-controller/internal/secrets 1.476s
ok github.com/novox/mesh-controller/internal/store 3.308s
ok github.com/novox/mesh-controller/internal/testbus 1.281s
ok github.com/novox/mesh-controller/internal/token 1.015s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.33s)
rest_at_once_test.go:74: the release is rolling: waiting before desk, laptop: another walk judges a build it carries &{Order:[anchor desk laptop] Next:1 Gate:<nil> Rest:true Gates:map[desk:0xc000c38540 laptop:0xc000c38700] Failed:[] Silent:[] Done:[anchor] Skipped:[] By: Settings:<nil>}
--- FAIL: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.34s)
rest_at_once_test.go:103: the release is rolling: waiting before desk, laptop: another walk judges a build it carries &{Order:[anchor desk laptop] Next:1 Gate:<nil> Rest:true Gates:map[desk:0xc0016bf180 laptop:0xc0016bf340] Failed:[] Silent:[] Done:[anchor] Skipped:[] By: Settings:<nil>}
--- FAIL: TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetried (0.28s)
tier_send_test.go:352: what anchor ran before the send: &{State:built AskedAt:<nil> BuiltAt:2026-10-13 23:11:42.612109556 +0000 UTC SentAt:<nil> First:[anchor] FirstAt:2026-10-13 23:11:42.613903 +0000 UTC Commit:c2 Why: Made: Build:build-2 Previous: Gate:0xc000776a80 GatedBy: Rest:map[]}
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 164.941s
```
mesh/merge-gate head 2f5cc146fe46 merged into trunk 1601cb17432e — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
A release's own gates held its other sends back for ever; an adopted send
lost what the machine ran before; a kept send could grow a build no gate
passed; a take-over matched by commit alone; a rest that went silent ended
done. The node-engine and the resolver still go one machine at a time, since
a fault that cuts a machine off shows only as silence.
Merge check at 2f5cc146
Judged: head 2f5cc146fe46 merged into trunk 1601cb17432e; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 1601cb17432e, mesh-host 1a2677882380, 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: TestAFirstMachineThatFailsStillStopsTheWalk (0.20s); and TestNoReaderAnswersEmptyForAnError
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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on ace as build-1791933562715652111 (builds --log build-1791933562715652111).
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 23:23
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 23:23
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 23:23
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
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
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-1791933825688413166; 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-1791933825986233707: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1791933825986233707 releases it; `plans release-1791933825986233707` says where it is
build-1791933826243720578: 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-1791933826243720578 (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 720 since 2026-10-13T23:21:12Z)
build-1791933826308819450: 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-1791933826308819450 (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-1791933826649386821, 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-1791933826921640355; 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-1791933827024657637, 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 154.762s
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.031s
ok github.com/novox/mesh-controller/examples/route-proxy 1.128s
ok github.com/novox/mesh-controller/internal/artifacts 1.062s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 3.965s
ok github.com/novox/mesh-controller/internal/builder 36.620s
ok github.com/novox/mesh-controller/internal/catalogue 7.526s
ok github.com/novox/mesh-controller/internal/conditions 2.530s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.039s
ok github.com/novox/mesh-controller/internal/identity 4.200s
ok github.com/novox/mesh-controller/internal/inventory 34.251s
ok github.com/novox/mesh-controller/internal/lease 17.690s
ok github.com/novox/mesh-controller/internal/licences 3.567s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.054s
ok github.com/novox/mesh-controller/internal/link 60.061s
--- FAIL: TestNoReaderAnswersEmptyForAnError (1.25s)
emptyonerror_test.go:23: cmd/mesh-controller/release.go:1268 (silentObservation) answers an empty collection and no error when it could not read: refuse by name (return the error), or say at the return why empty is the truth (// empty-on-error: <why>)
emptyonerror_test.go:26: 6 error branch(es) answer empty, each saying why
FAIL
FAIL github.com/novox/mesh-controller/internal/lint 1.281s
ok github.com/novox/mesh-controller/internal/outward 1.070s
ok github.com/novox/mesh-controller/internal/overlay 1.055s
ok github.com/novox/mesh-controller/internal/secrets 1.431s
ok github.com/novox/mesh-controller/internal/store 3.288s
ok github.com/novox/mesh-controller/internal/testbus 1.235s
ok github.com/novox/mesh-controller/internal/token 1.016s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAFirstMachineThatFailsStillStopsTheWalk (0.20s)
rest_at_once_test.go:284: no release plan
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 154.762s
--- FAIL: TestNoReaderAnswersEmptyForAnError (1.25s)
emptyonerror_test.go:23: cmd/mesh-controller/release.go:1268 (silentObservation) answers an empty collection and no error when it could not read: refuse by name (return the error), or say at the return why empty is the truth (// empty-on-error: <why>)
emptyonerror_test.go:26: 6 error branch(es) answer empty, each saying why
FAIL github.com/novox/mesh-controller/internal/lint 1.281s
**Merge check** at `2f5cc146`
Judged: head `2f5cc146fe46` merged into trunk `1601cb17432e`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `1601cb17432e`, mesh-host `1a2677882380`, 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: TestAFirstMachineThatFailsStillStopsTheWalk (0.20s); and TestNoReaderAnswersEmptyForAnError
**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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on ace as `build-1791933562715652111` (`builds --log build-1791933562715652111`).
```
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 23:23
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 23:23
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 23:23
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
node-tools's build c2 failed its gate on anchor and was put back to c1: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound)
plan-tier: the send to anchor in tier 0 failed its gate: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); app1 passed on its own and is kept; passed on their own and kept: app2; node-tools failed its gate on anchor in tier 0: not healthy within -1s of its apply: raised since it was sent: machine.anchor.core-behind — anchor runs the node tools it was last sent, not yet reported applied, and no plan is rolling them out (its settle window runs to the gate's bound); put back node-tools to c1 on anchor, in one send; none reported left as it was
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-1791933825688413166; 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-1791933825986233707: 2 build(s) wait for a gate on anchor, laptop; one machine first, then the rest at once, each judged
release-1791933825986233707 releases it; `plans release-1791933825986233707` says where it is
build-1791933826243720578: 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-1791933826243720578 (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 720 since 2026-10-13T23:21:12Z)
build-1791933826308819450: 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-1791933826308819450 (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-1791933826649386821, 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-1791933826921640355; 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-1791933827024657637, 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 154.762s
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.031s
ok github.com/novox/mesh-controller/examples/route-proxy 1.128s
ok github.com/novox/mesh-controller/internal/artifacts 1.062s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 3.965s
ok github.com/novox/mesh-controller/internal/builder 36.620s
ok github.com/novox/mesh-controller/internal/catalogue 7.526s
ok github.com/novox/mesh-controller/internal/conditions 2.530s
ok github.com/novox/mesh-controller/internal/envfile 1.036s
ok github.com/novox/mesh-controller/internal/facts 1.039s
ok github.com/novox/mesh-controller/internal/identity 4.200s
ok github.com/novox/mesh-controller/internal/inventory 34.251s
ok github.com/novox/mesh-controller/internal/lease 17.690s
ok github.com/novox/mesh-controller/internal/licences 3.567s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.054s
ok github.com/novox/mesh-controller/internal/link 60.061s
--- FAIL: TestNoReaderAnswersEmptyForAnError (1.25s)
emptyonerror_test.go:23: cmd/mesh-controller/release.go:1268 (silentObservation) answers an empty collection and no error when it could not read: refuse by name (return the error), or say at the return why empty is the truth (// empty-on-error: <why>)
emptyonerror_test.go:26: 6 error branch(es) answer empty, each saying why
FAIL
FAIL github.com/novox/mesh-controller/internal/lint 1.281s
ok github.com/novox/mesh-controller/internal/outward 1.070s
ok github.com/novox/mesh-controller/internal/overlay 1.055s
ok github.com/novox/mesh-controller/internal/secrets 1.431s
ok github.com/novox/mesh-controller/internal/store 3.288s
ok github.com/novox/mesh-controller/internal/testbus 1.235s
ok github.com/novox/mesh-controller/internal/token 1.016s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAFirstMachineThatFailsStillStopsTheWalk (0.20s)
rest_at_once_test.go:284: no release plan
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 154.762s
--- FAIL: TestNoReaderAnswersEmptyForAnError (1.25s)
emptyonerror_test.go:23: cmd/mesh-controller/release.go:1268 (silentObservation) answers an empty collection and no error when it could not read: refuse by name (return the error), or say at the return why empty is the truth (// empty-on-error: <why>)
emptyonerror_test.go:26: 6 error branch(es) answer empty, each saying why
FAIL github.com/novox/mesh-controller/internal/lint 1.281s
```
mesh/merge-gate head b482122d6646 merged into trunk 1601cb17432e — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
Merge check at b482122d
Judged: head b482122d6646 merged into trunk 1601cb17432e; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main 1601cb17432e, mesh-host 1a2677882380, 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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on shanks as build-1791933988602730810 (builds --log build-1791933988602730810).
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 59 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-13T22:42:29Z 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-13T22:42:29Z
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/rest_at_once_test.go and testdata/store-tests 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.122s
ok github.com/novox/mesh-controller/cmd/mesh-controller 186.264s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.031s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.044s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.201s
ok github.com/novox/mesh-controller/internal/artifacts 1.104s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.579s
ok github.com/novox/mesh-controller/internal/builder 43.951s
ok github.com/novox/mesh-controller/internal/catalogue 8.924s
ok github.com/novox/mesh-controller/internal/conditions 2.665s
ok github.com/novox/mesh-controller/internal/envfile 1.065s
ok github.com/novox/mesh-controller/internal/facts 1.067s
ok github.com/novox/mesh-controller/internal/identity 5.118s
ok github.com/novox/mesh-controller/internal/inventory 37.667s
ok github.com/novox/mesh-controller/internal/lease 17.730s
ok github.com/novox/mesh-controller/internal/licences 4.173s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.049s
ok github.com/novox/mesh-controller/internal/link 59.567s
ok github.com/novox/mesh-controller/internal/lint 2.564s
ok github.com/novox/mesh-controller/internal/outward 1.082s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.548s
ok github.com/novox/mesh-controller/internal/store 3.472s
ok github.com/novox/mesh-controller/internal/testbus 1.258s
ok github.com/novox/mesh-controller/internal/token 1.014s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.23s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.24s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.31s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.25s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.26s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.22s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./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.37s)
./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.18s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.24s)
./cmd/mesh-controller --- PASS: TestAReusedCheckBuildIsRegisteredByItsDigestAndGatedAsABuiltOne (0.30s)
./cmd/mesh-controller --- PASS: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.25s)
./cmd/mesh-controller --- PASS: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere (0.20s)
./cmd/mesh-controller --- PASS: TestAFirstSendMadeAndNotKeptIsNotSentAgain (0.26s)
./cmd/mesh-controller --- PASS: TestAReleaseSendKeptAndMadeIsNotMadeAgain (0.53s)
./cmd/mesh-controller --- PASS: TestAFirstMachineThatFailsStillStopsTheWalk (0.40s)
./cmd/mesh-controller --- PASS: TestTheControlNodeIsSentLastInAStep (0.23s)
./cmd/mesh-controller --- PASS: TestARestMachineSilentPastItsBoundIsLeftAndSaid (0.22s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.08s)
./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.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestAReportOfABusyContainerIsKeptAndReadBack (0.09s)
**Merge check** at `b482122d`
Judged: head `b482122d6646` merged into trunk `1601cb17432e`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `1601cb17432e`, mesh-host `1a2677882380`, 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/rest_at_once_test.go, testdata/store-tests
Run by the build seat on shanks as `build-1791933988602730810` (`builds --log build-1791933988602730810`).
```
--- the gate: build-agent, mesh-controller
mesh-controller: ok, 59 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-13T22:42:29Z 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-13T22:42:29Z
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/rest_at_once_test.go and testdata/store-tests 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.122s
ok github.com/novox/mesh-controller/cmd/mesh-controller 186.264s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.031s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.044s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.201s
ok github.com/novox/mesh-controller/internal/artifacts 1.104s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 4.579s
ok github.com/novox/mesh-controller/internal/builder 43.951s
ok github.com/novox/mesh-controller/internal/catalogue 8.924s
ok github.com/novox/mesh-controller/internal/conditions 2.665s
ok github.com/novox/mesh-controller/internal/envfile 1.065s
ok github.com/novox/mesh-controller/internal/facts 1.067s
ok github.com/novox/mesh-controller/internal/identity 5.118s
ok github.com/novox/mesh-controller/internal/inventory 37.667s
ok github.com/novox/mesh-controller/internal/lease 17.730s
ok github.com/novox/mesh-controller/internal/licences 4.173s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.049s
ok github.com/novox/mesh-controller/internal/link 59.567s
ok github.com/novox/mesh-controller/internal/lint 2.564s
ok github.com/novox/mesh-controller/internal/outward 1.082s
ok github.com/novox/mesh-controller/internal/overlay 1.070s
ok github.com/novox/mesh-controller/internal/secrets 1.548s
ok github.com/novox/mesh-controller/internal/store 3.472s
ok github.com/novox/mesh-controller/internal/testbus 1.258s
ok github.com/novox/mesh-controller/internal/token 1.014s
store tests, each run against the store:
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeWalksTheOthersAgain (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeEndsTheMergesThatContainIt (0.23s)
./cmd/mesh-controller --- PASS: TestAStopWalksTheOthersAgainInTheOpenBatch (0.23s)
./cmd/mesh-controller --- PASS: TestAStopNamesWhatStaysOnTheMachinesAndWhatStillCarriesIt (0.22s)
./cmd/mesh-controller --- PASS: TestAStopWithoutAMergeLeavesItOutOfABatch (0.23s)
./cmd/mesh-controller --- PASS: TestSavingPlansAndMovingMergesIsOneAct (0.18s)
./cmd/mesh-controller --- PASS: TestAPlanFollowedFromTheStoreAnswersWhenItMoves (1.97s)
./cmd/mesh-controller --- PASS: TestNodeShowAndStatusReadTheLastSendFromTheStore (0.24s)
./cmd/mesh-controller --- PASS: TestTheConditionsVerbReadsTheLooksTheBucketNoLongerHolds (0.13s)
./cmd/mesh-controller --- PASS: TestAWalkLetGoAndStoppedByVerbsIsSaidStartedAndEnded (0.27s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedOrClosedByAPersonIsSaidEndedStopped (0.26s)
./cmd/mesh-controller --- PASS: TestAWalkRetriedByAPersonIsSaidStartedAgain (0.21s)
./cmd/mesh-controller --- PASS: TestABacklogReleasedByAPersonIsSaidStarted (0.21s)
./cmd/mesh-controller --- PASS: TestAWalkEndedByCancelOrClearIsSaidEnded (0.28s)
./cmd/mesh-controller --- PASS: TestAWalkRestartedByARebuildIsSaidStarted (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkStoppedByHandAndRetriedEndsFailedWhenItFailsAgain (0.27s)
./cmd/mesh-controller --- PASS: TestReplay237 (0.21s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeUnresolvedSaysSoOnceInItsAnswer (0.20s)
./cmd/mesh-controller --- PASS: TestAnUnassignThatLeavesItsNodeResolvedSaysNothingOfIt (0.20s)
./cmd/mesh-controller --- PASS: TestAnAssignThatLeavesItsNodeUnresolvedSaysOnlyThePlansRefusal (0.21s)
./cmd/mesh-controller --- PASS: TestADirectoryOwnersKeyIsRefusedThroughAVerb (0.24s)
./cmd/mesh-controller --- PASS: TestTheSendMakesNoValueForAnOutsideSecretNobodyGave (0.29s)
./cmd/mesh-controller --- PASS: TestAQuestionComposesWithoutAnOutsideSecretNobodyGave (0.28s)
./cmd/mesh-controller --- PASS: TestReplay201 (0.16s)
./cmd/mesh-controller --- PASS: TestARollbackWhoseSendWasRefusedIsCompletedByTheNextSend (0.15s)
./cmd/mesh-controller --- PASS: TestAGateJudgesTheOtherMovesBesideAKeptCore (0.16s)
./cmd/mesh-controller --- PASS: TestReplay401 (0.31s)
./cmd/mesh-controller --- PASS: TestReplay201ThePlansSend (0.25s)
./cmd/mesh-controller --- PASS: TestPlanAndNodeListAnOptionalRequirementLeftUnbound (0.30s)
./cmd/mesh-controller --- PASS: TestReplay340 (0.26s)
./cmd/mesh-controller --- PASS: TestOnlyATrustedFilesNamedKeyIsRefusedThroughAVerb (0.20s)
./cmd/mesh-controller --- PASS: TestReplay349 (0.22s)
./cmd/mesh-controller --- PASS: TestReplay348AFaultFromBeforeTheSendFailsNoGate (0.19s)
./cmd/mesh-controller --- PASS: TestReplay239AModuleNameIsNotTakenOverByAnotherRepository (0.17s)
./cmd/mesh-controller --- PASS: TestAWalkThatMovedNothingSaysWhichModulesMatchedWhatRuns (0.19s)
./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.37s)
./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.18s)
./cmd/mesh-controller --- PASS: TestAProviderElsewhereServesItsOwnComposedName (0.24s)
./cmd/mesh-controller --- PASS: TestAReusedCheckBuildIsRegisteredByItsDigestAndGatedAsABuiltOne (0.30s)
./cmd/mesh-controller --- PASS: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.25s)
./cmd/mesh-controller --- PASS: TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn (0.23s)
./cmd/mesh-controller --- PASS: TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere (0.20s)
./cmd/mesh-controller --- PASS: TestAFirstSendMadeAndNotKeptIsNotSentAgain (0.26s)
./cmd/mesh-controller --- PASS: TestAReleaseSendKeptAndMadeIsNotMadeAgain (0.53s)
./cmd/mesh-controller --- PASS: TestAFirstMachineThatFailsStillStopsTheWalk (0.40s)
./cmd/mesh-controller --- PASS: TestTheControlNodeIsSentLastInAStep (0.23s)
./cmd/mesh-controller --- PASS: TestARestMachineSilentPastItsBoundIsLeftAndSaid (0.22s)
./internal/inventory --- PASS: TestTheLastSendSaysWhatTheMachineAnswered (0.08s)
./internal/inventory --- PASS: TestAReportIsTheLastSendsAnswerOnlyWhenItIsAboutThatSend (0.08s)
./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.08s)
./internal/inventory --- PASS: TestOneAcceptForAProviderIsSealedToEveryConsumer (0.09s)
./internal/inventory --- PASS: TestASharedOwnSecretIssuedOutsideIsNeverMade (0.08s)
./internal/inventory --- PASS: TestAReportOfABusyContainerIsKeptAndReadBack (0.09s)
```
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.
Implements novox/hq ADR 0353 (proposed, waiting for the operator's Approve).
The rest at once (§1-§4). A release sends its first machine and judges it as before; once it passes, every other machine heard from is sent in one step, each judged by its own gate (
PlanRelease.Gates). A build that passed no gate goes to one machine of a step only (restStep). A machine of the rest that fails is put back at once without stopping the others; the build is still marked failed and goes back wherever it was sent, and the other gates stop judging it (Returned). A machine silent on its send pastApplySilentAfteris left, not failed. The walk ends failed if any machine failed.A gate survives a new controller (§5-§8). A release keeps a send (gate
Pending) before it makes it; a controller that takes over reads the machine's last send and does not send again. A walk's first send to a machine whose last send already carries the build (lost save, or another walk's send) sends nothing, counts from that send, and takes over another open gate's readings of the same build there (PlanGate.TakeReadings). Seen 2026-10-14: plan-1791930084567936961 re-sent the control node the controller build the release had just applied and judged it from zero.Tests (store tests listed in testdata/store-tests): TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses, TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn, TestAWalkTakesOverTheReadingsOfAGateJudgingTheSameBuildThere, TestAFirstSendMadeAndNotKeptIsNotSentAgain, TestAReleaseSendKeptAndMadeIsNotMadeAgain; pure: TestABuildThatPassedNoGateGoesToOneMachineOfAStep.
Not run locally against a store (none on this machine): the store tests are proven by mesh/repo-check.
Delivery
novox/mesh-controller@b482122d6646— delivered since 2026-10-13T23:47:02ZDelivery 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
c2ea9b4cJudged: head
c2ea9b4c5187merged into trunk1601cb17432e; read beside it: mesh-catalogebf7f3773dc7, mesh-controller-main1601cb17432e, mesh-host1a2677882380, 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: TestAReleaseSendsTheRestAtOnceAfterTheFirstPasses (0.33s); and TestARestMachineThatFailsIsPutBackAloneAndTheOthersAreJudgedOn, TestAModuleItsSendChangedNothingOfIsLeftAsItWasAndRetriedDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791932831004732727(builds --log build-1791932831004732727).Merge check at
2f5cc146Judged: head
2f5cc146fe46merged into trunk1601cb17432e; read beside it: mesh-catalogebf7f3773dc7, mesh-controller-main1601cb17432e, mesh-host1a2677882380, 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: TestAFirstMachineThatFailsStillStopsTheWalk (0.20s); and TestNoReaderAnswersEmptyForAnErrorDelivery plan — builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791933562715652111(builds --log build-1791933562715652111).Merge check at
b482122dJudged: head
b482122d6646merged into trunk1601cb17432e; read beside it: mesh-catalogebf7f3773dc7, mesh-controller-main1601cb17432e, mesh-host1a2677882380, 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-1791933988602730810(builds --log build-1791933988602730810).