Skip to content

pv lint --gate shapes: a contract whose YAML does not parse is dropped silently from a directory run, which still reports Pass #4622

Closed as not planned

Description

@noahgift

What

pv lint <dir> --gate shapes (pv 0.70.0, 8d021f6) silently drops a contract whose YAML does not parse, and still reports verdict: Pass. The broken file is not graded, not listed in declines, and not counted in shapes_n.

A lone broken contract is reported as decline: NoShapes with exit 2. That is correct. But next to any good contract, it vanishes.

Repro

d=$(mktemp -d); x=$(mktemp -d "$d/x.XXXXXX")
cp <any passing shaped contract> "$x/"
printf 'name: x\nshape: {}\nfoo: `bad`\n' > "$x/broken-v1.yaml"   # a plain scalar may not start with a backtick
pv lint "$x" --gate shapes --format json | jq -c '{verdict, shapes_n, by_shape, declines}'
# {"verdict":"Pass","shapes_n":1,"by_shape":["<good>=1"],"declines":[]}

How it was found

In paiml/infra (#1033), a new arbiter-corpus-code-v1.yaml had if_fails: \arbiter ask` …. That is invalid YAML. The gate over all of contracts/` said Pass, while the same contract graded alone declined. Its planted defects "failed" for the wrong reason: exit 2, not 1.

Expected

A file under the linted directory that fails to parse is either a finding or a decline row that makes the run not-Pass. Whichever it is, the report must name it. "0 violations over N−1 of N files" should not be possible.

Workaround in infra

The arbiter done-when (I1.sh --shapes) will assert that every shaped contracts/arbiter-*.yaml appears in by_shape.

Activity

  1. added this to the 0.71.0 milestone on Oct 8, 2026
  2. added
    P1High priority
    and removed
    P0Critical priority
    on Oct 12, 2026
  3. noahgift commented on Oct 14, 2026

    @noahgift
    MemberAuthor

    P0 to P1 (2026-10-14 P0 triage): P0 now means it blocks the next release or carries the operator's own words on it; this issue does neither, so it stays on the 0.71.0 milestone at P1.

  4. noahgift commented on Oct 14, 2026

    @noahgift
    MemberAuthor

    Folded into #5308 as a checklist row (TRIAGE-100, 2026-10-14): the open-ticket cap is 100, so this ticket is now tracked on that master and closed as not planned. Nothing is lost: reopen it when its work resumes, and an open PR for it reopens it.

    Agent: aprender-clerk

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High priorityowner:aprender-cdOwned by session aprender-cdsize:MK̂ 3-4 h

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions