Root cause of hq issue 244.schemaWithoutNode took node out of every tool's schema, and mesh_call deleted node from every call's arguments — right for an address that names the machine (<node>/<seat>.<verb>, <node>/<module>.<tool>), wrong for a seat held once for the mesh, where node is the verb's own argument. So the controller's verbs were described and called without the machine they act on:
push → {}: mesh_call mesh-controller.push {"node": "…"} arrived empty and ran as push --behind — every machine behind was pushed by someone who meant one.
plan / node → {}, and plan needs "node" whatever was sent.
(The controller's records — mesh-controller.tools — always carried node; only the console lost it.)
Fix
schemaAsPassed: node is taken out only where the address names the machine.
argumentsAsSent: where the address names the machine, a node naming the same one is dropped as redundant, a different one is refused; where it does not, node goes to the tool. A seat verb's call carrying an argument its schema does not declare is refused, naming it — never sent to be passed over.
Paired with novox/mesh-controller (the verb side of the same safety net: undeclared/unused arguments refused, push without a machine says it is the whole mesh).
Tests
New TestAMeshSeatsNodeIsItsOwnArgument (no bus needed).
gofmt -l, go vet ./..., go test ./... clean. The bus-backed console tests (MESH_TEST_NATS) fail identically on main against a bare nats -js container here, so they were not a usable signal locally — worth running in the usual lab before merging.
**Root cause of hq issue 244.** `schemaWithoutNode` took `node` out of every tool's schema, and `mesh_call` deleted `node` from every call's arguments — right for an address that names the machine (`<node>/<seat>.<verb>`, `<node>/<module>.<tool>`), wrong for a seat held once for the mesh, where `node` is the verb's own argument. So the controller's verbs were described and called without the machine they act on:
- `push` → `{}`: `mesh_call mesh-controller.push {"node": "…"}` arrived empty and ran as `push --behind` — every machine behind was pushed by someone who meant one.
- `plan` / `node` → `{}`, and `plan needs "node"` whatever was sent.
- `assign`, `unassign`, `pin`, `unpin`, `issue`, `settings`, `rotate`, `pause`, `resume` → no node.
(The controller's records — `mesh-controller.tools` — always carried `node`; only the console lost it.)
## Fix
- `schemaAsPassed`: `node` is taken out only where the address names the machine.
- `argumentsAsSent`: where the address names the machine, a `node` naming the same one is dropped as redundant, a different one is **refused**; where it does not, `node` goes to the tool. A seat verb's call carrying an argument its schema does not declare is **refused, naming it** — never sent to be passed over.
Paired with novox/mesh-controller (the verb side of the same safety net: undeclared/unused arguments refused, push without a machine says it is the whole mesh).
## Tests
- New `TestAMeshSeatsNodeIsItsOwnArgument` (no bus needed).
- `gofmt -l`, `go vet ./...`, `go test ./...` clean. The bus-backed console tests (`MESH_TEST_NATS`) fail identically on `main` against a bare `nats -js` container here, so they were not a usable signal locally — worth running in the usual lab before merging.
The console took node out of every schema and every call, so the
controller's push, plan, assign, pin and settings were described without
the machine and called without it: a push naming one machine ran as a
push of every machine behind (hq issue 244). node is now taken out only
where the address names the machine, a different machine there is
refused, and an argument a seat's verb does not declare is refused.
Deliverynovox/mesh-tools@9730bd89c3e4 — held since 2026-10-06T23:05:28Z
Held for a person: merged without a passing check: only a person decides that it goes on — mesh-delivery.release with why lets it go on.
Delivery plan — builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step
tier 0: mesh-tools, node-tools
ace: receives node-tools
g14: receives node-tools
novox: receives node-tools
shanks: receives node-tools
node-tools provides mcp-endpoint: its consumers are sent again after it
Transitions
2026-10-06 23:05 (new) → proposed (announced): novox/mesh-tools#14 merged; its head was not heard by this owner, so it is made from the forge's word
2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-tools@9730bd89c3e4` — **held** since 2026-10-06T23:05:28Z
Held for a person: merged without a passing check: only a person decides that it goes on — `mesh-delivery.release` with why lets it go on.
**Delivery plan** — builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step
- tier 0: mesh-tools, node-tools
- ace: receives node-tools
- g14: receives node-tools
- novox: receives node-tools
- shanks: receives node-tools
- node-tools provides mcp-endpoint: its consumers are sent again after it
**Transitions**
- 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-tools#14 merged; its head was not heard by this owner, so it is made from the forge's word
- 2026-10-06 23:05 proposed → held (merged-unchecked): merged without a passing check — a verdict known with it is taken first: only a person decides that it goes on
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
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.
Root cause of hq issue 244.
schemaWithoutNodetooknodeout of every tool's schema, andmesh_calldeletednodefrom every call's arguments — right for an address that names the machine (<node>/<seat>.<verb>,<node>/<module>.<tool>), wrong for a seat held once for the mesh, wherenodeis the verb's own argument. So the controller's verbs were described and called without the machine they act on:push→{}:mesh_call mesh-controller.push {"node": "…"}arrived empty and ran aspush --behind— every machine behind was pushed by someone who meant one.plan/node→{}, andplan needs "node"whatever was sent.assign,unassign,pin,unpin,issue,settings,rotate,pause,resume→ no node.(The controller's records —
mesh-controller.tools— always carriednode; only the console lost it.)Fix
schemaAsPassed:nodeis taken out only where the address names the machine.argumentsAsSent: where the address names the machine, anodenaming the same one is dropped as redundant, a different one is refused; where it does not,nodegoes to the tool. A seat verb's call carrying an argument its schema does not declare is refused, naming it — never sent to be passed over.Paired with novox/mesh-controller (the verb side of the same safety net: undeclared/unused arguments refused, push without a machine says it is the whole mesh).
Tests
TestAMeshSeatsNodeIsItsOwnArgument(no bus needed).gofmt -l,go vet ./...,go test ./...clean. The bus-backed console tests (MESH_TEST_NATS) fail identically onmainagainst a barenats -jscontainer here, so they were not a usable signal locally — worth running in the usual lab before merging.Delivery
novox/mesh-tools@9730bd89c3e4— held since 2026-10-06T23:05:28ZHeld for a person: merged without a passing check: only a person decides that it goes on —
mesh-delivery.releasewith why lets it go on.Delivery plan — builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.