Fix of issue 1842: the bus module's README told a person to verify the bus snapshot with docker exec … mesh-nats-snapshot verify, which no mesh tool does; R4d's bus upgrade (ADR 0480 §6) needed it.
New read-only tool nats_snapshot_verify in the nats module's tools: it verifies the newest *.tar in the module's snapshots directory (or one named by a single path component; .partial files skipped, symlinks refused, nothing outside the directory), checks every file of every stream against the manifest's checksum and the archive's size, and reads each archive to its end. It answers the file, its time and size, when it was taken, each stream's name and last sequence, and passed with the first fault.
No copy of the code: the archive code moved from cmd/mesh-nats-snapshot (a main package) into modules/nats/internal/busarchive, shared by the snapshot program and the tool; the program's tests are unchanged and pass.
MESH_NATS_SNAPSHOTS_DIR=${dir:snapshots} in the tools bundle's env; README upgrade step 2 and restore step 2 name the tool (the restored copy outside the directory keeps its verify through the program).
Tests: fixture tars made in the test: good, corrupted checksum, truncated, checksums right but the archive unreadable, newest pick, path escape, symlink; each failed first. Try build-1792672203111547903: pass.
First live use: tonight's nightly dump after R4d's bus upgrade, which is also the last proof two of R4d's bus issues wait for (the tracker's 1640 and 1642).
Fix of issue 1842: the bus module's README told a person to verify the bus snapshot with `docker exec … mesh-nats-snapshot verify`, which no mesh tool does; R4d's bus upgrade (ADR 0480 §6) needed it.
- **New read-only tool `nats_snapshot_verify`** in the nats module's tools: it verifies the newest `*.tar` in the module's snapshots directory (or one named by a single path component; `.partial` files skipped, symlinks refused, nothing outside the directory), checks every file of every stream against the manifest's checksum and the archive's size, and reads each archive to its end. It answers the file, its time and size, when it was taken, each stream's name and last sequence, and passed with the first fault.
- **No copy of the code:** the archive code moved from `cmd/mesh-nats-snapshot` (a main package) into `modules/nats/internal/busarchive`, shared by the snapshot program and the tool; the program's tests are unchanged and pass.
- `MESH_NATS_SNAPSHOTS_DIR=${dir:snapshots}` in the tools bundle's env; README upgrade step 2 and restore step 2 name the tool (the restored copy outside the directory keeps its verify through the program).
Tests: fixture tars made in the test: good, corrupted checksum, truncated, checksums right but the archive unreadable, newest pick, path escape, symlink; each failed first. Try build-1792672203111547903: pass.
First live use: tonight's nightly dump after R4d's bus upgrade, which is also the last proof two of R4d's bus issues wait for (the tracker's 1640 and 1642).
Reviewed-by: reviewer-1842@shanks at 98ca97fc5b3fce8746515f22eef9db8e1e29c79c
mesh/check failed: ace: novox/mesh-catalog#442: checks/particulars/go.mod cannot be read to check its mesh-sdk pin: Gitea API /repos/novox/mesh-catalo…
mesh/merge-gate head 98ca97fc5b3f merged into trunk dcf6e86d0236 — pass: builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) fo…
mesh/repo-check head 98ca97fc5b3f merged into trunk dcf6e86d0236 — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-…
The upgrade and restore steps told a person to docker exec the snapshot program; no mesh tool
did it. nats_snapshot_verify reads the newest bus.tar of the snapshots directory only.
Deliverynovox/mesh-catalog@98ca97fc5b3f — delivered since 2026-10-22T13:10:42Z
Delivery plan — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
tier 0: nats
novox: waits for a person: nats
merging this needs a person's bus upgrade: nats is never sent by an ordinary send, and until mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"} runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)
nats provides mesh-bus: its consumers are sent again after it
nats keeps data (ADR 0233): what it holds is backed up before it moves
Transitions
2026-10-22 12:55 (new) → proposed (announced): novox/mesh-catalog#442's head announced
2026-10-22 13:06 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-22 13:06 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-22 13:08 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-22 13:08 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-22 13:10 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@98ca97fc5b3f` — **delivered** since 2026-10-22T13:10:42Z
**Delivery plan** — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
- tier 0: nats
- novox: waits for a person: nats
- merging this needs a person's bus upgrade: nats is never sent by an ordinary send, and until `mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"}` runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)
- nats provides mesh-bus: its consumers are sent again after it
- nats keeps data (ADR 0233): what it holds is backed up before it moves
**Transitions**
- 2026-10-22 12:55 (new) → proposed (announced): novox/mesh-catalog#442's head announced
- 2026-10-22 13:06 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-22 13:06 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-22 13:08 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-22 13:08 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-22 13:10 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Merge check at 98ca97fc
Judged: head 98ca97fc5b3f merged into trunk dcf6e86d0236; read beside it: mesh-controller 8f2d22db0caa, mesh-controller-main 8f2d22db0caa, mesh-host 4065b45ae84f, mesh-tools e0fadc43d9dd
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: nats)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
tier 0: nats
novox: waits for a person: nats
merging this needs a person's bus upgrade: nats is never sent by an ordinary send, and until mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"} runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)
nats provides mesh-bus: its consumers are sent again after it
nats keeps data (ADR 0233): what it holds is backed up before it moves
read by no module's build: modules/nats/README.md, modules/nats/cmd/mesh-nats-snapshot/image_test.go, modules/nats/cmd/mesh-nats-snapshot/live_test.go, modules/nats/internal/busarchive/archive.go, modules/nats/internal/busarchive/types.go, modules/nats/internal/busarchive/verifyfile.go, modules/nats/internal/busarchive/verifyfile_test.go
Run by the build seat on ace as build-1792673730092986669 (builds --log build-1792673730092986669).
--- the gate: nats
nats: ok, 10 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)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-22T12:51:59Z says they run
composing every machine as the mesh is
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
composing every machine with the change
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-22T12:51:59Z
modules the change moves:
- nats (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-config, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-provisioner, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 1 module(s) in 1 tier(s): nats
notes:
- modules/nats/README.md, modules/nats/cmd/mesh-nats-snapshot/image_test.go, modules/nats/cmd/mesh-nats-snapshot/live_test.go, modules/nats/internal/busarchive/archive.go, modules/nats/internal/busarchive/types.go, modules/nats/internal/busarchive/verifyfile.go and modules/nats/internal/busarchive/verifyfile_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words and 70 daemons' lines, none in the 60723 strings of 938 files
ok git.novox.be/novox/mesh-catalog/checks/particulars 0.006s
particulars: none of 4 node names in the 2 covered modules
ok git.novox.be/novox/mesh-catalog/checks/toolchains 0.009s
toolchains: go, nodejs, npm and buildah are declared only by their owners
ok git.novox.be/novox/mesh-catalog/checks/imagebuild 0.009s
imagebuild: rootless-image-build is provided only by buildah
ok git.novox.be/novox/mesh-catalog/checks/imageplace 0.009s
imageplace: every image builds from a Dockerfile in its own module's directory
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/mailstore 0.008s
mail-store: claimed only by mesh-mail
ok git.novox.be/novox/mesh-catalog/checks/sshdir 0.015s
~/.ssh: named only by ssh-client
ok git.novox.be/novox/mesh-catalog/checks/owned 0.007s
owned paths: every directory and archive says how it treats unknown files; no module declares inside another's directory
ok git.novox.be/novox/mesh-catalog/checks/secrets 0.011s
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.218s
predefined.json: 2 key(s), none removed that a module names
ok git.novox.be/novox/mesh-catalog/checks/config 0.014s
config: no moved module says settings, takes-settings or ${setting:<key>}, or takes a whole layer (0 not yet moved)
ok git.novox.be/novox/mesh-catalog/checks/templates 0.011s
templates: no module keeps a file's text inline but the 0 listed
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 58, as kept
ok git.novox.be/novox/mesh-catalog/checks/deps 0.194s
testing modules/nats
ok nats-tools/cmd/mesh-nats-snapshot 1.012s
ok nats-tools/cmd/nats-tools 6.277s
ok nats-tools/internal/busarchive 1.047s
NOT RUN: the bus's five docker tests (modules/nats/cmd/mesh-nats-snapshot) skipped: this check has no docker (MESH_CHECK_DOCKER is not 1)
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `98ca97fc`
Judged: head `98ca97fc5b3f` merged into trunk `dcf6e86d0236`; read beside it: mesh-controller `8f2d22db0caa`, mesh-controller-main `8f2d22db0caa`, mesh-host `4065b45ae84f`, mesh-tools `e0fadc43d9dd`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: nats)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
- tier 0: nats
- novox: waits for a person: nats
- merging this needs a person's bus upgrade: nats is never sent by an ordinary send, and until `mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"}` runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)
- nats provides mesh-bus: its consumers are sent again after it
- nats keeps data (ADR 0233): what it holds is backed up before it moves
- read by no module's build: modules/nats/README.md, modules/nats/cmd/mesh-nats-snapshot/image_test.go, modules/nats/cmd/mesh-nats-snapshot/live_test.go, modules/nats/internal/busarchive/archive.go, modules/nats/internal/busarchive/types.go, modules/nats/internal/busarchive/verifyfile.go, modules/nats/internal/busarchive/verifyfile_test.go
Run by the build seat on ace as `build-1792673730092986669` (`builds --log build-1792673730092986669`).
```
--- the gate: nats
nats: ok, 10 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)
long-running resources without health: 1
files asking for a setting without saying whether it is trusted: 0
1 manifest(s) checked. Judged against the seats this binary carries; a claim on one of the mesh's own seats is judged fully at registration, and a seat declared by a module not given here reads as unknown. Identities judged on a 6-character machine name, against the bounds of the providers given here
judging 1 module(s) changed against 4 machine(s), as the snapshot of 2026-10-22T12:51:59Z says they run
composing every machine as the mesh is
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
composing every machine with the change
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on f35; sealed by the controller until the vault holds it: mesh-provisioner-client — own/f35/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on idt; sealed by the controller until the vault holds it: mesh-provisioner-client — own/idt/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
HELD: the vault did not answer for the core's credentials on ygcyr; sealed by the controller until the vault holds it: mesh-provisioner, mesh-provisioner-client, nats — own/ygcyr/mesh-provisioner/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus; own/ygcyr/nats/broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
the bus's user list leaves out 8 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, ygcyr.mesh-mail.send, ygcyr.only-office.converter, node.yvbpsm, yvbpsm.brother.device. Each is a user that cannot connect until one is issued
HELD: the vault did not answer for the core's credentials on yvbpsm; sealed by the controller until the vault holds it: mesh-provisioner-client — own/yvbpsm/mesh-provisioner-client/provisioner-broker: this control plane has no MESH_BUS_NATS, so it cannot reach the mesh's bus
merge gate: PASS — every machine composes with the change as it did without (4 of 4 compose)
judged by controller development build against the facts of 2026-10-22T12:51:59Z
modules the change moves:
- nats (changed)
machines:
- a machine (f35): composes
- holds mesh-dns-resolver (idt): composes
- holds git, holds mesh-artifact-store, holds mesh-broker, holds mesh-catalog, holds mesh-config, holds mesh-delivery, holds mesh-dns-resolver, holds mesh-provisioner, holds mesh-store, holds mesh-vault, holds npm-package-registry, the control node, the hub (ygcyr): composes
- a machine (yvbpsm): composes
a merge would rebuild 1 module(s) in 1 tier(s): nats
notes:
- modules/nats/README.md, modules/nats/cmd/mesh-nats-snapshot/image_test.go, modules/nats/cmd/mesh-nats-snapshot/live_test.go, modules/nats/internal/busarchive/archive.go, modules/nats/internal/busarchive/types.go, modules/nats/internal/busarchive/verifyfile.go and modules/nats/internal/busarchive/verifyfile_test.go read by no module's build, and rebuild nothing (issue 280)
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.002s
words: 12 retired words and 70 daemons' lines, none in the 60723 strings of 938 files
ok git.novox.be/novox/mesh-catalog/checks/particulars 0.006s
particulars: none of 4 node names in the 2 covered modules
ok git.novox.be/novox/mesh-catalog/checks/toolchains 0.009s
toolchains: go, nodejs, npm and buildah are declared only by their owners
ok git.novox.be/novox/mesh-catalog/checks/imagebuild 0.009s
imagebuild: rootless-image-build is provided only by buildah
ok git.novox.be/novox/mesh-catalog/checks/imageplace 0.009s
imageplace: every image builds from a Dockerfile in its own module's directory
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.011s
agent-home: no archive and no file written into under the agent's home
ok git.novox.be/novox/mesh-catalog/checks/mailstore 0.008s
mail-store: claimed only by mesh-mail
ok git.novox.be/novox/mesh-catalog/checks/sshdir 0.015s
~/.ssh: named only by ssh-client
ok git.novox.be/novox/mesh-catalog/checks/owned 0.007s
owned paths: every directory and archive says how it treats unknown files; no module declares inside another's directory
ok git.novox.be/novox/mesh-catalog/checks/secrets 0.011s
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.218s
predefined.json: 2 key(s), none removed that a module names
ok git.novox.be/novox/mesh-catalog/checks/config 0.014s
config: no moved module says settings, takes-settings or ${setting:<key>}, or takes a whole layer (0 not yet moved)
ok git.novox.be/novox/mesh-catalog/checks/templates 0.011s
templates: no module keeps a file's text inline but the 0 listed
ok git.novox.be/novox/mesh-catalog/checks/paths 0.005s
paths: no module names another's state on its machine (3 known, listed to go)
long-running resources without health: 58, as kept
ok git.novox.be/novox/mesh-catalog/checks/deps 0.194s
testing modules/nats
ok nats-tools/cmd/mesh-nats-snapshot 1.012s
ok nats-tools/cmd/nats-tools 6.277s
ok nats-tools/internal/busarchive 1.047s
NOT RUN: the bus's five docker tests (modules/nats/cmd/mesh-nats-snapshot) skipped: this check has no docker (MESH_CHECK_DOCKER is not 1)
--- its merge-check-typescript.sh (typescript toolchain)
```
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.
Fix of issue 1842: the bus module's README told a person to verify the bus snapshot with
docker exec … mesh-nats-snapshot verify, which no mesh tool does; R4d's bus upgrade (ADR 0480 §6) needed it.nats_snapshot_verifyin the nats module's tools: it verifies the newest*.tarin the module's snapshots directory (or one named by a single path component;.partialfiles skipped, symlinks refused, nothing outside the directory), checks every file of every stream against the manifest's checksum and the archive's size, and reads each archive to its end. It answers the file, its time and size, when it was taken, each stream's name and last sequence, and passed with the first fault.cmd/mesh-nats-snapshot(a main package) intomodules/nats/internal/busarchive, shared by the snapshot program and the tool; the program's tests are unchanged and pass.MESH_NATS_SNAPSHOTS_DIR=${dir:snapshots}in the tools bundle's env; README upgrade step 2 and restore step 2 name the tool (the restored copy outside the directory keeps its verify through the program).Tests: fixture tars made in the test: good, corrupted checksum, truncated, checksums right but the archive unreadable, newest pick, path escape, symlink; each failed first. Try build-1792672203111547903: pass.
First live use: tonight's nightly dump after R4d's bus upgrade, which is also the last proof two of R4d's bus issues wait for (the tracker's 1640 and 1642).
Reviewed-by: reviewer-1842@shanks at
98ca97fc5bDelivery
novox/mesh-catalog@98ca97fc5b3f— delivered since 2026-10-22T13:10:42ZDelivery plan — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"}runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
98ca97fcJudged: head
98ca97fc5b3fmerged into trunkdcf6e86d0236; read beside it: mesh-controller8f2d22db0caa, mesh-controller-main8f2d22db0caa, mesh-host4065b45ae84f, mesh-toolse0fadc43d9ddmesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: nats)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds nats, sent nowhere; merging this needs a person's bus upgrade; 1 wait(s) for a person
mesh_call mesh-controller.bus {"upgrade": "true", "why": "…", "reversible" or "irreversible": "true"}runs, nothing else is sent to novox either — unless the new build turns out the same as the one running there (issue 280)Run by the build seat on ace as
build-1792673730092986669(builds --log build-1792673730092986669).