nfs-server and mounts: share one folder at a time over the private network, mount it on demand (hq ADR 0263) #136

Merged
mesh-admin merged 9 commits from feat/mounts-module into main 2026-10-08 19:12:21 +00:00
Contributor

Why

No mesh tool could read a machine's fstab, its mount and automount units, or its NFS and Samba exports. That gap showed while diagnosing two failing fstab mounts on the workstation (an NFS mount of the home server's media library that times out, and an SMB mount of a games console that is only sometimes on). The only way to read them was the operator account's login shell, which is the work-around ADR 0245 says a missing tool must not become.

This is the read half of hq research 038 (shares and mounts managed by the mesh). The to-be design there makes this module write the mount and automount units for the shares a node requires; that waits for the operator's decision on the design.

What it adds

modules/mounts, a Go tools bundle like disk-load, with two read-only tools:

  • mounts_list: every mount point joined from /etc/fstab, the service manager's mount and automount units (state, result, timeout, generated from fstab or a unit file) and /proc/self/mountinfo. Network filesystems are marked, and a network mount without automount or nofail is said. Narrowed with network and match.
  • mounts_exports: the NFS exports in /etc/exports and /etc/exports.d, the kernel's live export table, the ZFS sharenfs/sharesmb properties, the Samba share sections, and whether nfs-server and smb are active. An export declared and not live, or live and declared nowhere, is said.

Credentials are never answered: password=/pass=/passwd= values are redacted (tested), a credentials= file is named and never opened, and smb.conf's [global] section and every setting outside a short list are left out. A mount point is never opened or statted, so a server that is away cannot hang a call. A file or command that cannot be read is said under notes.

What it does not do

It declares no resource, writes nothing, and this pull request assigns it to no machine.

Not to be merged before the operator has reviewed the hq design (research 038 and its proposed decision).

Checked locally

go vet, go test -race (fixtures with documentation addresses), checks/words and checks/paths pass. Run against one workstation's real files: its two local mounts said, nothing shared.

## Why No mesh tool could read a machine's fstab, its mount and automount units, or its NFS and Samba exports. That gap showed while diagnosing two failing fstab mounts on the workstation (an NFS mount of the home server's media library that times out, and an SMB mount of a games console that is only sometimes on). The only way to read them was the operator account's login shell, which is the work-around ADR 0245 says a missing tool must not become. This is the read half of hq research 038 (shares and mounts managed by the mesh). The to-be design there makes this module write the mount and automount units for the shares a node requires; that waits for the operator's decision on the design. ## What it adds `modules/mounts`, a Go tools bundle like `disk-load`, with two read-only tools: - `mounts_list`: every mount point joined from /etc/fstab, the service manager's mount and automount units (state, result, timeout, generated from fstab or a unit file) and /proc/self/mountinfo. Network filesystems are marked, and a network mount without automount or nofail is said. Narrowed with `network` and `match`. - `mounts_exports`: the NFS exports in /etc/exports and /etc/exports.d, the kernel's live export table, the ZFS sharenfs/sharesmb properties, the Samba share sections, and whether nfs-server and smb are active. An export declared and not live, or live and declared nowhere, is said. Credentials are never answered: password=/pass=/passwd= values are redacted (tested), a credentials= file is named and never opened, and smb.conf's [global] section and every setting outside a short list are left out. A mount point is never opened or statted, so a server that is away cannot hang a call. A file or command that cannot be read is said under `notes`. ## What it does not do It declares no resource, writes nothing, and this pull request assigns it to no machine. **Not to be merged before the operator has reviewed the hq design (research 038 and its proposed decision).** ## Checked locally `go vet`, `go test -race` (fixtures with documentation addresses), checks/words and checks/paths pass. Run against one workstation's real files: its two local mounts said, nothing shared.
Author
Contributor

Delivery novox/mesh-catalog@b8e04acfaf22 — delivered since 2026-10-09T07:31:48Z

Delivery plan — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

Machines

  • build-agent on ace: passed — carried by plan-1791486461720933148
  • route-proxy on ace: passed — carried by plan-1791486461720933148
  • dunst on g14: judging — carried by release-1791489531381320915
  • dunst on shanks: judging — carried by release-1791489531381320915

Transitions

  • 2026-10-08 19:06 (new) → proposed (announced): novox/mesh-catalog#136's head announced
  • 2026-10-08 19:08 proposed → checked (checked): the verdict names this commit
  • 2026-10-08 19:08 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-08 19:22 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it
  • 2026-10-09 07:31 held → delivered (done): merged, and nothing for a walk to move: builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

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

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-catalog@b8e04acfaf22` — **delivered** since 2026-10-09T07:31:48Z **Delivery plan** — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step **Machines** - build-agent on ace: passed — carried by plan-1791486461720933148 - route-proxy on ace: passed — carried by plan-1791486461720933148 - dunst on g14: judging — carried by release-1791489531381320915 - dunst on shanks: judging — carried by release-1791489531381320915 **Transitions** - 2026-10-08 19:06 (new) → proposed (announced): novox/mesh-catalog#136's head announced - 2026-10-08 19:08 proposed → checked (checked): the verdict names this commit - 2026-10-08 19:08 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-08 19:22 ready → held (hold): something holds it for a person: its group's composed check did not pass for the heads that merged, or it merged and no walk was opened for it - 2026-10-09 07:31 held → delivered (done): merged, and nothing for a walk to move: builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Author
Contributor

Merge check at 27d9090d

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts)
  • mesh/repo-check: PASS — its merge-check.sh passed

Delivery plan — builds new: modules/mounts, sent nowhere; no bus step

Run by the build seat on g14 as build-1791472891188548201 (builds --log build-1791472891188548201).

--- the gate: new:modules/mounts
mounts: ok, 2 tool(s)
long-running resources without health: 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-08T15:20:36Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
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-08T15:20:36Z

modules the change moves:
  - mounts (added)

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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s)
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.002s
words: 12 retired words, none in the 30968 strings of 567 files
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: 70, as kept
testing modules/mounts
ok  	mounts/cmd/mounts	1.015s
**Merge check** at `27d9090d` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts) - `mesh/repo-check`: **PASS** — its merge-check.sh passed **Delivery plan** — builds new: modules/mounts, sent nowhere; no bus step Run by the build seat on g14 as `build-1791472891188548201` (`builds --log build-1791472891188548201`). ``` --- the gate: new:modules/mounts mounts: ok, 2 tool(s) long-running resources without health: 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-08T15:20:36Z says they run composing every machine as the mesh is the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued composing every machine with the change the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued 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-08T15:20:36Z modules the change moves: - mounts (added) 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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s) --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.002s words: 12 retired words, none in the 30968 strings of 567 files 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: 70, as kept testing modules/mounts ok mounts/cmd/mounts 1.015s ```
jschoubben added 3 commits 2026-10-08 16:36:15 +00:00
A machine mounts what its assignment names: a node's share from the
provision nfs-share, whose path it reads from nfs-server's state on the
bus, and occasional sources (an SMB device, a disk) whose absence is a
state, not a fault. apply writes and arms the unit pairs as root; watch
tries each source and judges the health; the operator's fstab lines are
taken over only through adopt, on their word, once the replacement is
armed. SMB logins are an outside party's secret, given with secret accept.
Add the nfs-server module: a node shares a folder with the mesh's machines only, every client mapped to the folder's owner (hq ADR 0263)
mesh/merge-gate fail: builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step; a manifest the change touches fails the module check: modu…
mesh/repo-check fail: its merge-check.sh failed: long-running resources without health: 70
mesh/delivery-group group feat/mounts-module rejected: a member's own check failed
mesh/delivery superseded: a newer head of the same pull request
48fba44471
jschoubben force-pushed feat/mounts-module from 27d9090dd7 to 48fba44471 2026-10-08 16:36:15 +00:00 Compare
Author
Contributor

Merge check at 48fba444

  • mesh/merge-gate: FAIL — a manifest the change touches fails the module check: modules/mounts/module.json: this manifest cannot be used: (modules: new:modules/mounts, new:modules/nfs-server)
  • mesh/repo-check: FAIL — its merge-check.sh failed: long-running resources without health: 70

Delivery plan — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

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

--- the gate: new:modules/mounts, new:modules/nfs-server
modules/mounts/module.json: this manifest cannot be used:
  - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
modules/nfs-server/module.json: this manifest cannot be used:
  - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
long-running resources without health: 0
mesh-controller: 2 problem(s) in 2 manifest(s)
--- the same manifests on main
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.002s
words: 12 retired words, none in the 32197 strings of 583 files
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.007s
paths: no module names another's state on its machine (3 known, listed to go)
mesh-controller: 2 problem(s) in 119 manifest(s)
modules/mounts/module.json: this manifest cannot be used:
  - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
modules/nfs-server/module.json: this manifest cannot be used:
  - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
adwaita: ok, 4 tool(s)
artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect
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
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); 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)
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, 40 tool(s), keeps state servers, holdings, config, reads claude-licence-manager.bindings, keeps agent-home (valuable)
claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings
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)
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; 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)
docker: ok, 21 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, 5 tool(s)
fail2ban: ok, 1 tool(s); 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)
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
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
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: 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)
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: 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: 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: 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-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, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, keeps state deliveries, groups
mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable)
mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats
messenger: ok, 4 tool(s), invokes seat:node-notifier.send, seat:mesh-controller.conditions, keeps state open, sent
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
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, 8 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, 3 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)
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
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)
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: 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, keeps repository (rebuildable), state (cache)
rofi: ok, 3 tool(s)
route-adapter: ok
route-proxy: ok, keeps acme (rebuildable), ca (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)
screen-lock: ok, 3 tool(s)
searxng: ok, keeps valkey (cache); 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, 3 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: 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
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: 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)
xorg: ok, 8 tool(s)
xterm: ok, 2 tool(s)
zsh: ok, 1 tool(s)
zsh-autosuggestions: ok
zsh-syntax-highlighting: ok
long-running resources without health: 70
**Merge check** at `48fba444` - `mesh/merge-gate`: **FAIL** — a manifest the change touches fails the module check: modules/mounts/module.json: this manifest cannot be used: (modules: new:modules/mounts, new:modules/nfs-server) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: long-running resources without health: 70 **Delivery plan** — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step Run by the build seat on novox as `build-1791477377537422630` (`builds --log build-1791477377537422630`). ``` --- the gate: new:modules/mounts, new:modules/nfs-server modules/mounts/module.json: this manifest cannot be used: - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network modules/nfs-server/module.json: this manifest cannot be used: - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network long-running resources without health: 0 mesh-controller: 2 problem(s) in 2 manifest(s) --- the same manifests on main --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.002s words: 12 retired words, none in the 32197 strings of 583 files ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s paths: no module names another's state on its machine (3 known, listed to go) mesh-controller: 2 problem(s) in 119 manifest(s) modules/mounts/module.json: this manifest cannot be used: - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network modules/nfs-server/module.json: this manifest cannot be used: - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network adwaita: ok, 4 tool(s) artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect 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 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); 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) 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, 40 tool(s), keeps state servers, holdings, config, reads claude-licence-manager.bindings, keeps agent-home (valuable) claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings 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) 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; 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) docker: ok, 21 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, 5 tool(s) fail2ban: ok, 1 tool(s); 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) 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 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 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: 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) 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: 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: 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: 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-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, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, keeps state deliveries, groups mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable) mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats messenger: ok, 4 tool(s), invokes seat:node-notifier.send, seat:mesh-controller.conditions, keeps state open, sent 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 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, 8 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, 3 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) 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 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) 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: 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, keeps repository (rebuildable), state (cache) rofi: ok, 3 tool(s) route-adapter: ok route-proxy: ok, keeps acme (rebuildable), ca (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) screen-lock: ok, 3 tool(s) searxng: ok, keeps valkey (cache); 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, 3 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: 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 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: 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) xorg: ok, 8 tool(s) xterm: ok, 2 tool(s) zsh: ok, 1 tool(s) zsh-autosuggestions: ok zsh-syntax-highlighting: ok long-running resources without health: 70 ```
mesh-admin changed title from A read-only mounts module: a machine's fstab, mount units and exports (hq research 038) to nfs-server and mounts: share one folder at a time over the private network, mount it on demand (hq ADR 0263) 2026-10-08 16:42:58 +00:00
jschoubben added 5 commits 2026-10-08 18:21:31 +00:00
The review of #136 found a share could squash every client to root, be
judged at a symlink's name rather than its folder, sit inside or above a
backup repository deeper than one level, export an unmounted dataset's
empty folder, go to every address in the private network's range, and
stay exported after the module left. Each is now refused or closed, with
a test that reproduced it first:

- a folder owned by uid or gid 0 is refused;
- the path is resolved through symlinks and every check runs on the real
  folder, which the export line names;
- a share inside a backup repository (any parent) or holding one within
  four levels is refused, and a look cut short by its bound refuses;
- every line carries mp, or mp=<its filesystem's mount point>;
- a share goes only to the nodes this machine's grants setting names and
  whose mounts module wants it on the bus, at the lower access, at the
  roster's address inside the range; nothing without wants;
- the process is declared before its config, so on unassignment it finds
  the config gone, removes its export file and lets the shares go;
- confirm accepts the seat's string "true".
Say that the modules' own checks are the only line before root, since sudo grants the account everything
mesh/merge-gate pass: builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step; every machine composes with the change as it did without (…
mesh/repo-check fail: its merge-check.sh failed: --- FAIL: TestAnExportLineSquashesEveryClientToTheFoldersOwnerToTheMeshRangeOnly (0.00s)
mesh/delivery superseded: a newer head of the same pull request
mesh/delivery-group group feat/mounts-module delivering: 0 of 3 delivered
29ac6ee16a
Author
Contributor

Merge check at 29ac6ee1

  • mesh/merge-gate: FAIL — a manifest the change touches fails the module check: modules/mounts/module.json: this manifest cannot be used: (modules: new:modules/mounts, new:modules/nfs-server)
  • mesh/repo-check: FAIL — its merge-check.sh failed: long-running resources without health: 70

Delivery plan — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

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

--- the gate: new:modules/mounts, new:modules/nfs-server
modules/mounts/module.json: this manifest cannot be used:
  - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
modules/nfs-server/module.json: this manifest cannot be used:
  - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
long-running resources without health: 0
mesh-controller: 2 problem(s) in 2 manifest(s)
--- the same manifests on main
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.002s
words: 12 retired words, none in the 32432 strings of 584 files
ok  	git.novox.be/novox/mesh-catalog/checks/paths	0.007s
paths: no module names another's state on its machine (3 known, listed to go)
mesh-controller: 2 problem(s) in 119 manifest(s)
modules/mounts/module.json: this manifest cannot be used:
  - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
modules/nfs-server/module.json: this manifest cannot be used:
  - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network
adwaita: ok, 4 tool(s)
artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect
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
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); 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)
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, 40 tool(s), keeps state servers, holdings, config, reads claude-licence-manager.bindings, keeps agent-home (valuable)
claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings
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)
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; 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)
docker: ok, 21 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, 5 tool(s)
fail2ban: ok, 1 tool(s); 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)
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
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
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: 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)
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: 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: 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: 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-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, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, keeps state deliveries, groups
mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable)
mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats
messenger: ok, 4 tool(s), invokes seat:node-notifier.send, seat:mesh-controller.conditions, keeps state open, sent
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
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, 8 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, 3 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)
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
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)
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: 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, keeps repository (rebuildable), state (cache)
rofi: ok, 3 tool(s)
route-adapter: ok
route-proxy: ok, keeps acme (rebuildable), ca (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)
screen-lock: ok, 3 tool(s)
searxng: ok, keeps valkey (cache); 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, 3 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: 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
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: 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)
xorg: ok, 8 tool(s)
xterm: ok, 2 tool(s)
zsh: ok, 1 tool(s)
zsh-autosuggestions: ok
zsh-syntax-highlighting: ok
long-running resources without health: 70
**Merge check** at `29ac6ee1` - `mesh/merge-gate`: **FAIL** — a manifest the change touches fails the module check: modules/mounts/module.json: this manifest cannot be used: (modules: new:modules/mounts, new:modules/nfs-server) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: long-running resources without health: 70 **Delivery plan** — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step Run by the build seat on novox as `build-1791483713517410686` (`builds --log build-1791483713517410686`). ``` --- the gate: new:modules/mounts, new:modules/nfs-server modules/mounts/module.json: this manifest cannot be used: - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network modules/nfs-server/module.json: this manifest cannot be used: - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network long-running resources without health: 0 mesh-controller: 2 problem(s) in 2 manifest(s) --- the same manifests on main --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.002s words: 12 retired words, none in the 32432 strings of 584 files ok git.novox.be/novox/mesh-catalog/checks/paths 0.007s paths: no module names another's state on its machine (3 known, listed to go) mesh-controller: 2 problem(s) in 119 manifest(s) modules/mounts/module.json: this manifest cannot be used: - mounts claims "node-mounts", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network modules/nfs-server/module.json: this manifest cannot be used: - nfs-server claims "node-nfs-server", which is a seat in the mesh's own namespace (mesh-*/node-*) that it does not define (novox/hq ADR 0121) — the seats are: git, mesh-artifact-store, mesh-broker, mesh-build-machine, mesh-catalog, mesh-controller, mesh-delivery, mesh-dns-resolver, mesh-store, mesh-vault, node-backup, node-bar, node-build-agent, node-clipboard, node-compositor, node-container-runtime, node-display-server, node-display-session, node-environment, node-hostname, node-hotkeys, node-intrusion-prevention, node-launcher, node-lock-screen, node-login-manager, node-login-shell, node-message-bus, node-notifier, node-package-manager, node-packet-filter, node-power, node-resolver, node-secret-service, node-service-manager, node-terminal-emulator, node-uplink, npm-package-registry, the-private-network adwaita: ok, 4 tool(s) artifact-store-tools: ok, 4 tool(s), invokes seat:mesh-controller.artifacts, seat:mesh-controller.collect 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 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); 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) 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, 40 tool(s), keeps state servers, holdings, config, reads claude-licence-manager.bindings, keeps agent-home (valuable) claude-licence-manager: ok, keeps state bindings, reads claude-code.holdings 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) 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; 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) docker: ok, 21 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, 5 tool(s) fail2ban: ok, 1 tool(s); 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) 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 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 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: 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) 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: 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: 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: 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-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, gitea.gitea_note_append, gitea.gitea_delivery_view, gitea.gitea_commit_status, gitea.gitea_commit_statuses, keeps state deliveries, groups mesh-vault: ok, keeps state (valuable), ledger (valuable), root (valuable) mesh-watcher: ok, 4 tool(s), invokes mesh-watcher.watcher_ping, seat:mesh-controller.seats messenger: ok, 4 tool(s), invokes seat:node-notifier.send, seat:mesh-controller.conditions, keeps state open, sent 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 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, 8 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, 3 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) 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 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) 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: 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, keeps repository (rebuildable), state (cache) rofi: ok, 3 tool(s) route-adapter: ok route-proxy: ok, keeps acme (rebuildable), ca (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) screen-lock: ok, 3 tool(s) searxng: ok, keeps valkey (cache); 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, 3 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: 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 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: 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) xorg: ok, 8 tool(s) xterm: ok, 2 tool(s) zsh: ok, 1 tool(s) zsh-autosuggestions: ok zsh-syntax-highlighting: ok long-running resources without health: 70 ```
Author
Contributor

Merge check at 29ac6ee1

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts, new:modules/nfs-server)
  • mesh/repo-check: FAIL — its merge-check.sh failed: --- FAIL: TestAnExportLineSquashesEveryClientToTheFoldersOwnerToTheMeshRangeOnly (0.00s)

Delivery plan — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

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

--- the gate: new:modules/mounts, new:modules/nfs-server
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
nfs-server: ok, 1 tool(s), keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s
long-running resources without health: 0
2 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 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T18:54:27Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
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-08T18:54:27Z

modules the change moves:
  - mounts (added)
  - nfs-server (added)

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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s)

notes:
  - mounts could not be tried on a machine: these assignments cannot be applied: - nothing in this mesh provides "nfs-share", wanted by mounts — assign nfs-server to a node
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.002s
words: 12 retired words, none in the 32432 strings of 584 files
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)
long-running resources without health: 70, as kept
testing modules/mounts
ok  	mounts/cmd/mounts	1.122s
testing modules/nfs-server
--- FAIL: TestAnExportLineSquashesEveryClientToTheFoldersOwnerToTheMeshRangeOnly (0.00s)
    nfs_test.go:122: status: {At:2026-10-08 19:21:00 +0000 UTC Range:10.0.0.0/24 Shares:[] Refused:[{Name:downloads Path:/srv/downloads Why:The share downloads's folder /srv/downloads is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:library Path:/srv/library Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.}] Problems:[] Said:[] Reloaded:2026-10-08 19:21:00 +0000 UTC ReloadWhy:the export file changed ReloadError:}
--- FAIL: TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothingIsCreated (0.00s)
    nfs_test.go:177: pool refused with "The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own.", want "holds a backup repository"
    nfs_test.go:177: backups refused with "The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own.", want "is a backup repository"
    nfs_test.go:181: only the folder beside the backups is exported: []
    nfs_test.go:191: a refused share makes the module unhealthy, said: {Healthy:false Why:The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share file's path /srv/a-file is not a folder. The share media's folder /srv/pool/media is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share missing's folder /srv/nowhere is not there (lstat /tmp/TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothin1999078607/001/srv/nowhere: no such file or directory); the module never creates it. The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share rel names "srv/x", which is not an absolute path. The share root is the machine's root, which is never exported. Found:[The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share file's path /srv/a-file is not a folder. The share media's folder /srv/pool/media is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share missing's folder /srv/nowhere is not there (lstat /tmp/TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothin1999078607/001/srv/nowhere: no such file or directory); the module never creates it. The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share rel names "srv/x", which is not an absolute path. The share root is the machine's root, which is never exported.]}
--- FAIL: TestAdoptIsADryRunWithoutConfirmAndRefusesWhileTheMeshExportIsNotLive (0.00s)
    nfs_test.go:268: adopt while not live: the mesh does not export /srv/library: add it to this machine's nfs-server `shares` setting first, so the folder is never unexported
--- FAIL: TestHealthSaysAStoppedServerAStaleProcessAndAShareNotInTheTable (0.00s)
    nfs_test.go:327: healthy: {Healthy:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own. Found:[The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.]}
    nfs_test.go:335: health lacks "The share library (/srv/library) is not in the kernel's export table.": {Healthy:false Why:The NFS server (nfs-server.service) is failed. The module's process last looked 10m0s ago, at 19:21. The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own. Found:[The NFS server (nfs-server.service) is failed. The module's process last looked 10m0s ago, at 19:21. The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.]}
--- FAIL: TestExportsAnswersTheSharesAndWhatIsNotTheMeshs (0.00s)
    nfs_test.go:368: {"shares":[],"refused":[{"name":"library","path":"/srv/library","why":"The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own."}],"foreign":[{"path":"/srv/library","client":"192.0.2.0/24","options":"sec=sys,rw,no_subtree_check","from":"/etc/exports.d/zfs.exports"},{"path":"/srv/library","client":"rw=@192.0.2.0/24","from":"zfs sharenfs on pool/library"}],"service":"active","range":"10.0.0.0/24","looked":"2026-10-08T19:21:00Z","said":["refused: The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.","not the mesh's: /srv/library to 192.0.2.0/24 (/etc/exports.d/zfs.exports)","not the mesh's: /srv/library to rw=@192.0.2.0/24 (zfs sharenfs on pool/library)","the NFS server is active"]}
    nfs_test.go:375: the answer lacks "uid", which the mounts module reads
    nfs_test.go:375: the answer lacks "gid", which the mounts module reads
    nfs_test.go:375: the answer lacks "live", which the mounts module reads
    nfs_test.go:375: the answer lacks "clients", which the mounts module reads
    nfs_test.go:375: the answer lacks "access", which the mounts module reads
--- FAIL: TestTestSaysWhetherAShareIsServedAndWhetherAnAddressIsInRange (0.00s)
    nfs_test.go:389: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.}
    nfs_test.go:393: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.}
    nfs_test.go:397: an address in the range the share is not exported to: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.}
--- FAIL: TestASymlinkIsJudgedAndExportedAtItsRealPath (0.00s)
    review_test.go:98: the export does not name the real folder:
        # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process
        # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings,
        # never this file. One share per folder, to each granted and wanting node's private address only,
        # every client squashed to the folder's owner.
--- FAIL: TestABackupRepositoryAboveOrDeepBelowIsRefusedAndAnUnfinishedLookRefuses (0.03s)
    review_test.go:121: a folder inside a backup repository: "The share inside's folder /srv/repo/data/ab is owned by root (0:0), and every client would act as root there: give it an owner of its own."
    review_test.go:124: a repository three levels down: "The share deep's folder /srv/media is owned by root (0:0), and every client would act as root there: give it an owner of its own."
    review_test.go:130: a look cut short by its bound did not refuse: "The share wide's folder /srv/wide is owned by root (0:0), and every client would act as root there: give it an owner of its own."
    review_test.go:135: a clean folder is refused: [{Name:clean Path:/srv/clean Why:The share clean's folder /srv/clean is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:deep Path:/srv/media Why:The share deep's folder /srv/media is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:inside Path:/srv/repo/data/ab Why:The share inside's folder /srv/repo/data/ab is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:wide Path:/srv/wide Why:The share wide's folder /srv/wide is owned by root (0:0), and every client would act as root there: give it an owner of its own.}]
--- FAIL: TestAShareGoesOnlyToTheNodesGrantedAndWantingItAtTheLowerAccess (0.00s)
    review_test.go:170: the library goes ro to the workstation (it wants ro) and ro to the laptop (granted ro): ""
    review_test.go:176: downloads goes rw to the workstation only: ""
    review_test.go:184: the status does not say "control wants library":
    review_test.go:184: the status does not say "stranger":
    review_test.go:184: the status does not say "unwanted is granted to ws, which does not want it":
    review_test.go:193: the status lacks each share's clients
--- FAIL: TestTheExportCarriesMpForItsFilesystem (0.00s)
    review_test.go:223: a dataset share lacks mp:
        # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process
        # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings,
        # never this file. One share per folder, to each granted and wanting node's private address only,
        # every client squashed to the folder's owner.
    review_test.go:226: a folder in a dataset lacks mp=<its dataset>:
        # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process
        # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings,
        # never this file. One share per folder, to each granted and wanting node's private address only,
        # every client squashed to the folder's owner.
--- FAIL: TestTheExportFileGoesOnUnassignmentAndStaysOnARestart (0.00s)
    review_test.go:247: a restart (config still there) removed the exports
--- FAIL: TestTheLookBelowIsKeptForAWhileAndThenTakenAgain (0.00s)
    review_test.go:330: a clean folder is refused: [{Name:clean Path:/srv/clean Why:The share clean's folder /srv/clean is owned by root (0:0), and every client would act as root there: give it an owner of its own.}]
FAIL
FAIL	nfsserver/cmd/nfs-server	0.089s
FAIL
**Merge check** at `29ac6ee1` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts, new:modules/nfs-server) - `mesh/repo-check`: **FAIL** — its merge-check.sh failed: --- FAIL: TestAnExportLineSquashesEveryClientToTheFoldersOwnerToTheMeshRangeOnly (0.00s) **Delivery plan** — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step Run by the build seat on novox as `build-1791485944300905939` (`builds --log build-1791485944300905939`). ``` --- the gate: new:modules/mounts, new:modules/nfs-server 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 nfs-server: ok, 1 tool(s), keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s long-running resources without health: 0 2 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 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T18:54:27Z says they run composing every machine as the mesh is the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued composing every machine with the change the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued 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-08T18:54:27Z modules the change moves: - mounts (added) - nfs-server (added) 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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s) notes: - mounts could not be tried on a machine: these assignments cannot be applied: - nothing in this mesh provides "nfs-share", wanted by mounts — assign nfs-server to a node --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.002s words: 12 retired words, none in the 32432 strings of 584 files 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) long-running resources without health: 70, as kept testing modules/mounts ok mounts/cmd/mounts 1.122s testing modules/nfs-server --- FAIL: TestAnExportLineSquashesEveryClientToTheFoldersOwnerToTheMeshRangeOnly (0.00s) nfs_test.go:122: status: {At:2026-10-08 19:21:00 +0000 UTC Range:10.0.0.0/24 Shares:[] Refused:[{Name:downloads Path:/srv/downloads Why:The share downloads's folder /srv/downloads is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:library Path:/srv/library Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.}] Problems:[] Said:[] Reloaded:2026-10-08 19:21:00 +0000 UTC ReloadWhy:the export file changed ReloadError:} --- FAIL: TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothingIsCreated (0.00s) nfs_test.go:177: pool refused with "The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own.", want "holds a backup repository" nfs_test.go:177: backups refused with "The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own.", want "is a backup repository" nfs_test.go:181: only the folder beside the backups is exported: [] nfs_test.go:191: a refused share makes the module unhealthy, said: {Healthy:false Why:The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share file's path /srv/a-file is not a folder. The share media's folder /srv/pool/media is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share missing's folder /srv/nowhere is not there (lstat /tmp/TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothin1999078607/001/srv/nowhere: no such file or directory); the module never creates it. The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share rel names "srv/x", which is not an absolute path. The share root is the machine's root, which is never exported. Found:[The share backups's folder /srv/backups is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share file's path /srv/a-file is not a folder. The share media's folder /srv/pool/media is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share missing's folder /srv/nowhere is not there (lstat /tmp/TestTheRootABackupRepositoryAndAMissingFolderAreRefusedAndNothin1999078607/001/srv/nowhere: no such file or directory); the module never creates it. The share pool's folder /srv/pool is owned by root (0:0), and every client would act as root there: give it an owner of its own. The share rel names "srv/x", which is not an absolute path. The share root is the machine's root, which is never exported.]} --- FAIL: TestAdoptIsADryRunWithoutConfirmAndRefusesWhileTheMeshExportIsNotLive (0.00s) nfs_test.go:268: adopt while not live: the mesh does not export /srv/library: add it to this machine's nfs-server `shares` setting first, so the folder is never unexported --- FAIL: TestHealthSaysAStoppedServerAStaleProcessAndAShareNotInTheTable (0.00s) nfs_test.go:327: healthy: {Healthy:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own. Found:[The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.]} nfs_test.go:335: health lacks "The share library (/srv/library) is not in the kernel's export table.": {Healthy:false Why:The NFS server (nfs-server.service) is failed. The module's process last looked 10m0s ago, at 19:21. The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own. Found:[The NFS server (nfs-server.service) is failed. The module's process last looked 10m0s ago, at 19:21. The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.]} --- FAIL: TestExportsAnswersTheSharesAndWhatIsNotTheMeshs (0.00s) nfs_test.go:368: {"shares":[],"refused":[{"name":"library","path":"/srv/library","why":"The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own."}],"foreign":[{"path":"/srv/library","client":"192.0.2.0/24","options":"sec=sys,rw,no_subtree_check","from":"/etc/exports.d/zfs.exports"},{"path":"/srv/library","client":"rw=@192.0.2.0/24","from":"zfs sharenfs on pool/library"}],"service":"active","range":"10.0.0.0/24","looked":"2026-10-08T19:21:00Z","said":["refused: The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.","not the mesh's: /srv/library to 192.0.2.0/24 (/etc/exports.d/zfs.exports)","not the mesh's: /srv/library to rw=@192.0.2.0/24 (zfs sharenfs on pool/library)","the NFS server is active"]} nfs_test.go:375: the answer lacks "uid", which the mounts module reads nfs_test.go:375: the answer lacks "gid", which the mounts module reads nfs_test.go:375: the answer lacks "live", which the mounts module reads nfs_test.go:375: the answer lacks "clients", which the mounts module reads nfs_test.go:375: the answer lacks "access", which the mounts module reads --- FAIL: TestTestSaysWhetherAShareIsServedAndWhetherAnAddressIsInRange (0.00s) nfs_test.go:389: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.} nfs_test.go:393: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.} nfs_test.go:397: an address in the range the share is not exported to: {Share:library Path:/srv/library Access: Live:false Service:active InRange:<nil> OK:false Why:The share library's folder /srv/library is owned by root (0:0), and every client would act as root there: give it an owner of its own.} --- FAIL: TestASymlinkIsJudgedAndExportedAtItsRealPath (0.00s) review_test.go:98: the export does not name the real folder: # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings, # never this file. One share per folder, to each granted and wanting node's private address only, # every client squashed to the folder's owner. --- FAIL: TestABackupRepositoryAboveOrDeepBelowIsRefusedAndAnUnfinishedLookRefuses (0.03s) review_test.go:121: a folder inside a backup repository: "The share inside's folder /srv/repo/data/ab is owned by root (0:0), and every client would act as root there: give it an owner of its own." review_test.go:124: a repository three levels down: "The share deep's folder /srv/media is owned by root (0:0), and every client would act as root there: give it an owner of its own." review_test.go:130: a look cut short by its bound did not refuse: "The share wide's folder /srv/wide is owned by root (0:0), and every client would act as root there: give it an owner of its own." review_test.go:135: a clean folder is refused: [{Name:clean Path:/srv/clean Why:The share clean's folder /srv/clean is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:deep Path:/srv/media Why:The share deep's folder /srv/media is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:inside Path:/srv/repo/data/ab Why:The share inside's folder /srv/repo/data/ab is owned by root (0:0), and every client would act as root there: give it an owner of its own.} {Name:wide Path:/srv/wide Why:The share wide's folder /srv/wide is owned by root (0:0), and every client would act as root there: give it an owner of its own.}] --- FAIL: TestAShareGoesOnlyToTheNodesGrantedAndWantingItAtTheLowerAccess (0.00s) review_test.go:170: the library goes ro to the workstation (it wants ro) and ro to the laptop (granted ro): "" review_test.go:176: downloads goes rw to the workstation only: "" review_test.go:184: the status does not say "control wants library": review_test.go:184: the status does not say "stranger": review_test.go:184: the status does not say "unwanted is granted to ws, which does not want it": review_test.go:193: the status lacks each share's clients --- FAIL: TestTheExportCarriesMpForItsFilesystem (0.00s) review_test.go:223: a dataset share lacks mp: # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings, # never this file. One share per folder, to each granted and wanting node's private address only, # every client squashed to the folder's owner. review_test.go:226: a folder in a dataset lacks mp=<its dataset>: # Written by the mesh's module nfs-server (novox/hq ADR 0263). Rendered by the module's own process # from its assignment's `shares` and `grants` and the nodes that want each share; edit the settings, # never this file. One share per folder, to each granted and wanting node's private address only, # every client squashed to the folder's owner. --- FAIL: TestTheExportFileGoesOnUnassignmentAndStaysOnARestart (0.00s) review_test.go:247: a restart (config still there) removed the exports --- FAIL: TestTheLookBelowIsKeptForAWhileAndThenTakenAgain (0.00s) review_test.go:330: a clean folder is refused: [{Name:clean Path:/srv/clean Why:The share clean's folder /srv/clean is owned by root (0:0), and every client would act as root there: give it an owner of its own.}] FAIL FAIL nfsserver/cmd/nfs-server 0.089s FAIL ```
jschoubben added 1 commit 2026-10-08 19:05:54 +00:00
Let nfs-server's tests see their folders as the library owner's, so the root refusal is tested and not tripped when the build seat runs them as root
mesh/merge-gate pass: builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step; every machine composes with the change as it did without (…
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
b8e04acfaf
Author
Contributor

Merge check at b8e04acf

  • mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts, new:modules/nfs-server)
  • mesh/repo-check: PASS — its merge-check.sh passed

Delivery plan — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step

Run by the build seat on shanks as build-1791486373061399282 (builds --log build-1791486373061399282).

--- the gate: new:modules/mounts, new:modules/nfs-server
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
nfs-server: ok, 1 tool(s), keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s
long-running resources without health: 0
2 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 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T19:03:27Z says they run
composing every machine as the mesh is
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
composing every machine with the change
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued
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-08T19:03:27Z

modules the change moves:
  - mounts (added)
  - nfs-server (added)

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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s)

notes:
  - mounts could not be tried on a machine: these assignments cannot be applied: - nothing in this mesh provides "nfs-share", wanted by mounts — assign nfs-server to a node
--- its merge-check.sh (go toolchain)
ok  	git.novox.be/novox/mesh-catalog/checks/words	0.002s
words: 12 retired words, none in the 32432 strings of 584 files
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)
long-running resources without health: 70, as kept
testing modules/mounts
ok  	mounts/cmd/mounts	1.078s
testing modules/nfs-server
ok  	nfsserver/cmd/nfs-server	1.069s
**Merge check** at `b8e04acf` - `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: new:modules/mounts, new:modules/nfs-server) - `mesh/repo-check`: **PASS** — its merge-check.sh passed **Delivery plan** — builds new: modules/mounts, modules/nfs-server, sent nowhere; no bus step Run by the build seat on shanks as `build-1791486373061399282` (`builds --log build-1791486373061399282`). ``` --- the gate: new:modules/mounts, new:modules/nfs-server 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 nfs-server: ok, 1 tool(s), keeps state exports, reads mounts.shares, ready: server by unit every 30s; exports by its tool nfs_health every 1m0s long-running resources without health: 0 2 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 2 module(s) changed against 4 machine(s), as the snapshot of 2026-10-08T19:03:27Z says they run composing every machine as the mesh is the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued composing every machine with the change the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued the bus's user list leaves out 5 user(s) the mesh has minted no credential for: controller, node.f35, node.idt, node.ygcyr, node.yvbpsm. Each is a user that cannot connect until one is issued 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-08T19:03:27Z modules the change moves: - mounts (added) - nfs-server (added) 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-delivery, holds mesh-dns-resolver, 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 0 module(s) in 0 tier(s) notes: - mounts could not be tried on a machine: these assignments cannot be applied: - nothing in this mesh provides "nfs-share", wanted by mounts — assign nfs-server to a node --- its merge-check.sh (go toolchain) ok git.novox.be/novox/mesh-catalog/checks/words 0.002s words: 12 retired words, none in the 32432 strings of 584 files 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) long-running resources without health: 70, as kept testing modules/mounts ok mounts/cmd/mounts 1.078s testing modules/nfs-server ok nfsserver/cmd/nfs-server 1.069s ```
mesh-admin merged commit 7b307a06b7 into main 2026-10-08 19:12:21 +00:00
mesh-admin deleted branch feat/mounts-module 2026-10-08 19:12:22 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-catalog#136