Skip to content

pv extract emits a PARTIAL graph on an unparseable binding.yaml (one dropped quote → 356 triples silently gone, --check agrees with itself) — it must refuse, naming the line #3640

Closed

Description

@noahgift

What

contracts/binding.yaml on PR #3350's branch lost one closing " (commit d3cc76f1f, the QE2E-INV-001 note) and stopped being valid YAML at line 764. pv extract did not refuse. It emitted a graph with every bound symbol after the broken entry silently gone — prune::run, distill::run, harness_ir::*, ptx_explain::run — 356 triples smaller than main, and --check (committed == fresh) would have agreed with itself. Found by aprender-d4 on 2026-09-20 ~22:50Z only because the rebase regenerated contracts.nt under a pinned in-tree pv and the count was compared to main by hand. Fixed in da1ee1506 (one character; 156 entries parse again; extraction byte-identical to main).

This is tonight's absence-scored-as-conformance class with a fresh mechanism: a malformed input producing a confidently smaller output, confirmed by the instrument that caused it. Sibling of #3639 (producer failure invisible to the consumer) and of the stale-pv 107-triples-short case on #3600.

done_when

  • pv extract (and every pv reader of binding.yaml) exits non-zero on a binding.yaml that does not parse, naming the file and line, and writes NO graph — mutation: drop one " at an arbitrary entry → RED with the line number; restore → GREEN, byte-identical graph
  • the partial-parse path cannot be reached: a parse error is not an empty-tail; the case table covers unterminated string, bad indent, duplicate key
  • pv extract contracts --check on the mutated tree is RED for the parse reason, not for a count delta

Refs #3350 (the branch that carried it), #3639, #3641 (the consumer-side floor).

Activity

  1. added this to the 0.70.0 milestone on Sep 20, 2026
  2. added
    bugSomething isn't working
    P1High priority
    on Sep 20, 2026
  3. noahgift commented on Sep 21, 2026

    @noahgift
    MemberAuthor

    Neighbour finding from aprender-d4 on #3395 (01:55Z), recorded here as the census-vocabulary sibling rather than a new row: the 24 new crux contracts carry no metadata.kind and registry: false, so pv census files them under kind kernel by default, while main's 294 crux contracts (registry: true) file under registry — 24 DRAFT contracts with no tests now count as kernel contracts in by_kind; the census has no draft/intake bucket. A default that classifies an unlabelled input into the most-trusted class is the placeholder-is-most-permissive shape. Not in #3395's scope; whoever takes #3640 should decide whether the census refuses a kind-less contract (as ONT-6b made the linter say 'the kind was assumed') or adds a draft bucket.

  4. modified the milestones: 0.70.0, 0.71.0 on Sep 23, 2026
  5. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    milestone → 0.71.0 per docs/roadmaps/milestone-triage-2026-09-23.md (#4024), operator approval 2026-09-23 (relayed by aprender-cf). Reason: debt ratchet pillars B/C (#3997: pv at the deepest level, ontology merge), slice 2

  6. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    Closed by paiml-implement — folded into epic #2556 (triage evidence/triage-1623.md)

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 prioritybugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions