Issue 379 (the desktop's two hand-written network mounts), the remaining half: the Pi's SMB share waits for its login through the desk prompt.
Symptom. The module's own secret smb-credentials read only as an INI file ([recalbox] section, then username=, password=, domain= lines). The desk's one-line prompt (secret ask <node> mounts smb-credentials, hq ADR 0277) cannot type that, and the desktop's source was said as smb-credentials: line 1 is not key=value inside a [section].
Change (modules/mounts, Go only):
A login is also one line, [recalbox] username=root password=…: the source's name in brackets, then space-separated key=value. password= is last and takes everything after it to the end of the line, so a password may hold spaces and =; domain=, when wanted, comes before it. Several sources are several such lines. The file form still reads, and a file may mix both; both forms give the same login.
A line the module cannot read is refused with the form it expected ([<source>] username=… password=…), never with what was typed: a word that is not key=value may be the password typed without its key, and so may a line that starts like a name ([abc-1]xyz). An unknown key is said as such, not by name.
A login without a username is not answered at all, so apply says the source as not set up rather than writing a credentials file with a hole in it.
A one-line login closes any open file-form section, so a stray key on a later line lands in no login. The name is the first ]'s and matches a source's name, so nothing typed after it opens another section.
The source's login is not given now says the desk verb and the line to type, as well as the file form.
README "The secret" documents both forms.
Not done, on purpose: a hint in the prompt. The desk prompt is written by node-launcher.secret from names alone (the review of 2026-10-09, M4, so a caller cannot word a prompt), and own-secrets in a manifest carries no hint field; adding one is a controller and launcher change, not this module's. The URL's user part (smb://root@host/share) is not read either: the sources setting does not take user@host, so the username is given on the line.
Tests. Both forms give the same login (a password with spaces, an inner = and a trailing ==; a leading space after password= kept in both); a mixed file with \r\n; the section-closing rule; thirteen refusals, each checked for the expected-form message and for echoing nothing typed. Mutation on the one-line branch: eight mutants (password takes only the word, name unchecked, no space after ], malformed word accepted, section not closed, duplicate accepted, unknown key unsaid, username-less login answered), all killed.
Review. One independent pass against the checklist (password never logged or echoed in any error; parsing cannot be tricked into reading a different section; credentials file still root-only 0600): one should-fix (a password typed alone as [abc-1]xyz echoed its bracketed start) and three nits, all applied.
Issue 379 (the desktop's two hand-written network mounts), the remaining half: the Pi's SMB share waits for its login through the desk prompt.
**Symptom.** The module's own secret `smb-credentials` read only as an INI file (`[recalbox]` section, then `username=`, `password=`, `domain=` lines). The desk's one-line prompt (`secret ask <node> mounts smb-credentials`, hq ADR 0277) cannot type that, and the desktop's source was said as `smb-credentials: line 1 is not key=value inside a [section]`.
**Change** (`modules/mounts`, Go only):
- A login is also one line, `[recalbox] username=root password=…`: the source's name in brackets, then space-separated `key=value`. `password=` is last and takes everything after it to the end of the line, so a password may hold spaces and `=`; `domain=`, when wanted, comes before it. Several sources are several such lines. The file form still reads, and a file may mix both; both forms give the same login.
- A line the module cannot read is refused with the form it expected (`[<source>] username=… password=…`), never with what was typed: a word that is not `key=value` may be the password typed without its key, and so may a line that starts like a name (`[abc-1]xyz`). An unknown key is said as such, not by name.
- A login without a username is not answered at all, so apply says the source as not set up rather than writing a credentials file with a hole in it.
- A one-line login closes any open file-form section, so a stray key on a later line lands in no login. The name is the first `]`'s and matches a source's name, so nothing typed after it opens another section.
- The source's `login is not given` now says the desk verb and the line to type, as well as the file form.
- README "The secret" documents both forms.
Not done, on purpose: a hint in the prompt. The desk prompt is written by `node-launcher.secret` from names alone (the review of 2026-10-09, M4, so a caller cannot word a prompt), and `own-secrets` in a manifest carries no hint field; adding one is a controller and launcher change, not this module's. The URL's user part (`smb://root@host/share`) is not read either: the `sources` setting does not take `user@host`, so the username is given on the line.
**Tests.** Both forms give the same login (a password with spaces, an inner `=` and a trailing `==`; a leading space after `password=` kept in both); a mixed file with `\r\n`; the section-closing rule; thirteen refusals, each checked for the expected-form message and for echoing nothing typed. Mutation on the one-line branch: eight mutants (password takes only the word, name unchecked, no space after `]`, malformed word accepted, section not closed, duplicate accepted, unknown key unsaid, username-less login answered), all killed.
**Review.** One independent pass against the checklist (password never logged or echoed in any error; parsing cannot be tricked into reading a different section; credentials file still root-only 0600): one should-fix (a password typed alone as `[abc-1]xyz` echoed its bracketed start) and three nits, all applied.
mesh/delivery covered after its failure: a later walk that contains it was delivered: plan-1791663540935383995 (novox/mesh-catalog at 7534167f into main,…
The secret smb-credentials was an INI file alone, which the desk's one-line
prompt (secret ask, hq ADR 0277) cannot type: on the desktop the Pi's source
said "line 1 is not key=value inside a [section]". A login is now also one line,
`[recalbox] username=root password=…`, password last and to the end of the
line so it may hold spaces and `=`; the file form still reads, and a file may
mix both. A line the module cannot read is refused with the form it expected,
never with what was typed, and a login without a username is not answered. The
source's "login is not given" says the desk verb and the line to type.
Deliverynovox/mesh-catalog@a058cad73573 — failed since 2026-10-10T14:07:31Z
Covered: covered after its failure: a later walk that contains it was delivered: plan-1791663540935383995 (novox/mesh-catalog at 7534167f into main, done, contains its merge 3b497bd7)
Delivery plan — builds mounts → shanks; no bus step
tier 0: mounts
shanks: receives mounts
Machines
mounts on shanks: rolled-back — not healthy within 10m0s of its apply: its process mounts.watch on shanks fails its tool check
Transitions
2026-10-10 13:51 (new) → proposed (announced): novox/mesh-catalog#179's head announced
2026-10-10 13:53 proposed → checked (checked): the verdict names this commit
2026-10-10 13:53 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-10 13:56 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-10 13:56 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-10 14:07 delivering → failed (failed): its walk failed, carrying its own commit: a gate on a first machine (what it carried put back), a build, a machine
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@a058cad73573` — **failed** since 2026-10-10T14:07:31Z
**Covered**: covered after its failure: a later walk that contains it was delivered: plan-1791663540935383995 (novox/mesh-catalog at 7534167f into main, done, contains its merge 3b497bd7)
**Delivery plan** — builds mounts → shanks; no bus step
- tier 0: mounts
- shanks: receives mounts
**Machines**
- mounts on shanks: rolled-back — not healthy within 10m0s of its apply: its process mounts.watch on shanks fails its tool check
**Transitions**
- 2026-10-10 13:51 (new) → proposed (announced): novox/mesh-catalog#179's head announced
- 2026-10-10 13:53 proposed → checked (checked): the verdict names this commit
- 2026-10-10 13:53 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-10 13:56 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-10 13:56 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-10 14:07 delivering → failed (failed): its walk failed, carrying its own commit: a gate on a first machine (what it carried put back), a build, a machine
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mounts)
mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
Delivery plan — builds mounts → shanks; no bus step
tier 0: mounts
shanks: receives mounts
Run by the build seat on shanks as build-1791640283213867984 (builds --log build-1791640283213867984).
--- the gate: mounts
mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T13:46:57Z 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-10T13:46:57Z
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 1 module(s) in 1 tier(s): mounts
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.003s
words: 12 retired words and 70 daemons' lines, none in the 37544 strings of 637 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.012s
agent-home: no archive and no file written into under the agent's home
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.124s
--- its merge-check-typescript.sh (typescript toolchain)
**Merge check** at `a058cad7`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: mounts)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)
**Delivery plan** — builds mounts → shanks; no bus step
- tier 0: mounts
- shanks: receives mounts
Run by the build seat on shanks as `build-1791640283213867984` (`builds --log build-1791640283213867984`).
```
--- the gate: mounts
mounts: ok, 3 tool(s), invokes seat:mesh-controller.data, keeps state shares, reads nfs-server.exports, ready: apply by unit every 30s; watch by its tool mounts_health every 1m0s; WARNING: config ask(s) for a setting and do(es) not say whether it is trusted, so it counts as trusted: set at the terminal alone; say "trusted" false where nothing trusts it (novox/hq issue 339)
long-running resources without health: 0
files asking for a setting without saying whether it is trusted: 1
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 0 module(s) changed against 4 machine(s), as the snapshot of 2026-10-10T13:46:57Z 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-10T13:46:57Z
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 1 module(s) in 1 tier(s): mounts
--- its merge-check.sh (go toolchain)
ok git.novox.be/novox/mesh-catalog/checks/words 0.003s
words: 12 retired words and 70 daemons' lines, none in the 37544 strings of 637 files
ok git.novox.be/novox/mesh-catalog/checks/agenthome 0.012s
agent-home: no archive and no file written into under the agent's home
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.124s
--- its merge-check-typescript.sh (typescript toolchain)
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Issue 379 (the desktop's two hand-written network mounts), the remaining half: the Pi's SMB share waits for its login through the desk prompt.
Symptom. The module's own secret
smb-credentialsread only as an INI file ([recalbox]section, thenusername=,password=,domain=lines). The desk's one-line prompt (secret ask <node> mounts smb-credentials, hq ADR 0277) cannot type that, and the desktop's source was said assmb-credentials: line 1 is not key=value inside a [section].Change (
modules/mounts, Go only):[recalbox] username=root password=…: the source's name in brackets, then space-separatedkey=value.password=is last and takes everything after it to the end of the line, so a password may hold spaces and=;domain=, when wanted, comes before it. Several sources are several such lines. The file form still reads, and a file may mix both; both forms give the same login.[<source>] username=… password=…), never with what was typed: a word that is notkey=valuemay be the password typed without its key, and so may a line that starts like a name ([abc-1]xyz). An unknown key is said as such, not by name.]'s and matches a source's name, so nothing typed after it opens another section.login is not givennow says the desk verb and the line to type, as well as the file form.Not done, on purpose: a hint in the prompt. The desk prompt is written by
node-launcher.secretfrom names alone (the review of 2026-10-09, M4, so a caller cannot word a prompt), andown-secretsin a manifest carries no hint field; adding one is a controller and launcher change, not this module's. The URL's user part (smb://root@host/share) is not read either: thesourcessetting does not takeuser@host, so the username is given on the line.Tests. Both forms give the same login (a password with spaces, an inner
=and a trailing==; a leading space afterpassword=kept in both); a mixed file with\r\n; the section-closing rule; thirteen refusals, each checked for the expected-form message and for echoing nothing typed. Mutation on the one-line branch: eight mutants (password takes only the word, name unchecked, no space after], malformed word accepted, section not closed, duplicate accepted, unknown key unsaid, username-less login answered), all killed.Review. One independent pass against the checklist (password never logged or echoed in any error; parsing cannot be tricked into reading a different section; credentials file still root-only 0600): one should-fix (a password typed alone as
[abc-1]xyzechoed its bracketed start) and three nits, all applied.Delivery
novox/mesh-catalog@a058cad73573— failed since 2026-10-10T14:07:31ZCovered: covered after its failure: a later walk that contains it was delivered: plan-1791663540935383995 (novox/mesh-catalog at
7534167finto main, done, contains its merge3b497bd7)Delivery plan — builds mounts → shanks; no bus step
Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
a058cad7mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: mounts)mesh/repo-check: PASS — its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-check-typescript.sh (typescript)Delivery plan — builds mounts → shanks; no bus step
Run by the build seat on shanks as
build-1791640283213867984(builds --log build-1791640283213867984).