The mesh-vault seat in the controller's compiled seat set (internal/catalogue/seats.go) now promises one verb, get (name, public_key), marked Optional (design 33 §7).
Why
Package V1 (issue 674, hq ADR 0349 §11) rewrites mesh-vault in Go and has it answer get on request and reply. mesh-vault is a seat of the mesh's own, so its protocol is the controller's: a claim naming serves: ["get"] is refused by a controller whose seat does not promise it (mesh-vault claims mesh-vault and says it serves get, which that seat's protocol does not promise, seen with the integration branch's controller). This is the reader accepting the field before the writer (mesh-catalog#PR for V1) uses it.
Optional so the vault that runs today (TypeScript, serving no get) is still accepted until the Go vault ships in the same release.
How it is proven
TestTheVaultsSeatPromisesGet (new, failed before: "the vault's seat does not promise get"): the seat promises get with name and public_key; a holder serving it is accepted; a holder not serving it yet is accepted too.
TestTheVaultsSeatDeliversSecret unchanged and passing.
The catalogue's mesh-vault manifest checked with a controller built from this branch: mesh-vault: ok, 3 tool(s); with the integration branch's controller: refused as above.
Left for later
When the Go vault is the one running everywhere, Optional is removed (V4 or the release's last step). Who may ask is V4/P3's.
Reviewer's checklist
Does what V1 needs from the controller and nothing else: one verb on one seat. ✓
New test failed before, passes now; existing tests untouched. ✓
Composition unchanged for every module: a seat's protocol is not composed into a declaration; the full suite passes. ✓
No secret anywhere; no schema change. ✓
Strict parsers: this is the reader side; the catalogue PR that writes serves: ["get"] must merge after this one. ✓
gofmt -l empty, go vet ./... clean, sh merge-check.sh exit 0 with MESH_TEST_POSTGRES pointed at a throwaway PostgreSQL (every store test listed in testdata/store-tests ran and passed), race detector on. ✓
Words: seat, verb, holder, node-engine; no retired word. ✓
## What changed
The `mesh-vault` seat in the controller's compiled seat set (`internal/catalogue/seats.go`) now promises one verb, `get` (`name`, `public_key`), marked `Optional` (design 33 §7).
## Why
Package V1 (issue 674, hq ADR 0349 §11) rewrites mesh-vault in Go and has it answer `get` on request and reply. `mesh-vault` is a seat of the mesh's own, so its protocol is the controller's: a claim naming `serves: ["get"]` is refused by a controller whose seat does not promise it (`mesh-vault claims mesh-vault and says it serves get, which that seat's protocol does not promise`, seen with the integration branch's controller). This is the reader accepting the field before the writer (mesh-catalog#PR for V1) uses it.
`Optional` so the vault that runs today (TypeScript, serving no `get`) is still accepted until the Go vault ships in the same release.
## How it is proven
- `TestTheVaultsSeatPromisesGet` (new, failed before: "the vault's seat does not promise get"): the seat promises `get` with `name` and `public_key`; a holder serving it is accepted; a holder not serving it yet is accepted too.
- `TestTheVaultsSeatDeliversSecret` unchanged and passing.
- The catalogue's mesh-vault manifest checked with a controller built from this branch: `mesh-vault: ok, 3 tool(s)`; with the integration branch's controller: refused as above.
## Left for later
When the Go vault is the one running everywhere, `Optional` is removed (V4 or the release's last step). Who may ask is V4/P3's.
## Reviewer's checklist
1. Does what V1 needs from the controller and nothing else: one verb on one seat. ✓
2. New test failed before, passes now; existing tests untouched. ✓
3. Composition unchanged for every module: a seat's protocol is not composed into a declaration; the full suite passes. ✓
4. No secret anywhere; no schema change. ✓
5. Strict parsers: this is the reader side; the catalogue PR that writes `serves: ["get"]` must merge after this one. ✓
6. `gofmt -l` empty, `go vet ./...` clean, `sh merge-check.sh` exit 0 with `MESH_TEST_POSTGRES` pointed at a throwaway PostgreSQL (every store test listed in testdata/store-tests ran and passed), race detector on. ✓
7. Words: seat, verb, holder, node-engine; no retired word. ✓
The vault hands a secret only on request and reply, sealed to the asker's key
(hq ADR 0349 §11). The seat set is the controller's, so the verb is promised
here; optional until the vault that runs serves it (design 33 §7).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 00:58 (new) → proposed (announced): novox/mesh-controller#317's head announced
2026-10-14 01:15 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-14 01:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-14 01:19 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-14 01:19 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@661918f4e4e0` — **delivered** since 2026-10-14T01:19:36Z
**Delivery plan** — builds nothing: the change touches no module of the mesh's graph
**Group** `pkg/57-v1-vault-in-go`, in order: novox/mesh-catalog@b67fe1ffb16e → novox/mesh-controller@661918f4e4e0
**Transitions**
- 2026-10-14 00:58 (new) → proposed (announced): novox/mesh-controller#317's head announced
- 2026-10-14 01:15 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-14 01:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-14 01:19 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-14 01:19 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 661918f4
Judged: head 661918f4e4e0 merged into trunk bfc79c64d989; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller-main df9e5728a925, mesh-host 1a2677882380, mesh-tools 954e1a53eef9
mesh/merge-gate: PASS — the change touches no module of the mesh's graph
mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
Run by the build seat on novox as build-1791939526678494046 (builds --log build-1791939526678494046).
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.183s
ok github.com/novox/mesh-controller/cmd/mesh-controller 385.625s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/route-proxy 1.158s
ok github.com/novox/mesh-controller/internal/artifacts 1.068s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 13.893s
ok github.com/novox/mesh-controller/internal/builder 92.001s
ok github.com/novox/mesh-controller/internal/catalogue 9.901s
ok github.com/novox/mesh-controller/internal/conditions 3.566s
ok github.com/novox/mesh-controller/internal/envfile 1.020s
ok github.com/novox/mesh-controller/internal/facts 1.047s
ok github.com/novox/mesh-controller/internal/identity 18.126s
ok github.com/novox/mesh-controller/internal/inventory 65.845s
--- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
lease_test.go:71: a: took the controller lease at epoch 1 (a)
lease_test.go:71: b: another controller holds the lease (a, epoch 1, taken 2026-10-14T01:00:35Z); waiting until it lets go or stops renewing
lease_test.go:71: a: LOST the controller lease (epoch 1): the renewal could not be made: context deadline exceeded — this controller stops acting at once
lease_test.go:118: a, holding, answers 0, this controller does not hold the lease: it lost it — the renewal could not be made: context deadline exceeded
lease_test.go:86: taking: context canceled
FAIL
FAIL github.com/novox/mesh-controller/internal/lease 17.996s
ok github.com/novox/mesh-controller/internal/licences 16.329s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 79.400s
ok github.com/novox/mesh-controller/internal/lint 2.530s
ok github.com/novox/mesh-controller/internal/outward 1.044s
ok github.com/novox/mesh-controller/internal/overlay 1.033s
ok github.com/novox/mesh-controller/internal/secrets 1.490s
ok github.com/novox/mesh-controller/internal/store 8.546s
ok github.com/novox/mesh-controller/internal/testbus 1.362s
ok github.com/novox/mesh-controller/internal/token 1.027s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
lease_test.go:71: a: took the controller lease at epoch 1 (a)
lease_test.go:71: b: another controller holds the lease (a, epoch 1, taken 2026-10-14T01:00:35Z); waiting until it lets go or stops renewing
lease_test.go:71: a: LOST the controller lease (epoch 1): the renewal could not be made: context deadline exceeded — this controller stops acting at once
lease_test.go:118: a, holding, answers 0, this controller does not hold the lease: it lost it — the renewal could not be made: context deadline exceeded
lease_test.go:86: taking: context canceled
FAIL github.com/novox/mesh-controller/internal/lease 17.996s
Out of date when it landed: out of date: judged against trunk bfc79c64d9, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
**Merge check** at `661918f4`
Judged: head `661918f4e4e0` merged into trunk `bfc79c64d989`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller-main `df9e5728a925`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph
- `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
Run by the build seat on novox as `build-1791939526678494046` (`builds --log build-1791939526678494046`).
```
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.183s
ok github.com/novox/mesh-controller/cmd/mesh-controller 385.625s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.024s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.021s
ok github.com/novox/mesh-controller/examples/route-proxy 1.158s
ok github.com/novox/mesh-controller/internal/artifacts 1.068s
? github.com/novox/mesh-controller/internal/beside [no test files]
ok github.com/novox/mesh-controller/internal/broker 13.893s
ok github.com/novox/mesh-controller/internal/builder 92.001s
ok github.com/novox/mesh-controller/internal/catalogue 9.901s
ok github.com/novox/mesh-controller/internal/conditions 3.566s
ok github.com/novox/mesh-controller/internal/envfile 1.020s
ok github.com/novox/mesh-controller/internal/facts 1.047s
ok github.com/novox/mesh-controller/internal/identity 18.126s
ok github.com/novox/mesh-controller/internal/inventory 65.845s
--- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
lease_test.go:71: a: took the controller lease at epoch 1 (a)
lease_test.go:71: b: another controller holds the lease (a, epoch 1, taken 2026-10-14T01:00:35Z); waiting until it lets go or stops renewing
lease_test.go:71: a: LOST the controller lease (epoch 1): the renewal could not be made: context deadline exceeded — this controller stops acting at once
lease_test.go:118: a, holding, answers 0, this controller does not hold the lease: it lost it — the renewal could not be made: context deadline exceeded
lease_test.go:86: taking: context canceled
FAIL
FAIL github.com/novox/mesh-controller/internal/lease 17.996s
ok github.com/novox/mesh-controller/internal/licences 16.329s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.015s
ok github.com/novox/mesh-controller/internal/link 79.400s
ok github.com/novox/mesh-controller/internal/lint 2.530s
ok github.com/novox/mesh-controller/internal/outward 1.044s
ok github.com/novox/mesh-controller/internal/overlay 1.033s
ok github.com/novox/mesh-controller/internal/secrets 1.490s
ok github.com/novox/mesh-controller/internal/store 8.546s
ok github.com/novox/mesh-controller/internal/testbus 1.362s
ok github.com/novox/mesh-controller/internal/token 1.027s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)
lease_test.go:71: a: took the controller lease at epoch 1 (a)
lease_test.go:71: b: another controller holds the lease (a, epoch 1, taken 2026-10-14T01:00:35Z); waiting until it lets go or stops renewing
lease_test.go:71: a: LOST the controller lease (epoch 1): the renewal could not be made: context deadline exceeded — this controller stops acting at once
lease_test.go:118: a, holding, answers 0, this controller does not hold the lease: it lost it — the renewal could not be made: context deadline exceeded
lease_test.go:86: taking: context canceled
FAIL github.com/novox/mesh-controller/internal/lease 17.996s
```
**Out of date when it landed**: out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
Independent review of issue 674 (package V1, the vault in Go), controller side.
What I ran on 661918f4e4: gofmt -l on the changed files (empty); sh merge-check.sh with MESH_TEST_POSTGRES pointing at a throwaway PostgreSQL over TCP on 127.0.0.1 (exit 0, race detector on, every listed store test passed; the server is stopped). TestTheVaultsSeatPromisesGet copied onto the integration branch without the seats.go change fails, so it proves the change. I also merged 661918f onto the current trunk 617881c (T1, #313, landed after the forge judged this): it merges cleanly, and go vet plus go test ./internal/catalogue ./cmd/... pass there. A controller built from this head accepts the catalogue's mesh-vault manifest from mesh-catalog#286 (mesh-vault: ok, 3 tool(s)); the integration branch's controller refuses it (says it serves get, which that seat's protocol does not promise).
The change is minimal and correct: one verb on the mesh-vault seat, Optional so the TypeScript vault that runs is still accepted, with its input schema matching the Go vault's tool (name, public_key as SPKI PEM). The optional mark is applied from the compiled seat (optionalAsCompiled), so a stored seat row does not lose it.
Findings (none blocks):
Forge: mesh/merge-gate and mesh/repo-check are pending (out of date: judged against trunk bfc79c64d9, the trunk is now 617881c309). Ask mesh-delivery.recheck and merge only on the new verdict.
internal/catalogue/seats.go:133 says Optional holds until the vault that runs serves get; the pull request names V4 for removing it. Note that on issue 674 or the V4 issue, so it is not forgotten.
Verdict: APPROVE at 661918f4e4e0
Independent review of issue 674 (package V1, the vault in Go), controller side.
What I ran on 661918f4e4e0: `gofmt -l` on the changed files (empty); `sh merge-check.sh` with MESH_TEST_POSTGRES pointing at a throwaway PostgreSQL over TCP on 127.0.0.1 (exit 0, race detector on, every listed store test passed; the server is stopped). `TestTheVaultsSeatPromisesGet` copied onto the integration branch without the seats.go change fails, so it proves the change. I also merged 661918f onto the current trunk 617881c (T1, #313, landed after the forge judged this): it merges cleanly, and `go vet` plus `go test ./internal/catalogue ./cmd/...` pass there. A controller built from this head accepts the catalogue's mesh-vault manifest from mesh-catalog#286 (`mesh-vault: ok, 3 tool(s)`); the integration branch's controller refuses it (`says it serves get, which that seat's protocol does not promise`).
The change is minimal and correct: one verb on the `mesh-vault` seat, `Optional` so the TypeScript vault that runs is still accepted, with its input schema matching the Go vault's tool (`name`, `public_key` as SPKI PEM). The optional mark is applied from the compiled seat (`optionalAsCompiled`), so a stored seat row does not lose it.
Findings (none blocks):
1. Forge: mesh/merge-gate and mesh/repo-check are `pending` (out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d). Ask `mesh-delivery.recheck` and merge only on the new verdict.
2. internal/catalogue/seats.go:133 says `Optional` holds until the vault that runs serves `get`; the pull request names V4 for removing it. Note that on issue 674 or the V4 issue, so it is not forgotten.
mesh-admin
merged commit dc36536e19 into feat/57-config-and-provisioning2026-10-14 01:19:24 +00:00
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.
What changed
The
mesh-vaultseat in the controller's compiled seat set (internal/catalogue/seats.go) now promises one verb,get(name,public_key), markedOptional(design 33 §7).Why
Package V1 (issue 674, hq ADR 0349 §11) rewrites mesh-vault in Go and has it answer
geton request and reply.mesh-vaultis a seat of the mesh's own, so its protocol is the controller's: a claim namingserves: ["get"]is refused by a controller whose seat does not promise it (mesh-vault claims mesh-vault and says it serves get, which that seat's protocol does not promise, seen with the integration branch's controller). This is the reader accepting the field before the writer (mesh-catalog#PR for V1) uses it.Optionalso the vault that runs today (TypeScript, serving noget) is still accepted until the Go vault ships in the same release.How it is proven
TestTheVaultsSeatPromisesGet(new, failed before: "the vault's seat does not promise get"): the seat promisesgetwithnameandpublic_key; a holder serving it is accepted; a holder not serving it yet is accepted too.TestTheVaultsSeatDeliversSecretunchanged and passing.mesh-vault: ok, 3 tool(s); with the integration branch's controller: refused as above.Left for later
When the Go vault is the one running everywhere,
Optionalis removed (V4 or the release's last step). Who may ask is V4/P3's.Reviewer's checklist
serves: ["get"]must merge after this one. ✓gofmt -lempty,go vet ./...clean,sh merge-check.shexit 0 withMESH_TEST_POSTGRESpointed at a throwaway PostgreSQL (every store test listed in testdata/store-tests ran and passed), race detector on. ✓Delivery
novox/mesh-controller@661918f4e4e0— delivered since 2026-10-14T01:19:36ZDelivery plan — builds nothing: the change touches no module of the mesh's graph
Group
pkg/57-v1-vault-in-go, in order: novox/mesh-catalog@b67fe1ffb1 → novox/mesh-controller@661918f4e4Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
661918f4Judged: head
661918f4e4e0merged into trunkbfc79c64d989; read beside it: mesh-catalogebf7f3773dc7, mesh-controller-maindf9e5728a925, mesh-host1a2677882380, mesh-tools954e1a53eef9mesh/merge-gate: PASS — the change touches no module of the mesh's graphmesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestTheSecondControllerWaitsAndTakesAHigherEpochOnHandover (4.06s)Run by the build seat on novox as
build-1791939526678494046(builds --log build-1791939526678494046).Out of date when it landed: out of date: judged against trunk
bfc79c64d9, the trunk is now 617881c3093d; judged again on a recheck or when it is mergedVerdict: APPROVE at
661918f4e4Independent review of issue 674 (package V1, the vault in Go), controller side.
What I ran on
661918f4e4:gofmt -lon the changed files (empty);sh merge-check.shwith MESH_TEST_POSTGRES pointing at a throwaway PostgreSQL over TCP on 127.0.0.1 (exit 0, race detector on, every listed store test passed; the server is stopped).TestTheVaultsSeatPromisesGetcopied onto the integration branch without the seats.go change fails, so it proves the change. I also merged661918fonto the current trunk617881c(T1, #313, landed after the forge judged this): it merges cleanly, andgo vetplusgo test ./internal/catalogue ./cmd/...pass there. A controller built from this head accepts the catalogue's mesh-vault manifest from mesh-catalog#286 (mesh-vault: ok, 3 tool(s)); the integration branch's controller refuses it (says it serves get, which that seat's protocol does not promise).The change is minimal and correct: one verb on the
mesh-vaultseat,Optionalso the TypeScript vault that runs is still accepted, with its input schema matching the Go vault's tool (name,public_keyas SPKI PEM). The optional mark is applied from the compiled seat (optionalAsCompiled), so a stored seat row does not lose it.Findings (none blocks):
pending(out of date: judged against trunkbfc79c64d9, the trunk is now617881c309). Askmesh-delivery.recheckand merge only on the new verdict.Optionalholds until the vault that runs servesget; the pull request names V4 for removing it. Note that on issue 674 or the V4 issue, so it is not forgotten.