Feature 57's mesh-controller work into the release branch feat/57-config-and-provisioning (ADR 0358). Merging here delivers nothing; the release branch goes to main with the feature's bundled delivery plan. It goes in before mesh-host #114: mesh-host's new declaration code imports mesh-sdk's seal package, which only this controller vendors (sdk d3e18250, mesh-host 5a7ec377); #114 is rechecked after this merges.
Two commits: 97a2d841 is the feature's diff; 37e4219e restores the final blank line of seven golden files that the patch push dropped (issue 866). The head's tree (abef9677) equals the local feature head 87b47fc7.
Review: Opus, A and C round 2, 840 check and the hand-act check APPROVE at 973f9b5b; 87b47fc7 adds only the 804 re-pin (sdk d3e18250, mesh-host 5a7ec377, vendor: mesh-host declaration and sdk seal) and the recaptured SDK conformance testdata. merge-check.sh green locally with the store tests.
Feature 57's mesh-controller work into the release branch `feat/57-config-and-provisioning` (ADR 0358). Merging here delivers nothing; the release branch goes to main with the feature's bundled delivery plan. It goes in before mesh-host #114: mesh-host's new declaration code imports mesh-sdk's seal package, which only this controller vendors (sdk d3e18250, mesh-host 5a7ec377); #114 is rechecked after this merges.
Two commits: 97a2d841 is the feature's diff; 37e4219e restores the final blank line of seven golden files that the patch push dropped (issue 866). The head's tree (abef9677) equals the local feature head 87b47fc7.
Issues: 145 270 477 607 611 647 648 652 662 664 669 670 671 672 675 676 679 681 684 685 686 691 694 703 704 711 713 716 717 718 720 721 723 726 727 728 731 735 736 738 745 749 751 752 754 755 757 760 762 765 767 768 776 777 779 780 781 785 786 787 788 789 792 793 794 795 802 804 817 828 830 831 835 836 840 851.
Review: Opus, A and C round 2, 840 check and the hand-act check APPROVE at 973f9b5b; 87b47fc7 adds only the 804 re-pin (sdk d3e18250, mesh-host 5a7ec377, vendor: mesh-host declaration and sdk seal) and the recaptured SDK conformance testdata. merge-check.sh green locally with the store tests.
The controller plans config, templates and moved providers' provisions,
hands bus accounts to the vault and judges the new manifest words, on the
feature's SDK and node-engine validator (feature 57, config and provisioning).
mesh/merge-gate head 37e4219e28fd merged into trunk fcdecb436117 — pass: [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] t…
mesh/repo-check head 37e4219e28fd merged into trunk fcdecb436117 — fail: [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] T…
The forge applied the feature's patch without the last, empty, added line of
these files, so the commit's tree differed from the reviewed head (issue 866).
composed together: pass — [release feat/57-config-and-provisioning, judged by the group's controller 84847e5c6530] every machine composes with the change as it did without (4 of 4 compose)
Transitions
2026-10-16 00:00 (new) → proposed (announced): novox/mesh-controller#346's head announced
2026-10-16 00:09 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-16 00:09 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-16 01:32 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-16 01:32 published → delivered (done): nothing for a walk to move
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@c711e62287ff` — **delivered** since 2026-10-16T01:32:22Z
**Delivery plan** — builds nothing: the change touches no module of the mesh's graph
**Group** `57-config-and-provisioning`, in order: novox/mesh-controller@c711e62287ff → novox/mesh-host@5a7ec3775b98
- composed together: pass — [release feat/57-config-and-provisioning, judged by the group's controller 84847e5c6530] every machine composes with the change as it did without (4 of 4 compose)
**Transitions**
- 2026-10-16 00:00 (new) → proposed (announced): novox/mesh-controller#346's head announced
- 2026-10-16 00:09 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-16 00:09 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-16 01:32 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-16 01:32 published → delivered (done): nothing for a walk to move
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Merge check at 37e4219e
Judged: head 37e4219e28fd merged into trunk fcdecb436117; read beside it: mesh-catalog 1a2c917abfdb, mesh-controller-main 7543f64911c5, mesh-host 53fd32618916, mesh-tools 6b3e15042fee
mesh/merge-gate: PASS — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] the change touches no module of the mesh's graph
mesh/repo-check: FAIL — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): feat/57-config-and-provisioning's version judged it; the change's judges the pull requests after it merges; its merge-check.sh failed: --- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s); and TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose
Run by the build seat on shanks as build-1792100391189171382 (builds --log build-1792100391189171382).
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 Shanks through settings at 2026-10-15 21:49
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 Shanks at 2026-10-15 21:49
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 Shanks at 2026-10-15 21:49
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)
build-1: a try of at c0ffee, read with `try --id`: said to nobody, nothing taken in
build-2: a try of at , read with `try --id`: said to nobody, nothing taken in
build-3: a try of at , read with `try --id`: said to nobody, nothing taken in
build-4: novox/a#7 at checked on a machine that did not say which: gate PASS — ; repository none
flag provided but not defined: -upload-pack
Usage of try:
-base string
the branch it is merged into (the repository's default branch when none)
-id string
a try's id: what came of it
-store-only
only the repository's store tests
-tests go test -run
only the tests this go test -run pattern names
bus user provisioner.laptop minted for mesh-provisioner-client's provisioner client, scoped to laptop's keys, its reports and the vault
--- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xeb1f35]
goroutine 16213 [running]:
testing.tRunner.func1.2({0x25a8640, 0x3b05790})
/usr/local/go/src/testing/testing.go:1974 +0x419
testing.tRunner.func1()
/usr/local/go/src/testing/testing.go:1977 +0x67f
panic({0x25a8640?, 0x3b05790?})
/usr/local/go/src/runtime/panic.go:860 +0x13a
log.(*Logger).output(0xc00018c6f0, 0x0, 0x2, 0xc001100768)
/usr/local/go/src/log/log.go:244 +0x675
log.Printf(...)
/usr/local/go/src/log/log.go:408
github.com/novox/mesh-controller/cmd/mesh-controller.announceSecretGiven({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x27c9a78, 0x1c}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/desk_secret.go:412 +0x945
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept.func1()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:257 +0xfa
github.com/novox/mesh-controller/cmd/mesh-controller.keepGiven(0x0, 0xc001100fe8, 0xc001100f88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:704 +0xe9
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x0, 0x0}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:255 +0x8f6
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand.func3()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:148 +0x17e
github.com/novox/mesh-controller/cmd/mesh-controller.bySwitch({0x2795317, 0x5}, 0xc000cfc800, 0xc0011013c0, 0xc001101358)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_secrets.go:119 +0x187
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand({0x2919ce0, 0xc000f154a0}, {0xc0000fe5a0, 0x6, 0x6})
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:147 +0x12a8
github.com/novox/mesh-controller/cmd/mesh-controller.TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm(0xc000cbed88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_switch_test.go:125 +0x592
testing.tRunner(0xc000cbed88, 0x28f1cf0)
/usr/local/go/src/testing/testing.go:2036 +0x21d
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:2101 +0xb13
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 483.221s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.038s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/route-proxy 1.229s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
? github.com/novox/mesh-controller/internal/beside [no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
genesis_template_test.go:38: the installer's user list does not let the controller publish mesh.seat.operator-channel.tool.tell, but that falls back rather than refuses: refused: the controller raises the secret-given condition as before (ADR 0380 §9)
genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_predefined.> mesh.seat.mesh-controller.event.predefined-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 51.028s
ok github.com/novox/mesh-controller/internal/builder 58.179s
ok github.com/novox/mesh-controller/internal/catalogue 10.265s
ok github.com/novox/mesh-controller/internal/conditions 2.673s
ok github.com/novox/mesh-controller/internal/envfile 1.044s
ok github.com/novox/mesh-controller/internal/facts 1.048s
ok github.com/novox/mesh-controller/internal/identity 4.981s
ok github.com/novox/mesh-controller/internal/inventory 39.593s
ok github.com/novox/mesh-controller/internal/lease 10.133s
ok github.com/novox/mesh-controller/internal/licences 3.987s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.042s
ok github.com/novox/mesh-controller/internal/link 59.396s
ok github.com/novox/mesh-controller/internal/lint 2.752s
ok github.com/novox/mesh-controller/internal/outward 1.078s
ok github.com/novox/mesh-controller/internal/overlay 1.060s
ok github.com/novox/mesh-controller/internal/recordmirror 15.427s
ok github.com/novox/mesh-controller/internal/secrets 1.513s
ok github.com/novox/mesh-controller/internal/store 3.437s
ok github.com/novox/mesh-controller/internal/testbus 1.196s
ok github.com/novox/mesh-controller/internal/token 1.023s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xeb1f35]
goroutine 16213 [running]:
testing.tRunner.func1.2({0x25a8640, 0x3b05790})
/usr/local/go/src/testing/testing.go:1974 +0x419
testing.tRunner.func1()
/usr/local/go/src/testing/testing.go:1977 +0x67f
panic({0x25a8640?, 0x3b05790?})
/usr/local/go/src/runtime/panic.go:860 +0x13a
log.(*Logger).output(0xc00018c6f0, 0x0, 0x2, 0xc001100768)
/usr/local/go/src/log/log.go:244 +0x675
log.Printf(...)
/usr/local/go/src/log/log.go:408
github.com/novox/mesh-controller/cmd/mesh-controller.announceSecretGiven({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x27c9a78, 0x1c}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/desk_secret.go:412 +0x945
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept.func1()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:257 +0xfa
github.com/novox/mesh-controller/cmd/mesh-controller.keepGiven(0x0, 0xc001100fe8, 0xc001100f88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:704 +0xe9
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x0, 0x0}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:255 +0x8f6
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand.func3()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:148 +0x17e
github.com/novox/mesh-controller/cmd/mesh-controller.bySwitch({0x2795317, 0x5}, 0xc000cfc800, 0xc0011013c0, 0xc001101358)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_secrets.go:119 +0x187
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand({0x2919ce0, 0xc000f154a0}, {0xc0000fe5a0, 0x6, 0x6})
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:147 +0x12a8
github.com/novox/mesh-controller/cmd/mesh-controller.TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm(0xc000cbed88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_switch_test.go:125 +0x592
testing.tRunner(0xc000cbed88, 0x28f1cf0)
/usr/local/go/src/testing/testing.go:2036 +0x21d
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:2101 +0xb13
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 483.221s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
genesis_template_test.go:38: the installer's user list does not let the controller publish mesh.seat.operator-channel.tool.tell, but that falls back rather than refuses: refused: the controller raises the secret-given condition as before (ADR 0380 §9)
genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_predefined.> mesh.seat.mesh-controller.event.predefined-changed] — it would come up and be refused on the first thing it tried
FAIL github.com/novox/mesh-controller/internal/broker 51.028s
**Merge check** at `37e4219e`
Judged: head `37e4219e28fd` merged into trunk `fcdecb436117`; read beside it: mesh-catalog `1a2c917abfdb`, mesh-controller-main `7543f64911c5`, mesh-host `53fd32618916`, mesh-tools `6b3e15042fee`
- `mesh/merge-gate`: **PASS** — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] the change touches no module of the mesh's graph
- `mesh/repo-check`: **FAIL** — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): feat/57-config-and-provisioning's version judged it; the change's judges the pull requests after it merges; its merge-check.sh failed: --- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s); and TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose
Run by the build seat on shanks as `build-1792100391189171382` (`builds --log build-1792100391189171382`).
```
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 Shanks through settings at 2026-10-15 21:49
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 Shanks at 2026-10-15 21:49
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 Shanks at 2026-10-15 21:49
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)
build-1: a try of at c0ffee, read with `try --id`: said to nobody, nothing taken in
build-2: a try of at , read with `try --id`: said to nobody, nothing taken in
build-3: a try of at , read with `try --id`: said to nobody, nothing taken in
build-4: novox/a#7 at checked on a machine that did not say which: gate PASS — ; repository none
flag provided but not defined: -upload-pack
Usage of try:
-base string
the branch it is merged into (the repository's default branch when none)
-id string
a try's id: what came of it
-store-only
only the repository's store tests
-tests go test -run
only the tests this go test -run pattern names
bus user provisioner.laptop minted for mesh-provisioner-client's provisioner client, scoped to laptop's keys, its reports and the vault
--- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xeb1f35]
goroutine 16213 [running]:
testing.tRunner.func1.2({0x25a8640, 0x3b05790})
/usr/local/go/src/testing/testing.go:1974 +0x419
testing.tRunner.func1()
/usr/local/go/src/testing/testing.go:1977 +0x67f
panic({0x25a8640?, 0x3b05790?})
/usr/local/go/src/runtime/panic.go:860 +0x13a
log.(*Logger).output(0xc00018c6f0, 0x0, 0x2, 0xc001100768)
/usr/local/go/src/log/log.go:244 +0x675
log.Printf(...)
/usr/local/go/src/log/log.go:408
github.com/novox/mesh-controller/cmd/mesh-controller.announceSecretGiven({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x27c9a78, 0x1c}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/desk_secret.go:412 +0x945
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept.func1()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:257 +0xfa
github.com/novox/mesh-controller/cmd/mesh-controller.keepGiven(0x0, 0xc001100fe8, 0xc001100f88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:704 +0xe9
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x0, 0x0}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:255 +0x8f6
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand.func3()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:148 +0x17e
github.com/novox/mesh-controller/cmd/mesh-controller.bySwitch({0x2795317, 0x5}, 0xc000cfc800, 0xc0011013c0, 0xc001101358)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_secrets.go:119 +0x187
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand({0x2919ce0, 0xc000f154a0}, {0xc0000fe5a0, 0x6, 0x6})
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:147 +0x12a8
github.com/novox/mesh-controller/cmd/mesh-controller.TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm(0xc000cbed88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_switch_test.go:125 +0x592
testing.tRunner(0xc000cbed88, 0x28f1cf0)
/usr/local/go/src/testing/testing.go:2036 +0x21d
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:2101 +0xb13
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 483.221s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.038s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.018s
ok github.com/novox/mesh-controller/examples/route-proxy 1.229s
ok github.com/novox/mesh-controller/internal/artifacts 1.073s
? github.com/novox/mesh-controller/internal/beside [no test files]
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
genesis_template_test.go:38: the installer's user list does not let the controller publish mesh.seat.operator-channel.tool.tell, but that falls back rather than refuses: refused: the controller raises the secret-given condition as before (ADR 0380 §9)
genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_predefined.> mesh.seat.mesh-controller.event.predefined-changed] — it would come up and be refused on the first thing it tried
FAIL
FAIL github.com/novox/mesh-controller/internal/broker 51.028s
ok github.com/novox/mesh-controller/internal/builder 58.179s
ok github.com/novox/mesh-controller/internal/catalogue 10.265s
ok github.com/novox/mesh-controller/internal/conditions 2.673s
ok github.com/novox/mesh-controller/internal/envfile 1.044s
ok github.com/novox/mesh-controller/internal/facts 1.048s
ok github.com/novox/mesh-controller/internal/identity 4.981s
ok github.com/novox/mesh-controller/internal/inventory 39.593s
ok github.com/novox/mesh-controller/internal/lease 10.133s
ok github.com/novox/mesh-controller/internal/licences 3.987s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.042s
ok github.com/novox/mesh-controller/internal/link 59.396s
ok github.com/novox/mesh-controller/internal/lint 2.752s
ok github.com/novox/mesh-controller/internal/outward 1.078s
ok github.com/novox/mesh-controller/internal/overlay 1.060s
ok github.com/novox/mesh-controller/internal/recordmirror 15.427s
ok github.com/novox/mesh-controller/internal/secrets 1.513s
ok github.com/novox/mesh-controller/internal/store 3.437s
ok github.com/novox/mesh-controller/internal/testbus 1.196s
ok github.com/novox/mesh-controller/internal/token 1.023s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xeb1f35]
goroutine 16213 [running]:
testing.tRunner.func1.2({0x25a8640, 0x3b05790})
/usr/local/go/src/testing/testing.go:1974 +0x419
testing.tRunner.func1()
/usr/local/go/src/testing/testing.go:1977 +0x67f
panic({0x25a8640?, 0x3b05790?})
/usr/local/go/src/runtime/panic.go:860 +0x13a
log.(*Logger).output(0xc00018c6f0, 0x0, 0x2, 0xc001100768)
/usr/local/go/src/log/log.go:244 +0x675
log.Printf(...)
/usr/local/go/src/log/log.go:408
github.com/novox/mesh-controller/cmd/mesh-controller.announceSecretGiven({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x27c9a78, 0x1c}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/desk_secret.go:412 +0x945
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept.func1()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:257 +0xfa
github.com/novox/mesh-controller/cmd/mesh-controller.keepGiven(0x0, 0xc001100fe8, 0xc001100f88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:704 +0xe9
github.com/novox/mesh-controller/cmd/mesh-controller.acceptKept({0x2919ce0, 0xc000f154a0}, {0x279665c, 0x6}, {0x2795317, 0x5}, {0x279505b, 0x5}, {0x0, 0x0}, ...)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:255 +0x8f6
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand.func3()
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:148 +0x17e
github.com/novox/mesh-controller/cmd/mesh-controller.bySwitch({0x2795317, 0x5}, 0xc000cfc800, 0xc0011013c0, 0xc001101358)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_secrets.go:119 +0x187
github.com/novox/mesh-controller/cmd/mesh-controller.secretCommand({0x2919ce0, 0xc000f154a0}, {0xc0000fe5a0, 0x6, 0x6})
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/secret.go:147 +0x12a8
github.com/novox/mesh-controller/cmd/mesh-controller.TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm(0xc000cbed88)
/var/lib/build-agent/workspace/check/mesh-controller/cmd/mesh-controller/vault_switch_test.go:125 +0x592
testing.tRunner(0xc000cbed88, 0x28f1cf0)
/usr/local/go/src/testing/testing.go:2036 +0x21d
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:2101 +0xb13
FAIL github.com/novox/mesh-controller/cmd/mesh-controller 483.221s
--- FAIL: TestTheInstallersFirstUserListIsWhatTheControllerWouldCompose (0.79s)
genesis_template_test.go:29: judged against /var/lib/build-agent/workspace/check/mesh-host as cloned beside this check
genesis_template_test.go:38: the installer's user list does not let the controller publish mesh.seat.operator-channel.tool.tell, but that falls back rather than refuses: refused: the controller raises the secret-given condition as before (ADR 0380 §9)
genesis_template_test.go:39: the installer's user list does not let the controller publish [$KV.mesh-controller_predefined.> mesh.seat.mesh-controller.event.predefined-changed] — it would come up and be refused on the first thing it tried
FAIL github.com/novox/mesh-controller/internal/broker 51.028s
```
mesh-delivery: the ready mark at is cleared: the head is now c711e62287, pushed after it. Mark the new head ready once it is reviewed.
mesh-delivery: the ready mark at is cleared: the head is now c711e62287ff6b88949909094cb3daf0f6dac3f5, pushed after it. Mark the new head ready once it is reviewed.
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.
Feature 57's mesh-controller work into the release branch
feat/57-config-and-provisioning(ADR 0358). Merging here delivers nothing; the release branch goes to main with the feature's bundled delivery plan. It goes in before mesh-host #114: mesh-host's new declaration code imports mesh-sdk's seal package, which only this controller vendors (sdk d3e18250, mesh-host 5a7ec377); #114 is rechecked after this merges.Two commits:
97a2d841is the feature's diff;37e4219erestores the final blank line of seven golden files that the patch push dropped (issue 866). The head's tree (abef9677) equals the local feature head 87b47fc7.Issues: 145 270 477 607 611 647 648 652 662 664 669 670 671 672 675 676 679 681 684 685 686 691 694 703 704 711 713 716 717 718 720 721 723 726 727 728 731 735 736 738 745 749 751 752 754 755 757 760 762 765 767 768 776 777 779 780 781 785 786 787 788 789 792 793 794 795 802 804 817 828 830 831 835 836 840 851.
Review: Opus, A and C round 2, 840 check and the hand-act check APPROVE at 973f9b5b; 87b47fc7 adds only the 804 re-pin (sdk d3e18250, mesh-host 5a7ec377, vendor: mesh-host declaration and sdk seal) and the recaptured SDK conformance testdata. merge-check.sh green locally with the store tests.
Delivery
novox/mesh-controller@c711e62287ff— delivered since 2026-10-16T01:32:22ZDelivery plan — builds nothing: the change touches no module of the mesh's graph
Group
57-config-and-provisioning, in order: novox/mesh-controller@c711e62287 → novox/mesh-host@5a7ec3775bTransitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
37e4219eJudged: head
37e4219e28fdmerged into trunkfcdecb436117; read beside it: mesh-catalog1a2c917abfdb, mesh-controller-main7543f64911c5, mesh-host53fd32618916, mesh-tools6b3e15042feemesh/merge-gate: PASS — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] the change touches no module of the mesh's graphmesh/repo-check: FAIL — [release feat/57-config-and-provisioning, judged by its controller e2ea694217a7] THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): feat/57-config-and-provisioning's version judged it; the change's judges the pull requests after it merges; its merge-check.sh failed: --- FAIL: TestAcceptOfAnOwnSecretTakesThePathOfItsModulesForm (0.37s); and TestTheInstallersFirstUserListIsWhatTheControllerWouldComposeRun by the build seat on shanks as
build-1792100391189171382(builds --log build-1792100391189171382).ready at
c711e62287mesh-delivery: the ready mark at is cleared: the head is now
c711e62287, pushed after it. Mark the new head ready once it is reviewed.ready at
c711e62287