Skip to content

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

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.

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) is AT1: emits a friction doc scoped to one repo, no merge request, no cross-repo governance state touched.
  • petrova.act.request_review (request_review) is AT1: opens a PR for human review, single repo, does not request merge.
  • petrova.act.propose_fix (propose_fix) is AT1: composes a fix PR bound to a prior diagnosis, single target repo, no merge request.
  • petrova.act.materialise_bundle (materialise_bundle) is AT1: composes request_review under the hood, writes only inside .panto/ in the single target repo.
  • petrova.act.petrova_install_playbook (petrova_install_playbook) is AT1: deposits boot-kit files into one consumer’s own .petrova/playbook/, refuses to overwrite by default.
  • petrova.act.petrova_onboard (petrova_onboard) is AT1: writes one consumer’s own .petrova/contract.yaml and an optional workflow file, scoped to that repo alone.
  • petrova.act.wire_integration (wire_integration) is AT1: flips one consumer’s own integration block from pending to wired; requires its own ratifying_decision_doc_path as 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) is AT2: a phase transition, the taxonomy doc’s own named example category for this tier.
  • petrova.act.close_phase (close_phase) is AT2: a phase transition, same category as start_phase.
  • petrova.act.declare_baseline (declare_baseline) is AT2: 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 than registry.yaml directly.
  • petrova.act.petrova_act_reconcile_drift (reconcile_drift) is AT2: a registry edit (bumps registry.yaml’s contract_sha for a slug).
  • petrova.act.petrova_act_register_consumer (register_consumer) is AT2: a registry edit (adds a new registry.yaml entry).
  • petrova.act.petrova_act_deregister_consumer (deregister_consumer) is AT2: a registry edit (removes a registry.yaml entry).

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.

  • 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.

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.

  • irina/tickets/IR-002-seam-class-sequence.xml
  • docs/decisions/2026-09-12-seam-class-taxonomy.md
  • docs/decisions/2026-09-12-seam-tier-carrier-field-schema-act.md
  • host/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)
  • 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.