Security, operator's decision of 2026-10-09.node-login-shell.execute runs any command as the operator account, which has passwordless sudo, so any caller of the mesh's tools is root on that node. The operator withholds it on the control-node now; the other nodes keep it until a call to it needs a person's approval (hq research 039, hq #233). Decision record: hq ADR 0268 (PR to follow, linked in a comment).
What changes
execute on node-login-shell is marked optional (ADR 0246's mark). A holder that does not serve it on a machine still holds the seat there, and is not judged silent (probe D3, holdingNeedsAnAnswer). The mark survives a seat row read back from the store (optionalAsCompiled).
The per-machine choice is the holder's: mesh-catalog's zsh setting execute (mesh-catalog PR, same branch name).
The loginShellVerbs comment, which sat above backupVerbs, is moved to its function.
Trade, said: the seat now has no required verb, so a holder's silence on the bus is no longer judged on any node, the three that still serve execute included.
Tests that failed on main first
internal/catalogue/login_shell_execute_test.goTestTheLoginShellsExecuteIsOptionalSoAMachineMayWithholdIt (compiled, and read back from a stored row): on main, execute is required.
cmd/mesh-controller/holders_silent_test.goTestALoginShellWithholdingExecuteIsNotSilent: on main, the holder was expected to answer.
sh merge-check.sh passes locally (gofmt, vet, the full suite under -race). The catalogue's merge check passes with both this controller and main's as MESH_GATE.
Merge order: either order composes. This first is better: with only the catalogue merged and the control-node's setting at withhold, the self-check would raise seat.node-login-shell.<control-node>.silent until this lands. Do not merge without review.
**Security, operator's decision of 2026-10-09.** `node-login-shell.execute` runs any command as the operator account, which has passwordless sudo, so any caller of the mesh's tools is root on that node. The operator withholds it on the control-node now; the other nodes keep it until a call to it needs a person's approval (hq research 039, hq #233). Decision record: hq ADR 0268 (PR to follow, linked in a comment).
**What changes**
- `execute` on `node-login-shell` is marked optional (ADR 0246's mark). A holder that does not serve it on a machine still holds the seat there, and is not judged silent (probe D3, `holdingNeedsAnAnswer`). The mark survives a seat row read back from the store (`optionalAsCompiled`).
- The per-machine choice is the holder's: mesh-catalog's zsh setting `execute` (mesh-catalog PR, same branch name).
- The `loginShellVerbs` comment, which sat above `backupVerbs`, is moved to its function.
**Trade, said:** the seat now has no required verb, so a holder's silence on the bus is no longer judged on any node, the three that still serve `execute` included.
**Tests that failed on main first**
- `internal/catalogue/login_shell_execute_test.go` `TestTheLoginShellsExecuteIsOptionalSoAMachineMayWithholdIt` (compiled, and read back from a stored row): on main, `execute is required`.
- `cmd/mesh-controller/holders_silent_test.go` `TestALoginShellWithholdingExecuteIsNotSilent`: on main, the holder was expected to answer.
`sh merge-check.sh` passes locally (gofmt, vet, the full suite under -race). The catalogue's merge check passes with both this controller and main's as `MESH_GATE`.
**Merge order:** either order composes. This first is better: with only the catalogue merged and the control-node's setting at `withhold`, the self-check would raise `seat.node-login-shell.<control-node>.silent` until this lands. Do not merge without review.
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
execute runs any command as the operator account, which can become root
without a person. The operator withholds it on the control-node until a
call needs a person's approval (hq ADR 0268); the holder withholds it per
machine through its own setting. With execute required, that holder could
not hold the seat there and would be judged silent. ADR 0246's optional
mark lets it hold the seat without serving the verb.
composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
Machines
mesh-controller on novox: passed — healthy 3 times over 3m39s
mesh-controller on the rest running it: sent
build-agent on ace: passed — healthy 3 times over 3m30s
build-agent on the rest running it: sent
route-proxy on ace: passed — healthy 3 times over 3m14s
route-proxy on the rest running it: sent
Transitions
2026-10-08 22:11 (new) → proposed (announced): novox/mesh-controller#169's head announced
2026-10-08 22:15 proposed → checked (checked): the verdict names this commit
2026-10-08 22:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 22:45 ready → proposed (recheck): checked at 22:15Z before #168 merged; check against today's main before merging
2026-10-08 22:51 proposed → checked (checked): the verdict names this commit
2026-10-08 22:51 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-08 22:52 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 22:52 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
2026-10-08 23:07 delivering → delivered (done): its walk is done: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@2073bfe2e618` — **delivered** since 2026-10-08T23:07:34Z
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
**Group** `withhold-login-shell-execute`, in order: novox/mesh-controller@2073bfe2e618 → novox/mesh-catalog@cfe1dffa4591
- novox/mesh-controller@2073bfe2e618 before novox/mesh-catalog@cfe1dffa4591: built by
- composed together: pass — every machine composes with the change as it did without (4 of 4 compose)
**Machines**
- mesh-controller on novox: passed — healthy 3 times over 3m39s
- mesh-controller on the rest running it: sent
- build-agent on ace: passed — healthy 3 times over 3m30s
- build-agent on the rest running it: sent
- route-proxy on ace: passed — healthy 3 times over 3m14s
- route-proxy on the rest running it: sent
**Transitions**
- 2026-10-08 22:11 (new) → proposed (announced): novox/mesh-controller#169's head announced
- 2026-10-08 22:15 proposed → checked (checked): the verdict names this commit
- 2026-10-08 22:15 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 22:45 ready → proposed (recheck): checked at 22:15Z before #168 merged; check against today's main before merging
- 2026-10-08 22:51 proposed → checked (checked): the verdict names this commit
- 2026-10-08 22:51 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-08 22:52 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 22:52 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
- 2026-10-08 23:07 delivering → delivered (done): its walk is done: every machine of its deploy plan passed, or was left as its policy says
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on ace as build-1791497468196657561 (builds --log build-1791497468196657561).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T21:34:01Z 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-08T21:34:01Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.032s
ok github.com/novox/mesh-controller/cmd/mesh-controller 170.210s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.121s
ok github.com/novox/mesh-controller/internal/artifacts 1.038s
ok github.com/novox/mesh-controller/internal/broker 2.649s
ok github.com/novox/mesh-controller/internal/builder 1.921s
ok github.com/novox/mesh-controller/internal/catalogue 4.443s
ok github.com/novox/mesh-controller/internal/conditions 2.241s
ok github.com/novox/mesh-controller/internal/envfile 1.061s
ok github.com/novox/mesh-controller/internal/facts 1.087s
ok github.com/novox/mesh-controller/internal/identity 4.393s
ok github.com/novox/mesh-controller/internal/inventory 74.132s
ok github.com/novox/mesh-controller/internal/lease 17.735s
ok github.com/novox/mesh-controller/internal/licences 4.027s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.085s
ok github.com/novox/mesh-controller/internal/link 51.084s
ok github.com/novox/mesh-controller/internal/lint 2.048s
ok github.com/novox/mesh-controller/internal/outward 1.090s
ok github.com/novox/mesh-controller/internal/overlay 1.079s
ok github.com/novox/mesh-controller/internal/secrets 1.499s
ok github.com/novox/mesh-controller/internal/store 3.394s
ok github.com/novox/mesh-controller/internal/testbus 1.248s
ok github.com/novox/mesh-controller/internal/token 1.018s
**Merge check** at `2073bfe2`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on ace as `build-1791497468196657561` (`builds --log build-1791497468196657561`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T21:34:01Z 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-08T21:34:01Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.032s
ok github.com/novox/mesh-controller/cmd/mesh-controller 170.210s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.015s
ok github.com/novox/mesh-controller/examples/route-proxy 1.121s
ok github.com/novox/mesh-controller/internal/artifacts 1.038s
ok github.com/novox/mesh-controller/internal/broker 2.649s
ok github.com/novox/mesh-controller/internal/builder 1.921s
ok github.com/novox/mesh-controller/internal/catalogue 4.443s
ok github.com/novox/mesh-controller/internal/conditions 2.241s
ok github.com/novox/mesh-controller/internal/envfile 1.061s
ok github.com/novox/mesh-controller/internal/facts 1.087s
ok github.com/novox/mesh-controller/internal/identity 4.393s
ok github.com/novox/mesh-controller/internal/inventory 74.132s
ok github.com/novox/mesh-controller/internal/lease 17.735s
ok github.com/novox/mesh-controller/internal/licences 4.027s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.085s
ok github.com/novox/mesh-controller/internal/link 51.084s
ok github.com/novox/mesh-controller/internal/lint 2.048s
ok github.com/novox/mesh-controller/internal/outward 1.090s
ok github.com/novox/mesh-controller/internal/overlay 1.079s
ok github.com/novox/mesh-controller/internal/secrets 1.499s
ok github.com/novox/mesh-controller/internal/store 3.394s
ok github.com/novox/mesh-controller/internal/testbus 1.248s
ok github.com/novox/mesh-controller/internal/token 1.018s
```
build-agent keeps data (ADR 0233): what it holds is backed up before it moves
route-proxy provides route: its consumers are sent again after it
route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as build-1791499521345529835 (builds --log build-1791499521345529835).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T22:41:56Z 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-08T22:41:56Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.045s
ok github.com/novox/mesh-controller/cmd/mesh-controller 211.628s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.029s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.152s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 3.030s
ok github.com/novox/mesh-controller/internal/builder 3.607s
ok github.com/novox/mesh-controller/internal/catalogue 5.641s
ok github.com/novox/mesh-controller/internal/conditions 2.337s
ok github.com/novox/mesh-controller/internal/envfile 1.038s
ok github.com/novox/mesh-controller/internal/facts 1.038s
ok github.com/novox/mesh-controller/internal/identity 5.335s
ok github.com/novox/mesh-controller/internal/inventory 92.385s
ok github.com/novox/mesh-controller/internal/lease 17.721s
ok github.com/novox/mesh-controller/internal/licences 4.876s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 55.607s
ok github.com/novox/mesh-controller/internal/lint 2.447s
ok github.com/novox/mesh-controller/internal/outward 1.037s
ok github.com/novox/mesh-controller/internal/overlay 1.032s
ok github.com/novox/mesh-controller/internal/secrets 1.509s
ok github.com/novox/mesh-controller/internal/store 3.427s
ok github.com/novox/mesh-controller/internal/testbus 1.213s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `2073bfe2`
- `mesh/merge-gate`: **PASS** — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)
- `mesh/repo-check`: **PASS** — its merge-check.sh passed
**Delivery plan** — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
- tier 0: mesh-controller
- tier 1: build-agent
- tier 2: route-proxy
- ace: receives build-agent, route-proxy
- g14: receives build-agent
- novox: receives mesh-controller, build-agent, route-proxy
- shanks: receives build-agent
- build-agent keeps data (ADR 0233): what it holds is backed up before it moves
- route-proxy provides route: its consumers are sent again after it
- route-proxy keeps data (ADR 0233): what it holds is backed up before it moves
Run by the build seat on novox as `build-1791499521345529835` (`builds --log build-1791499521345529835`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 52 tool(s); WARNING: controller stay(s) up and say(s) not how it is ready — judged by liveness alone, refused from 2026-11-18 (ADR 0240 rule 8)
long-running resources without health: 1
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-08T22:41:56Z 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-08T22:41:56Z
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 3 module(s) in 3 tier(s): build-agent, mesh-controller, route-proxy
--- its merge-check.sh (go toolchain)
ok github.com/novox/mesh-controller/cmd/mesh-builder 1.045s
ok github.com/novox/mesh-controller/cmd/mesh-controller 211.628s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.019s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.029s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/route-proxy 1.152s
ok github.com/novox/mesh-controller/internal/artifacts 1.054s
ok github.com/novox/mesh-controller/internal/broker 3.030s
ok github.com/novox/mesh-controller/internal/builder 3.607s
ok github.com/novox/mesh-controller/internal/catalogue 5.641s
ok github.com/novox/mesh-controller/internal/conditions 2.337s
ok github.com/novox/mesh-controller/internal/envfile 1.038s
ok github.com/novox/mesh-controller/internal/facts 1.038s
ok github.com/novox/mesh-controller/internal/identity 5.335s
ok github.com/novox/mesh-controller/internal/inventory 92.385s
ok github.com/novox/mesh-controller/internal/lease 17.721s
ok github.com/novox/mesh-controller/internal/licences 4.876s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.012s
ok github.com/novox/mesh-controller/internal/link 55.607s
ok github.com/novox/mesh-controller/internal/lint 2.447s
ok github.com/novox/mesh-controller/internal/outward 1.037s
ok github.com/novox/mesh-controller/internal/overlay 1.032s
ok github.com/novox/mesh-controller/internal/secrets 1.509s
ok github.com/novox/mesh-controller/internal/store 3.427s
ok github.com/novox/mesh-controller/internal/testbus 1.213s
ok github.com/novox/mesh-controller/internal/token 1.017s
```
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.
Security, operator's decision of 2026-10-09.
node-login-shell.executeruns any command as the operator account, which has passwordless sudo, so any caller of the mesh's tools is root on that node. The operator withholds it on the control-node now; the other nodes keep it until a call to it needs a person's approval (hq research 039, hq #233). Decision record: hq ADR 0268 (PR to follow, linked in a comment).What changes
executeonnode-login-shellis marked optional (ADR 0246's mark). A holder that does not serve it on a machine still holds the seat there, and is not judged silent (probe D3,holdingNeedsAnAnswer). The mark survives a seat row read back from the store (optionalAsCompiled).execute(mesh-catalog PR, same branch name).loginShellVerbscomment, which sat abovebackupVerbs, is moved to its function.Trade, said: the seat now has no required verb, so a holder's silence on the bus is no longer judged on any node, the three that still serve
executeincluded.Tests that failed on main first
internal/catalogue/login_shell_execute_test.goTestTheLoginShellsExecuteIsOptionalSoAMachineMayWithholdIt(compiled, and read back from a stored row): on main,execute is required.cmd/mesh-controller/holders_silent_test.goTestALoginShellWithholdingExecuteIsNotSilent: on main, the holder was expected to answer.sh merge-check.shpasses locally (gofmt, vet, the full suite under -race). The catalogue's merge check passes with both this controller and main's asMESH_GATE.Merge order: either order composes. This first is better: with only the catalogue merged and the control-node's setting at
withhold, the self-check would raiseseat.node-login-shell.<control-node>.silentuntil this lands. Do not merge without review.Delivery
novox/mesh-controller@2073bfe2e618— delivered since 2026-10-08T23:07:34ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Group
withhold-login-shell-execute, in order: novox/mesh-controller@2073bfe2e6 → novox/mesh-catalog@cfe1dffa45Machines
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
2073bfe2mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on ace as
build-1791497468196657561(builds --log build-1791497468196657561).Merge check at
2073bfe2mesh/merge-gate: PASS — every machine composes with the change as it did without (4 of 4 compose) (modules: build-agent, mesh-controller, route-proxy)mesh/repo-check: PASS — its merge-check.sh passedDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on novox as
build-1791499521345529835(builds --log build-1791499521345529835).