Skip to content

Seam-class taxonomy, assignment authority, and profile composition

Date: 2026-09-12 Status: closed — ratified 2026-09-13 (both boxes countersigned; min-of-both falsification recorded in stratt-hq TK-petrova-min-of-both-0001) Supersedes: none Superseded-by: none — current

Amended 2026-09-12, same day, pre-ratification — reconciled against mary-wiki PR #653 (docs/decisions/2026-09-12-autonomy-tier-taxonomy- drafted-f-072.md), drafted the same day by an independent pass over the same irina/SYNTHESIS.md §1.1 gap from MARY’s side. Three points changed from the version originally merged as #433, named below rather than silently rewritten. This doc’s own Context already invited edit pre-ratification (“a proposal for you to edit or replace, not a fact already established”); this amendment exercises exactly that invitation, once, before either doc’s countersign box is ticked.

irina/SYNTHESIS.md §1.1 (2026-09-11 synthesis) found that FR-003’s ruled seam-class ceilings have no carrier anywhere in the corpus: neither the PETROVA verb envelope ({verb, target_repo, idempotency_key, dry_run, actor, triggered_by} + params) nor the registry row (slug, url, default_branch, contract_sha, role, profile, fleets_allowed) nor .petrova/contract.yaml carries a class field. Classes “A-D” are referenced by name throughout the corpus (FR-003, irina/IRINA-SCOPE-FANOUT-2.xml decided_inputs) but — per irina/SYNTHESIS.md line 370 — never enumerated or assigned anywhere. irina/tickets/IR-002-seam-class-sequence.xml files this as a 4-step sequence; this doc is step 1, the ratification the other three steps (schema act, validator, population) are blocked on.

This doc also carries the second open question SYNTHESIS.md §1.1 flags as load-bearing: how a seam-class ceiling composes with the registry’s profile field when the two disagree (e.g. a top-tier seam attempted in a permissive-profile repo). SYNTHESIS.md proposes “min-of-both” as the defensible default but is explicit that adopting it silently would itself invent a fact.

Three changes made in this amendment, and why:

  1. Renamed Class A–Class D to AT0–AT3 (“autonomy tier”). mary-wiki’s own corpus already overloads the term class-A with three distinct referents (a money-seam class under FR-003, an alert-severity class under FR-004, and a repo-autonomy tier under FR-005) — ruled real but deliberately not widened further (mary-wiki F-096, “worth ruling for the wake path’s clarity, not for this draft”). This taxonomy is a fourth, cross-repo referent for the same four letters and would repeat exactly the mistake F-096 declined to make, in a corpus MARY’s own agents read and cite. AT0–AT3 is a disjoint name; the four ordered tiers below are otherwise unchanged in substance from the original A–D definitions.
  2. min-of-both composition is stated but withheld from ratification, pending a named falsification. mary-wiki PR #653 applies its own negative-evidence rule (FR-021) to this exact borrowed default: a composition rule that has never been run against a concrete case in either direction is not yet evidence that it holds in either direction. The rule is not rejected — it remains the standing proposal — but this doc’s sign-off is split into two independently-tickable boxes so the taxonomy and assignment mechanism (which have no such open falsification) are not held hostage to a check that hasn’t been run.
  3. Assignment authority tightened: the original text (“verb author proposes a class at schema-authoring time; a human reviewer ratifies it as part of normal PR review — no separate ceremony”) reintroduces the hazard irina/SYNTHESIS.md §7 names in its own words: “an agent that decides when to ask holds a fraction of the gate.” A verb-schema PR review is a real check, but it is the same reviewer-in-the-loop shape the synthesis explicitly warns is not equivalent to a deterministic, pre-ratified ask-condition — a tired or fast reviewer approving a verb-schema diff is not the same act as a reviewer deliberately ratifying an autonomy grant. Tightened below to require the tier be backed by its own named, dated decision — the verb-schema PR then only cites that decision’s id, it does not propose the tier de novo.

Taxonomy. Four ordered tiers, increasing in what a seam is allowed to do without a human in the loop before the act completes:

  • AT0 — read/observe. No mutation. Every petrova.* read tool and petrova.cupel.trace_status today. Not gated by this taxonomy at all — included for completeness of the ladder, not because it needs a ceiling.
  • AT1 — reversible write, low blast radius. Opens a PR but touches no privileged path (mirrors the existing NO_PRIVILEGED_PATHS verb precondition) and is scoped to a single repo. Example: petrova.act.open_decision, petrova.act.update_milestone.
  • AT2 — reversible write, wider blast radius. Opens a PR that changes governance state read by other repos (registry edits, phase transitions) or requests a merge (petrova.act.request_merge_when_green). Reversible in principle (revert commit, re-open phase) but the reversal is a second act, not automatic.
  • AT3 — irreversible or externally-visible. Anything that fires a real side effect outside version control at write time: petrova.sweeps.trigger (starts a CI run), any future verb that calls an external paid API, sends a notification, or touches money. No verb in the current registry is AT3 by this definition except petrova.sweeps.trigger — flagged explicitly because it mutates without an act. prefix (per host/src/registry.ts’s own header comment) and is exactly the kind of tool a name-based classifier would miss.

Assignment authority and moment. A verb’s tier is not proposed and ratified inline inside the spec/verbs/<verb>.schema.json PR that introduces or changes it. It is set by a named, dated decision document (this one, for the four verbs enumerated above; a new one for each future verb or reclassification) that the schema PR then cites by id — the schema PR carries no tier judgment of its own, only a citation to a decision that already made one. This is mechanical, not discretionary, at the point a verb ships: spec/verbs/<verb>.schema.json gains a required seam_tier field whose value must match a tier this or a future decision document has already assigned to that verb name; a schema PR proposing a seam_tier value with no matching decision citation fails review on that ground alone, the same way an unratified human_ratify claim would. Reclassifying an existing verb follows the same path: a new decision, never a silent schema edit.

Composition with registry profile — stated, not ratified. The proposed rule, unchanged in substance: min-of-both. The effective ceiling for a given (verb, repo) pair is the stricter of the verb’s own tier and whatever ceiling the repo’s profile independently implies for its own axis (permissive/standard/strict, mapped once profile itself grows a documented tier-ceiling mapping — out of scope for this doc, tracked separately). A repo cannot loosen a verb’s ceiling by being permissive; a verb cannot force a stricter repo to accept a tier it refuses. This rule is withheld from ratification (see the second sign- off box below) until a concrete falsification is run and recorded, showing both: (a) a strict-profile repo’s ceiling does not silently defeat a tier grant a permissive-profile repo would otherwise honour when it shouldn’t be defeated, and (b) a permissive-profile repo does not let a low-tier grant escalate past what a stricter repo’s profile would allow. Until that record exists, citing min-of-both as ratified policy is exactly the unfalsified-default problem mary-wiki’s FR-021 exists to name.

  • Max-of-both composition — rejected: would let a permissive-profile repo grant an AT3 verb more room than the verb’s own tier allows, inverting the point of having a per-verb ceiling at all.
  • No taxonomy — gate everything through NO_PRIVILEGED_PATHS and FLEETS_ALLOWED* alone — rejected: those are path- and repo-scoped refusals, not a graduated ceiling; they cannot express “this verb is fine everywhere except it must never run unattended,” which is the actual shape of the AT3 case (petrova.sweeps.trigger).
  • Five or more tiers — considered and rejected for v1: SYNTHESIS.md’s own corpus references stop at four; adding granularity before any consumer exists to need it would be inventing precision nobody asked for.
  • Keep Class A–Class D naming — rejected in this amendment: reuses a term mary-wiki’s own F-096 already found overloaded with three senses, in a corpus MARY’s agents read and cite directly. A fourth sense is the exact mistake that ruling declined to make.
  • Ratify min-of-both now, on SYNTHESIS.md’s recommendation alone — rejected in this amendment: SYNTHESIS.md itself calls the rule “defensible,” not proven, and flags it as undecided. Adopting another document’s unverified assertion as ratified policy is not the same as independently verifying it.
  • Let a verb-schema PR both propose and ratify a tier in one review — rejected in this amendment, replaced by the decision-first, schema-cites model above, for the reason given in Context point 3.

For code: none yet — this doc ratifies the taxonomy, assignment mechanism, and min-of-both composition (both sign-off boxes ticked 2026-09-13). irina/tickets/IR-002-seam-class-sequence.xml steps 2-4 (schema act, validator, population) are unblocked and may now implement min-of-both as live policy. A profile→tier-ceiling mapping (what each profile value’s ceiling actually is) is still not ratified anywhere — that is a separate, tracked decision step 2-4 still needs before composition can run against real registry data.

For docs: none beyond this file. irina/SYNTHESIS.md §1.1’s “UNDECIDED” framing for the taxonomy, assignment mechanism, and min-of-both composition is resolved by this doc as of both boxes being signed. SYNTHESIS.md itself is not edited (it’s a dated scoping artifact, not updated in place per MR-7).

For in-flight phases: none.

For invariants: none changed. FR-003 (“ceilings are set by class, not by console”) gains, for the first time, an actual tier definition to be set by — AT0–AT3 here supplies that definition; mary-wiki continues to use class-A for its own three pre-existing senses, unaffected by this doc.

  • irina/SYNTHESIS.md §1.1, §7 (source of the “no carrier” finding, the min-of-both proposal, and the “agent decides when to ask” hazard)
  • irina/tickets/IR-002-seam-class-sequence.xml (this doc is step 1 of 4)
  • irina/LANES-M1-M4.md M2 (lane return that scoped this sequence)
  • host/src/registry.ts (verb envelope + mutating flag; no class field exists there today)
  • mary-wiki PR #653, docs/decisions/2026-09-12-autonomy-tier-taxonomy- drafted-f-072.md — the reconciling document this amendment aligns with; mary-wiki F-096 (the class-A overload ruling this amendment defers to) and FR-021 (the negative-evidence rule this amendment applies to min-of-both)
  • Subagent: claude-sonnet-5 (session_015i7EhMadZvtfUZcniDzdq6, amended 2026-09-12 by a later session reconciling against mary-wiki #653)
  • Human countersign (Alex Devarno, 2026-09-13) — ratifies the AT0–AT3 taxonomy as defined above and the decision-first/schema-cites assignment mechanism. irina/tickets/IR-002-seam-class-sequence.xml steps 2-4 are unblocked; they must not assume min-of-both is live policy per the second box below.
  • Human countersign (Alex Devarno, 2026-09-13) — ratifies min-of-both composition with registry profile. Falsification run and recorded in stratt-hq (repo stratt-hq/stratt-run) as TK-petrova-min-of-both-0001, commits 8a2bcbe/09f9249/fbdce16 on its main: C1 (direction a — strict ceiling not silently defeated), C2 (direction b — permissive ceiling does not let a verb’s tier escalate), C3 (regression — ordinary case unaffected), all RED-proved then GREEN (traces/TR-petrova-min-of-both-0001-C{1,2,3}.yaml). No profile→tier- ceiling mapping is ratified by this — that remains a separate, tracked decision; this only confirms the composition rule’s shape holds.

Countersigned by human:alex@devarno.com on 2026-09-13 — both boxes above, commit f48ad212 (this file’s creation commit) is authored by the human directly, per docs/decisions/2026-09-05-proxy-countersign-retired.md’s post-retirement definition. Line added retroactively by the agent as scribe.