ADR 0283: a part waiting for the operator's secret or setting is said as waiting and passes the first-node gate (issue 386)
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery-group group feat/386-a-wait-for-the-operator checking: 1 of 2 member(s) ready
mesh/delivery superseded: a newer head of the same pull request

A module whose only unhealthy part waited for the operator's secret failed
its gate, held every later walk and told the operator there was nothing to
do. The record adds a waits answer and a waiting state, checked by the
controller, read by the gate as waits for a person, and said as a
needs-operator condition naming the act; and secret families so each SMB
source's password is one hidden line at the desk prompt.
This commit is contained in:
jochen
2026-10-10 21:05:29 +02:00
parent 5f4ff3a80b
commit 242a6c548b
5 changed files with 250 additions and 14 deletions
@@ -2,8 +2,9 @@
layer: to-be
status: in-progress
code: [mesh-host, mesh-controller, mesh-lab, mesh-catalog]
updated: 2026-10-08
updated: 2026-10-10
decisions:
- 02-DECISIONS/0283-a-part-that-waits-for-the-operators-secret-or-setting-is-said-as-waiting-passes-the-first-node-gate-and-names-the-act.md
- 02-DECISIONS/0254-a-wait-for-a-persons-new-login-is-not-a-gates-failure-and-each-module-of-a-send-keeps-its-own-pass.md
- 02-DECISIONS/0240-a-module-says-how-it-is-healthy-and-the-node-engine-judges-it.md
- 02-DECISIONS/0241-a-machine-says-how-its-network-is-and-an-outside-writer-of-a-mesh-file-is-a-finding.md
@@ -121,8 +122,16 @@ period do the timing, without an execution per look from outside.
**Per module and long-running resource, the node-engine keeps a state:** `healthy`, `unhealthy` (with the
reason: down, restarting, or the check's failure in words), `starting` (inside grace), `held` (§1) or
`unknown` (nothing could be read). With it: since when, the failing streak, and the restarts counted. Every
start of a resource — a new build, a recreate, a restart — begins in `starting`.
`unknown` (nothing could be read), or `waiting` (its tool check says it waits for the operator, below).
With it: since when, the failing streak, and the restarts counted. Every start of a resource — a new build,
a recreate, a restart — begins in `starting`.
**A tool check answers one of three: healthy, unhealthy, or waits**
([ADR 0283](../../02-DECISIONS/0283-a-part-that-waits-for-the-operators-secret-or-setting-is-said-as-waiting-passes-the-first-node-gate-and-names-the-act.md)).
*Waits* says nothing of the module is wrong but a part that cannot work until the operator gives something:
each wait names one own secret or one setting of the module, the part, and what the operator gives, in words
with no path, address or value. The answer's shape is mesh-sdk's, read by the module and the node-engine
alike. One look that says it states the resource `waiting`, inside the grace too, with its waits.
**Said three ways**, as the core already says its own state:
@@ -146,6 +155,14 @@ place of `unhealthy` ([ADR 0254](../../02-DECISIONS/0254-a-wait-for-a-persons-ne
cleared as above, its summary one sentence that says to log out and in again. When the login has come and
a unit still fails, it clears and `unhealthy` is raised.
**A wait for the operator's secret or setting is its own condition**, `module.<module>.<machine>.needs-operator`,
in place of `unhealthy` (ADR 0283): a warning, the operator's, never escalated by age, raised and cleared as
above. The controller first checks the wait: a secret it names must be the module's own, declared issued
outside the mesh, and hold no value given on that machine; a setting must be one the module declares. Its
plain words name the act — "Needs you: type the password of the source … at <machine>'s desk prompt", or
approve the setting when an agent proposes it — and never say there is nothing to do. A wait that fails the
check is said as `unhealthy`, with why.
**`status`** lists it with the other conditions; **`node show`** shows each module's resources with their
state and since when, so "is it working" has an answer without opening a terminal on the machine.
@@ -174,6 +191,11 @@ fails at the bound until the operator logs in again.
The node-engine names the account on every resource that runs in an account's own manager, which is how
the controller tells such a unit from one that is broken.
**A wait for the operator's secret or setting is a wait for a person too** (ADR 0283, issue 386). A module
whose only resources not healthy are `waiting`, each wait checked as in §4, reads **waits for a person**: a
pass, carried in the verdict, nothing put back. Unlike a new login, a secret not given is owed by every
build alike, so any build of the module is excused while the wait checks out.
**Each module of a send keeps its own pass** (ADR 0254). A send is still judged as one, with one verdict.
The gate also counts, per module, the judgings in a row that found it healthy or waiting for a person;
when the send fails, a module whose count reached the passes asked keeps a pass, said "on its own", and is
+17 -10
View File
@@ -7,6 +7,7 @@ code:
- mesh-catalog modules/mounts
updated: 2026-10-10
decisions:
- 02-DECISIONS/0283-a-part-that-waits-for-the-operators-secret-or-setting-is-said-as-waiting-passes-the-first-node-gate-and-names-the-act.md
- 02-DECISIONS/0277-a-trusted-setting-is-proposed-through-a-verb-and-set-on-the-operators-warrant-and-a-modules-own-secret-is-asked-for-and-typed-at-the-desk.md
- 02-DECISIONS/0263-a-share-is-a-provision-a-node-mounts-it-on-demand-and-only-nodes-that-ask-get-it.md
- 02-DECISIONS/0051-shared-data-is-the-operators.md
@@ -55,7 +56,7 @@ The glossary holds the three words.
| `nfs-server` | the catalogue | holds `node-nfs-server`, provides the provision, writes its export file, runs the service, opens 2049 to the private network |
| `mounts` | the catalogue | holds `node-mounts`, writes a unit pair per share, keeps each share's state, serves the tools |
| the binding | the controller | gives a consumer the server's name; the consumer asks the server's seat for each share's path and access over the bus |
| the credential | the vault | the `mounts` module's own secret `smb-credentials`, issued outside the mesh and given with `secret accept`, unsealed on the node as a file |
| the credential | the vault | per SMB source, the `mounts` module's own secret `smb-password-<source>` (a member of the family `smb-password-*`), issued outside the mesh and given with `secret accept` or typed at the desk prompt, unsealed on the node as a file; the username is the setting `smb-users` |
## 1. The server: `nfs-server`
@@ -102,12 +103,18 @@ The glossary holds the three words.
this node mounts, by the server's name for them. `none` (the default) mounts none.
- **Its setting `sources`.** Occasional sources: `name=smb://<host>/<share>@<mountpoint>` or
`name=disk:<uuid>@<mountpoint>`, each optionally `:ro`. `none` (the default) is none.
- **Its secret `smb-credentials`.** One section per SMB source, `[name]` with `username=` and
`password=`, issued outside the mesh and given with `secret accept <node> mounts smb-credentials
--from <file>` at the controller's terminal — or asked for by an agent with the controller's `secret-ask`
verb, on which a hidden prompt opens at that machine's desk naming the module, the secret and who asked,
and the operator types it there ([ADR 0277](../../02-DECISIONS/0277-a-trusted-setting-is-proposed-through-a-verb-and-set-on-the-operators-warrant-and-a-modules-own-secret-is-asked-for-and-typed-at-the-desk.md)). The process writes one credentials file per source, readable by root only. A source
with no section is said with that remedy and is not mounted.
- **Its setting `smb-users`.** The username of each SMB source, `name=username`, space-separated; `none` (the
default) is none. Not a secret, so it is a setting.
- **Its secret family `smb-password-*`.** One member per SMB source, `smb-password-<source>`, holding that
source's password as one line, issued outside the mesh and asked for by an agent with the controller's
`secret-ask` verb, on which a hidden prompt opens at that machine's desk naming the module, the secret and
who asked, and the operator types it there ([ADR 0277](../../02-DECISIONS/0277-a-trusted-setting-is-proposed-through-a-verb-and-set-on-the-operators-warrant-and-a-modules-own-secret-is-asked-for-and-typed-at-the-desk.md));
or given with `secret accept <node> mounts smb-password-<source> --from <file>` at the controller's
terminal. The mesh never makes a member, so one not given is no file ([ADR 0283](../../02-DECISIONS/0283-a-part-that-waits-for-the-operators-secret-or-setting-is-said-as-waiting-passes-the-first-node-gate-and-names-the-act.md)).
The process writes one credentials file per source from the username and the password, readable by root
only. A source whose username or password is not given is not mounted, and its health answers *waits*,
naming the setting or the secret and what the operator gives: the controller says it as
`needs-operator`, and the first-node gate does not fail a build for it (ADR 0283).
- **Its settings are trusted settings** (a trusted file asks for them), so a verb may not set them outright:
an agent proposes them (`settings propose mounts … --node <node>`) and the operator approves on their
phone, where the ask shows each source in its shape ("recalbox=‹address›@‹path›") and the layer's
@@ -213,9 +220,9 @@ folders, none refused for a reason not understood.
export goes; the mesh's stays. *Undo:* `zfs set sharenfs=<the old value>` by a person, recorded as a
hand-act.
7. **The downloads**, the same way: read-only first, then read-write.
8. **The gaming device**: an agent asks for `smb-credentials` with `secret-ask`, and the operator types it at
that machine's desk (or gives it with `secret accept` at the terminal); the agent proposes the source in
`sources`, and the operator approves it on their phone; `node-mounts.list` says it `absent` while the
8. **The gaming device**: the agent proposes the source in `sources` and its username in `smb-users`, and the
operator approves each on their phone; an agent asks for `smb-password-<source>` with `secret-ask`, and the
operator types it at that machine's desk (or gives it with `secret accept` at the terminal); `node-mounts.list` says it `absent` while the
device is off, and it mounts on access when it is on. Then its fstab line is adopted.
9. **The laptop**, read-only, granted read-only on the home server.