diff --git a/03-DESIGN/00-as-is/13-the-console.md b/03-DESIGN/00-as-is/13-the-console.md index c24d94b..c45170b 100644 --- a/03-DESIGN/00-as-is/13-the-console.md +++ b/03-DESIGN/00-as-is/13-the-console.md @@ -38,7 +38,8 @@ The console asks the `mesh-controller` seat's `tools` verb beside the modules an tools as `.` — `mesh-controller.status`, `mesh-controller.push` and the other ten. A call to `.` reaches the seat when the prefix is a seat declaring that verb, and the module otherwise; `seat:.` says so outright. When the control plane does not answer, the list -names `mesh-controller (seat)` as not answering and carries the modules' tools regardless. +names `mesh-controller (seat)` as not answering and carries the modules' tools regardless. The +`mesh-controller` *module* is always named as not answering: it serves no module tools, only its seat's. ## Around it diff --git a/03-DESIGN/01-to-be/33-the-tools-the-mesh-answers.md b/03-DESIGN/01-to-be/33-the-tools-the-mesh-answers.md index 9e0d28a..e1215ac 100644 --- a/03-DESIGN/01-to-be/33-the-tools-the-mesh-answers.md +++ b/03-DESIGN/01-to-be/33-the-tools-the-mesh-answers.md @@ -1,6 +1,6 @@ --- layer: to-be -status: in-progress +status: implemented code: [mesh-controller, mesh-tools] updated: 2026-09-30 decisions: @@ -139,6 +139,24 @@ verb answers every seat's tools from the records, because the console cannot rea console lists a role's tools beside the modules' own and resolves `.` to the seat when the seat declares that verb. Which verbs each *other* seat serves stays a decision per seat, still untaken. +## What shipped, 2026-09-30 + +mesh-controller PRs 166 and 167, mesh-tools PR 21. Verified on the live mesh the same evening: the +console on a workstation lists the twelve verbs as `mesh-controller.` beside 67 module tools, and +`mesh-controller.nodes` and `mesh-controller.status` answer through it with what the commands print. + +Two things shipped bent. **The grant arrived after the holder started**: the controller composes the +bus's user list and a push delivers it, so the first controller to serve its seat subscribed before +the broker's list named the grant, the server refused all twelve subscriptions, and the client never +retried — a holder now rebinds a refused subscription every thirty seconds (PR 167), and a controller +roll-out that adds a grant is followed by a push to the broker node. **A JSON verb's answer was parsed +from both output streams**, so `status --json`'s warnings hid the document as data; the answer is now +parsed from standard output alone (mesh-controller PR 168, pending). The `output` field carried it +either way. + +What stays as designed and not built: which verbs any *other* seat serves, and §3 for module-declared +seats' schemas beyond the names their manifests already list. + ## What this does not settle - Which verbs each seat should serve. That is a decision per seat, and the reason to do it slowly: a