57/V2: accept, secret-ask, issued and rotate are the vault's verbs (issue 675) #302

Closed
mesh-admin wants to merge 5 commits from pkg/57-v2-vault-verbs into feat/57-config-and-provisioning
Contributor

Design 57's V2 (issue 675; ADR 0349 clauses 8 to 10; ADR 0277 §22–§27 and ADR 0305 with the vault in the controller's place), the vault's half. The controller's half is mesh-controller#337, and it merges first: the vault's manifest now serves accept, secret-ask, issued and rotate, which only #337's seat set promises. I checked this: the feat/57 controller's module check refuses this manifest (1 problem), and #337's controller accepts it.

What changed (modules/mesh-vault)

  • intake.go: four verbs of the mesh-vault seat. accept, secret-ask and issued are each two steps of one verb, taken from the controller caller alone, as the runtime proved it. The first step names the secret and answers call and seal_to, the public half of an X25519 key made for that one call (the NaCl anonymous box the desk and provider tools already seal to). The second step carries the value sealed to that key. The vault opens it with the private half, which is kept in memory only and forgotten once used or after two minutes. The value opens nowhere but here.
    • accept: kept with origin accepted. An accepted provision credential is never remade, and a software-issued value is not taken this way.
    • secret-ask: the ask is recorded in the vault's store (asks.jsonl, bounded as the record of hand-outs is) before the answer that lets a prompt open. One open ask per secret (at most 2 min) and three an hour. Who asked is cut to a name and answered back for the prompt. Every outcome is recorded, and secret_asks reads the record.
    • issued: kept as the provision's one credential, origin issued. The same value again writes nothing and says nothing.
    • rotate: refused for an issued value and for an accepted provision credential. Who asked and who carried the act are both kept (changed-by, changed-via).
  • Store names: own/<node>/<module>/<name> and provision/<provider node>/<provision>.
  • V1's review follow-ups (issue 675's note of 05:07): the tool layer passes consumers, why, by, via and confirm through to the custody ledger. An argument by that differs from the proven caller is now kept beside it (via: "…, called by <caller>"). The roll of the record of hand-outs is said in the journal. The export's fingerprint and vault_status are tested.
  • README: a section on taking values in.

Why the controller carries the call

A desk's prompt and a provider's tool answer the controller alone (the subject that names its caller, issue 365). The vault runs in its machine's tool runner, whose one bus account also carries that machine's agents' calls (issue 569). So the vault cannot ask them in a name of its own, and the controller asks them with the vault's call key and passes the sealed answer on unopened. This is how "the provider's tool answers the vault alone" (clause 10) holds today: the tool still answers only the controller, and the value opens only in the vault.

How it is proven

  • TestAnAskIsRecordedBeforeThePromptAndTheTypedValueOpensOnlyInTheVault: ADR 0349's secret-ask test as far as the vault answers it. The ask is in the store before the prompt; the asker is named as the bus named it; the typed value opens only here; nothing the vault said or wrote holds it.
  • TestAnAskIsBoundedToOneOpenPerSecretAndThreeAnHour.
  • TestAnAskIsTakenFromTheControllerAloneAndOnlySealedToItsCall: other callers are refused and fill no record; a value sealed to another key is refused; a call is answered once; a late call is closed; an empty answer is recorded as empty.
  • TestAnIssuingProviderAnswersOnlyTheControllersCallSealedToTheVault: the issuing provider's test, with a stand-in provider, plus ADR 0305 §13's checks that are the vault's: nothing rewritten for a value held, a change kept as a new generation, rotate refused, accept refused for it, the value in nothing said.
  • TestAnAcceptedValueOpensInTheVaultAloneAndIsNotRemade, TestRotateKeepsWhoAskedAndWhoCarriedIt, TestTheNamesOfWhatIsTakenIn, TestTheVerbsTakeTheirCallerFromTheRuntime.
  • TestTheRetirementToolsPassTheActThrough, TestARolledRecordOfHandOutsIsSaid, TestTheExportsFingerprintAndVaultStatus: the V1 follow-ups.
  • Mutations I ran: raising the hour's bound, dropping the controller-only check, dropping the issued rotate refusal, and dropping the open-ask check each fail a test.
  • Every V1 test passes unchanged.

Deliberately left

  • Nothing calls these verbs until V4 turns the controller's switch on for a module (issue 647).
  • The controller's secrets move in under these names with V3 (issue 676).
  • plex's own tool is unchanged: it already answers the controller alone, and the media catalogue moves after release 57.
  • ADR 0305 §13's "later consumer waits at most an hour" belongs to the providers' answers (V4/V5).
  • The offer's parsing and the hand-act table stay the controller's tests.

Reviewer's checklist

  1. Does what issue 675's Expected and its decision note say: the four verbs are the vault's, with the ask's refusals, record, bounds, the asker named in the prompt and the hand-act log (the controller's). Nothing outside modules/mesh-vault. Yes.
  2. The Done-when proof exists as new tests that fail without the code: they reference the new verbs, and the mutations above fail them. The V1 tests are untouched. Yes.
  3. Nothing composes differently for a module that has not moved: only the vault's own manifest changes (a tool and its claim's serves), and the controller sends it nothing until V4. Yes.
  4. No secret in a log, event, bucket, fixture or commit. everything() scans what the vault published and every file it wrote. Test values are made up, there is no bucket, and the store is files. Yes.
  5. Strict parsers: the claim's new serves are promised by mesh-controller#337's seat, which merges first. No new manifest field. Yes.
  6. gofmt -l . and go vet ./... in modules/mesh-vault are clean, and go test -race ./... passes. MESH_GATE=<controller built from #337> MESH_CHECK_CHANGED=modules/mesh-vault/module.json sh merge-check.sh exits 0 (words, agent home, secrets, predefined keys and paths checks pass; long-running resources without health: 66, as kept; modules/mesh-vault tested). Yes.
  7. Words follow the glossary, and the internal names are glossed. Yes.
Design 57's V2 (issue 675; ADR 0349 clauses 8 to 10; ADR 0277 §22–§27 and ADR 0305 with the vault in the controller's place), the vault's half. The controller's half is **mesh-controller#337**, and it merges first: the vault's manifest now serves `accept`, `secret-ask`, `issued` and `rotate`, which only #337's seat set promises. I checked this: the feat/57 controller's module check refuses this manifest (1 problem), and #337's controller accepts it. ## What changed (modules/mesh-vault) - **`intake.go`: four verbs of the `mesh-vault` seat.** `accept`, `secret-ask` and `issued` are each two steps of one verb, taken from the `controller` caller alone, as the runtime proved it. The first step names the secret and answers `call` and `seal_to`, the public half of an X25519 key made for that one call (the NaCl anonymous box the desk and provider tools already seal to). The second step carries the value sealed to that key. The vault opens it with the private half, which is kept in memory only and forgotten once used or after two minutes. The value opens nowhere but here. - `accept`: kept with origin `accepted`. An accepted provision credential is never remade, and a software-issued value is not taken this way. - `secret-ask`: the ask is recorded in the vault's store (`asks.jsonl`, bounded as the record of hand-outs is) before the answer that lets a prompt open. One open ask per secret (at most 2 min) and three an hour. Who asked is cut to a name and answered back for the prompt. Every outcome is recorded, and `secret_asks` reads the record. - `issued`: kept as the provision's one credential, origin `issued`. The same value again writes nothing and says nothing. - `rotate`: refused for an issued value and for an accepted provision credential. Who asked and who carried the act are both kept (`changed-by`, `changed-via`). - Store names: `own/<node>/<module>/<name>` and `provision/<provider node>/<provision>`. - **V1's review follow-ups** (issue 675's note of 05:07): the tool layer passes `consumers`, `why`, `by`, `via` and `confirm` through to the custody ledger. An argument `by` that differs from the proven caller is now kept beside it (`via: "…, called by <caller>"`). The roll of the record of hand-outs is said in the journal. The export's fingerprint and `vault_status` are tested. - README: a section on taking values in. ## Why the controller carries the call A desk's prompt and a provider's tool answer the controller alone (the subject that names its caller, issue 365). The vault runs in its machine's tool runner, whose one bus account also carries that machine's agents' calls (issue 569). So the vault cannot ask them in a name of its own, and the controller asks them with the vault's call key and passes the sealed answer on unopened. This is how "the provider's tool answers the vault alone" (clause 10) holds today: the tool still answers only the controller, and the value opens only in the vault. ## How it is proven - `TestAnAskIsRecordedBeforeThePromptAndTheTypedValueOpensOnlyInTheVault`: ADR 0349's `secret-ask` test as far as the vault answers it. The ask is in the store before the prompt; the asker is named as the bus named it; the typed value opens only here; nothing the vault said or wrote holds it. - `TestAnAskIsBoundedToOneOpenPerSecretAndThreeAnHour`. - `TestAnAskIsTakenFromTheControllerAloneAndOnlySealedToItsCall`: other callers are refused and fill no record; a value sealed to another key is refused; a call is answered once; a late call is closed; an empty answer is recorded as `empty`. - `TestAnIssuingProviderAnswersOnlyTheControllersCallSealedToTheVault`: the issuing provider's test, with a stand-in provider, plus ADR 0305 §13's checks that are the vault's: nothing rewritten for a value held, a change kept as a new generation, `rotate` refused, `accept` refused for it, the value in nothing said. - `TestAnAcceptedValueOpensInTheVaultAloneAndIsNotRemade`, `TestRotateKeepsWhoAskedAndWhoCarriedIt`, `TestTheNamesOfWhatIsTakenIn`, `TestTheVerbsTakeTheirCallerFromTheRuntime`. - `TestTheRetirementToolsPassTheActThrough`, `TestARolledRecordOfHandOutsIsSaid`, `TestTheExportsFingerprintAndVaultStatus`: the V1 follow-ups. - Mutations I ran: raising the hour's bound, dropping the controller-only check, dropping the issued rotate refusal, and dropping the open-ask check each fail a test. - Every V1 test passes unchanged. ## Deliberately left - Nothing calls these verbs until V4 turns the controller's switch on for a module (issue 647). - The controller's secrets move in under these names with V3 (issue 676). - plex's own tool is unchanged: it already answers the controller alone, and the media catalogue moves after release 57. - ADR 0305 §13's "later consumer waits at most an hour" belongs to the providers' answers (V4/V5). - The offer's parsing and the hand-act table stay the controller's tests. ## Reviewer's checklist 1. Does what issue 675's Expected and its decision note say: the four verbs are the vault's, with the ask's refusals, record, bounds, the asker named in the prompt and the hand-act log (the controller's). Nothing outside modules/mesh-vault. Yes. 2. The Done-when proof exists as new tests that fail without the code: they reference the new verbs, and the mutations above fail them. The V1 tests are untouched. Yes. 3. Nothing composes differently for a module that has not moved: only the vault's own manifest changes (a tool and its claim's serves), and the controller sends it nothing until V4. Yes. 4. No secret in a log, event, bucket, fixture or commit. `everything()` scans what the vault published and every file it wrote. Test values are made up, there is no bucket, and the store is files. Yes. 5. Strict parsers: the claim's new `serves` are promised by mesh-controller#337's seat, which merges first. No new manifest field. Yes. 6. `gofmt -l .` and `go vet ./...` in modules/mesh-vault are clean, and `go test -race ./...` passes. `MESH_GATE=<controller built from #337> MESH_CHECK_CHANGED=modules/mesh-vault/module.json sh merge-check.sh` exits 0 (words, agent home, secrets, predefined keys and paths checks pass; long-running resources without health: 66, as kept; modules/mesh-vault tested). Yes. 7. Words follow the glossary, and the internal names are glossed. Yes.
mesh-admin added 5 commits 2026-10-14 19:15:46 +00:00
ADR 0349 clauses 8 to 10: a value given at the controller's terminal, typed
at a desk or issued by a provider's software enters the vault and opens
there alone, and rotation is the vault's. Each comes in two steps from the
controller, which reaches the desk and the provider: the vault makes a key
for the one call and opens what was sealed to it. An ask is recorded in the
vault's store before the prompt opens and bounded to one open per secret
and three an hour.

Also V1's review follow-ups: the tool layer passes an act through, a
rolled record is said, the export's fingerprint and vault_status are
tested, and an unproven by is kept beside the proven caller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Prove the vault's secret-ask test and the issuing provider's test with a stand-in provider (issue 675)
mesh/merge-gate head eb958f668ecd merged into trunk 1a2c917abfdb — pass: [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] t…
mesh/repo-check head eb958f668ecd merged into trunk 1a2c917abfdb — fail: [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] i…
mesh/delivery-group group pkg/57-v2-vault-verbs rejected: a member's own check failed
mesh/delivery stopped: the pull request closed unmerged
eb958f668e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Contributor

Delivery novox/mesh-catalog@eb958f668ecd — stopped since 2026-10-14T19:35:38Z

Delivery plan — builds nothing: the change touches no module of the mesh's graph

Transitions

  • 2026-10-14 19:16 (new) → proposed (announced): novox/mesh-catalog#302's head announced
  • 2026-10-14 19:17 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
  • 2026-10-14 19:17 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
  • 2026-10-14 19:35 rejected → stopped (closed): the pull request closed unmerged

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-catalog@eb958f668ecd` — **stopped** since 2026-10-14T19:35:38Z **Delivery plan** — builds nothing: the change touches no module of the mesh's graph **Transitions** - 2026-10-14 19:16 (new) → proposed (announced): novox/mesh-catalog#302's head announced - 2026-10-14 19:17 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit - 2026-10-14 19:17 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed - 2026-10-14 19:35 rejected → stopped (closed): the pull request closed unmerged The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at eb958f66
Judged: head eb958f668ecd merged into trunk 1a2c917abfdb; read beside it: mesh-controller fcdecb436117, mesh-controller-main c2ec0a601acb, mesh-host 53fd32618916, mesh-tools d0dcae53a8c0

  • mesh/merge-gate: PASS — [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] the change touches no module of the mesh's graph
  • mesh/repo-check: FAIL — [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] its merge-check.sh failed: files asking for a setting without saying whether it is trusted: 25

Run by the build seat on novox as build-1792005372951451506 (builds --log build-1792005372951451506).

--- judged for the release branch feat/57-config-and-provisioning by its controller at fcdecb436117, with mesh-host's validator of feat/57-config-and-provisioning at 53fd32618916; read beside it: mesh-controller feat/57-config-and-provisioning at fcdecb436117, mesh-controller-main main at c2ec0a601acb, mesh-host feat/57-config-and-provisioning at 53fd32618916, mesh-tools main at d0dcae53a8c0
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.005s
words: 12 retired words and 70 daemons' lines, none in the 47502 strings of 723 files
ok  	git.novox.be/novox/mesh-catalog/checks/agenthome	0.016s
agent-home: no archive and no file written into under the agent's home
ok  	git.novox.be/novox/mesh-catalog/checks/secrets	0.015s
secrets: no setting can replace a vault secret in a mergeable file (1 known, nested)
ok  	git.novox.be/novox/mesh-catalog/checks/predefined	0.349s
predefined.json: 2 key(s), none removed that a module names
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.006s
paths: no module names another's state on its machine (3 known, listed to go)
mesh-controller: 1 problem(s) in 128 manifest(s)
mesh-vault claims mesh-vault and says it serves accept, secret-ask, issued, rotate, which that seat's protocol does not promise — a claim's serves names the seat's verbs and nothing else
adwaita: ok, 4 tool(s)
artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect, mesh-catalog.catalog_modules, mesh-catalog.catalog_module
asus-zephyrus-g14: ok, 11 tool(s); WARNING: asusd, supergfxd, upower stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
audit-logger: ok, keeps trail (valuable), spool (valuable)
avahi: ok, 4 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
baserow: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
betterbird: ok, 17 tool(s), invokes seat:mesh-controller.settings, seat:mesh-controller.nodes, seat:mesh-controller.node, betterbird.betterbird_derive
blueman: ok, 3 tool(s)
bluetooth: ok, 9 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
build-agent: ok, keeps workspace (cache), ready: server by exec every 10s
ca-trust: ok; WARNING: trust stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
claude-code: ok, 48 tool(s), keeps state servers, holdings, config, proposals, questions, memory, reads claude-licence-manager.bindings, keeps agent-home (valuable); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
clipmenu: ok, 3 tool(s)
confluence: ok
cups: ok, 7 tool(s); WARNING: socket, scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
dbus: ok, 5 tool(s); WARNING: system-bus stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
de-spiegel: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
desk-channel: ok, 1 tool(s), invokes seat:node-notifier.send, keeps state shown; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
dev-tools: ok
disk-load: ok, 4 tool(s)
distribution: ok, keeps registry (rebuildable); WARNING: store stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
dmenu: ok, 2 tool(s)
dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s
docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
docker-compose: ok, 9 tool(s)
dunst: ok, 6 tool(s)
fail2ban: ok, 2 tool(s), ready: watch by its tool fail2ban_health every 1m0s; run by unit every 30s
feh: ok, 2 tool(s)
flatpak: ok, 11 tool(s)
fonts: ok, 6 tool(s)
forticlient: ok, 3 tool(s), ready: split-dns by unit every 30s; WARNING: scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
gitea: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
gitlab: ok
gnome-keyring: ok, 4 tool(s)
grafana: ok, keeps data (valuable), ready: server by http / on web every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
hello-web: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
home-assistant: ok, keeps config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
hostname: ok; WARNING: name ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
i3: ok, 10 tool(s)
i3status-rust: ok, 4 tool(s)
icecast: ok, keeps logs (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
influxdb: ok, keeps data (valuable), config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
invoicing: ok; WARNING: app, api stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
jira: ok
keycloak: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
lab: ok, keeps work (cache); WARNING: runtime-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
lemurs: ok, 2 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
letta: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
local-model-consumer: ok
localization: ok, 4 tool(s)
logrotate: ok, 7 tool(s); WARNING: timer stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
mailu: ok, keeps mail (valuable), dkim (valuable), data (valuable), dav (valuable), webmail (valuable), queue (valuable), filter (rebuildable), certs (rebuildable), automx (rebuildable), fetchmail (rebuildable), clamav (cache), redis (cache), ready: resolver by its image's own check every 30s; admin by its image's own check every 30s; imap by its image's own check every 30s; smtp by its image's own check every 30s; antispam by its image's own check every 30s; webmail by its image's own check every 30s; webdav by its image's own check every 30s; fetchmail by its image's own check every 30s; front by its image's own check every 30s; WARNING: config-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: redis, antivirus, automx stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
marrytts: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
matrix: ok, keeps db (valuable), ready: element by its image's own check every 30s; WARNING: element-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: homeserver stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
memory-pressure: ok, 6 tool(s); WARNING: oomd stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
mesh-catalog: ok
mesh-cli: ok
mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, keeps state deliveries, groups
mesh-issues: ok, invokes claude-code.claude_code_judge, seat:mesh-delivery.checks, seat:operator-channel.notify, gitea.gitea_pull_reviews, records.records_status, records.records_list, records.records_read, mesh-knowledge.knowledge_highest, keeps state issues, counters, grooming, reservations, keeps log changes (1024 MiB)
mesh-knowledge: ok, 2 tool(s), invokes seat:issue-tracker.reserve, claude-code.claude_code_judge, claude-code.claude_code_judged, records.records_status, records.records_list, records.records_read, seat:operator-channel.notify, ready: keep by unit every 30s; watch by its tool knowledge_health every 1m0s
mesh-reads: ok
mesh-vault: ok, 11 tool(s), keeps state (valuable), ledger (valuable), root (valuable), store (valuable)
mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
messenger: ok, 7 tool(s), invokes seat:mesh-controller.conditions, seat:mesh-controller.root-free, seat:issue-tracker.tracking, keeps state open, sent, asks, identities, walks; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
minio: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
model-usage: ok, keeps state (cache), spool (valuable)
mongodb: ok, keeps data (valuable), dumps (rebuildable), ready: server by tcp on database every 30s
mosquitto: ok, keeps data (rebuildable), ready: server by tcp on mqtt every 30s
mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
mssql: ok, keeps data (valuable), dumps (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
n8n: ok, keeps data (valuable), cache (cache); WARNING: server, cache-server, browser stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
nats: ok, 9 tool(s), keeps jetstream (valuable), snapshots (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
netcheck: ok, 5 tool(s)
networkmanager: ok
nextcloud: ok, keeps html (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
nextcloud-client: ok, 4 tool(s)
nfs-server: ok, 1 tool(s), invokes seat:mesh-controller.seats, seat:mesh-controller.data, keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
nftables: ok, 1 tool(s); WARNING: load stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
nm-applet: ok, 3 tool(s)
node-env: ok
nodered: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
ollama: ok, keeps models (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
only-office: ok, keeps data (rebuildable), lib (rebuildable), db (rebuildable), fonts (rebuildable), logs (cache), rabbitmq (cache), redis (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
openai-consumer: ok
openrazer: ok, 3 tool(s)
pacman: ok, 15 tool(s); WARNING: mirror-refresh, cache-cleaning stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
photos-eef: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
photos-filip: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
picom: ok, 4 tool(s); WARNING: configuration ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
polychromatic: ok, 3 tool(s)
postgres: ok, keeps store (valuable), dumps (rebuildable), ready: server by tcp on database every 30s
power: ok, 5 tool(s), keeps state draw, ready: draw by unit every 30s; WARNING: logind-power ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: after-boot, before-shutdown stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
powerlevel10k: ok
records: ok, 6 tool(s), keeps checkout (rebuildable)
redis: ok, keeps data (cache), ready: server by tcp on cache every 30s
restic: ok, 3 tool(s), keeps repository (rebuildable), state (cache), ready: night by its tool backup_health every 1m0s; measure by unit every 30s
rofi: ok, 3 tool(s)
route-adapter: ok; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
route-proxy: ok, keeps acme (rebuildable), ca (cache), ready: server by tcp on http every 10s
screen-lock: ok, 3 tool(s)
searxng: ok, keeps valkey (cache); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: cache, server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s
showcase: ok; WARNING: server, tools stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
slack: ok, 4 tool(s)
snapd: ok, 10 tool(s)
ssh-client: ok, 8 tool(s), keeps ssh (valuable)
sshd: ok; WARNING: run stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
step-ca: ok, keeps home (valuable), ready: server by its image's own check every 30s
sudo: ok, 4 tool(s)
supabase: ok, keeps db (valuable), dumps (rebuildable), storage (valuable), functions (valuable), db-config (rebuildable), ready: db by its image's own check every 30s; kong by its image's own check every 30s; meta by its image's own check every 30s; studio by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: vector, analytics, auth, rest, realtime, imgproxy, storage-api, edge-functions, pooler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
systemd: ok
systemd-networkd: ok
systemd-resolved: ok, ready: service by unit every 30s; guard by unit every 30s
telegram: ok, 1 tool(s), keeps state offset, messages
time-sync: ok, 3 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
triggerhappy: ok, 4 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
umami: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
unifi: ok, keeps data (valuable); WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
website: ok, ready: server by http / on web every 30s
xclip: ok, 4 tool(s)
xdg: ok, 5 tool(s); WARNING: user-dirs ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
xorg: ok, 9 tool(s)
xterm: ok, 2 tool(s)
zfs: ok, 15 tool(s), ready: watch by its tool zfs_health every 1m0s; events by unit every 30s; WARNING: scrub-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
zsh: ok, 1 tool(s); WARNING: tools-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
zsh-autosuggestions: ok
zsh-syntax-highlighting: ok
long-running resources without health: 66
files asking for a setting without saying whether it is trusted: 25
**Merge check** at `eb958f66` Judged: head `eb958f668ecd` merged into trunk `1a2c917abfdb`; read beside it: mesh-controller `fcdecb436117`, mesh-controller-main `c2ec0a601acb`, mesh-host `53fd32618916`, mesh-tools `d0dcae53a8c0` - `mesh/merge-gate`: **PASS** — [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] the change touches no module of the mesh's graph - `mesh/repo-check`: **FAIL** — [release feat/57-config-and-provisioning, judged by its controller fcdecb436117] its merge-check.sh failed: files asking for a setting without saying whether it is trusted: 25 Run by the build seat on novox as `build-1792005372951451506` (`builds --log build-1792005372951451506`). ``` --- judged for the release branch feat/57-config-and-provisioning by its controller at fcdecb436117, with mesh-host's validator of feat/57-config-and-provisioning at 53fd32618916; read beside it: mesh-controller feat/57-config-and-provisioning at fcdecb436117, mesh-controller-main main at c2ec0a601acb, mesh-host feat/57-config-and-provisioning at 53fd32618916, mesh-tools main at d0dcae53a8c0 --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.005s words: 12 retired words and 70 daemons' lines, none in the 47502 strings of 723 files ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.016s agent-home: no archive and no file written into under the agent's home ok git.novox.be/novox/mesh-catalog/checks/secrets 0.015s secrets: no setting can replace a vault secret in a mergeable file (1 known, nested) ok git.novox.be/novox/mesh-catalog/checks/predefined 0.349s predefined.json: 2 key(s), none removed that a module names ok git.novox.be/novox/mesh-catalog/checks/paths 0.006s paths: no module names another's state on its machine (3 known, listed to go) mesh-controller: 1 problem(s) in 128 manifest(s) mesh-vault claims mesh-vault and says it serves accept, secret-ask, issued, rotate, which that seat's protocol does not promise — a claim's serves names the seat's verbs and nothing else adwaita: ok, 4 tool(s) artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect, mesh-catalog.catalog_modules, mesh-catalog.catalog_module asus-zephyrus-g14: ok, 11 tool(s); WARNING: asusd, supergfxd, upower stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) audit-logger: ok, keeps trail (valuable), spool (valuable) avahi: ok, 4 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) baserow: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) betterbird: ok, 17 tool(s), invokes seat:mesh-controller.settings, seat:mesh-controller.nodes, seat:mesh-controller.node, betterbird.betterbird_derive blueman: ok, 3 tool(s) bluetooth: ok, 9 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) build-agent: ok, keeps workspace (cache), ready: server by exec every 10s ca-trust: ok; WARNING: trust stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) claude-code: ok, 48 tool(s), keeps state servers, holdings, config, proposals, questions, memory, reads claude-licence-manager.bindings, keeps agent-home (valuable); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) clipmenu: ok, 3 tool(s) confluence: ok cups: ok, 7 tool(s); WARNING: socket, scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) dbus: ok, 5 tool(s); WARNING: system-bus stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) de-spiegel: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) desk-channel: ok, 1 tool(s), invokes seat:node-notifier.send, keeps state shown; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) dev-tools: ok disk-load: ok, 4 tool(s) distribution: ok, keeps registry (rebuildable); WARNING: store stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) dmenu: ok, 2 tool(s) dnsmasq: ok, 3 tool(s), ready: service by unit every 30s; watch by its tool dnsmasq_health every 20s docker: ok, 22 tool(s), invokes seat:mesh-controller.images; WARNING: socket, runtime, prune stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) docker-compose: ok, 9 tool(s) dunst: ok, 6 tool(s) fail2ban: ok, 2 tool(s), ready: watch by its tool fail2ban_health every 1m0s; run by unit every 30s feh: ok, 2 tool(s) flatpak: ok, 11 tool(s) fonts: ok, 6 tool(s) forticlient: ok, 3 tool(s), ready: split-dns by unit every 30s; WARNING: scheduler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) gitea: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) gitlab: ok gnome-keyring: ok, 4 tool(s) grafana: ok, keeps data (valuable), ready: server by http / on web every 30s; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) hello-web: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) home-assistant: ok, keeps config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) hostname: ok; WARNING: name ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) i3: ok, 10 tool(s) i3status-rust: ok, 4 tool(s) icecast: ok, keeps logs (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) influxdb: ok, keeps data (valuable), config (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) invoicing: ok; WARNING: app, api stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) jira: ok keycloak: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) lab: ok, keeps work (cache); WARNING: runtime-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) lemurs: ok, 2 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) letta: ok; WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) local-model-consumer: ok localization: ok, 4 tool(s) logrotate: ok, 7 tool(s); WARNING: timer stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) mailu: ok, keeps mail (valuable), dkim (valuable), data (valuable), dav (valuable), webmail (valuable), queue (valuable), filter (rebuildable), certs (rebuildable), automx (rebuildable), fetchmail (rebuildable), clamav (cache), redis (cache), ready: resolver by its image's own check every 30s; admin by its image's own check every 30s; imap by its image's own check every 30s; smtp by its image's own check every 30s; antispam by its image's own check every 30s; webmail by its image's own check every 30s; webdav by its image's own check every 30s; fetchmail by its image's own check every 30s; front by its image's own check every 30s; WARNING: config-env ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: redis, antivirus, automx stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) marrytts: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) matrix: ok, keeps db (valuable), ready: element by its image's own check every 30s; WARNING: element-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: homeserver stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) memory-pressure: ok, 6 tool(s); WARNING: oomd stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) mesh-catalog: ok mesh-cli: ok mesh-delivery: ok, 1 tool(s), invokes seat:mesh-controller.delivery-plan, seat:mesh-controller.delivery-order, seat:mesh-controller.delivery-check, seat:mesh-controller.deliver, seat:mesh-controller.delivery-stop, seat:mesh-controller.delivery-walks, seat:mesh-controller.forget-checks, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, gitea.gitea_contains, gitea.gitea_open_pulls, keeps state deliveries, groups mesh-issues: ok, invokes claude-code.claude_code_judge, seat:mesh-delivery.checks, seat:operator-channel.notify, gitea.gitea_pull_reviews, records.records_status, records.records_list, records.records_read, mesh-knowledge.knowledge_highest, keeps state issues, counters, grooming, reservations, keeps log changes (1024 MiB) mesh-knowledge: ok, 2 tool(s), invokes seat:issue-tracker.reserve, claude-code.claude_code_judge, claude-code.claude_code_judged, records.records_status, records.records_list, records.records_read, seat:operator-channel.notify, ready: keep by unit every 30s; watch by its tool knowledge_health every 1m0s mesh-reads: ok mesh-vault: ok, 11 tool(s), keeps state (valuable), ledger (valuable), root (valuable), store (valuable) mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) messenger: ok, 7 tool(s), invokes seat:mesh-controller.conditions, seat:mesh-controller.root-free, seat:issue-tracker.tracking, keeps state open, sent, asks, identities, walks; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) minio: ok, keeps data (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) model-usage: ok, keeps state (cache), spool (valuable) mongodb: ok, keeps data (valuable), dumps (rebuildable), ready: server by tcp on database every 30s mosquitto: ok, keeps data (rebuildable), ready: server by tcp on mqtt every 30s mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) mssql: ok, keeps data (valuable), dumps (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) n8n: ok, keeps data (valuable), cache (cache); WARNING: server, cache-server, browser stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) nats: ok, 9 tool(s), keeps jetstream (valuable), snapshots (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) netcheck: ok, 5 tool(s) networkmanager: ok nextcloud: ok, keeps html (valuable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) nextcloud-client: ok, 4 tool(s) nfs-server: ok, 1 tool(s), invokes seat:mesh-controller.seats, seat:mesh-controller.data, keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) nftables: ok, 1 tool(s); WARNING: load stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) nm-applet: ok, 3 tool(s) node-env: ok nodered: ok, keeps data (valuable), ready: server by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) ollama: ok, keeps models (rebuildable); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) only-office: ok, keeps data (rebuildable), lib (rebuildable), db (rebuildable), fonts (rebuildable), logs (cache), rabbitmq (cache), redis (cache); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) openai-consumer: ok openrazer: ok, 3 tool(s) pacman: ok, 15 tool(s); WARNING: mirror-refresh, cache-cleaning stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) photos-eef: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) photos-filip: ok; WARNING: client stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) picom: ok, 4 tool(s); WARNING: configuration ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) polychromatic: ok, 3 tool(s) postgres: ok, keeps store (valuable), dumps (rebuildable), ready: server by tcp on database every 30s power: ok, 5 tool(s), keeps state draw, ready: draw by unit every 30s; WARNING: logind-power ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: after-boot, before-shutdown stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) powerlevel10k: ok records: ok, 6 tool(s), keeps checkout (rebuildable) redis: ok, keeps data (cache), ready: server by tcp on cache every 30s restic: ok, 3 tool(s), keeps repository (rebuildable), state (cache), ready: night by its tool backup_health every 1m0s; measure by unit every 30s rofi: ok, 3 tool(s) route-adapter: ok; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) route-proxy: ok, keeps acme (rebuildable), ca (cache), ready: server by tcp on http every 10s screen-lock: ok, 3 tool(s) searxng: ok, keeps valkey (cache); WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: cache, server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) sensors: ok, 6 tool(s), ready: drives by unit every 30s; watch by its tool sensors_health every 1m0s showcase: ok; WARNING: server, tools stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) slack: ok, 4 tool(s) snapd: ok, 10 tool(s) ssh-client: ok, 8 tool(s), keeps ssh (valuable) sshd: ok; WARNING: run stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) step-ca: ok, keeps home (valuable), ready: server by its image's own check every 30s sudo: ok, 4 tool(s) supabase: ok, keeps db (valuable), dumps (rebuildable), storage (valuable), functions (valuable), db-config (rebuildable), ready: db by its image's own check every 30s; kong by its image's own check every 30s; meta by its image's own check every 30s; studio by its image's own check every 30s; WARNING: settings ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: vector, analytics, auth, rest, realtime, imgproxy, storage-api, edge-functions, pooler stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) systemd: ok systemd-networkd: ok systemd-resolved: ok, ready: service by unit every 30s; guard by unit every 30s telegram: ok, 1 tool(s), keeps state offset, messages time-sync: ok, 3 tool(s); WARNING: daemon stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) triggerhappy: ok, 4 tool(s); WARNING: service stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) umami: ok; WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) unifi: ok, keeps data (valuable); WARNING: runtime-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339); WARNING: server stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8) website: ok, ready: server by http / on web every 30s xclip: ok, 4 tool(s) xdg: ok, 5 tool(s); WARNING: user-dirs ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) xorg: ok, 9 tool(s) xterm: ok, 2 tool(s) zfs: ok, 15 tool(s), ready: watch by its tool zfs_health every 1m0s; events by unit every 30s; WARNING: scrub-config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) zsh: ok, 1 tool(s); WARNING: tools-conf ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339) zsh-autosuggestions: ok zsh-syntax-highlighting: ok long-running resources without health: 66 files asking for a setting without saying whether it is trusted: 25 ```
Author
Contributor

Verdict: APPROVE at eb958f668e

Reviewed together with mesh-controller#337 (65531d737514), as package V2 of release 57 (issue 675). This pull request merges only after #337, and #337 needs a change in its tests first (my verdict there). Nothing in this pull request has to change.

Checks I ran: MESH_CHECK_MODULES=modules/mesh-vault MESH_CHECK_BASE=feat/57-config-and-provisioning MESH_GATE=<controller built from #337> sh merge-check.sh exited 0, and the vault's tests passed. With the feat/57 controller as MESH_GATE the check exits 1, because that controller refuses the new serves, as expected. gofmt -l printed nothing, go vet passed, and go test -race -count=3 passed.

To check that the tests guard the rules, I changed the code and confirmed each test fails. Allowing four asks an hour, dropping the one-open-ask rule, letting any caller do the intake steps, and opening the prompt without recording the ask first: each change fails the matching test in intake_test.go. The ask record and both bounds are in the vault's store (asks.jsonl, synced) before the key the prompt seals to is answered (ADR 0277 §24-§27). V1's four follow-ups are correct (followups_test.go). The tools pass by, via, confirm and consumers through, and an unproven by keeps the proven caller in via. A roll of the hand-out record is logged and counted, and the count now covers only hand-outs (store.go). The export's fingerprint and vault_status are tested.

Should (can follow):

  1. intake.go:435-457 / tools.go:148: rotate takes any proven bus caller. It does not go through the controller's switch, so it is not blocked for a module that has not moved, and it does not ask for the why of the hand-act log. The store is empty until V3, so this harms nothing today. Before V3, limit it to the controller (or require a why), so that rotating an unmoved module's secret in the vault cannot drift from the value the controller holds.
  2. intake.go:318: AskEnd's recordAsk runs without Store.asksMu, so two writers can roll asks.jsonl at the same time. Take the lock around the append.
  3. IssuedOpen does not refuse a provision whose credential was accepted, while AcceptOpen does refuse one that was issued. Decide whether issued may replace an accepted value, and write down which.
Verdict: APPROVE at eb958f668ecd798c0bce03f8639fefa0de222f21 Reviewed together with mesh-controller#337 (65531d737514), as package V2 of release 57 (issue 675). This pull request merges only after #337, and #337 needs a change in its tests first (my verdict there). Nothing in this pull request has to change. Checks I ran: `MESH_CHECK_MODULES=modules/mesh-vault MESH_CHECK_BASE=feat/57-config-and-provisioning MESH_GATE=<controller built from #337> sh merge-check.sh` exited 0, and the vault's tests passed. With the feat/57 controller as MESH_GATE the check exits 1, because that controller refuses the new `serves`, as expected. gofmt -l printed nothing, go vet passed, and go test -race -count=3 passed. To check that the tests guard the rules, I changed the code and confirmed each test fails. Allowing four asks an hour, dropping the one-open-ask rule, letting any caller do the intake steps, and opening the prompt without recording the ask first: each change fails the matching test in intake_test.go. The ask record and both bounds are in the vault's store (asks.jsonl, synced) before the key the prompt seals to is answered (ADR 0277 §24-§27). V1's four follow-ups are correct (followups_test.go). The tools pass by, via, confirm and consumers through, and an unproven `by` keeps the proven caller in `via`. A roll of the hand-out record is logged and counted, and the count now covers only hand-outs (store.go). The export's fingerprint and vault_status are tested. Should (can follow): 1. intake.go:435-457 / tools.go:148: `rotate` takes any proven bus caller. It does not go through the controller's switch, so it is not blocked for a module that has not moved, and it does not ask for the `why` of the hand-act log. The store is empty until V3, so this harms nothing today. Before V3, limit it to the controller (or require a why), so that rotating an unmoved module's secret in the vault cannot drift from the value the controller holds. 2. intake.go:318: AskEnd's `recordAsk` runs without `Store.asksMu`, so two writers can roll asks.jsonl at the same time. Take the lock around the append. 3. IssuedOpen does not refuse a provision whose credential was accepted, while AcceptOpen does refuse one that was issued. Decide whether `issued` may replace an accepted value, and write down which.
Author
Contributor

Closed unmerged: feature 57 is now built on one feature branch, 57-config-and-provisioning, in every repository, pushed and opened as one pull request per repository when every issue is done (the operator's rule, 2026-10-14). This head eb958f66 is on that branch (V2's catalogue half, issue 675).

Closed unmerged: feature 57 is now built on one feature branch, `57-config-and-provisioning`, in every repository, pushed and opened as one pull request per repository when every issue is done (the operator's rule, 2026-10-14). This head eb958f66 is on that branch (V2's catalogue half, issue 675).
mesh-admin closed this pull request 2026-10-14 19:27:18 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-catalog#302