The controller side of hq issue 244. The root cause — the console dropping node from every schema and call — is fixed in novox/mesh-tools; this makes the controller's own verbs refuse instead of ignoring, so the next loss of an argument on the way fails loudly.
Safety net
argvFor now checks a call against this binary's own verb table (catalogue.ControllerVerbs) and refuses, naming the argument:
an argument the verb does not declare (push {"machine": …} no longer runs as a whole-mesh push);
an argument it declares but did not use for the command line it composed — given beside one that wins (push node+behind, plans id+stop, builds log+module, settings clear+values, both rotate shapes) or half a shape (rotate {node});
a switch that is not "true"/"false" (switches are now enum in the schema), or a non-text value.
tools refuses arguments too.
push with no machine prints first: no machine named: this is a push of the WHOLE mesh — every machine that is behind (N): a, b, …, and N node(s) told now names them (also the shell's push/push --behind).
Schemas
plan + files; push + behind (the whole mesh said outright; refused with node); builds/plans + limit (-n). Switches carry enum: [true,false]. The start-up runnability check samples only required arguments (it used to add node/module/repository to every verb).
Tests that walk every served verb (from the announcement, as the console sees it)
TestNoArgumentAVerbIsGivenIsPassedOver — for every verb and every subset of its declared arguments: refused, or every given argument changes the command line. (One recorded exception: push behind, which says the default aloud.) Also fails if the command line reads an argument the schema does not declare.
TestAnArgumentAVerbDoesNotDeclareIsRefused — every verb, plus node for every verb without one.
TestEveryFlagOfAVerbsCommandIsAnArgumentOrAccountedFor — parses this package's source for every flag.NewFlagSet and its flags; every flag of the command a verb reaches must be a schema property or listed in accountedFlags with a reason (set by the verb / withheld / carried as another name). Stale entries fail too. A new verb or new flag cannot regress silently.
gofmt -l, go vet ./..., go test ./... clean (live tests skip without a DB).
Note: the live seat row is older than this binary (e.g. builds lacks log), so the console's schemas follow the running controller; they refresh when this is rolled out.
The controller side of hq issue 244. The root cause — the console dropping `node` from every schema and call — is fixed in novox/mesh-tools; this makes the controller's own verbs refuse instead of ignoring, so the next loss of an argument on the way fails loudly.
## Safety net
`argvFor` now checks a call against this binary's own verb table (`catalogue.ControllerVerbs`) and refuses, naming the argument:
- an argument the verb does not declare (`push {"machine": …}` no longer runs as a whole-mesh push);
- an argument it declares but did not use for the command line it composed — given beside one that wins (`push node+behind`, `plans id+stop`, `builds log+module`, `settings clear+values`, both `rotate` shapes) or half a shape (`rotate {node}`);
- a switch that is not "true"/"false" (switches are now `enum` in the schema), or a non-text value.
- `tools` refuses arguments too.
`push` with no machine prints first: `no machine named: this is a push of the WHOLE mesh — every machine that is behind (N): a, b, …`, and `N node(s) told` now names them (also the shell's `push`/`push --behind`).
## Schemas
`plan` + `files`; `push` + `behind` (the whole mesh said outright; refused with `node`); `builds`/`plans` + `limit` (`-n`). Switches carry `enum: [true,false]`. The start-up runnability check samples only required arguments (it used to add node/module/repository to every verb).
## Tests that walk every served verb (from the announcement, as the console sees it)
- `TestNoArgumentAVerbIsGivenIsPassedOver` — for every verb and every subset of its declared arguments: refused, or every given argument changes the command line. (One recorded exception: `push behind`, which says the default aloud.) Also fails if the command line reads an argument the schema does not declare.
- `TestAnArgumentAVerbDoesNotDeclareIsRefused` — every verb, plus `node` for every verb without one.
- `TestEveryFlagOfAVerbsCommandIsAnArgumentOrAccountedFor` — parses this package's source for every `flag.NewFlagSet` and its flags; every flag of the command a verb reaches must be a schema property or listed in `accountedFlags` with a reason (set by the verb / withheld / carried as another name). Stale entries fail too. A new verb or new flag cannot regress silently.
- `TestAPushIsOneMachineOrSaysItIsTheWholeMesh`, `TestEveryRequiredArgumentIsDescribed`.
`gofmt -l`, `go vet ./...`, `go test ./...` clean (live tests skip without a DB).
Note: the live seat row is older than this binary (e.g. `builds` lacks `log`), so the console's schemas follow the running controller; they refresh when this is rolled out.
A push naming one machine reached the verb without it and pushed every
machine behind (hq issue 244). The controller now refuses any argument a
verb does not declare, any it composed its command line without, and a
switch that is not true or false; a push that names no machine says first
that it is the whole mesh. Tests walk every served verb: no argument is
ever ignored, and every flag of a verb's command, read from the source, is
in its schema or accounted for. plan gains files, push behind, builds and
plans limit.
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
Transitions
2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#71 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-controller@ede9bce6ef12` — **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 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
**Transitions**
- 2026-10-06 23:05 (new) → proposed (announced): novox/mesh-controller#71 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`.
This repo is archived. You cannot comment on pull requests.
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 controller side of hq issue 244. The root cause — the console dropping
nodefrom every schema and call — is fixed in novox/mesh-tools; this makes the controller's own verbs refuse instead of ignoring, so the next loss of an argument on the way fails loudly.Safety net
argvFornow checks a call against this binary's own verb table (catalogue.ControllerVerbs) and refuses, naming the argument:push {"machine": …}no longer runs as a whole-mesh push);push node+behind,plans id+stop,builds log+module,settings clear+values, bothrotateshapes) or half a shape (rotate {node});enumin the schema), or a non-text value.toolsrefuses arguments too.pushwith no machine prints first:no machine named: this is a push of the WHOLE mesh — every machine that is behind (N): a, b, …, andN node(s) toldnow names them (also the shell'spush/push --behind).Schemas
plan+files;push+behind(the whole mesh said outright; refused withnode);builds/plans+limit(-n). Switches carryenum: [true,false]. The start-up runnability check samples only required arguments (it used to add node/module/repository to every verb).Tests that walk every served verb (from the announcement, as the console sees it)
TestNoArgumentAVerbIsGivenIsPassedOver— for every verb and every subset of its declared arguments: refused, or every given argument changes the command line. (One recorded exception:push behind, which says the default aloud.) Also fails if the command line reads an argument the schema does not declare.TestAnArgumentAVerbDoesNotDeclareIsRefused— every verb, plusnodefor every verb without one.TestEveryFlagOfAVerbsCommandIsAnArgumentOrAccountedFor— parses this package's source for everyflag.NewFlagSetand its flags; every flag of the command a verb reaches must be a schema property or listed inaccountedFlagswith a reason (set by the verb / withheld / carried as another name). Stale entries fail too. A new verb or new flag cannot regress silently.TestAPushIsOneMachineOrSaysItIsTheWholeMesh,TestEveryRequiredArgumentIsDescribed.gofmt -l,go vet ./...,go test ./...clean (live tests skip without a DB).Note: the live seat row is older than this binary (e.g.
buildslackslog), so the console's schemas follow the running controller; they refresh when this is rolled out.Delivery
novox/mesh-controller@ede9bce6ef12— 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 build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step
Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.