Say the uplink verbs shipped optional, not staged: a progressive insight in ADR 0241, corrected in to-be 48
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

The controller that merged (mesh-controller #116) dropped the staged seat and
marked both verbs optional, stored in the seat's row and read back optional.
This commit is contained in:
jochen
2026-10-07 21:18:11 +02:00
parent e6a17b8bf6
commit 91daabaa97
3 changed files with 21 additions and 3 deletions
@@ -144,6 +144,18 @@ Nobody opens a terminal on the machine. The verbs are *staged*: promised and rou
of holding the seat, and never stored in the seat's row. A controller older than them reads the row and
would refuse every holder of its time. A later change requires them once both holders serve them.
> **Progressive insight — 2026-10-07.** The verbs did not ship *staged*. This rule said they were
> "promised and routed, but not yet a condition of holding the seat, and never stored in the seat's row",
> and the check for rule 8 in the table below said "a staged verb is never seeded into the row and comes
> back from the binary". The controller that merged (mesh-controller #116) has no staged seat. It marks
> both verbs optional (`Verb.Optional`). An optional verb is promised, so a claim serving it is accepted,
> but it is not required, so a holder serving neither still holds the seat. It is seeded into the seat's
> row like any verb, and it stays optional when read back, because the mark is taken from the seat as
> compiled. Mesh-controller's `TestTheUplinkVerbsReadBackFromTheRowStayOptional` holds that. The
> decision is unchanged: promised now, required once both holders serve them. The general rule for a verb
> added to a held seat is [ADR 0246](0246-a-seats-new-verb-is-promised-before-it-is-required.md), from
> [issue 298](../04-ISSUES/298-a-new-seat-verb-deadlocks-across-two-repositories/00-report.md).
## Consequences
- **The VPN rewriting the laptop's file is said within about a minute,** naming FortiClient from its
@@ -261,7 +261,10 @@ the machine itself, beside its liveness looks, and says it in the same statement
- **It reads and never acts** (§7). The reconcile writes the file back as it always has.
- **Asked further through the uplink seat.** `node-uplink` serves `resolvers` (the file, whether it is the
mesh's, its writer) and `links` (each link, its default route, the resolvers its manager knows). They are the
same from every holder, and staged until both holders serve them.
same from every holder, and optional until both holders serve them: promised, so a holder may serve them,
and not yet required to hold the seat (mesh-controller #116; the three steps of an added verb are
[ADR 0246](../../02-DECISIONS/0246-a-seats-new-verb-is-promised-before-it-is-required.md), from
[issue 298](../../04-ISSUES/298-a-new-seat-verb-deadlocks-across-two-repositories/00-report.md)).
## Phases
@@ -41,7 +41,10 @@ optional verb is promised, so a claim that serves it is accepted, but it is not
that does not serve it still holds the seat. `failed` was first written as required and refused today's
holder. #114 made it optional and fixed a second hole. The mark was never stored, so a verb seeded into
a seat row came back required when the row was read. The working set now takes the mark from the
compiled seat. #116 adds the uplink verbs as optional from the start.
compiled seat. #116 adds the uplink verbs as optional from the start. ADR 0241 rule 8 and to-be 48 §10
had called those two verbs *staged*, never stored in the seat's row. That was corrected on the day,
as a progressive insight in ADR 0241 and in place in to-be 48: they are optional, stored in the row, and
read back optional.
## Why it is a design issue
@@ -62,7 +65,7 @@ controller first promises the verb as optional, the holder serves it, and the co
- `TestFailedIsAnOptionalVerbOfTheServiceManager`, `TestAnOptionalVerbStaysOptionalInASetReadFromTheStore`
and `TestASeatsVerbGainsTheArgumentsTheBinaryNames` (#114);
- `TestTheUplinkSeatPromisesItsVerbsAndRequiresNoneYet` and
`TestTheUplinkVerbsReadBackFromTheRowStayOptional` (#116, open).
`TestTheUplinkVerbsReadBackFromTheRowStayOptional` (#116).
The trail is in [01-diagnosis.md](01-diagnosis.md). This is a core issue: at resolution it names its
replay, or says in `replay-none:` why none is possible (ADR 0237).