Files
stack/docs/PRDs/2026-08-31_PRD_rev1/SEAT.1-seat-profile.md
T
jason.woltje ad21ad7ac5
ci/woodpecker/pr/ci Pipeline failed
docs: ratify PRD rev1 — consolidated bundle, permanent shim, rev0 archived
Ratifies the Mosaic Stack PRD rev1 (Jason Woltje, 2026-09-01) as project
source of truth and installs the GOV.1 lifecycle model:

- docs/PRD.md becomes a permanent shim (kind: shim, current_rev ->
  docs/PRDs/2026-08-31_PRD_rev1/). Its path never changes again.
- docs/PRDs/2026-08-26_PRD_rev0/PRD.md archives the 2026-08-26 North Star
  verbatim (sha256 60cc2f98...36afdf unchanged). Archive, never delete.
- docs/PRDs/2026-08-31_PRD_rev1/ is the frozen rev1 bundle: 18 sectioned
  documents (VIS, DATA, AUTHN, AUTHZ, SEAT, ROLE, HARN, PROV, SESS, UI, CLI,
  GOV.1-5) consolidating rev0 D1-D15, the fleet north star, the agent-runtime
  L1/L2 contracts and the control-plane-surfaces lane findings, with a single
  decision map (GOV.3) and a closed open-questions frontier (GOV.5, grill
  rounds 1-8). Drafting inputs (_source-* snapshots) are not shipped.

Consequences of the ratified rulings carried in the same change:

- Q-T1 (ruling B, "shipped but frozen"): D3 amended in GOV.3/VIS.1;
  federation M1-M3 acknowledged as shipped behind tier === 'federated',
  excluded from the v1 bar and frozen, with a security re-audit gate before
  any resumption. docs/MISSION-MANIFEST.md, docs/federation/MISSION-MANIFEST.md
  and docs/scratchpads/mvp-20260312.md get status: superseded + banners
  (content preserved verbatim); docs/guides/deployment.md gains a
  "Relationship to the PRD (D15)" section. NORTH_STAR.yaml adds dormant
  workstream M (projects no goals by design); NORTH_STAR.md regenerated.
- Q-G2 (distinct registry prefixes): every citation of the operator
  DECISION-REGISTER in the bundle reads OD-nn; the stack registry stays
  D1-D15; L1-Dnn/L2-Dnn untouched. Prefix rule recorded in GOV.1.

Follow-ups (not in this PR): CI parity drift-gate witness (Q-C1); brain-side
DECISION-REGISTER rename to OD- with redirect table on its next touch.
2026-09-01 18:32:14 -05:00

4.1 KiB

id, status, ratified
id status ratified
SEAT.1 ratified 2026-09-01 (Jason Woltje; PRD rev1 ratification PR)

SEAT.1 — Seat identity, profile, and configuration

Instance contract (register OD-48)

File Carries
profile.json structured identity — and, post-consolidation, the full seat record (DATA.1-record-authority §consolidation)
overlay.json generated composition
seat-local AGENTS.md narrative specialization
SOUL.md persona

Seat configuration surface (WebUI page + CLI)

Control Notes
harness from enabled harnesses only (HARN.1-harness-config)
model constrained by the harness's available-models allowlist
reasoning level
work dir
authentication account from configured, active accounts allowed for that harness (AUTHN.1-auth-accounts)
overlay per-seat overlay only — never the role file (ROLE separation rule)
role binding separated section — see below

The role-binding control (gap G5)

Role Binding is the single highest-authority action in the system, principal-only under L2-D13. model is a preference. They must not share one undifferentiated form — a privilege grant must not inherit the ceremony of a dropdown. Requirements:

  • Visually and structurally separate section on the page.
  • Distinct confirmation step; re-authentication of the principal is under consideration (GOV.5-open-questions Q-S2).
  • Register OD-02/OD-03 bind the semantics: a seat has exactly one role; an active session never switches roles. A role change reconfigures the existing seat, preserves identity and history, discards ephemeral context, and starts a clean session. The surface must say so before confirming.
  • Role-transition history is recorded: old role, new role, reason, authorizer, checkpoint, activation time (register OD-04).

Role changes are therefore a different operation from harness/model/provider changes (SESS.1-session-continuity) and must not share a code path.

Seat identity and credential rules (pulled 2026-08-31 from seat-identity draft)

  • One seat = one identity = one token slot. A second copy of a token anywhere is drift and is removed without reading it.
  • Agents never mint their own tokens; provisioning, rotation, and scope changes are operator authority. Credential refusal is correct behavior — the fix is the seat's identity, never another seat's or a shared credential.
  • Fail-closed everywhere: an empty/unreadable slot is a designed state reported at launch; the credential helper refuses, records, notifies — never falls back to a shared or owner credential.
  • Git identity resolution order: explicit environment identity → configured identity → git's own answer. Identity is named on every invocation and never persisted inside a shared clone/worktree config (silent attribution rewrite). Commit author must identify the seat that did the work.
  • Tokens are compared by digest, never by value; scopes are verified from the authority's own report, never transcription.

E2 inputs (triage 2026-08-31; see GOV.2-docs-inventory)

Canonical ground truth: fleet/reference/agent-mutations.md, fleet/reference/lifecycle-transitions.md (enabled/desired_state authority), fleet/how-to/create-update-delete-agent.md, guides/fleet-local-canary.md. Pending pulls: brain docs/guides/proposed/operations/seat-identity.md (credential-resolution mechanics under the OD-48 instance contract).

Role-binding step-up ruling (Q-S2, Jason 2026-09-01)

Confirming a role-binding change requires fresh principal re-authentication no older than 10 minutes — the same step-up bar the S2 identity-lifecycle contract sets for account linking. An active session alone is insufficient; this closes the stolen-session → privilege-misdirection path through the seat surface.

Seat record consolidation ruling (Q-D1, Jason 2026-09-01)

launch.env consolidates into profile.json: one seat record. Verified: mosaic-core/lib/loader.ts seatRole() reads only the role key from a generically-parsed record, so widened files are tolerated by construction.