# Seats — the dual-model operating protocol

> **Conformance:** L1 — binds every federation repo **and every AI agent session opened in one**, scarce-tier and executor-tier alike. The rules bind **seat behaviour**, which is in force the moment they are enacted; per-repo propagation of the dispatch block is **staged** under **SEAT-08**.
> **Audience:** every agent session in a federation repo; the supervisor deciding who does what; the founder ruling from a packet.
> **Propagation (DOC-18):** changing a rule here ripples — walk DOCUMENTATION.md §10.4 and update its dependents in the same commit: README *Index of MUSTs* + `rules.json` (regenerated) + FEDERATION.md §4 family table + SCOPE.md count + [`../../templates/SEAT_DISPATCH.md`](../../templates/SEAT_DISPATCH.md) (the one dispatch source — **SEAT-08**) + [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) (the full pattern), and — cross-repo, same change-wave, **supervisor-applied per AG-13** — the `mgf-fed standards` / `agents` CLI surfaces in `mgf-common`.

> **Scope.** *Which seat a session occupies, and what that seat may and may not do.* The
> federation runs **two AI capability tiers with asymmetric cost** — a top tier whose tokens are a
> finite block, and a strong executor whose tokens are effectively unlimited — plus one human. The
> question this family answers is never "which model is better." It is **which decisions are
> expensive to get wrong**, because that is the only thing worth the scarce tier. Governance
> write-authority over a federation **library** is [AG-13](AGENTS.md#AG-13)'s concern — only the
> `mgf-common` supervisor changes one; everyone else files in that library's `FEEDBACK.md` — and is
> not restated here; risky-action confirmation is [AG-06](AGENTS.md#AG-06)'s.

**THE ENABLING CONDITION — read this before any rule below.** Capability arbitrage only works
because **execution is engineered not to need the scarce tier**: executable gates as the definition
of done, goldens, deterministic double-runs, adversarial review rounds, staged plans. Every one of
those converts *"trust the model"* into *"check the output"* — which is exactly what makes it safe
to hand implementation to the abundant tier. **Build the gates first; the economics follow.** A
project without them cannot adopt this family by pasting the dispatch block alone.

**The federation already satisfies it.** This is why the pilot worked here on the first attempt and
why SEAT lands as law rather than as an experiment:

| The condition wants… | mgf already ships |
|---|---|
| Executable gates as the definition of done | The **four green gates** — lint / typecheck / test / import-linter, CI-enforced and merge-blocking ([WF-02](WORKFLOWS.md#WF-02), [WF-01](WORKFLOWS.md#WF-01)) |
| A canonical self-diagnostic an executor converges on | **`mgf-fed app-doctor`** (+ `--standards`), the [OP-02](OPERABILITY.md#OP-02) `doctor` surface and the [DOC-18](DOCUMENTATION.md#DOC-18) mechanical backstop |
| Goldens / byte-identity where the domain allows | [OB-10](OBSERVABILITY.md#OB-10) one-golden wire shape; the two-sided alignment tests DOC-18 names |
| Machine-checked corpus + registry currency | `gen_rules_index.py --check` (incl. `check_headline_coherence.py`), `gen_mgf_libraries.py --check` ([REL-13](RELEASING.md#REL-13)), `mgf-fed drift-check` |
| Staged, checkpointed plans an executor can run | The [DOC-06](DOCUMENTATION.md#DOC-06) tracker shape + the cohort-release / sync recipes |
| A tiered, supervised test gate | [TS-22..TS-28](TESTING.md) — `mgf-test-supervisor` tiers |

## The three seats

| Seat | Tier | Produces | Never |
|---|---|---|---|
| **Designer** (scarce) | Fable / Mythos-class | Contracts others execute: decision packets, threat models, complexity maps, adversarial verdicts, checkpointed runbooks. | Executes what has a playbook, a validator, or a golden to converge on. |
| **Executor** (abundant) | Opus / Sonnet / Haiku-class | Implementation against a ruled contract, the tests the contract names, playbook runs, CI babysitting, doc-currency sweeps, routine review rounds. | Redesigns a ruled decision, or enacts governance. |
| **Enactor** (human) | the founder | The **decision**. A recommendation becomes a ruling only by the human's recorded word. | — agents never self-enact ([AG-06](AGENTS.md#AG-06), [AG-13](AGENTS.md#AG-13), [`agent-empowerment-charter`](principles/agent-empowerment-charter.md)). |

---

## Rules box (read this first)

| ID | Rule |
|---|---|
| <a id="SEAT-01"></a>**SEAT-01** | **Three seats, one enactor MUST hold.** The scarce **designer** produces contracts, the abundant **executor** implements against them, and the **human enactor** alone decides. Agents propose, draft, verify, and advise; a recommendation becomes a ruling only by the human's recorded word. The split is enforced socially **and** mechanically — it is not a convention an agent may renegotiate mid-session. Consistent with [AG-06](AGENTS.md#AG-06) (risky actions need explicit confirmation), [AG-13](AGENTS.md#AG-13) (only the `mgf-common` supervisor changes a federation library), and the [Agent Empowerment Charter](principles/agent-empowerment-charter.md) (empowered to push back through the channels — never to enact). |
| <a id="SEAT-02"></a>**SEAT-02** | **Every session MUST identify its seat before it does the work.** A session determines its model class from its own system prompt and takes the matching seat before it acts. A session that does not know which seat it occupies defaults to the most expensive one — doing executor work at designer cost is the failure this family exists to prevent, and it is invisible unless the seat is named up front. The dispatch block of **SEAT-08** is what makes this automatic. |
| <a id="SEAT-03"></a>**SEAT-03** | **Altitude only: the scarce tier MUST NOT do what the executor can do against a written spec.** On discovering playbook-shaped work mid-session — implementation against a ruling, a doc-currency sweep, a catch-up run, test-writing to a decided matrix, a re-attestation, a routine review round, formatting — the designer **writes it down as an executor handoff and does not do it**. What earns the scarce tier is judgment under irreversibility: unbounded option spaces, adversarial reasoning, whole-program inference across the fleet, deciding *what to prove*, emergent dynamics, and long hijackable sequences (a cohort-release wave, a fleet rename). The taxonomy is [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) §3; the anti-scope list is §3's. |
| <a id="SEAT-04"></a>**SEAT-04** | **Spawns MUST NOT inherit the model: every subagent or workflow spawned from a scarce-tier session pins an explicit, cheaper model.** Inheritance is the measured leak — one audit spent roughly **three quarters of its scarce-tier budget on two sweep subagents that silently inherited the parent model** (the Sooth family's measured figure, carried here with attribution; mgf's own measured number is the workstation burn ratio in [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) §8, with its caveats). The tooling exposes a model parameter precisely so this rule is mechanically satisfiable; not passing it is the defect, and the subagent share of a session's burn is its tripwire (**SEAT-09**). |
| <a id="SEAT-05"></a>**SEAT-05** | **Durable output only: a scarce-tier session MUST end with its thinking in a committed document** — a decision packet, a complexity map, a ruling record, a runbook — committed **as each artifact finishes**, never batched to session close. Chat-only insight has a one-session half-life, and the uncommitted working tree is the only crash-loss surface. Commits carry the [AG-03](AGENTS.md#AG-03) trailers like any other. |
| <a id="SEAT-06"></a>**SEAT-06** | **The executor implements, and proposes; it MUST NOT re-rule.** An executor-tier session does not redesign a decision already ruled and does not enact governance. Observations that surface during implementation — and implementation **is** the sanctioned window for discovering them — go to the tracker, the open-questions list, or a FEEDBACK paper ([AG-04](AGENTS.md#AG-04) / [AG-10](AGENTS.md#AG-10) / [AG-11](AGENTS.md#AG-11)), where the designer amends the spec and the human ratifies. Spec, tracker, and code move in the **same recorded change** ([AG-14](AGENTS.md#AG-14) / [DOC-18](DOCUMENTATION.md#DOC-18)); silent divergence is the failure this family exists to prevent. Declining with a recorded rationale is conformant ([`non-adoption-is-valid`](principles/non-adoption-is-valid.md)); silently re-deciding is not. |
| <a id="SEAT-07"></a>**SEAT-07** | **The adversarial chair MUST be graded by the cost of a wrong CONCUR, not the prestige of the artifact.** Wherever a mistaken approval costs more than a mistaken finding — gate-opening rounds, golden re-blesses, frozen-evidence changes, a corpus amendment under [`../../LOCK.md`](../../LOCK.md), a release that opens the [REL-13](RELEASING.md#REL-13) federation gate — the **scarce** tier sits in the review chair; routine wedge and increment rounds are the executor's. A scarce verdict is cheap next to the irreversible mistake it prevents; this is the one *recurring* scarce-tier expense that is always justified. |
| <a id="SEAT-08"></a>**SEAT-08** | **The harness MUST re-teach the protocol every session, from one source.** Each repo's `docs/claude/CLAUDE.md` carries the seat-dispatch block copied **verbatim** from [`../../templates/SEAT_DISPATCH.md`](../../templates/SEAT_DISPATCH.md), adjusted only for that repo's tracker path — never re-worded per repo, because divergent dispatch text is how two repos come to believe different things about one protocol. The intended channel is the **managed auto-block** `mgf-fed catch-up` already maintains between its `BEGIN`/`END` markers — the same machinery that keeps [AG-01](AGENTS.md#AG-01)'s `AGENTS.md` and [AG-02](AGENTS.md#AG-02)'s project-lookup block fleet-current. That is *the channel `catch-up` will emit into once DB-S1-1 lands*; until then the block lives in the repo-owned region **below** the `END` marker, because `catch-up` regenerates the managed span wholesale (`_splice_auto_block`) and deletes any second block it finds (`_strip_orphan_auto_blocks`) — hand-written text inside the markers does not survive the next `--apply`. Project instructions load every session and the system prompt names the model, so this is the one channel that reaches every session regardless of what any agent remembers. **Per-repo propagation is staged** (see *Adoption posture* below). |
| <a id="SEAT-09"></a>**SEAT-09** | **Spend SHOULD be planned from measured burn, never from extrapolation.** Derive sessions-remaining from actual output-token history by model family, re-measured whenever spend is planned, and watch the subagent share as the **SEAT-04** tripwire. Budgeting by extrapolation produces phantom runway, discovered only when the block is already gone. The measurement loop is [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) §8. |

*(Family enacted — Sooth→mgf adoption wave S1, corpus **v3.5.0** EXTEND under [`LOCK.md`](../../LOCK.md) §2, founder-enacted; date recorded at merge.)*

---

## 1. Naming — four things called a "seat" here

The word collides in this federation. Disambiguated, canonically:

| Term | Means | Canonical home |
|---|---|---|
| **Seats / the dual-model protocol** | *This family* — which capability tier does which work, and who enacts. | `SEATS.md` + [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) |
| **A dual-seat court round** | A *review method*, not a model tier: counsel drafts, a fresh-context court seat attacks the committed pin, findings are answered by ID and folded. | The **court family** — [`REVIEW.md`](REVIEW.md) **CRT-01..12**, landed as adoption wave **S2** ([`../inprogress/SOOTH_ADOPTION.md`](../inprogress/SOOTH_ADOPTION.md)). Cite the rule IDs — CRT-01 (fresh-context chair), CRT-02 (committed pin), CRT-07 (answer by ID) — never "dual-seat". `hrb-app/docs/gui/GUI_ACCEPTANCE.md` remains the worked instance of a project's standing prompt, which CRT-12 keeps review-time material. |
| **The supervisor** | A *write-authority* role, not a model tier: per [AG-13](AGENTS.md#AG-13), only the `mgf-common` supervisor changes a federation **library**; other projects file in that library's `FEEDBACK.md`. [`LOCK.md`](../../LOCK.md) §6 lets the supervisor delegate a named, scoped wave. Orthogonal to seat: the supervisor role can be held from either tier. | `AGENTS.md` (AG-13) + `LOCK.md` §6 |
| **A repo-local seat directive** | A hand-pasted restatement of the protocol in one repo's `CLAUDE.md`. | **Superseded** — a repo carries the **SEAT-08** managed block instead, and any local directive becomes a pointer to it. |

Using "seat" or "dual-seat" unqualified in a decision record is ambiguous; cite the rule id, the
court lane, or AG-13 instead.

## 2. Why this is a family and not only a recipe

A discipline with no rule IDs cannot be cited in a review, cannot appear in the *Index of MUSTs*,
and cannot be checked by a gate — so its adoption stays invisible and drifts. That is the same
structural failure the propagation discipline had before [DOC-18](DOCUMENTATION.md#DOC-18) and the
memory discipline had before [AG-17](AGENTS.md#AG-17). The recipe
([`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md)) remains the full
pattern and the worked instantiation, and **wins on any conflict about detail**; this family is the
citable obligation layer.

## 3. Adoption posture (why nothing here fails today)

**SEAT-01** through **SEAT-07** and **SEAT-09** bind *behaviour*. They are in force for every
session the moment they are enacted and need no file to exist anywhere — a repo cannot be
non-conformant against them by omission, only by conduct.

**SEAT-08**'s per-repo dispatch block is **staged**: a repo that has not yet received it is
conformant while propagation is pending. Two things must land before a repo can be held to it, and
both land in federation libraries (`mgf-fed` / `mgf-common`), so both are **supervisor-applied per
[AG-13](AGENTS.md#AG-13)** (same change-wave
discipline as [AG-14](AGENTS.md#AG-14)):

1. `mgf-fed catch-up` learns to emit the seat block into the managed `docs/claude/CLAUDE.md`
   auto-block, from `templates/SEAT_DISPATCH.md` as its single source. That needs the template
   *resolvable from an installed wheel* — the `read_scaffold()` seam `catch-up` already uses for
   the AG-03 hook + trailer checker. Promoting the dispatch template into that seam changes
   `list_scaffold()`'s output, so it is an [AP-\*](API_DESIGN.md) public-surface decision for the
   founder, staged in [`../inprogress/SOOTH_ADOPTION.md`](../inprogress/SOOTH_ADOPTION.md) — not
   taken here.
2. A presence check follows (block present **and** byte-identical to the template modulo the
   tracker path) — the same shape **`catch-up`'s own audit step** already uses for `AGENTS.md`
   (AG-01), where a mismatched copy surfaces as a finding.

Until then the block is adopted per repo, opportunistically, and it sits **below** the managed
block's `END` marker — the repo-owned region — never between the markers (see **SEAT-08**). This is the federation's standing
warn-then-enforce order — the same staging the **PR-\*** DRAFT marker uses and the same *GATED*
class [`LOCK.md`](../../LOCK.md) §1 defines — and it keeps the family gateable on day one instead
of declaring 44 repos non-conformant for a mechanism that has not shipped yet.

## 4. Self-review checklist

Before calling a session done:

- [ ] **SEAT-02** — I named my seat from my system prompt before I acted, and the work I did
      belongs to that seat.
- [ ] **SEAT-03** — nothing I did had a playbook, a validator, or a golden to converge on (scarce
      tier); anything that did was written down as an executor handoff instead.
- [ ] **SEAT-04** — every `Agent` / workflow spawn in this session passed an explicit `model:`.
- [ ] **SEAT-05** — my thinking is in a committed document, committed as each artifact finished —
      not only in this conversation, and not batched to the end.
- [ ] **SEAT-06** — I did not redesign a ruled decision; every observation went to the tracker or
      a FEEDBACK paper, and spec + tracker + code moved together.
- [ ] **SEAT-07** — if this round could open a gate, re-bless a golden, amend the corpus, or ship a
      release, the scarce tier chaired it.
- [ ] **SEAT-01** — every decision in the artifact is a *recommendation with one option named*,
      awaiting the founder's recorded word. Nothing was self-enacted.

## 5. Mechanical enforcement

| Rule | Enforcement |
|---|---|
| SEAT-01 | Review-only (agent conduct). The standing aids are [AG-06](AGENTS.md#AG-06)'s confirmation requirement and the decision-box form — a packet whose boxes are marked RULED without a recorded founder word is the trigger for a reviewer prompt. |
| SEAT-02 | Mechanised by **SEAT-08**: the dispatch block states the seat rule at session start; without it, review-only. |
| SEAT-03 | Review-only. The tripwire is measurable: a scarce session whose burn dwarfs its deliverable (see SEAT-09). |
| SEAT-04 | Self-checkable **today** — the burn loop in [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) §8 reads the harness transcripts and shows scarce-model output attributable to subagents. Not CI-enforceable (the store is machine-local, like [AG-19](AGENTS.md#AG-19)). |
| SEAT-05 | Partly mechanical — an uncommitted working tree at session end is visible to `git status`; the discipline itself is review-enforced. |
| SEAT-06 | Review-enforced, backed by the [DOC-18](DOCUMENTATION.md#DOC-18) propagation gate (`mgf-fed app-doctor --standards`): a code change whose spec/tracker dependents are stale fails the same check that catches any un-propagated change. |
| SEAT-07 | Review-only. The round's own record names who chaired it; a gate-opening round chaired by the executor tier is a finding. |
| SEAT-08 | **Staged** — becomes mechanical when `mgf-fed catch-up` emits the block and `app-doctor` checks it (§3). Until then: presence is checked by hand at adoption time. `templates/SEAT_DISPATCH.md` being the single source is enforced by this doc's Propagation header + DOC-18. |
| SEAT-09 | Self-checkable via the §8 burn loop; not CI-enforceable by design (machine-local transcripts). |

---

## Provenance

**Adapted with attribution from the Sooth family.** The rule set, the three-seat table, the
enabling condition, and the naming-collision table are adapted from `sooth-standard`'s
`docs/standards/SEATS.md` (SEAT-01..09, founder-directed there 2026-07-15) and its companion
recipe. **This is a copy, not a dependency** (the Sooth family's **XF-03**): mgf takes on **no import edge,
no package dependency, and no cross-family resolution path** to the Sooth corpus — the two families are
independently versioned and may diverge. Rule IDs are kept aligned so a finding can be cited across
both families; the *text* is mgf's, and mgf's is authoritative here. The convergence is deliberate,
in the same spirit as [`LOCK.md`](../../LOCK.md) §5's shared-philosophy clause: a semantic change on
either side warrants a cross-family note to the other.

**Ported after field-proving, not before.** The protocol ran end-to-end inside this federation
before it was written down here — the **hrb-app release arc** of 2026-07-29/30, whose plan is a
decision packet in exactly this form and whose ledger is the evidence:
`hrb-app/docs/inprogress/RELEASE_MASTERPLAN.md` — §3 decision boxes DB-0..6 ruled by the founder
(SEAT-01), §4 an explicit gate-and-cost posture naming the seat protocol, and **§5 the append-only
ledger** carrying the arc's court verdicts.

Measured outcome, each figure traced to its recorded source:

| Figure | Recorded source |
|---|---|
| **14 merged PRs**, #10–#23 | the §5 ledger's per-wave close-out rows |
| **5 waves** (W1–W5), all ✅ | §2 |
| **≥10 court rounds**, counted by name from §5 | W2 ×2 (pass-1, pass-2 — *"Both court rounds returned"*); W3 ×5, per §5's own enumeration *"(contract trio, controller, brand, depth, closing)"*; W4 wave court ×1; the closing wave court ×1; plus the sibling consumer court on `mgf-uitest-desktop` (findings a–f). §5's summary line asserts 11; ten are individually enumerable, so ten is what this note claims. |
| suite **215 → 501** | 215 at the §1 baseline; 501 at the last measured gate run before the release cut (`hrb-app/docs/inprogress/MGF_STANDARDS_CONFORMANCE.md` §audit-log, 2026-07-30 W5.6). §5's summary line says 503 — a post-release docs-only line, not a gate output. |
| branch coverage **92.77%** | the measured branch-aware figure, recorded six times across the masterplan, `CHANGELOG.md`, and the conformance tracker. (§5's summary line's 92.85% appears once and is not a gate output.) |
| **4 dated entries** in `hrb-app/LESSON_LEARNED.md` | the file's own dated headings |
| one library founded → published → adopted | W4.8 (`mgf-uitest-desktop` 0.1.0) |

The arc closed by tagging **hrb-app v0.2.0** — the *consumer app's* version, not any library's and
not a corpus version.

**The relay-finish — the recorded evidence for SEAT-05.** Twice during the arc the **executor**
died mid-wave on server-side API errors (four consecutive failures in the W3 depth pass;
`RELEASE_MASTERPLAN.md:465-470`), and each time roughly **a thousand lines of implementation
survived in the dead executor's worktree** because they had been committed as they were produced.
Recovery was **twice-shaped**: once a **fresh executor** picked the work up from that worktree plus
the written contract; once — when the executor path was fully down (`:512`, three consecutive API
529/500) — the **designer finished at the bench**. The claim SEAT-05 supports is precisely this and
no more: *committed-as-you-go work outlives the session that produced it, and can be picked up by a
different seat.* It is **not** a claim that a program can be reconstructed from the ledger alone —
the worktree carried the code, the ledger carried the contract, and both were needed. That is why
the rule says *as each artifact finishes* rather than *before you stop*.

On any conflict with [`../recipes/dual-model-economics.md`](../recipes/dual-model-economics.md) at
HEAD, the recipe wins on detail and this doc takes a correction note.
