Skip to content

pv score: a missing binding registry scores 0.00, and a valid registry is refused over one enum variant #2704

Closed

Description

@noahgift

Both reproduce on pv 0.63.0 against paiml/rmedia. Filed from the consumer side; downstream tracking issue is paiml/rmedia#320.

1. Absence is scored as a zero

$ pv score contracts/pill-geometry-v1.yaml
  D5 Binding           0.00
    - (all): (no binding registry)

pv score does not auto-discover contracts/binding.yaml, so every contract scores 0.00 on D5 unless --binding is passed. The parenthetical is honest; the number is not. 0.00 aggregates into the contract grade exactly as a genuine zero does, so a contract with all 54 equations bound is indistinguishable from one with none.

The right behaviour is to exclude D5 from the aggregate when no registry was supplied, not to score it 0 — a dimension that was not measured is not a dimension that measured badly.

This is the same shape as a family of defects rmedia has been closing all year: a value describing missing input consumed as though it described the thing measured. It is worth fixing in pv precisely because pv is the tool that decides release soundness — if it scores absence as badness, every consumer inherits that.

2. A valid registry is refused over one enum variant

$ pv score contracts/pill-geometry-v1.yaml --binding contracts/binding.yaml
error: bindings[78].status: unknown variant `superseded`,
       expected one of `implemented`, `partial`, `not_implemented`, `pending`
       at line 685 column 13

So the workaround for (1) — pass --binding — fails on this repo's registry.

superseded is a real lifecycle state, not a typo: an equation that has been replaced by a later one is neither implemented, partial, not-implemented, nor pending. rmedia's own scripts/lint-contract-bindings.sh counts it deliberately:

lint-contract-bindings: OK (54 specs, all bound; 210 bindings;
                            175 implemented, 27 partial, 6 not implemented, 2 superseded)

Either the enum should gain superseded, or pv should say what a consumer is meant to write for a replaced binding. Silently collapsing it into not_implemented would be wrong — that reads as unfinished work rather than deliberately retired work, and it would show up as a coverage gap that no one can close.

Net effect today

D5 Binding is 0.00 for every contract in rmedia, by two independent routes, and neither is "nothing is bound". Related: the pv hardening epic #2556, which does not currently list either of these.

Activity

  1. noahgift commented on Sep 10, 2026

    @noahgift
    MemberAuthor

    This issue belongs in paiml/pv, not paiml/aprender.

  2. added this to the 0.68.0 milestone on Sep 10, 2026
  3. noahgift commented on Sep 10, 2026

    @noahgift
    MemberAuthor

    Triage correction: the earlier triage-wrong-repo-2704 marker was wrong. pv has lived in-tree since the monorepo consolidation (crates/aprender-contracts-cli), so this belongs here. Milestoned to 0.68.0, the backlog train.

  4. added
    bugSomething isn't working
    P1High priority
    on Sep 11, 2026
  5. modified the milestones: 0.68.0, 0.69.0, 0.73.0, 0.70.0 on Sep 16, 2026
  6. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    triage 2026-09-23 (aprender-dd, standing triage owner): milestoned to 0.70.0, theme Fast Train (CI, gates, pv, release tooling, hygiene); it moved out of backlog (the 2026-09-17 overflow bucket, not a release).

  7. added
    kind:codeWork is a code change (derived rule, #4159)
    on Sep 24, 2026
  8. modified the milestones: 0.70.0, backlog on Sep 24, 2026
  9. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    Closed by paiml-implement — folded into epic #2556 (triage evidence/triage-1418.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 workingkind:codeWork is a code change (derived rule, #4159)

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions