Feature 57 (config and provisioning): the controller's part, into its release branch #346

Merged
mesh-tools merged 3 commits from 57-config-and-provisioning into feat/57-config-and-provisioning 2026-10-16 01:32:17 +00:00
Member

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.

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.
mesh-tools added 2 commits 2026-10-15 21:39:47 +00:00
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).
Restore the final blank line of seven golden files the patch push dropped
mesh/delivery-group group 57-config-and-provisioning rejected: a member's own check failed
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…
mesh/delivery superseded: a newer head of the same pull request
37e4219e28
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).
Author
Member

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@c711e62287 → novox/mesh-host@5a7ec3775b

  • 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`.
Author
Member

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-tools added 1 commit 2026-10-16 00:00:46 +00:00
Restore the previous log writer in the 675 accept test, so later tests can log (issues 675 and 804)
mesh/merge-gate head c711e62287ff merged into trunk fcdecb436117 beside mesh-host#114@5a7ec377 — pass: [release feat/57-config-and-provisioning, judged by …
mesh/repo-check head c711e62287ff merged into trunk fcdecb436117 beside mesh-host#114@5a7ec377 — pass: [release feat/57-config-and-provisioning, judged by …
mesh/delivery delivered
mesh/delivery-group group 57-config-and-provisioning stopped: a member was stopped
c711e62287
Co-Authored-By: Claude <noreply@anthropic.com>
mesh-tools added the mesh/ready label 2026-10-16 00:38:40 +00:00
Author
Member

ready at c711e62287

ready at c711e62287ff6b88949909094cb3daf0f6dac3f5
mesh-tools removed the mesh/ready label 2026-10-16 00:38:49 +00:00
Author
Member

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.
mesh-tools added the mesh/ready label 2026-10-16 01:31:44 +00:00
Author
Member

ready at c711e62287

ready at c711e62287ff6b88949909094cb3daf0f6dac3f5
mesh-tools merged commit cf897e89fe into feat/57-config-and-provisioning 2026-10-16 01:32:17 +00:00
mesh-tools deleted branch 57-config-and-provisioning 2026-10-16 01:32:18 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#346