Narrow ADR 0287's claimant rule to any seat naming the path, and correct two facts the review found
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered

This commit is contained in:
jochen
2026-10-10 21:57:24 +02:00
parent 6b49ed613c
commit 906d702b8d
3 changed files with 35 additions and 25 deletions
+9 -5
View File
@@ -264,18 +264,22 @@ is compiled with the set and never stored, like what it needs, and changing it i
**Holding the seat means declaring its paths.** A module that claims the seat declares every path it names,
as a resource or as a file the mesh renders for it. `CanHold` refuses a claim without them, at registration
and at handover, naming the missing paths, beside the verbs it already requires.
and at handover, naming the missing paths, beside the verbs it already requires. A seat a module declares
for itself is held to the same rule by the registration check that judges what its holder serves.
**Only a claimant declares a seat's path.** Any other module declaring it is refused at registration, and
**Only a claimant declares a seat's path.** A module that claims no seat naming the path, and declares it, is
refused at registration, naming the seats that name it, and
what the controller generates is refused at composition by the same rule, which is how the controller is
held to writing no file a seat's holder owns. Reading the path is access and stays open to every module.
**One seat per path, with a declared step-back.** Every path has exactly one seat naming it outright. A
second seat may name it only *stepping back for* that seat: where the other seat is held on the machine, its
holder owns the path, and the stepping-back seat's holder does not declare it there. The uplink steps back
holder owns the path, and the stepping-back seat's holder still declares it, but its declaration is not
composed on that machine. The uplink steps back
for a machine's own resolver this way ([ADR 0247](../../02-DECISIONS/0247-a-machine-with-a-vpn-client-routes-names-by-domain-through-a-resolver-of-its-own.md)),
and the collision check reads that from the seat rather than from a case of its own. A module declaring a
seat that names a path another seat already names is refused at registration.
seat that names a path another seat already names is refused at registration: only the mesh's own seats
step back, each by a record.
**The listing shows each seat's paths**, so the controller's `seats` verb answers who owns a path on a
machine: the seat that names it, and that seat's holder there.
@@ -339,7 +343,7 @@ checked as their tables say:
| A replicated seat has every holder on record and composes on each; a seat held once still refuses a second holder, on record or not; `--add` is refused for it | 0223: resolution and composition tests with two holders on record and a third machine, with two claimants and nothing on record, and on `mesh-store`; a unit test that only `mesh-dns-resolver` is replicated, surviving the store's rows; store tests keeping several holders once each, a handover leaving one, and unassigning one taking only its row. |
| A retired seat leaves the set once nothing claims it, from the compiled set and the store's table both | 0220: the closed-set test's count, and the store migration that deletes the row. |
| A node seat names only literal absolute paths; every path has one seat naming it outright, and stepping back does not cycle | 0287: a unit test over the compiled set; registration tests refusing a module's seat naming a path at mesh scope, with `${`, or already named by another seat. |
| A holder declares every path its seat names, and only a claimant declares one | 0287: `CanHold` tests at registration and handover (declared as a resource, as a rendered file, not at all); a registration test refusing `/etc/hosts` from a module not claiming `node-hostname`; a composition test refusing a generated resource on a seat's path. |
| A holder declares every path its seat names, and only a claimant declares one | 0287: `CanHold` tests at registration and handover (declared as a resource, as a rendered file, not at all); a registration test refusing `/etc/hosts` from a module not claiming `node-hostname`, and one accepting the uplink and the resolver both declaring `/etc/resolv.conf`; a composition test refusing a generated resource on a seat's path. |
| The uplink's step-back comes from the seat | 0287: the composition tests for the uplink and the resolver on one machine pass with the case in the collision check removed. |
| Holdings are derived, and the overview lists every seat | 0118: the `seats` command test, including an unheld seat. |
| A build source on the seat records no address; an unheld seat refuses only self-hosted builds | 0111's tests. |