diff --git a/02-DECISIONS/0272-the-operator-reaches-the-controller-with-mesh-cli-on-every-node-and-a-node-is-the-terminal-only-where-no-agent-runs-as-its-operator.md b/02-DECISIONS/0272-the-operator-reaches-the-controller-with-mesh-cli-on-every-node-and-a-node-is-the-terminal-only-where-no-agent-runs-as-its-operator.md index 7e7c5d68..51d555d6 100644 --- a/02-DECISIONS/0272-the-operator-reaches-the-controller-with-mesh-cli-on-every-node-and-a-node-is-the-terminal-only-where-no-agent-runs-as-its-operator.md +++ b/02-DECISIONS/0272-the-operator-reaches-the-controller-with-mesh-cli-on-every-node-and-a-node-is-the-terminal-only-where-no-agent-runs-as-its-operator.md @@ -17,7 +17,7 @@ Some changes to the mesh are made **at the controller's terminal** only: ([issue 339](../04-ISSUES/339-a-verb-can-place-a-directory-at-the-machines-own/00-report.md)); - the agent module's managed settings, tool servers and shared text ([issue 340](../04-ISSUES/340-an-agent-can-plant-a-hook-in-every-agent-session-on-the-mesh/00-report.md)); -- a node's agent account (ADR 0266, hq pull request 225, not yet merged), typed as +- a node's agent account ([ADR 0266](0266-on-the-control-node-agents-run-under-an-account-of-their-own-that-cannot-become-root-without-a-person.md)), typed as `mesh-controller node agent-account `. In the controller's code "the terminal" is a negative: a command line that did not come through a verb. The @@ -157,16 +157,20 @@ A line from node N, vouched as account A, **runs as the controller's terminal** judgement, heard within ADR 0266 §4's fifteen minutes, says it cannot become root without a person. The controller runs it as it runs a verb's line, in a fresh process of its own binary with its own environment, but -without `MESH_VERB`, and records the caller as *A through mesh-cli on N*. +without `MESH_VERB` and without the mark ADR 0266 puts on everything the serving controller starts, and records the +caller as *A through mesh-cli on N*. So the line reads as the terminal wherever the controller asks whether a +command was started there. **Which node is the control-node does not follow a verb.** Whoever chooses where the controller's module runs chooses the terminal, so the module is assigned and unassigned at the controller's terminal only; `assign` and `unassign` naming it through a verb are refused with the reason. **A line from N's operator account that is not the terminal is an ordinary call.** A `settings` line is composed as -the settings verb composes its own and meets that verb's refusals, the terminal-only keys among them; any other -line goes through exactly what the generic `command` verb does with a line: its refusals today, and its list of -reads once ADR 0266 §7 builds one. It runs with `MESH_VERB=mesh-cli`, so every terminal-only change is refused +the settings verb composes its own and meets that verb's refusals, the terminal-only keys among them. Any other +line meets exactly what the generic `command` verb does with a line: only its reading forms run +([ADR 0266](0266-on-the-control-node-agents-run-under-an-account-of-their-own-that-cannot-become-root-without-a-person.md) §7), and +never a command that is the terminal's alone — `node account` and `node agent-account` above all, which ADR 0266 +makes terminal-only, `token`, `operator`, a secret's accept, recover or export. It runs with `MESH_VERB=mesh-cli`, so every terminal-only change is refused with the controller's own reason. The answer adds one sentence saying why this account on this node is not the terminal: the node's agents may run as its operator. That account already reaches the mesh's verbs through the mesh MCP server, so this widens nothing. @@ -269,15 +273,20 @@ Each claim, and what holds it: - **Another namespace is refused, and one account cannot hold the socket**: the node-engine's tests refuse a peer whose namespaces differ, and answer a second line of a busy account *busy* at once while the first is still asked. -- **An ordinary `settings` line takes the settings verb's path**: the controller's test composes each form as the - verb does and refuses any other; an ordinary repair without `--why` meets the generic verb's refusal. -- **The control-node does not follow a verb**: the controller's test refuses assigning or unassigning its module - with `MESH_VERB` set, and lets the terminal do it. +- **An ordinary `settings` line takes the settings verb's path, and every other ordinary line only the generic verb's + reads**: the controller's tests compose each settings form as the verb does and refuse any other, and refuse + `node account`, `node agent-account`, `token issue`, `secret export`, `operator` and `assign` from an ordinary + line, each running nothing (they fail on the commit before ADR 0266's checks were applied to it). +- **The control-node does not follow a verb**: the controller's test asks the `assign` and `unassign` acts + themselves with `MESH_VERB` set and has both refused before any store is touched; with the refusal taken out of + the acts, the test fails. - **A line is never lost, and never said as nothing having run when it may have**: the controller's test follows a line that outlasts the answer window to its answer, over a bus, and refuses a follow by another account or node; the node-engine's tests follow a running line to its answer, say *not known* with the call when no - answer comes, and say *nothing ran* only of a request nobody took. A line's record keeps neither its line's - values nor its answer on the bus, and `calls` never shows its answer (mesh-controller `internal/link`). + answer comes or the request fails after it may have been delivered, and say *nothing ran* only of a request the + link knows it never asked. A line's record keeps neither its line's values nor its answer on the bus, and + `calls` never shows its answer; those tests search both the text and the base64 JSON writes bytes in, and each + fails when the withholding it guards is taken out (mesh-controller `internal/link`, `cmd/mesh-controller`). - **The `MESH_VERB` refusal in `mesh-cli` is a courtesy**: its test holds that the program refuses before asking; nothing rests on it, since the controller judges the vouched account whatever the program does. - **The module places one file**: the catalogue's test holds `mesh-cli` to one archive resource unpacking one @@ -308,4 +317,5 @@ Each claim, and what holds it: - [ADR 0267](0267-an-artifact-is-rebuilt-only-when-its-build-source-changes-and-a-module-moves-only-along-build-dependencies-on-artifacts.md): a module builds from its own source. - [ADR 0234](0234-the-mesh-holds-a-conversation-with-its-operator.md): proof and assurance. -- ADR 0266 (hq pull request 225) and ADR 0259 (hq pull request 211): not yet merged, so named without links. +- [ADR 0266](0266-on-the-control-node-agents-run-under-an-account-of-their-own-that-cannot-become-root-without-a-person.md): agents under an account of their own, and what is terminal-only. +- ADR 0259 (hq pull request 211): not yet merged, so named without a link.