Skip to content

Sub-project F closure — petrova contract bootstrap backfill

Six consumer PRs merged 2026-05-06, each introducing .petrova/contract.yaml and a consumer-side decision doc:

SlugPRContract SHAState file
kahn-hqkahn-hq/kahn#6525428e8836a7state/kahn-hq.yaml
stratt-hqstratt-hq/stratt-run#3285afd0cc267dstate/stratt-hq.yaml
choco-hqchoco-hq/choco-hq#124cc468f150e4dstate/choco-hq.yaml
devarno-clouddevarno-cloud/devarno-cloud#332fab2dcfe1a5state/devarno-cloud.yaml
rocky-hqrocky-hq/rocky#171a593bc99ac2state/rocky-hq.yaml
eva-hqeva-hq/eva#4(recomputes after fix PR #5)(deferred)

Each contract validates against contracts/contract.schema.json. petrova doctor --self-check is ok. petrova doctor --commit-state ran successfully for 5 of 6 slugs.

eva-hq’s eva.not_applicable_reason exceeded the 200-character state.schema.json#probe_history.detail cap, causing petrova doctor --commit-state to refuse writing state/eva-hq.yaml. Trimmed in eva-hq fix PR #5; once that merges, write state/eva-hq.yaml and add the corresponding contract_sha to registry.yaml.

  • F-4 (blocker for Phase 1 close, originally in 20260506-1500-rocky-eva-realignment-verify-round.md): governed repos lacked .petrova/contract.yaml. Closed for 5 of 6 slugs; eva-hq deferred behind PR #5.
  • F-9 (advisory): state.schema.json#probe_history.detail maxLength=200 is propagated from contract not_applicable_reason fields. Long reason fields silently produce refuse-to-write errors. Disposition options: (a) raise the cap to 400 to match common decision-doc cite lengths, (b) truncate-and-warn in state.ts/writeState, (c) lint the cap at contract-load time so the error surfaces earlier and points at the consumer’s contract, not the spine. Option (c) is cheapest and most operator-friendly; recommend a small follow-up PR.
  • F-10 (advisory): petrova doctor --commit-state should not silently skip a slug on validation failure — it should set a non-zero exit code aggregated across the loop. Currently a partial-failure run looks identical to a clean run if you only inspect the last line of stdout. Recommend wrapping the per-slug loop in a result aggregator.
  • Schemas accept new key set; legacy probe_history retained.
  • CLI 158/158 tests, build clean, doctor self-check ok.
  • All 8 governed repos have either a contract or a pending-fix-PR (eva-hq).
  • State files committed for 5 of 6 newly-bootstrapped slugs.
  • Registry contract_sha values populated for the same 5 slugs.
  • eva-hq fix (PR #5) merge → state file + contract_sha entry.
  • grace-hq Wave 1 flip (grace-hq/grace#23) merge → state refresh.
  • traceo-mcp-server (slug exists in registry; the local clone is traceo-cat/, owned externally — defer to maintainer).

rocky-hq and eva-hq now have contracts but the upstream eva evidence shape in contract.schema.json#integration_eva is provisional. Sub-project G (rocky-hq + eva-hq surface ratification) is the design work to harden those shapes. Out of scope here; lives in those repos.