57/V1: The vault's seat promises get (issue 674) #317

Merged
mesh-admin merged 1 commits from pkg/57-v1-vault-in-go into feat/57-config-and-provisioning 2026-10-14 01:19:24 +00:00
Contributor

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. ✓
## 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. ✓
mesh-admin added 1 commit 2026-10-14 00:58:14 +00:00
Promise get on the vault's seat, so the Go vault can serve it (issue 674)
mesh/merge-gate head 661918f4e4e0 merged into trunk 71362c196dbc — pass: the change touches no module of the mesh's graph
mesh/delivery-group group pkg/57-v1-vault-in-go delivering: 1 of 2 delivered
mesh/repo-check head 661918f4e4e0 merged into trunk 71362c196dbc — pass: its merge-check.sh passed
mesh/delivery delivered
661918f4e4
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>
Author
Contributor

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@b67fe1ffb1 → novox/mesh-controller@661918f4e4

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.

<!-- 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`.
Author
Contributor

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
mesh-admin left a comment
Author
Contributor

Verdict: APPROVE at 661918f4e4

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):

  1. 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.
  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.
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-provisioning 2026-10-14 01:19:24 +00:00
mesh-admin deleted branch pkg/57-v1-vault-in-go 2026-10-14 01:19:24 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#317