IR-002 step 4 — seam-tier assignment for the 13 remaining write verbs
Date: 2026-09-14 Status: closed Supersedes: none Superseded-by: none — current
Context
Section titled “Context”docs/decisions/2026-09-12-seam-class-taxonomy.md (IR-002 step 1) ratified
the AT0–AT3 taxonomy and ruled that a verb’s tier is set by a named,
dated decision document the verb’s schema then cites by id — never
proposed inline. docs/decisions/2026-09-12-seam-tier-carrier-field-schema-act.md
(step 2) added the carrier fields. host/tests/registry.test.ts’s
co-occurrence test (step 3, PR #445) enforces that the cited decision
actually names the tier and the verb together in one paragraph, not just
anywhere in the same file.
5 of 18 mutating tools are stamped today, all citing the taxonomy doc
because it happens to name them as its own worked examples:
petrova.sweeps.trigger (AT3), petrova.act.open_decision and
petrova.act.update_milestone (AT1), petrova.act.request_merge_when_green
and petrova.act.petrova_act_registry_edit (AT2). The remaining 13 act
verbs have no tier at all — not because they were judged and deferred, but
because the taxonomy doc never mentioned them by name, so no citation
against it could pass the step-3 validator. This doc is that missing
citation target for all 13, in one place, so IR-004 (the write-path gate
that reads these tiers) has something to actually gate once it starts.
This doc does not reopen the taxonomy itself (AT0–AT3’s definitions,
min-of-both’s still-unratified status) — only applies it to the 13
unassigned verbs, one paragraph each, per the assignment-authority
mechanism step 1 already ratified.
Decision
Section titled “Decision”Applying the taxonomy’s own worked criteria — single-repo/reversible/no-
privileged-path is AT1; anything that is a registry edit, a phase
transition, or otherwise changes governance state another repo reads is
AT2 — to each remaining verb:
AT1 — reversible, single-repo, no privileged path:
petrova.act.verify_round(verify_round) isAT1: emits a friction doc scoped to one repo, no merge request, no cross-repo governance state touched.petrova.act.request_review(request_review) isAT1: opens a PR for human review, single repo, does not request merge.petrova.act.propose_fix(propose_fix) isAT1: composes a fix PR bound to a prior diagnosis, single target repo, no merge request.petrova.act.materialise_bundle(materialise_bundle) isAT1: composesrequest_reviewunder the hood, writes only inside.panto/in the single target repo.petrova.act.petrova_install_playbook(petrova_install_playbook) isAT1: deposits boot-kit files into one consumer’s own.petrova/playbook/, refuses to overwrite by default.petrova.act.petrova_onboard(petrova_onboard) isAT1: writes one consumer’s own.petrova/contract.yamland an optional workflow file, scoped to that repo alone.petrova.act.wire_integration(wire_integration) isAT1: flips one consumer’s own integration block from pending to wired; requires its ownratifying_decision_doc_pathas an input, so the autonomy question for the specific flip is already gated per-call, independent of this tier.
AT2 — registry edit, phase transition, or other cross-repo governance
state:
petrova.act.start_phase(start_phase) isAT2: a phase transition, the taxonomy doc’s own named example category for this tier.petrova.act.close_phase(close_phase) isAT2: a phase transition, same category asstart_phase.petrova.act.declare_baseline(declare_baseline) isAT2: ratifies a new petrova baseline version that every consumer’s onboarding and compliance checks read — governance state other repos consume, the same shape as a registry edit even though it writes a decision doc rather thanregistry.yamldirectly.petrova.act.petrova_act_reconcile_drift(reconcile_drift) isAT2: a registry edit (bumpsregistry.yaml’scontract_shafor a slug).petrova.act.petrova_act_register_consumer(register_consumer) isAT2: a registry edit (adds a newregistry.yamlentry).petrova.act.petrova_act_deregister_consumer(deregister_consumer) isAT2: a registry edit (removes aregistry.yamlentry).
No verb here is AT3: none fires a real side effect outside version
control at write time (the AT3 definition’s own bar) — every one of the
13 only opens or amends a PR.
What this does NOT do
Section titled “What this does NOT do”- Does not touch
min-of-both— still withheld from ratification per step 1, pending its named falsification. - Does not itself update
host/src/registry.ts— per the assignment- authority mechanism, the schema/registry edit is a separate, subsequent, purely mechanical act once this doc is ratified (mirrors step 1 → step 2’s own sequencing 2026-09-12/13). - Does not gate any write path on these tiers — that is IR-004, still gated on its own human-ruling-required decision doc, unaffected by this one.
Consequences
Section titled “Consequences”Once ratified, the follow-up PR stamping seamTier/authorizingDecision
onto these 13 tools in host/src/registry.ts is mechanical: cite this
doc’s path for each, and host/tests/registry.test.ts’s existing
co-occurrence check (no new test needed) proves each citation actually
holds.
References
Section titled “References”irina/tickets/IR-002-seam-class-sequence.xmldocs/decisions/2026-09-12-seam-class-taxonomy.mddocs/decisions/2026-09-12-seam-tier-carrier-field-schema-act.mdhost/tests/registry.test.ts(the step-3 co-occurrence validator this doc’s paragraphs are written to satisfy)host/src/registry.ts(all 18 mutating tools,MUTATING_TOOLS)
Sign-off
Section titled “Sign-off”- Subagent: claude-sonnet-5 (session_01Ft2mfLuQC63sLqH3vGWxWA)
- Human: alex@devarno.com
Countersigned by human:alex@devarno.com on 2026-09-14 — commit cbe2fdfa
(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.