Design 58: milestones for the operator to confirm, owners named, and the as-is of logins on the bus (playbook 04)
mesh/merge-gate head 45e2d7e9722d merged into trunk 08d6476e5287 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 45e2d7e9722d merged into trunk 08d6476e5287 — pass: its merge-check.sh passed
mesh/delivery ready: it delivers once merged

This commit is contained in:
2026-10-16 03:03:21 +02:00
parent 9844020589
commit 45e2d7e972
3 changed files with 67 additions and 1 deletions
@@ -0,0 +1,41 @@
---
layer: as-is
status: implemented
code: [mesh-controller, mesh-tools]
updated: 2026-10-16
decisions:
- "ADR 0106"
---
# Logins on the bus, as they run
**The bus reads one static list of logins from its settings file, in one account, written by the controller from
its own records. Every module has a login per assignment; a person's login may call only the tools it was given;
the sessions on the operator's machines call through their machine's tool-runner login, which may call every tool.
Nothing marks what a tool does.** Read from the controller's and the tool runner's code on main on 2026-10-15
(research 053, question 8). Design 58 replaces it.
## The list
- **One list, one account.** The controller writes every login from its records into the bus's settings file;
the bus re-reads it without dropping connections (ADR 0106 §3).
- **A module's login per assignment**, named by machine and module, may publish and subscribe only what its
manifest declares it emits, consumes, serves and calls.
- **A person's login** may publish only to the tools it was given and listen only on its own inbox.
- **The caller is in the address.** A call's address carries the caller's name, so the runtime takes the caller
from the address, never from the message. For a seat every machine holds, the address also names the machine.
## What it cannot do
- **No expiry.** A login lives until its record is deleted and the list rewritten on the bus's node.
- **No per-agent login.** Agent sessions reach the bus through each machine's tool-runner login, which may call
every tool on the mesh; what one session did cannot be told from another's.
- **No effect.** No tool or seat verb declares whether it reads, acts or is dangerous; some module documents say
it in prose, and nothing reads that.
- **Asks and warrants exist** (ADR 0259): a module can have one act authorised by the operator, bound to that
act; nothing yet asks for a dangerous call by itself.
## How it is checked
By reading: the controller's code that renders the bus's settings and the tool runner's caller check, on main.
When design 58's switch is done, this document is replaced by the as-is of signed logins.
+1
View File
@@ -24,6 +24,7 @@ Where the two disagree, the implementation wins and the disagreement is stated.
| [`13-the-console.md`](13-the-console.md) | The mesh's tools on the machine a person sits at, served by a module the mesh assigned there |
| [`14-a-modules-state.md`](14-a-modules-state.md) | A module's current state on the bus: what the controller creates, the runtime serves, and the first live use showed |
| [`15-the-agent-and-its-licences.md`](15-the-agent-and-its-licences.md) | The operator's agent on every machine and the licence manager that keeps its licences |
| [`16-logins-on-the-bus.md`](16-logins-on-the-bus.md) | The bus's one list of logins, a login per module assignment, persons limited to their tools, sessions calling through the tool runner's login, and no effect on any tool |
## What these documents are not
@@ -1,7 +1,7 @@
---
layer: to-be
status: designed
code: []
code: [mesh-catalog, mesh-media-catalog, mesh-sdk, mesh-tools, mesh-controller, mesh-host, mesh-lab]
updated: 2026-10-16
decisions:
- "ADR 0383"
@@ -155,3 +155,27 @@ carry them:
4. The switch, run on the mesh's own modules in the lab from the bed test kept on the lab's branch
`research/053-signed-bus-logins`, loses nothing and leaves every identity on the new bus.
5. The acceptance sentence at the top, end to end.
## 11. Milestones
Each milestone is one feature step (playbook 07), usable as soon as its delivery plan is done, and starts when
the previous one's is. What it replaces is in the as-is documents
[15 — The agent and its licences](../00-as-is/15-the-agent-and-its-licences.md) and
[16 — Logins on the bus](../00-as-is/16-logins-on-the-bus.md). The issues are opened once the operator confirms
the milestones, and their numbers written here.
| # | Outcome, in one sentence | Proves | Repositories and their parts | Depends on |
|---|---|---|---|---|
| 1 | Every tool on the mesh says whether it reads, acts or is dangerous, a tool's description shows it, and the catalogue refuses a module that leaves one unmarked | test 3 | mesh-sdk: the effect in a tool's declaration, an unmarked tool served as dangerous; mesh-controller: the manifest field; mesh-catalog and mesh-media-catalog: every module marked, the check | — |
| 2 | A session works on a repository's workspace through the mesh's tools alone: read, glob, search, edit, write, git, its tests and its merge check, with no command runner | — | mesh-catalog: the module `nox-workspace` on the node seat `workspace`, on the always-on nodes; mesh-controller: the seat | 1 |
| 3 | A thread created through the thread seat runs headless on an always-on node, its conversation readable through the seat, its usage counted per thread, and a move to another node loses at most the turn in progress | — | mesh-catalog: `nox-threads` (seat `thread`, restricted streams, leases), `nox-thread-handler` (seat `thread-handler`), claude-code (mirror and rebuild), claude-licence-manager (usage per thread) | 2 |
| 4 | The operator starts, follows, answers and stops a thread from a terminal client, and answers its questions on Telegram | — | mesh-catalog: the terminal client, a Go program of `nox-threads`; claude-code: questions and permission requests through the asks | 3 |
| 5 | Every session runs in a sandbox of its own that reaches only the vendor and the bus, and the home server runs one too | tests 1 and 2 | mesh-catalog: the sandbox module (microsandbox pinned, KVM loaded where off); `nox-thread-handler`: runs sessions in it; claude-code: writes the login and the licence token without its refresh part | 3 |
| 6 | Every person, agent and module is an identity with a role, and an agent's call outside its role is refused, saying which grant is missing | — | mesh-catalog: the identity seat's module; mesh-sdk: the tool runner's exact check, calls carrying thread and agent token; mesh-controller: an identity asked for each assignment; mesh-tools: sessions call as a person or an agent, never through the tool runner's login | 1 |
| 7 | A dangerous act not named in a role comes to the operator as an ask, and the sealed break-glass agent opens only on the operator's word or a named condition | test 5 | mesh-sdk: dangerous calls asked; identity module: dangerous tools granted by name on an ask, break-glass and its telling | 6, 5, 4 |
| 8 | The bus checks signed logins on a second bus beside today's, the identity seat signs and revokes them, and the switch, run in the lab on the mesh's own modules, loses nothing | test 4 | identity module: signing keys, renewal, revocation read back and resent to new servers; the node-engine (`mesh-host`): node and module logins renewed; mesh-controller: the second bus as a leaf with the system account; mesh-lab: the bed test from the branch `research/053-signed-bus-logins` | 6 |
| 9 | Every identity is on the new bus, its data moved by copy, and today's bus is switched off | — | mesh-controller and the identity module: one identity at a time, then streams, buckets and the object store; mesh-catalog: the old bus's module retired | 8 |
| 10 | The operator follows and answers threads from the web page as from the terminal client, logged in as a person identity | — | mesh-catalog: the web page, a client of the thread seat over the bus's WebSocket listener | 9, 4 |
The front ends' later parts, the inference seat and the other agent harnesses are tracked by issue 850; the
seat-sense "role" in older designs by issue 872.