The agent reached machines over ssh because nothing tied a verb to the command it replaces.
catalogue.Verb gains optional replaces (shell commands as typed), beside main's Optional (both kept; rebased over #113, #115, #117). Read strictly like the rest of a verb's definition, so a module-defined seat's verb may carry it too.
The compiled seats say it: node-service-manager (journalctl, systemctl status|restart|start|stop|enable|disable|list-units|--failed|is-active), node-hostname (cat /etc/hosts, getent hosts, edit /etc/hosts, HOSTALIASES, sed -i /etc/hosts), node-intrusion-prevention (fail2ban-client …), node-packet-filter (nft list ruleset, iptables -L, iptables-save, nft -f, nft delete, iptables -X), node-backup (restic snapshots|backup|restore), mesh-store (psql -l, psql), mesh-controller.node (hostnamectl, uptime). node-login-shell.execute deliberately replaces nothing: the generic shell is not the answer to a missing tool.
A manifest may say it for its own tools: "replaces": {"docker_logs": ["docker logs"]} — refused when the key is not a declared tool, or an entry is empty, multi-line, over 80 characters or repeated.
tools answers replaces per verb; module list --json answers each module's replaces. Both feed the mesh MCP server's search (mesh-tools#21) and the agent's table and guard (mesh-catalog#110).
Tests: the worked-around verbs say what they replace; every entry one short line; a verb definition and a manifest carry it; each refusal; tools carries it.
Order: once this is live, a catalogue module may declare replaces (docker's is the first follow-up) — before that the strict manifest read refuses it.
hq ADR 0245.
The agent reached machines over ssh because nothing tied a verb to the command it replaces.
- `catalogue.Verb` gains optional `replaces` (shell commands as typed), beside main's `Optional` (both kept; rebased over #113, #115, #117). Read strictly like the rest of a verb's definition, so a module-defined seat's verb may carry it too.
- The compiled seats say it: node-service-manager (`journalctl`, `systemctl status|restart|start|stop|enable|disable|list-units|--failed|is-active`), node-hostname (`cat /etc/hosts`, `getent hosts`, `edit /etc/hosts`, `HOSTALIASES`, `sed -i /etc/hosts`), node-intrusion-prevention (`fail2ban-client …`), node-packet-filter (`nft list ruleset`, `iptables -L`, `iptables-save`, `nft -f`, `nft delete`, `iptables -X`), node-backup (`restic snapshots|backup|restore`), mesh-store (`psql -l`, `psql`), mesh-controller.node (`hostnamectl`, `uptime`). node-login-shell.execute deliberately replaces nothing: the generic shell is not the answer to a missing tool.
- A manifest may say it for its **own** tools: `"replaces": {"docker_logs": ["docker logs"]}` — refused when the key is not a declared tool, or an entry is empty, multi-line, over 80 characters or repeated.
- `tools` answers `replaces` per verb; `module list --json` answers each module's `replaces`. Both feed the mesh MCP server's search (mesh-tools#21) and the agent's table and guard (mesh-catalog#110).
- Tests: the worked-around verbs say what they replace; every entry one short line; a verb definition and a manifest carry it; each refusal; `tools` carries it.
Order: once this is live, a catalogue module may declare `replaces` (docker's is the first follow-up) — before that the strict manifest read refuses it.
hq ADR 0245.
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
Machines
mesh-controller on novox: judging — 0 healthy judging(s) so far
Transitions
2026-10-07 18:53 (new) → proposed (announced): novox/mesh-controller#118's head announced
2026-10-07 18:58 proposed → checked (checked): the verdict names this commit
2026-10-07 18:58 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-07 19:05 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-07 19:05 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-07 19:17 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@4469cab7f46f` — **superseded** since 2026-10-07T19:17:40Z
**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
**Machines**
- mesh-controller on novox: judging — 0 healthy judging(s) so far
**Transitions**
- 2026-10-07 18:53 (new) → proposed (announced): novox/mesh-controller#118's head announced
- 2026-10-07 18:58 proposed → checked (checked): the verdict names this commit
- 2026-10-07 18:58 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-07 19:05 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-07 19:05 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-07 19:17 delivering → superseded (superseded): a newer delivery to the same trunk took over its walk
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 g14 as build-1791395572018786925 (builds --log build-1791395572018786925).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T17:23:39Z 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-07T17:23:39Z
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-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.029s
ok github.com/novox/mesh-controller/cmd/mesh-controller 198.760s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/route-proxy 1.190s
ok github.com/novox/mesh-controller/internal/artifacts 1.037s
ok github.com/novox/mesh-controller/internal/broker 2.407s
ok github.com/novox/mesh-controller/internal/builder 1.247s
ok github.com/novox/mesh-controller/internal/catalogue 3.678s
ok github.com/novox/mesh-controller/internal/conditions 1.959s
ok github.com/novox/mesh-controller/internal/envfile 1.029s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 6.278s
ok github.com/novox/mesh-controller/internal/inventory 111.451s
ok github.com/novox/mesh-controller/internal/lease 17.671s
ok github.com/novox/mesh-controller/internal/licences 5.515s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 51.841s
ok github.com/novox/mesh-controller/internal/lint 1.786s
ok github.com/novox/mesh-controller/internal/outward 1.039s
ok github.com/novox/mesh-controller/internal/overlay 1.024s
ok github.com/novox/mesh-controller/internal/secrets 1.403s
ok github.com/novox/mesh-controller/internal/store 3.950s
ok github.com/novox/mesh-controller/internal/testbus 1.174s
ok github.com/novox/mesh-controller/internal/token 1.015s
**Merge check** at `d0283ffd`
- `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
**Change 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 g14 as `build-1791395572018786925` (`builds --log build-1791395572018786925`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T17:23:39Z 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-07T17:23:39Z
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-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.029s
ok github.com/novox/mesh-controller/cmd/mesh-controller 198.760s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.016s
ok github.com/novox/mesh-controller/examples/route-proxy 1.190s
ok github.com/novox/mesh-controller/internal/artifacts 1.037s
ok github.com/novox/mesh-controller/internal/broker 2.407s
ok github.com/novox/mesh-controller/internal/builder 1.247s
ok github.com/novox/mesh-controller/internal/catalogue 3.678s
ok github.com/novox/mesh-controller/internal/conditions 1.959s
ok github.com/novox/mesh-controller/internal/envfile 1.029s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 6.278s
ok github.com/novox/mesh-controller/internal/inventory 111.451s
ok github.com/novox/mesh-controller/internal/lease 17.671s
ok github.com/novox/mesh-controller/internal/licences 5.515s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.011s
ok github.com/novox/mesh-controller/internal/link 51.841s
ok github.com/novox/mesh-controller/internal/lint 1.786s
ok github.com/novox/mesh-controller/internal/outward 1.039s
ok github.com/novox/mesh-controller/internal/overlay 1.024s
ok github.com/novox/mesh-controller/internal/secrets 1.403s
ok github.com/novox/mesh-controller/internal/store 3.950s
ok github.com/novox/mesh-controller/internal/testbus 1.174s
ok github.com/novox/mesh-controller/internal/token 1.015s
```
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 shanks as build-1791396472398592725 (builds --log build-1791396472398592725).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:01:12Z 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-07T18:01:12Z
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-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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 453.318s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.236s
ok github.com/novox/mesh-controller/internal/artifacts 1.060s
ok github.com/novox/mesh-controller/internal/broker 2.539s
ok github.com/novox/mesh-controller/internal/builder 1.552s
ok github.com/novox/mesh-controller/internal/catalogue 4.282s
ok github.com/novox/mesh-controller/internal/conditions 2.030s
ok github.com/novox/mesh-controller/internal/envfile 1.025s
ok github.com/novox/mesh-controller/internal/facts 1.042s
ok github.com/novox/mesh-controller/internal/identity 42.021s
ok github.com/novox/mesh-controller/internal/inventory 283.960s
ok github.com/novox/mesh-controller/internal/lease 17.719s
ok github.com/novox/mesh-controller/internal/licences 43.165s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.036s
ok github.com/novox/mesh-controller/internal/link 82.318s
ok github.com/novox/mesh-controller/internal/lint 1.922s
ok github.com/novox/mesh-controller/internal/outward 1.069s
ok github.com/novox/mesh-controller/internal/overlay 1.055s
ok github.com/novox/mesh-controller/internal/secrets 1.484s
ok github.com/novox/mesh-controller/internal/store 10.872s
ok github.com/novox/mesh-controller/internal/testbus 1.223s
ok github.com/novox/mesh-controller/internal/token 1.018s
**Merge check** at `0e5af859`
- `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
**Change 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 shanks as `build-1791396472398592725` (`builds --log build-1791396472398592725`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:01:12Z 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-07T18:01:12Z
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-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.035s
ok github.com/novox/mesh-controller/cmd/mesh-controller 453.318s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.020s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.028s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.017s
ok github.com/novox/mesh-controller/examples/route-proxy 1.236s
ok github.com/novox/mesh-controller/internal/artifacts 1.060s
ok github.com/novox/mesh-controller/internal/broker 2.539s
ok github.com/novox/mesh-controller/internal/builder 1.552s
ok github.com/novox/mesh-controller/internal/catalogue 4.282s
ok github.com/novox/mesh-controller/internal/conditions 2.030s
ok github.com/novox/mesh-controller/internal/envfile 1.025s
ok github.com/novox/mesh-controller/internal/facts 1.042s
ok github.com/novox/mesh-controller/internal/identity 42.021s
ok github.com/novox/mesh-controller/internal/inventory 283.960s
ok github.com/novox/mesh-controller/internal/lease 17.719s
ok github.com/novox/mesh-controller/internal/licences 43.165s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.036s
ok github.com/novox/mesh-controller/internal/link 82.318s
ok github.com/novox/mesh-controller/internal/lint 1.922s
ok github.com/novox/mesh-controller/internal/outward 1.069s
ok github.com/novox/mesh-controller/internal/overlay 1.055s
ok github.com/novox/mesh-controller/internal/secrets 1.484s
ok github.com/novox/mesh-controller/internal/store 10.872s
ok github.com/novox/mesh-controller/internal/testbus 1.223s
ok github.com/novox/mesh-controller/internal/token 1.018s
```
mesh-admin
changed title from Say what each verb replaces, so the agent is pointed at it instead of a shell command (hq ADR 0242) to Say what each verb replaces, so the agent is pointed at it instead of a shell command (hq ADR 0245)2026-10-07 18:28:33 +00:00
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…
A seat's verb names the shell commands it is the mesh's way to do, and a module says it for its own
tools in its manifest; the tools verb and module list --json carry both, for the mesh MCP server's
search, the agent's instructions and the guard on its shell.
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-1791398644842724406 (builds --log build-1791398644842724406).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:46:45Z 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-07T18:46:45Z
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-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.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 409.710s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.059s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.104s
ok github.com/novox/mesh-controller/internal/artifacts 1.029s
ok github.com/novox/mesh-controller/internal/broker 2.632s
ok github.com/novox/mesh-controller/internal/builder 1.979s
ok github.com/novox/mesh-controller/internal/catalogue 3.555s
ok github.com/novox/mesh-controller/internal/conditions 2.318s
ok github.com/novox/mesh-controller/internal/envfile 1.057s
ok github.com/novox/mesh-controller/internal/facts 1.102s
ok github.com/novox/mesh-controller/internal/identity 47.139s
ok github.com/novox/mesh-controller/internal/inventory 257.773s
ok github.com/novox/mesh-controller/internal/lease 17.683s
ok github.com/novox/mesh-controller/internal/licences 44.295s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.097s
ok github.com/novox/mesh-controller/internal/link 73.005s
ok github.com/novox/mesh-controller/internal/lint 1.770s
ok github.com/novox/mesh-controller/internal/outward 1.078s
ok github.com/novox/mesh-controller/internal/overlay 1.067s
ok github.com/novox/mesh-controller/internal/secrets 1.394s
ok github.com/novox/mesh-controller/internal/store 16.831s
ok github.com/novox/mesh-controller/internal/testbus 1.392s
ok github.com/novox/mesh-controller/internal/token 1.014s
**Merge check** at `043d89be`
- `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-1791398644842724406` (`builds --log build-1791398644842724406`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:46:45Z 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-07T18:46:45Z
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-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.033s
ok github.com/novox/mesh-controller/cmd/mesh-controller 409.710s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.059s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.013s
ok github.com/novox/mesh-controller/examples/route-proxy 1.104s
ok github.com/novox/mesh-controller/internal/artifacts 1.029s
ok github.com/novox/mesh-controller/internal/broker 2.632s
ok github.com/novox/mesh-controller/internal/builder 1.979s
ok github.com/novox/mesh-controller/internal/catalogue 3.555s
ok github.com/novox/mesh-controller/internal/conditions 2.318s
ok github.com/novox/mesh-controller/internal/envfile 1.057s
ok github.com/novox/mesh-controller/internal/facts 1.102s
ok github.com/novox/mesh-controller/internal/identity 47.139s
ok github.com/novox/mesh-controller/internal/inventory 257.773s
ok github.com/novox/mesh-controller/internal/lease 17.683s
ok github.com/novox/mesh-controller/internal/licences 44.295s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.097s
ok github.com/novox/mesh-controller/internal/link 73.005s
ok github.com/novox/mesh-controller/internal/lint 1.770s
ok github.com/novox/mesh-controller/internal/outward 1.078s
ok github.com/novox/mesh-controller/internal/overlay 1.067s
ok github.com/novox/mesh-controller/internal/secrets 1.394s
ok github.com/novox/mesh-controller/internal/store 16.831s
ok github.com/novox/mesh-controller/internal/testbus 1.392s
ok github.com/novox/mesh-controller/internal/token 1.014s
```
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 g14 as build-1791399191578526040 (builds --log build-1791399191578526040).
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:46:45Z 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-07T18:46:45Z
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-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.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 172.352s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.009s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/route-proxy 1.194s
ok github.com/novox/mesh-controller/internal/artifacts 1.048s
ok github.com/novox/mesh-controller/internal/broker 2.550s
ok github.com/novox/mesh-controller/internal/builder 1.300s
ok github.com/novox/mesh-controller/internal/catalogue 3.842s
ok github.com/novox/mesh-controller/internal/conditions 1.983s
ok github.com/novox/mesh-controller/internal/envfile 1.027s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 6.257s
ok github.com/novox/mesh-controller/internal/inventory 95.677s
ok github.com/novox/mesh-controller/internal/lease 17.702s
ok github.com/novox/mesh-controller/internal/licences 5.592s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.006s
ok github.com/novox/mesh-controller/internal/link 48.418s
ok github.com/novox/mesh-controller/internal/lint 1.834s
ok github.com/novox/mesh-controller/internal/outward 1.040s
ok github.com/novox/mesh-controller/internal/overlay 1.027s
ok github.com/novox/mesh-controller/internal/secrets 1.471s
ok github.com/novox/mesh-controller/internal/store 3.857s
ok github.com/novox/mesh-controller/internal/testbus 1.187s
ok github.com/novox/mesh-controller/internal/token 1.017s
**Merge check** at `4469cab7`
- `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 g14 as `build-1791399191578526040` (`builds --log build-1791399191578526040`).
```
--- the gate: build-agent, mesh-controller, route-proxy
mesh-controller: ok, 46 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-07T18:46:45Z 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-07T18:46:45Z
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-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.037s
ok github.com/novox/mesh-controller/cmd/mesh-controller 172.352s
ok github.com/novox/mesh-controller/examples/objectstore-provisioner 1.009s
ok github.com/novox/mesh-controller/examples/postgres-provisioner 1.014s
ok github.com/novox/mesh-controller/examples/redis-provisioner 1.025s
ok github.com/novox/mesh-controller/examples/route-proxy 1.194s
ok github.com/novox/mesh-controller/internal/artifacts 1.048s
ok github.com/novox/mesh-controller/internal/broker 2.550s
ok github.com/novox/mesh-controller/internal/builder 1.300s
ok github.com/novox/mesh-controller/internal/catalogue 3.842s
ok github.com/novox/mesh-controller/internal/conditions 1.983s
ok github.com/novox/mesh-controller/internal/envfile 1.027s
ok github.com/novox/mesh-controller/internal/facts 1.032s
ok github.com/novox/mesh-controller/internal/identity 6.257s
ok github.com/novox/mesh-controller/internal/inventory 95.677s
ok github.com/novox/mesh-controller/internal/lease 17.702s
ok github.com/novox/mesh-controller/internal/licences 5.592s
ok github.com/novox/mesh-controller/internal/licences/adapters 1.006s
ok github.com/novox/mesh-controller/internal/link 48.418s
ok github.com/novox/mesh-controller/internal/lint 1.834s
ok github.com/novox/mesh-controller/internal/outward 1.040s
ok github.com/novox/mesh-controller/internal/overlay 1.027s
ok github.com/novox/mesh-controller/internal/secrets 1.471s
ok github.com/novox/mesh-controller/internal/store 3.857s
ok github.com/novox/mesh-controller/internal/testbus 1.187s
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.
The agent reached machines over ssh because nothing tied a verb to the command it replaces.
catalogue.Verbgains optionalreplaces(shell commands as typed), beside main'sOptional(both kept; rebased over #113, #115, #117). Read strictly like the rest of a verb's definition, so a module-defined seat's verb may carry it too.journalctl,systemctl status|restart|start|stop|enable|disable|list-units|--failed|is-active), node-hostname (cat /etc/hosts,getent hosts,edit /etc/hosts,HOSTALIASES,sed -i /etc/hosts), node-intrusion-prevention (fail2ban-client …), node-packet-filter (nft list ruleset,iptables -L,iptables-save,nft -f,nft delete,iptables -X), node-backup (restic snapshots|backup|restore), mesh-store (psql -l,psql), mesh-controller.node (hostnamectl,uptime). node-login-shell.execute deliberately replaces nothing: the generic shell is not the answer to a missing tool."replaces": {"docker_logs": ["docker logs"]}— refused when the key is not a declared tool, or an entry is empty, multi-line, over 80 characters or repeated.toolsanswersreplacesper verb;module list --jsonanswers each module'sreplaces. Both feed the mesh MCP server's search (mesh-tools#21) and the agent's table and guard (mesh-catalog#110).toolscarries it.Order: once this is live, a catalogue module may declare
replaces(docker's is the first follow-up) — before that the strict manifest read refuses it.hq ADR 0245.
Delivery
novox/mesh-controller@4469cab7f46f— superseded since 2026-10-07T19:17:40ZDelivery plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, 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
d0283ffdmesh/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 passedChange plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on g14 as
build-1791395572018786925(builds --log build-1791395572018786925).d0283ffdb1to0e5af8598fMerge check at
0e5af859mesh/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 passedChange plan — builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Run by the build seat on shanks as
build-1791396472398592725(builds --log build-1791396472398592725).Say what each verb replaces, so the agent is pointed at it instead of a shell command (hq ADR 0242)to Say what each verb replaces, so the agent is pointed at it instead of a shell command (hq ADR 0245)0e5af8598fto043d89bed2043d89bed2to4469cab7f4Merge check at
043d89bemesh/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-1791398644842724406(builds --log build-1791398644842724406).Merge check at
4469cab7mesh/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 g14 as
build-1791399191578526040(builds --log build-1791399191578526040).