Skip to content

PTV-SCF-0001 P2 — phase open

Date: 2026-08-13 Status: open Supersedes: none Superseded-by: none — current Phase: PTV-SCF-0001 P2 · Golden prompts as skills Predecessor: P1 · Specification — CLOSED 2026-08-12 Shape: G-01 (docs/PETROVA-GOLDEN-PROMPTS.md §2) Terminal state of this record: a phase opened with scope, gates and carried friction. It closes nothing.

None. Read from decision-doc history, not from a projection:

RecordVerdict
2026-08-12-ptv-scf-0001-p1-verification-round.mdmerged (#260) — the round, two gates FAIL
2026-08-12-requirement-tree-root-set.mdmerged (#261), countersigned — the F-02 ruling
2026-08-12-ptv-scf-0001-p1-close.mdmerged (#262) — P1 CLOSED, four preconditions PASS, no waiver

No record opens P2, P3 or any later phase. No phase is open.

Yes. P1’s close record is merged and countersigned, all four G-03 preconditions PASS on cited evidence, and no waiver was used. The two gates the round recorded as FAIL were made to pass by correcting a defect the gate itself found — not by weakening the gate.

The scaffold declares phases sequential and gated (docs/specs/2026-08-12-ptv-scf-0001-scaffold-rev-a.xml:145) with no per-phase entry criteria block. The criteria are therefore the sequencing discipline itself, plus the close record’s own consequence clause.

#CriterionVerdictEvidence
1Predecessor phase closedMET2026-08-12-ptv-scf-0001-p1-close.md, merged as #262.
2No phase skipped — P0 ran and P1 closed before P2MET, with a defect recordedP0’s exit-gate artefacts exist and are merged: docs/findings/20260811-1749-ptv-scf-0001-p0-ground-truth.md and -p0-delta-register.md, both status: baseline, every claim sourced. But no P0 close record exists — the close-record discipline began with P1. See the note below.
3The predecessor explicitly authorises this phase to openMETP1 close, §Consequences: “P2 · Golden prompts as skills may open. Its entry criteria are unaffected by anything in the deferred ledger.”
4Deferred friction targeted at this phase is enumerableMETThree items, step 4 below.

The P0 defect, stated rather than smoothed. G-01 says an unmet criterion is a halt, not a caveat — so this one is named at full weight. P0 has no close record and no verification round of its own; its terminal artefacts were merged and the scaffold moved on. Criterion 2 is judged MET because what a close record attests — that the exit gate was evaluated and friction classified — is evidenced here by the artefacts themselves and by P1’s round, which consumed P0’s delta register (D-09, D-12, D-19, D-20) and classified those items. The attestation is missing; the work it attests to is not.

This is not repaired retroactively. A close record written in August for a phase that ended on 2026-08-11 would be a manufactured attestation, which is worse than an absent one. It is recorded here as F-14 · P0 has no close record, raised at P2 open, carried into P2’s own verification round for classification.

No other criterion is unmet or unevidenced. No halt condition applies: a contract.yaml exists for this repo, and the current phase is determinable from decision-doc history above.

Step 4 — carried friction, the inputs to this phase

Section titled “Step 4 — carried friction, the inputs to this phase”

Per G-01 step 4 and MR-2. Source for all three: docs/decisions/2026-08-12-ptv-scf-0001-p1-close.md:43-56, itself consuming 2026-08-12-ptv-scf-0001-p1-verification-round.md.

ItemRaised inWhat it isWhere it lands in this phase
F-04round, L116-11935 of 40 registered slugs belong to no domain. They draw from the open DR-3600+ block, which is not a domain but the absence of one. Part 3 of their domain module is blocked on a DR block allocation, which is a G1 act.C4
F-05round, L121-123Domain module parts 3–5 unspecified for every generated slug — by design, since a generated judgement is a fabrication with a build step in front of it. But 40 × 3 unspecified sections have no owner named.C4
G4-implroot-set ruling, L140Gate G4 is asserted by CI in the SDD’s own mutation protocol (docs/PETROVA-SDD-BASELINE.md:927, sequence L914) and has no implementation. P1 found six orphans by hand-reading a mermaid block — precisely the manual check G4 was meant to replace.C3

F-03 was deferred to P2 by the round and then closed in the P1 close session. It is not carried. Nothing else in the eight-row ledger targets P2.

Objective, verbatim (…scaffold-rev-a.xml:204): make governance law fetchable rather than pasted.

A cold agent in a governed repo currently receives the law as ~60 pasted lines. A pasted copy cannot be revised, and a preamble that misstates the law is worse than no preamble at all. P2 replaces the paste with a fetch, and converts the eight golden prompts — today prose in a single 524-line markdown file — into skills that load.

Five spec tasks (XML L206-224) plus the three carried items. Six work chunks.

ChunkCoversWhat lands
C0—This record.
C1tasks 1–3Field gaps closed on the three machine artefacts.
C2tasks 4–5Eight skills + slash commands; the merged phase-cycle skill retired.
C3G4-implThe trace-to-root checker, registered in checks.yaml.
C4F-04, F-05A proposed DR-block allocation and per-slug ownership ledger.
C5—Verification round (G-02), then close (G-03). Separate acts.

These are deviations from a literal reading of the spec, decided here rather than drifted into. Each is recorded so the verification round can evaluate it.

R-1 · The three machine artefacts already exist, generated, at other paths. The spec lists public/llms-preamble.txt, public/errors.json and public/verbs/index.json as P2 deliverables (XML L456-458). All three already ship — as generated Astro routes, built by the 2026-08-10 machine-surface work:

  • site/src/pages/llms-preamble.txt.ts → https://petrova.blog/llms-preamble.txt
  • codes/src/pages/errors.json.ts → https://petrova.codes/errors.json
  • codes/src/pages/verbs/index.json.ts → https://petrova.codes/verbs/index.json

Ruling: keep the generated routes; the deliverable is the served URL, not a file under public/. Emitting static copies at the spec’s literal paths would create a second surface that goes stale — the exact defect docs/decisions/2026-08-10-machine-surface-bound-to-sources.md was written to close. P2’s work on these three is therefore gap-closing, not authoring. The spec text is amended by this record rather than satisfied literally.

What is genuinely missing, and is C1’s scope:

ArtefactTask asks forPresent todayGap
preamble”the operating law (L1–L7) and the current warning list, versioned”meta-rule titles, write mechanics, prohibitions, Generated: + Source commit:no labelled L1–L7 block; no warning list at all; no version distinct from build stamp
errors.json”code, stage, meaning, correct response, and whether retry with the SAME idempotency key is safe”code, description, arriving verbs, one global retry_semantics blockno per-code stage; no per-code correct_response
verbs/index.json”name, fingerprint, read/write class, refused-path globs”name, class, mutating, refusal codes, side effects, refused-path regexno fingerprint; refused paths are a regex, not globs

R-2 · skills/petrova-phase-cycle merges G-01, G-02 and G-03, which task 5 forbids. The task is explicit: “Preserve the structural separation of G-02 and G-03. An agent asked to verify-and-close optimises toward closure and under-surfaces friction. Do not merge them for convenience.” The prompts doc carries the same warning independently (L198-204). The existing skill is precisely that merge, and it predates the spec’s rescue.

Ruling: split into petrova-phase-open, petrova-verify-round and petrova-phase-close. petrova-phase-cycle becomes a deprecation pointer naming the three and stating why the merge was retired — deleting the name outright strands consumer repos that already reference it.

This phase is itself the worked example of why: P1’s round produced two FAIL verdicts and a halt. A skill that had been asked to verify-and-close would have been optimising toward the close while it wrote them.

R-3 · F-04 is enumerated and proposed, not ratified. DR-block allocation is a G1 act. C4 produces a record proposing an allocation for all 35 unallocated slugs with rationale, and names an owner per slug for F-05’s parts 3–5. It is authored Status: open and uncountersigned; an unticked human countersign keeps a decision open, and an agent never ticks one. P2 delivers the ledger; the ratification is the operator’s.

Gates 1–3 are the spec’s exit gate (XML L226-230), stated so someone outside this session can evaluate them. Gates 4–6 cover the carried friction, which the spec’s gate does not reach.

#GateEvaluable as
G-P2-1Every one of the eight skills loads in a cold session and produces a correct plan against a test repoFor each skill: a fresh session, that skill, the test repo, and a plan that names the right files and the right terminal state. Eight runs, eight verdicts.
G-P2-2A session using only the fetched preamble performs equivalently to one given the pasted §1 blockSame task, two cold sessions, one fetching and one pasted. Equivalent means: same law cited, same refusals predicted, no governance claim present in one and absent in the other.
G-P2-3No skill requires out-of-band context to workFAIL if any skill’s correct operation depends on a fact not reachable from the skill text plus the fetched artefacts. Asserted per skill, not in aggregate.
G-P2-4errors.json carries stage, meaning and correct_response for every code; verbs/index.json carries a fingerprint for every verb and refused paths as globs; the preamble carries L1–L7 labelled and a non-empty warning listRead the built artefacts and assert field presence and non-emptiness. Mechanical.
G-P2-5The G4 checker exits non-zero on a seeded orphan requirement and zero on the current baseline, and is registered in checks.yamlTwo runs plus a registry lookup.
G-P2-6Every one of the 35 unallocated slugs appears in the C4 record with a proposed DR block and a named owner, and the record is uncountersignedCount the rows; assert 35; assert the countersign is unticked.

G-P2-4 and G-P2-6 are stated as counts and field assertions on purpose. “The artefacts are better” is not a gate.

No gate here may be weakened to pass. If one fails, it fails, and the round says so — that is the termination condition the scaffold names.

IDStateAcceptance gate
C1 · machine artefactsopenG-P2-4
C2 · eight skillsopenG-P2-1, G-P2-3
C3 · G4 checkeropenG-P2-5
C4 · DR allocation ledgeropenG-P2-6
C5 · round and closeblocked on C1–C4G-P2-2, plus the G-03 preconditions

C1 precedes C2: the skills open with a fetch of what C1 emits, so authoring them first would mean authoring against an artefact that does not yet carry the law.

None. petrova-codes carries fleets_allowed: [] in its own registry entry by design — control-plane changes go through human PR review, never agent automation. There is no petrova.act.* dry-run to render here, and composing one would be the anti-shape the self-entry exists to prevent. This phase proceeds by PR.

  • docs/specs/2026-08-12-ptv-scf-0001-scaffold-rev-a.xml:203-230 — P2 tasks and exit gate. Rescued from a transcript, not ratified — see docs/findings/20260812-1228-scaffold-spec-existed-only-in-a-transcript.md.
  • docs/decisions/2026-08-12-ptv-scf-0001-p1-close.md — the deferred ledger.
  • docs/decisions/2026-08-12-ptv-scf-0001-p1-verification-round.md — F-04, F-05 as raised.
  • docs/decisions/2026-08-12-requirement-tree-root-set.md:140 — the G4 observation.
  • docs/decisions/2026-08-10-machine-surface-bound-to-sources.md — why R-1 keeps the generated routes.
  • docs/PETROVA-GOLDEN-PROMPTS.md — G-01..G-08 source text; §1 preamble; §11 gap analysis.
  • docs/PETROVA-SDD-BASELINE.md:927 — G4 as specified.
  • Subagent: PTV-SCF-0001 P2 open (session 2026-08-13)
  • Human: ☐ countersign — opens P2 on the criteria, scope, rulings and gates above.