The operator found two failed fstab mounts on the workstation on 2026-10-08 and asked the mesh to handle shares and mounts. This opens research 038 and proposes a decision and a design. Nothing here is decided yet: ADR 0263 is proposed, to-be 52 is proposed, research 038 stays active until the operator answers the open questions.
What was measured (research 038, evidence)
The library mount times out because the home server's packet filter drops NFS. The export exists and nfs-server runs, but no module listens on 2049/111/445 (ADR 0045), so the mesh's table drops them. The server's NFS counters read zero I/O since its boot on 2026-10-04. This is the closure issue 169 predicted.
The gaming device's SMB mount fails because the device is off. No nofail, no automount, and the share's password sits in a world-readable fstab.
The export comes from a ZFS sharenfs property, not /etc/exports; the library is a child dataset, so exporting the pool's root needs crossmnt.
With sec=sys, the operator's id 1000 on a client is a different account on the home server, which owns the backup repository. A plain export of the pool's root would expose it.
Eight containers bind the pool's paths locally; an export changes none of their paths or owners.
No module exports or mounts; no tool read fstab, mount units or exports. A read-only mounts module is proposed in mesh-catalog on the same branch name.
Proposed (ADR 0263, to-be 52)
nfs-server holds node seat nfs-share, provides the provision, writes its own /etc/exports.d file, NFS v4 only, port 2049 from the private network only, all_squash to the share's owner.
One share per folder (library, downloads); the backup repository and archive are not exported. The pool's root with crossmnt is the named alternative.
mounts holds node seat node-mounts and writes a .mount + .automount per share: nothing mounts or fails at boot; idle and mount timeouts.
Only nodes that ask get a share (workstation, laptop; not the control-node); "every node" is a mesh-wide setting.
Occasional sources (the gaming device, a USB disk): absence is a state, not a fault; credential via secret accept (ADR 0092).
share-unreachable condition for shares that should be there; nothing for an absent occasional source.
adopt acts take over the hand-written fstab lines and the ZFS property, only on a person's word.
Do not merge before the operator has answered the open questions in 02-options.md.
The operator found two failed fstab mounts on the workstation on 2026-10-08 and asked the mesh to handle shares and mounts. This opens research 038 and proposes a decision and a design. **Nothing here is decided yet: ADR 0263 is `proposed`, to-be 52 is `proposed`, research 038 stays `active` until the operator answers the open questions.**
## What was measured (research 038, evidence)
- **The library mount times out because the home server's packet filter drops NFS.** The export exists and nfs-server runs, but no module listens on 2049/111/445 (ADR 0045), so the mesh's table drops them. The server's NFS counters read zero I/O since its boot on 2026-10-04. This is the closure issue 169 predicted.
- **The gaming device's SMB mount fails because the device is off.** No `nofail`, no automount, and the share's password sits in a world-readable fstab.
- The export comes from a ZFS `sharenfs` property, not `/etc/exports`; the library is a child dataset, so exporting the pool's root needs `crossmnt`.
- With `sec=sys`, the operator's id 1000 on a client is a different account on the home server, which owns the backup repository. A plain export of the pool's root would expose it.
- Eight containers bind the pool's paths locally; an export changes none of their paths or owners.
- No module exports or mounts; no tool read fstab, mount units or exports. A read-only `mounts` module is proposed in mesh-catalog on the same branch name.
## Proposed (ADR 0263, to-be 52)
- `nfs-server` holds node seat `nfs-share`, provides the provision, writes its own `/etc/exports.d` file, NFS v4 only, port 2049 from the private network only, `all_squash` to the share's owner.
- One share per folder (library, downloads); the backup repository and archive are not exported. The pool's root with `crossmnt` is the named alternative.
- `mounts` holds node seat `node-mounts` and writes a `.mount` + `.automount` per share: nothing mounts or fails at boot; idle and mount timeouts.
- Only nodes that ask get a share (workstation, laptop; not the control-node); "every node" is a mesh-wide setting.
- Occasional sources (the gaming device, a USB disk): absence is a state, not a fault; credential via `secret accept` (ADR 0092).
- `share-unreachable` condition for shares that should be there; nothing for an absent occasional source.
- `adopt` acts take over the hand-written fstab lines and the ZFS property, only on a person's word.
## Checks
`records.py`, `index.py`, `cycle.py`, `words.py` pass locally (`merge-check.sh`).
Do not merge before the operator has answered the open questions in `02-options.md`.
2026-10-08 18:22 (new) → proposed (announced): novox/hq#221's head announced
2026-10-08 18:22 proposed → checked (checked): the verdict names this commit
2026-10-08 18:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 18:40 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-08 18:40 published → delivered (done): nothing for a walk to move
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/hq@d05c9d7ca4c7` — **delivered** since 2026-10-08T18:40:29Z
**Delivery plan** — builds nothing: the change touches no module of the mesh's graph
**Group** `feat/mounts-module`, in order: novox/hq@d05c9d7ca4c7 → novox/mesh-controller@d7fab82a8980 → novox/mesh-catalog@29ac6ee16a35
- novox/mesh-controller@d7fab82a8980 before novox/mesh-catalog@29ac6ee16a35: version skew
**Transitions**
- 2026-10-08 18:22 (new) → proposed (announced): novox/hq#221's head announced
- 2026-10-08 18:22 proposed → checked (checked): the verdict names this commit
- 2026-10-08 18:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 18:40 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-08 18:40 published → delivered (done): nothing for a walk to move
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
mesh-admin
changed title from Research 038, ADR 0263 (proposed) and to-be 52: shares and mounts the mesh manages to ADR 0263 (accepted), research 038, design 52: a share is a provision, a node mounts it on demand2026-10-08 16:42:57 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The operator found two failed fstab mounts on the workstation on 2026-10-08 and asked the mesh to handle shares and mounts. This opens research 038 and proposes a decision and a design. Nothing here is decided yet: ADR 0263 is
proposed, to-be 52 isproposed, research 038 staysactiveuntil the operator answers the open questions.What was measured (research 038, evidence)
nofail, no automount, and the share's password sits in a world-readable fstab.sharenfsproperty, not/etc/exports; the library is a child dataset, so exporting the pool's root needscrossmnt.sec=sys, the operator's id 1000 on a client is a different account on the home server, which owns the backup repository. A plain export of the pool's root would expose it.mountsmodule is proposed in mesh-catalog on the same branch name.Proposed (ADR 0263, to-be 52)
nfs-serverholds node seatnfs-share, provides the provision, writes its own/etc/exports.dfile, NFS v4 only, port 2049 from the private network only,all_squashto the share's owner.crossmntis the named alternative.mountsholds node seatnode-mountsand writes a.mount+.automountper share: nothing mounts or fails at boot; idle and mount timeouts.secret accept(ADR 0092).share-unreachablecondition for shares that should be there; nothing for an absent occasional source.adoptacts take over the hand-written fstab lines and the ZFS property, only on a person's word.Checks
records.py,index.py,cycle.py,words.pypass locally (merge-check.sh).Do not merge before the operator has answered the open questions in
02-options.md.Delivery
novox/hq@d05c9d7ca4c7— delivered since 2026-10-08T18:40:29ZDelivery plan — builds nothing: the change touches no module of the mesh's graph
Group
feat/mounts-module, in order: novox/hq@d05c9d7ca4 → novox/mesh-controller@d7fab82a89 → novox/mesh-catalog@29ac6ee16aTransitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Research 038, ADR 0263 (proposed) and to-be 52: shares and mounts the mesh managesto ADR 0263 (accepted), research 038, design 52: a share is a provision, a node mounts it on demand