Skip to content

PTV-SCF-0001 P3 — verification round (G-02)


rank: decision outranks: [] doc_id: PTV-DEC-0021 title: PTV-SCF-0001 P3 verification round — one gate passes, nine fail, twelve friction items date: 2026-08-25 status: open — awaiting human countersign owner: petrova-codes scaffold: PTV-SCF-0001 phase: P3 supersedes: none depends_on: docs/decisions/2026-08-14-ptv-scf-0001-p3-open.md

Section titled “rank: decision outranks: [] doc_id: PTV-DEC-0021 title: PTV-SCF-0001 P3 verification round — one gate passes, nine fail, twelve friction items date: 2026-08-25 status: open — awaiting human countersign owner: petrova-codes scaffold: PTV-SCF-0001 phase: P3 supersedes: none depends_on: docs/decisions/2026-08-14-ptv-scf-0001-p3-open.md”

PTV-SCF-0001 P3 — verification round (G-02)

Section titled “PTV-SCF-0001 P3 — verification round (G-02)”

Date: 2026-08-25 Status: open — awaiting human countersign Shape: G-02 (docs/PETROVA-GOLDEN-PROMPTS.md §2), run through skills/petrova-verify-round/SKILL.md Terminal state of this record: ten gate verdicts, twelve classified friction items, and a dry-run verify_round invocation. It closes no phase, discharges no gate, and applies nothing. G-03 is a separate session against this record once merged.

  • https://petrova.blog/llms-preamble.txt — 8,230 bytes, fetched with curl, not with a summarising fetch tool. Law fingerprint 139ba74609b4, source commit 8ae9613a3af1. Operating under L1–L7 and W1–W4 as written in those bytes.
  • The deviation is recorded rather than glossed. The skill’s step 1 says fetch the preamble; the tool that ordinarily does so returned a model-written paraphrase of roughly 1.4 KB. That is the same workaround the P3 open had to use, unchanged eleven days later, and it is G-P3-7’s evidence rather than a footnote.

petrova-codes, confirmed with the operator. skyflow-me’s Phase 6 is also open and has no friction round; under L4 that is its own repo’s ledger and is not touched here.

Every gate was re-evidenced against merged main (HEAD b71930ea) in this session. Two were exercised rather than read: the law fetch (G-P3-7) was run through both paths and byte-counted, and the phase-state derivation (G-P3-9) was read to the regex that decides what it can see.


G-P3-1 — canary registered, credential scoped, shown by failing elsewhere

Section titled “G-P3-1 — canary registered, credential scoped, shown by failing elsewhere”

PASS, on a record that is itself open.

registry.yaml:782-795, the file’s only role: canary entry. App petrova-canary-probe id 4605881, installation 153988870, repository_selection: selected, total_count: 1 (docs/decisions/2026-08-15-ptv-scf-0001-p3-c0-close.md:44-59). The operative clause is satisfied by executed refusals, not assertion: GET returns 404 against petrova, kahn-hq, eva-hq and 200 against petrova-canary (:82-87); merge returns 405 and a main write returns 409 (:111-121).

Two qualifications, neither of which flips the verdict, both carried below: the write half of the negative test was not executed and is disclosed as a coverage gap (:95-104), and the record’s human countersign is unticked (:179), which under docs/decisions/2026-08-10-countersign-gates-closed-status.md keeps that decision open.

G-P3-2 — probe asserts every A2 hop, three green runs, run IDs cited

Section titled “G-P3-2 — probe asserts every A2 hop, three green runs, run IDs cited”

FAIL. The probe is a skeleton by its own declaration: cli/src/probes/write-probe/index.ts:4 — “the apply path is C2’s”. runSkeleton returns stage: "skeleton" and five hop ids. Of A2’s nine hops, four are implemented (schema resolution hops.ts:90-109, fingerprint :129-191, admission :210-217); idempotency key, phase integrity, dry-run render, apply, PR emission and metadata parse-back are absent. The three-run shape exists only as a unit test over hard-coded ids "a"/"b"/"c" (cli/tests/probes/write-probe.test.ts:219-223). No executed run identifiers exist to cite.

G-P3-3 — re-invocation returns already-emitted, opens no second PR

Section titled “G-P3-3 — re-invocation returns already-emitted, opens no second PR”

FAIL. No occurrence of idempotency, already-emitted or any re-invocation assertion anywhere under cli/src/probes/ or its tests. M3.4 has no artefact and no commit. The phase’s own mandatory assertion (p3-open.md:132, “The re-invocation assertion is mandatory”) is the one with nothing behind it.

G-P3-4 — VCRM moves six SRs to test-verified

Section titled “G-P3-4 — VCRM moves six SRs to test-verified”

FAIL. docs/PTV-VCRM-0001.md does not exist in the repo. Of the six SRs, only PTV-SR-0005 and PTV-SR-0006 are cited by any hop (hops.ts:90,129,175,210). Four of six have zero probe assertions behind them, so the artefact is not merely unwritten — for two-thirds of its rows there is nothing to write.

G-P3-5 — induced failure emits refusal code + next action

Section titled “G-P3-5 — induced failure emits refusal code + next action”

FAIL. Half the gate holds and half does not, so it fails. Named next actions exist and are asserted under induced failure (write-probe.test.ts:50-70,104-110,128-148,198-208, including an explicit not-a-stack-trace assertion). No refusal code is attached to any of them — the strings are free text authored in hops.ts. spec/refusals.yaml (765 lines) carries the recovery semantics the gate wants, and nothing in host/src publishes it as /errors.json; the only errors.json in the tree is an unrelated Astro build artefact at codes/dist/.

G-P3-6 — structured per-run records at a console-readable path, parsed back

Section titled “G-P3-6 — structured per-run records at a console-readable path, parsed back”

FAIL. The record is an in-memory value by design (index.ts:7-10, “Printing is the caller’s job”). There is no caller and no path. The only round-trip is JSON.parse(JSON.stringify(...)) in-process, which tests the serialiser and not the artefact.

G-P3-7 — F-23 discharged: law fetch returns exact bytes, no curl workaround

Section titled “G-P3-7 — F-23 discharged: law fetch returns exact bytes, no curl workaround”

FAIL — demonstrated live, not inferred. In this session the fetch tool returned a ~1.4 KB paraphrase; curl returned 8,230 bytes. All eight skills still carry the unqualified step 1 “Fetch https://petrova.blog/llms-preamble.txt and operate under it” (skills/petrova-verify-round/SKILL.md:14 and seven siblings) with no byte-count check, no Law fingerprint verify and no stated method. The waiver’s remedy (docs/decisions/2026-08-13-waiver-ptv-scf-0001-p2.md:118) is unimplemented. M3.7 has no commit.

G-P3-8 — F-24 discharged: ten cold fetches, zero refusals

Section titled “G-P3-8 — F-24 discharged: ten cold fetches, zero refusals”

FAIL — unevaluable, and that is a finding about the gate. No record of any fetch series exists in the repo — no file, test or decision doc mentions ten attempts or a refusal count. The gate is also written so that only a fresh-session campaign can produce its evidence, and it names no artefact where the result should land; nothing in P3 was built to collect it. Unevaluable is a FAIL by G-02’s own rule.

G-P3-9 — F-26 discharged: documented phase-state location, in every phase skill, populated here

Section titled “G-P3-9 — F-26 discharged: documented phase-state location, in every phase skill, populated here”

FAIL on all three clauses.

  1. No document names the location; CLAUDE.md is silent on it.
  2. Grep across skills/ for phase-state vocabulary returns exactly one hit, and it is in skills/petrova-mr-audit/SKILL.md:63 — not a phase skill. petrova-phase-open, petrova-phase-close, petrova-phase-cycle and petrova-verify-round say nothing.
  3. state/petrova-codes.yaml:158-159 still reads current_phase: null / gate_open: null eleven days after P3 opened, and there is no state/transitions/petrova-codes.jsonl while eleven other slugs have one.

G-P3-10 — G-P2-2/G-P2-3 re-entered and recorded PASS by an agent that did not do the work

Section titled “G-P3-10 — G-P2-2/G-P2-3 re-entered and recorded PASS by an agent that did not do the work”

FAIL — unevaluable, and unevaluable by an agent in principle. No record dated 2026-08-15 or later evaluates either gate; every reference is a forward reference from the P3 open itself. Nothing has been re-run.

Separately, docs/findings/20260815-1930-p3-round-inputs-proxy-review-and-write-target-vocabulary.md:29-46 places a required operator act inside this gate: the two instruments P3 stands on were both proxy-signed, and only the human can say whether they are accepted as signed — “An agent must not supply this line, including under directive.” That line is unsupplied.


One PASS, nine FAIL. No gate was reworded and none is close to passing.

P3 is not closeable, and the round is being run early relative to the work. 4c98098c (2026-08-15, the write-probe skeleton) is the last commit that advances any P3 milestone. Since then: 398 commits, 321 of them scheduled sweeps, ~68 substantive — and not one advances a G-P3-* gate. Seven of eight sub-milestones (M3.2–M3.8) are untouched.

The consequence is not rhetorical. From docs/decisions/2026-08-13-waiver-ptv-scf-0001-p2.md:139-142:

Void if P3 closes without discharging F-23, F-24, F-26 … On voiding: G-P2-2 and G-P2-3 revert to FAIL, and P2 stands closed on a lapsed waiver, which is itself a finding to be raised at P3’s close rather than a matter of interpretation.

None of the three has moved. A P3 close today retroactively unsettles P2.

And the correct response to that is not to extend P3 until the harness is built. That is the extension L6 forbids and the one this round exists to refuse. P3 stays open with nine gates FAIL; the remaining work is P3’s, not this round’s to absorb.


Part B/C — friction, surfaced and classified

Section titled “Part B/C — friction, surfaced and classified”

Twelve items. Two IN-BUDGET, ten DEFERRED, none CLOSED — nothing surfaced here was trivial enough to resolve in-phase without extending it.

Target milestones M4.* are provisional pending P4’s open seeding; naming a target does not open a phase.

IDItemClassTarget
F-45Thirty-three merged documents carry phase: P4 in front-matter while P3 is the only open phase and no P4 open record exists; one session signs off as P4DEFERREDP4 · M4.1
F-46Eight commits / five new workflows under .github/workflows/ against an unconditional out-of-scope clause; W3’s letter held, the scope clause did notDEFERREDP4 · M4.2
F-47PTV-CHK-0040 ships as a workflow and is registered nowhere; checks.yaml stops at PTV-CHK-0039DEFERREDP4 · M4.3
F-48CLAUDE.md stale since 2026-08-12 on ≥8 counts; silent on phase, gates and phase-state location — F-26’s own shapeDEFERREDP4 · M4.4
F-49The phase-state writer cannot see this repo: repo-walker.ts:90-91 matches phase-<N>-open, records are ptv-scf-0001-p3-open.md. Escalates F-40DEFERREDP4 · M4.5
F-50G-P3-1’s negative test is unreproducible — petrova-canary.pem untracked, referenced by no codeDEFERREDP4 · M4.6
F-51The C0 close’s human countersign is unticked, so P3’s only gate record is open by the repo’s own ruleIN-BUDGEThuman act; executed refusals unaffected
F-52G-P3-10’s operator line on the two proxy-signed instruments is unsupplied; no agent may supply itIN-BUDGETrouted to operator at close
F-53n8n close-out: status: proposed, authority: FLIGHT, 30 rows, 465-repo sweep, scaffold: PTV-SCF-0001, no phase owns it; N8N-05 unruledDEFERREDP4 · M4.1
F-54rocky-hq: no writes, but eleven documents make it the sweep’s line-level subject and N8N-30 is opened against its vault in this ledgerDEFERREDP4 · M4.7
F-55F-25 reproduced by this round — the id pattern cannot hold F-NN, classification lands in prose again, output path wrong. Second consecutive deferralDEFERREDP4 · M4.8
F-56F-23/F-24/F-26 received no work at all — zero commits, zero mentions since the P3 openDEFERREDP4 · M4.5

F-51 and F-52 are classified IN-BUDGET rather than DEFERRED because carrying them forward would imply an agent could discharge them in P4. Neither can be discharged by an agent at all. They are surfaced, routed to the operator, and absorbed here at zero agent cost — which is why G-P3-10 was written as a gate in the first place.

  • F-45 is not repairable here: editing front-matter across thirty-three merged records during P3’s close is the extension L6 forbids, and three of them are countersigned. P4’s open record must adopt or renumber them, the way P3’s open adopted F-14 as F-39.
  • F-46 — the changes are individually good (they are PTV-CHK-0037…0040); what is missing is the record saying P3 was permitted to make them.
  • F-47 is a one-entry registry addition, and is deferred precisely because it is small: a one-line fix to a P3-era deliverable made during P3’s close is exactly the shape F-22’s deferral established.
  • F-49 is named separately from F-40 because F-40 as raised suggests a missing invocation, and the actual cause is a regex; a future phase that only wires up the invocation would ship a fix that still returns null.
  • F-56 is recorded separately from gates 7/8/9 because the gates measure the outcome while this measures the effort, and zero effort is a different fact from a failed attempt.

Nothing here is proposed for absorption into P3. Every actionable item is DEFERRED with a named target, per L6.


What a clean round would have looked like, and did not

Section titled “What a clean round would have looked like, and did not”

A round that surfaces nothing was not run properly. This one surfaced twelve items, nine gate failures, and a phase whose declared work stopped ten days ago while sixty-eight substantive commits went somewhere else.

The uncomfortable part is not the count. It is that the displaced work was good: PTV-CHK-0037 through PTV-CHK-0040 close real gate-integrity holes, and the n8n sweep produced nine method rules the estate did not have. Nothing here argues it should not have happened. What is missing is any record deciding that it should — the phase in force says verification harness, thirty-three documents say P4, and no act reconciles the two. A phase can be displaced by work nobody would refuse, and that is harder to see than a phase displaced by drift.

A second observation, for how gates are written rather than how they fared: G-P3-8 and G-P3-10 are unevaluable by construction, not by neglect. Each requires evidence that only a fresh-session campaign or a human can produce, and neither names an artefact where that evidence lands. P2’s round already found this class once (F-33, a gate asserting a mutable property with no timestamp). Two of ten gates here cannot be evaluated by anyone reading the repo, which is the same defect wearing a different coat.


  • https://petrova.blog/llms-preamble.txt — 8,230 bytes via curl, Law fingerprint: 139ba74609b4, Source commit: 8ae9613a3af1.

    Correction, applied before merge. This record first cited 8,235 bytes and Source commit: b71930ea. Both were wrong. The artefact measures 8,230 bytes (curl -sS <url> | wc -c) and declares Source commit: 8ae9613a3af1 on its own line 10; b71930ea was this repo’s then-HEAD, transcribed into a field that names the commit the law was published from. The fingerprint 139ba74609b4 was correct throughout, and is why neither error was caught: a reader who checks the hash sees a match and stops. The hash proves the artefact arrived intact; the commit id establishes which artefact it is. Only the second class can be confidently wrong while everything else agrees. Surfaced by #358.

    The HEAD b71930ea references elsewhere in this record are a different claim — the merged main the gates were re-evidenced against — and are left standing.

  • docs/decisions/2026-08-14-ptv-scf-0001-p3-open.md:129-132,161-163,187-189,220-233,243-252,264-268 — scope, exclusions, gates, milestones, standing constraints.

  • docs/decisions/2026-08-15-ptv-scf-0001-p3-c0-close.md:18,32-38,44-59,82-87,95-104,111-121,179 — G-P3-1’s evidence.

  • docs/decisions/2026-08-13-waiver-ptv-scf-0001-p2.md:118,139-146 — the remedy and the void condition.

  • docs/findings/20260815-1930-p3-round-inputs-proxy-review-and-write-target-vocabulary.md:29-46 — the operator act inside G-P3-10.

  • cli/src/probes/write-probe/index.ts:4,7-10,22-38, cli/src/probes/write-probe/hops.ts:90-217, cli/tests/probes/write-probe.test.ts:50-223 — the probe as built.

  • cli/src/repo-walker.ts:90-91, scripts/backfill-state-phase.mjs — F-49.

  • state/petrova-codes.yaml:158-159, state/transitions/ — F-40 unchanged.

  • spec/verbs/verify_round.schema.json, spec/refusals.yaml:1-31 — F-55, G-P3-5.

  • docs/PETROVA-N8N-CLOSEOUT.md:1-22,74,104-108, docs/decisions/2026-08-16-n8n-closeout-scope.md:25-26,53-55,81 — F-53.


  • Subagent: PTV-SCF-0001 P3 verification round (session 2026-08-25)
  • Human: ☐ countersign — accepts these verdicts and this classified friction list.

Ticking this does not close P3. The close is G-03, run in a separate session against this record once merged — and on the evidence above the close cannot succeed: ACCEPTANCE_GATE_PASSED fails nine times, and the P2 waiver voids on a P3 close that leaves F-23, F-24 and F-26 undischarged.

The operator line required by PTV-FND-0026 (F-52) belongs here and must be written by the operator, not transcribed by a scribe:

  • Operator, on the two proxy-signed instruments (2026-08-13-ptv-scf-0001-p2-close.md and 2026-08-13-waiver-ptv-scf-0001-p2.md): ☐ _______________________________

Verb invocation — dry-run, composed not runnable

Section titled “Verb invocation — dry-run, composed not runnable”

registry.yaml carries fleets_allowed: [] for petrova-codes by design: control-plane changes go through human PR review, never agent automation. There is no addressable verb surface, which P2’s close and P3’s open both recorded. The payload is composed anyway because L2 makes the dry-run the deliverable, and a composed payload that cannot be dispatched is a finding; a shrug is not.

Two fields are deliberately unfilled:

  • idempotency_key — SHA256 over verify_round|petrova-codes|<canonical params>, computed at dispatch time, and there is no dispatch.
  • this record’s doc_id was allocated via scripts/doc-ids.mjs next --kind DEC, which reads main plus every open PR head. Allocating from merged state alone is PTV-FND-0055.
{
"envelope": {
"verb": "verify_round",
"target_repo": "petrova-codes",
"dry_run": true,
"actor": "human:alex@devarno.com",
"triggered_by": {
"kind": "phase_close",
"ref": "docs/decisions/2026-08-14-ptv-scf-0001-p3-open.md"
},
"idempotency_key": "<sha256 of verify_round|petrova-codes|<canonical params>, computed at compose time>"
},
"params": {
"phase_number": 3,
"round_lead": "subagent:petrova-verify-round",
"checks_performed": [
"Per-gate re-evidencing of all ten G-P3-* gates against merged main (HEAD b71930ea), file:line and command output",
"Live law-fetch comparison: summarising fetch tool vs curl (8,230 bytes, fingerprint 139ba74609b4) — G-P3-7 exercised, not read",
"Probe hop audit: cli/src/probes/write-probe/{index,hops}.ts against scope A2's nine declared hops",
"Phase-state derivation read to the regex (cli/src/repo-walker.ts:90-91) and checked against state/petrova-codes.yaml and state/transitions/",
"Skills sweep: all 14 skills/*/SKILL.md for law-fetch method and phase-state preconditions",
"Commit and document census since 2026-08-14: 398 commits (321 scheduled sweeps), 32 findings, 12 decisions, phase front-matter tallied",
"Scope-boundary audit: .github/workflows/ commits, rocky-hq references, n8n close-out authorisation",
"Projection audit of CLAUDE.md against registry.yaml, the preamble's meta-rule set, skills/ and spec/verbs/"
],
"items": [
{ "id": "F3-45", "description": "Thirty-three merged documents carry phase: P4 in front-matter while P3 is the only open phase and no P4 open record exists; one session signs off as P4. DEFERRED -> P4 M4.1 (provisional).", "surfaced_by": "document census", "evidence_ref": "docs/decisions/2026-08-16-n8n-closeout-scope.md:81" },
{ "id": "F3-46", "description": "Eight commits and five new workflows under .github/workflows/ against P3's unconditional out-of-scope clause; W3's letter held (human-authored PRs), no decision widened the scope. DEFERRED -> P4 M4.2 (provisional).", "surfaced_by": "scope-boundary audit", "evidence_ref": "docs/decisions/2026-08-14-ptv-scf-0001-p3-open.md:161-163" },
{ "id": "F3-47", "description": "PTV-CHK-0040 ships as .github/workflows/ignored-tracked.yml and is registered nowhere; checks.yaml stops at PTV-CHK-0039. DEFERRED -> P4 M4.3 (provisional).", "surfaced_by": "check-registry audit", "evidence_ref": "docs/findings/20260825-0530-seven-gates-correctly-scoped-and-a-class-of-change-between-them.md:120" },
{ "id": "F3-48", "description": "CLAUDE.md untouched since 2026-08-12 and contradicts its sources on at least eight counts, including total silence on PTV-SCF-0001, any phase, any gate, and the phase-state location (L5). DEFERRED -> P4 M4.4 (provisional).", "surfaced_by": "projection audit", "evidence_ref": "CLAUDE.md" },
{ "id": "F3-49", "description": "The phase-state writer cannot see this repo: repo-walker matches /^(?:\\d+-)?phase-0*(\\d+)-open$/ and this repo names records ptv-scf-0001-p3-open.md, with no MILESTONES.md fallback (F-41). Escalates F-40. DEFERRED -> P4 M4.5 (provisional).", "surfaced_by": "gate audit G-P3-9", "evidence_ref": "cli/src/repo-walker.ts:90-91" },
{ "id": "F3-50", "description": "G-P3-1's negative test is unreproducible from the repo: petrova-canary.pem untracked, no code or workflow references it; the evidence exists only as transcribed command output. DEFERRED -> P4 M4.6 (provisional).", "surfaced_by": "gate audit G-P3-1", "evidence_ref": "docs/decisions/2026-08-15-ptv-scf-0001-p3-c0-close.md:95-104" },
{ "id": "F3-51", "description": "The C0 close's human countersign is unticked, so P3's only gate record is open by the repo's own rule. IN-BUDGET: remedy is a human act an agent must not perform; the underlying executed refusals are unaffected.", "surfaced_by": "gate audit G-P3-1", "evidence_ref": "docs/decisions/2026-08-15-ptv-scf-0001-p3-c0-close.md:179" },
{ "id": "F3-52", "description": "The operator line on the two proxy-signed instruments P3 stands on is unsupplied, and no agent may supply it. IN-BUDGET: surfaced and routed to the operator at close.", "surfaced_by": "carried input PTV-FND-0026", "evidence_ref": "docs/findings/20260815-1930-p3-round-inputs-proxy-review-and-write-target-vocabulary.md:29-46" },
{ "id": "F3-53", "description": "The n8n close-out (PTV-AUT-0002, status proposed, authority FLIGHT, 30 rows, 465-repo sweep) is bound to scaffold PTV-SCF-0001 with no phase owning it, and its head item N8N-05 is unruled. DEFERRED -> P4 M4.1 (provisional).", "surfaced_by": "scope-boundary audit", "evidence_ref": "docs/decisions/2026-08-16-n8n-closeout-scope.md:25-26" },
{ "id": "F3-54", "description": "rocky-hq boundary held in letter (no writes) and strained in substance: eleven documents make it the sweep's line-level read subject and positive control, and N8N-30 is opened against its vault in this ledger. DEFERRED -> P4 M4.7 (provisional), as the handover F-32 named.", "surfaced_by": "scope-boundary audit", "evidence_ref": "docs/PETROVA-N8N-CLOSEOUT.md:108" },
{ "id": "F3-55", "description": "F-25 is reproduced by this round: the schema's id pattern cannot hold F-NN, classification lands in prose, and the declared output path is not the repo's convention. Second consecutive deferral. DEFERRED -> P4 M4.8 (provisional).", "surfaced_by": "composing this round", "evidence_ref": "spec/verbs/verify_round.schema.json" },
{ "id": "F3-56", "description": "The three discharge-critical carried items F-23, F-24 and F-26 received no work at all: no commit since 2026-08-14 touches them and no document after the P3 open mentions them. The P2 waiver voids on a P3 close in this state. DEFERRED -> P4 M4.5 (provisional).", "surfaced_by": "gate audit G-P3-7/8/9", "evidence_ref": "docs/decisions/2026-08-13-waiver-ptv-scf-0001-p2.md:139-142" }
]
}
}

The F3-NN ids in the payload are the schema’s pattern, not this repo’s vocabulary; the prose ids F-45…F-56 are canonical. That divergence is F-55, and it is deferred rather than fixed here for the reason F-55 itself states.

This record’s own path follows this repo’s convention rather than the schema’s declared docs/decisions/<date>-phase-<N>-friction-round.md, which is the third limb of F-55.