Skip to content

2026-05-13-petrova-baseline-v1


title: PETROVA Baseline v1 — Data Hygiene + Governance Propagation date: 2026-05-13 status: ratified mr_compliance: [MR-1, MR-4, MR-7, MR-8, MR-12, MR-13]

Section titled “title: PETROVA Baseline v1 — Data Hygiene + Governance Propagation date: 2026-05-13 status: ratified mr_compliance: [MR-1, MR-4, MR-7, MR-8, MR-12, MR-13]”

Until 2026-05-13, the PETROVA control plane reported phase and acts state honestly for exactly one repo (skyflow-hq). The other 28 GitHub orgs the Petrova-act App is installed on rendered as silent dots or empty rows on /console/phases and /console/acts. Three distinct conditions were collapsed into the same blank cell: (a) the sweep had never run against the repo, (b) the sweep ran but the repo’s decision-doc filenames didn’t match ^(\d{4}-\d{2}-\d{2})-, and (c) the repo legitimately had no phase activity yet. The dashboard could not prove the fleet was in a known state, so “baseline” was unprovable.

This decision declares PETROVA Baseline v1: every org the Petrova-act GitHub App is installed on (29 total) is represented in registry.yaml, every active or dormant fleet repo has the canonical docs-invariants workflow installed, every dashboard cell distinguishes “onboarded” from “no phases yet” from “not onboarded”, and every sweep diagnostic surfaces the reason for an empty result instead of producing silent nulls. Scope was confirmed with the operator on 2026-05-13 as “data + governance propagation” — explicitly excluding a petrova-onboard verb, a declare-baseline verb, and an MR-14 audit check. Baseline declaration is this decision doc, not a verb-emitted artefact.

Baseline v1 is declared as of 2026-05-13. The fleet inventory, evidence map, and follow-up registry below constitute the baseline contract. Re-declaration as Baseline v2 will happen via a successor decision doc (per MR-7 append-only history); intermediate corrections that don’t break the v1 contract land as routine PRs without a new ADR.

Onboarded as governance repos (25): petrova-codes (control plane, role:control-plane), kahn-hq, stratt-hq, choco-hq, devarno-cloud, traceo-mcp-server, grace-hq, rocky-hq, eva-hq, skyflow-hq, smo1-io, oompa-tools (active, role:production), chronicle-hq, aphelion-craft, casa-nuova, iris-hq, k41ex, nestr-tools, so1-io, sparki-tools, tektree-io, v01t-io, cookr-hq, reactr-dev, featr-io (13 dormant, role:scaffold).

Placeholders (4): asgard-codes, thrustr-io, downlink-hq, pwplz — App-installed, no repos accessible at discovery time. Registered with role: placeholder and no url:. The schema relaxation that allows this is part of the Baseline v1 contract.

fleets_allowed: [] for every new entry (consistent with control-plane policy — agent automation requires an explicit subsequent governance change).

PhaseArtefactReference
0NNNN frontmatter precondition tablepre-baseline/2026-05-13/nnnn-precondition.md
0Pre-baseline state snapshot (11 yamls + 3 jsonls)pre-baseline/2026-05-13/state/
0Auto-discovery sanity check (29 = 29 vs gh.env)conversation log; reproducible via host/src/github-auth.ts:discoverInstallations()
118-org classification (1 active / 13 dormant / 4 placeholder)pre-baseline/2026-05-13/phase1-org-classification.yaml
2Control-plane changes (CLI multi-installation auth, sweep diagnostics, phases tri-state, registry expansion)PR petrova-codes#67 (merged 2026-05-13)
3NNNN→dated decision-doc migrations5 PRs across consumer orgs: kahn-hq #68, stratt-hq #62, devarno-cloud #38, rocky-hq #28, oompa-tools #2. 49 file renames, ~150 cross-references rewritten total.
4docs-invariants workflow propagation21 PRs across consumer orgs (full list in conversation log of 2026-05-13).
5This decision docdocs/decisions/2026-05-13-petrova-baseline-v1.md

Acceptance gate for “Baseline v1 declared”: all Phase 3 and Phase 4 PRs merged; a final petrova sweep-state --commit-state run produces zero (filename_convention_mismatch) hints across the active+dormant set. The operator may declare Baseline v1 before every PR is merged (this doc is the declaration), with a note in a follow-up sweep-state snapshot to confirm the post-merge state was clean.

Scope boundaries (deferred to future baselines)

Section titled “Scope boundaries (deferred to future baselines)”
  • No petrova-onboard verb. Bootstrap remains prose-driven (00-bootstrap.md); the workflow propagated in Phase 4 is the enforcement gate going forward, not a verb.
  • No declare-baseline verb. Baseline declaration is decision-doc-only. Future “Baseline v2” will be another decision doc, not an idempotent CLI call.
  • No MR-14 audit check for “is docs-invariants.yml installed”. The check exists implicitly via the dashboard tri-state (not_onboarded rows are visually obvious) and the sweep diagnostics ((no_decisions_dir) hints).
  • No registry-level audit that walks each repo to confirm workflow SHA matches canonical. Drift detection here is a known follow-up; until it lands, conformance is enforced at PR time (by the workflow in each repo) and reviewed at the next baseline.
  • No automatic acts backfill for repos whose past phase events were direct-commit. The acts surface remains act = signed verb PR as recorded by the 2026-05-13 skyflow-hq decision (docs/decisions/2026-05-13-phase-events-via-petrova-cli.md in skyflow-hq).

Known follow-up gaps (not blocking Baseline v1)

Section titled “Known follow-up gaps (not blocking Baseline v1)”

These were real, identified, deferred at declaration time. Status updated 2026-05-13 once the operator authorised follow-up work.

  1. 🟡 Outstanding (operator-only) — CLI petrova-act GitHub App lacks workflows:write scope. Phase 4 had to use the operator’s PAT (gh auth token) to land workflow files. Until the App is granted the additional scope, agent-driven workflow updates aren’t possible. To resolve: edit the App at https://github.com/settings/apps/petrova-act (or wherever the App is hosted) → Permissions → Repository permissions → set “Workflows” to “Read and write” → save. Each of the 29 installations will then receive a “permission change pending” notification that the org owner must accept. UI-only — cannot be scripted from this side.
  2. ✅ Closed — traceo-mcp-server registry URL corrected from traceo-ai/traceo-mcp-server to traceo-cat/traceo-mcp-server (the actual canonical repo, confirmed via apps.listReposAccessibleToInstallation). petrova-codes#69 merged 2026-05-13. Workflow installed on the corrected repo via traceo-cat/traceo-mcp-server#158.
  3. ✅ Closed — devarno-cloud/.github submodule detached. devarno-cloud/devarno-cloud#39 replaced the submodule with a regular .github/ directory and installed the workflow directly. Org-level community-file inheritance from devarno-cloud/.github continues to work via GitHub’s built-in mechanism (it doesn’t rely on the parent having a submodule pointer).
  4. ✅ Closed — rocky-hq ADR 0004 date. Body’s **Date:** 2026-05-04 was a single-character typo; corrected to 2026-05-03 to match the filename and git creation timestamp. rocky-hq#30 merged.
  5. ✅ Closed — stratt-hq forward refs to 0014–0016 rewritten to descriptive slugs (traceo-wire, crumb-wire, rocky-wire) plus <authoring-date> placeholders in AC entries. stratt-hq/stratt-run#64 merged.
  6. ✅ Closed — cli/tests/diagnose.test.ts slice-limit failure fixed by rewriting the test to call walkDecisions directly instead of going through the sliced diagnose output. petrova-codes#70 merged. 186/186 cli tests pass.
  7. 🟢 Open (low-urgency) — Decision-doc CRUMB / EVA frontmatter conformance for the 18 new entries’ integrations_applicability defaults. All newly-registered entries declare not_applicable for every integration; the long-term policy may vary per org (e.g. iris-hq SDK ecosystem might warrant eva: optional). Per-entry refinement is a follow-up triggered when each dormant org adopts governance — no action required until then.

Post-Baseline-v1 governance-audit sweep (2026-05-13)

Section titled “Post-Baseline-v1 governance-audit sweep (2026-05-13)”

After Baseline v1 declared, the live /console/governance page surfaced 4 fails + 32 warns across the fleet. Same-day resolution authorised by the operator. Final state after the sweep:

MetricBeforeAfter
Fails40
Warns3212
Reduction62%

Issues addressed:

  • MR-7 false-positive on petrova-codes (1 fail) — the audit’s regex matched **Status:** superseded mid-line in a table row documenting the MR-7 rule itself. Anchored the regex to line-start (multiline flag). petrova-codes#72.
  • MR-8 false-positive on skyflow-hq (1 fail) — same regex-anchoring class of issue: the audit was counting inline citations like (I-2) as declarations. Refined the regex to only count ^- \*\*I-N.\*\* declaration form. petrova-codes#72.
  • MR-1 + MR-12 noise on dormant/scaffold repos (16 warns + 5 warns) — added role-aware skip: roles in {scaffold, placeholder, archived, control-plane} return skip instead of warn when their gap is “no north-star yet” (legitimately absent for those roles). petrova-codes#72.
  • MR-4 fail on grace-hq (1 fail) — 5 findings docs were created with the decisions filename convention. Renamed to YYYYMMDD-0000- form with 16-file cross-reference sweep. grace-hq/grace#25.
  • MR-4 fail on kahn-hq (1 fail) — 10 non-conforming findings filenames. Renamed dated forms to YYYYMMDD-0000- and prefixed 4 long-lived registers (state.md, invariants.md, open_questions.md, airlock-schema-watch.md) with _ so they’re treated like templates by the audit. kahn-hq/kahn#70. Follow-up kahn-hq/kahn#71 lowercased two remaining mixed-case slugs (PASS, postC3) that the regex rejected.

Remaining 12 warns are substantive operator content work, not Baseline-v1 scope:

  • MR-1 (8 warns): active repos missing outranks: frontmatter on recent decisions (choco-hq, devarno-cloud, grace-hq, kahn-hq, oompa-tools, skyflow-hq, smo1-io, stratt-hq). Each operator should add outranks: [paths] to new decisions going forward; backfilling the listed entries is each repo’s call.
  • MR-1 (1 warn): rocky-hq missing docs/north-star/. Substantive — rocky-hq is role: experimental so the audit correctly flags it. Bootstrap north-star when rocky-hq’s operator is ready.
  • MR-10 (1 warn): kahn-hq has phase-close events without obvious verification-round findings. Substantive backfill question.
  • MR-12 (2 warns): rocky-hq (north-star gap, same root cause) + stratt-hq (CLAUDE.md doesn’t reference north-star/MILESTONES by name).

These don’t graduate to “blocking baseline” — they’re the kind of ongoing-governance work each *-hq operator addresses at their own cadence as they author new decisions.

Included in Baseline v1 (25 onboarded + 4 placeholder = 29): every entry currently in registry.yaml.

Deferred from Baseline v1 (0): none. Every App-installed org is represented.

Within-baseline conditional milestones (all resolved 2026-05-13):

  • ✅ Repos with workflow-install PR (Phase 4): all 21 merged.
  • ✅ Repos with decision-doc migration PR (Phase 3): all 5 merged.
  • devarno-cloud and traceo-mcp-server: both fully baselined via follow-up items 2 and 3.

Single remaining open item: follow-up #1 (App workflows:write scope) — operator-only.

  • Baseline v1 declared: 2026-05-13.
  • Baseline v2 will follow when sufficient new follow-up items accumulate to warrant fresh scope (rule of thumb: when this doc’s follow-up list crosses ~10 items, or when a load-bearing playbook change (new MR, new verb, new architectural invariant) ships). Re-declaration is by successor decision doc, never by silent edit of this one.
  • Plan: /home/devarno/.claude/plans/glittery-popping-bear.md (operator-local; reproduces the 5-phase rollout).
  • Supersedes: docs/decisions/2026-05-13-host-installation-auto-discovery.md is not superseded — that ADR ships the auto-discovery machinery that Baseline v1 depends on.
  • Related: pre-baseline/2026-05-13/ — full pre-baseline snapshot, NNNN precondition table, and Phase 1 classification, committed alongside this ADR so the evidence is reproducible from any future reader.