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.
Context
Section titled “Context”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:
- Renamed
Class A–Class DtoAT0–AT3(“autonomy tier”).mary-wiki’s own corpus already overloads the termclass-Awith 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-wikiF-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–AT3is a disjoint name; the four ordered tiers below are otherwise unchanged in substance from the original A–D definitions. min-of-bothcomposition is stated but withheld from ratification, pending a named falsification.mary-wikiPR #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.- 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 §7names 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.
Decision
Section titled “Decision”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. Everypetrova.*read tool andpetrova.cupel.trace_statustoday. 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 existingNO_PRIVILEGED_PATHSverb 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 isAT3by this definition exceptpetrova.sweeps.trigger— flagged explicitly because it mutates without anact.prefix (perhost/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.
Alternatives considered
Section titled “Alternatives considered”- Max-of-both composition — rejected: would let a permissive-profile
repo grant an
AT3verb 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_PATHSandFLEETS_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 theAT3case (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 Dnaming — rejected in this amendment: reuses a termmary-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-bothnow, onSYNTHESIS.md’s recommendation alone — rejected in this amendment:SYNTHESIS.mditself 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.
Consequences
Section titled “Consequences”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.
References
Section titled “References”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.mdM2 (lane return that scoped this sequence)host/src/registry.ts(verb envelope +mutatingflag; no class field exists there today)mary-wikiPR #653,docs/decisions/2026-09-12-autonomy-tier-taxonomy- drafted-f-072.md— the reconciling document this amendment aligns with;mary-wikiF-096 (theclass-Aoverload ruling this amendment defers to) and FR-021 (the negative-evidence rule this amendment applies tomin-of-both)
Sign-off
Section titled “Sign-off”- 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–AT3taxonomy as defined above and the decision-first/schema-cites assignment mechanism.irina/tickets/IR-002-seam-class-sequence.xmlsteps 2-4 are unblocked; they must not assumemin-of-bothis live policy per the second box below. - Human countersign (Alex Devarno, 2026-09-13) — ratifies
min-of-bothcomposition with registryprofile. Falsification run and recorded instratt-hq(repostratt-hq/stratt-run) asTK-petrova-min-of-both-0001, commits 8a2bcbe/09f9249/fbdce16 on itsmain: 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.