Issue 298 and ADR 0246: a seat's new verb is promised before it is required
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 superseded: a newer head of the same pull request

Design 33 said a seat's verbs change additively, and section 3 made each
one a condition of holding, so a verb added in the controller and served
from the catalogue could land in neither order. It happened three times on
2026-10-07. Section 7 now says the three steps and how each is checked.
This commit is contained in:
jochen
2026-10-07 21:14:20 +02:00
parent 921ff3e6c4
commit e6a17b8bf6
6 changed files with 230 additions and 2 deletions
@@ -2,8 +2,9 @@
layer: to-be
status: implemented
code: [mesh-controller, mesh-tools]
updated: 2026-10-02
updated: 2026-10-07
decisions:
- 02-DECISIONS/0246-a-seats-new-verb-is-promised-before-it-is-required.md
- 02-DECISIONS/0170-the-firewall-seat-serves-its-verbs.md
- 02-DECISIONS/0179-the-intrusion-seat-serves-its-verbs-and-every-door-declares-its-jail.md
- 02-DECISIONS/0160-the-mesh-issues-an-assignments-subjects-and-a-runtime-serves-what-it-is-issued.md
@@ -131,6 +132,24 @@ A seat's tools are an interface and change like one. Additive within a version.
break a caller takes the version token the subject already has room for, and the two versions run side
by side until nothing is bound to the old one.
*Amended 2026-10-07 ([ADR 0246](../../02-DECISIONS/0246-a-seats-new-verb-is-promised-before-it-is-required.md),
[issue 298](../../04-ISSUES/298-a-new-seat-verb-deadlocks-across-two-repositories/00-report.md)):*
**additive takes two steps when the seat and its holder are in different repositories.** That is the
case for every mesh seat whose holder is a catalogue module. §3 makes every promised verb a condition of
holding, and a claim may name no verb the seat does not promise. So a verb added to the seat in the
controller refuses today's holder, and a holder that serves it is refused by today's controller. Neither
change can land first. An added verb therefore lands in three steps, each its own pull request:
1. **The controller promises the verb as optional.** A holder that serves it is accepted, and one that
does not yet serve it still holds the seat. The mark comes from the seat as compiled, so a seat row
read back from the store keeps it.
2. **Every holder serves it**, checked against a controller that already promises it.
3. **The controller requires it.** The mark is removed, and the verb is a condition of holding like the
rest.
A verb on a seat that nothing holds yet is required from the start. A change that breaks a caller is
still a new version.
## How it is checked
- **A holder missing a verb cannot take the seat.** One test per condition of holding, as the existing
@@ -142,6 +161,16 @@ by side until nothing is bound to the old one.
answer equals what the seats declare — if it needed a module up, it would not be a read.
- **Two nodes holding one node-scoped seat derive two addresses.** Checked by the same test as the rest
of the subject table.
- **An added verb lands in steps, and each step is checked (§7).** The controller's claim check refuses
a claim that serves a verb the seat does not promise, and a holder that misses a required verb. It runs
at registration, at handover, and in `module check`, which the catalogue's merge check runs over every
manifest with the controller the mesh runs. So a step out of order fails the pull request that took
it. That an optional verb stays optional when read back from the store is held by mesh-controller's
`TestAnOptionalVerbStaysOptionalInASetReadFromTheStore` (#114), and that a seat's row gains a verb's
new arguments by `TestASeatsVerbGainsTheArgumentsTheBinaryNames` (#114). Each added verb has its own
test that it is promised and not yet required: `TestTheDeliverySeatPromisesChecks` (#117) and
`TestFailedIsAnOptionalVerbOfTheServiceManager` (#114). **Not yet checked:** that step 3 happens. A
verb left optional binds no future holder ([issue 298](../../04-ISSUES/298-a-new-seat-verb-deadlocks-across-two-repositories/01-diagnosis.md)).
## What is built, 2026-09-30