Skip to content

feat(pr-pipeline): add the verify-capture key and verdict evidence metrics #11385

Description

@kyle-sexton

Parent

Refs #8651. Evidence-verification plan: Brief and acceptance criteria at #11364 (comment); Design and Plan comments are on #11364.

Depends on

  • none

Outcome

docs/conventions/pr-pipeline.yaml carries merge.verify-capture, and every per-head verdict records an evidence block (capture: no-app until a capture exists).

Demo: run the write-verdict test; the no-app, blocked and local_loop cases pass.

Plan (phase S6)

Satisfies: AC10, AC11, AC5
Size Small-Medium. Depends on: none. Files: docs/conventions/pr-pipeline.yaml, docs/conventions/pr-pipeline/pr-pipeline.schema.json, docs/conventions/pr-pipeline/README.md, .github/scripts/pr-verify/write-verdict.mjs (+ test). Design: C7, C8, T11.

  • merge.verify-capture (app unset, retention-days: 30); schema and README "Verifier verdict" row.
  • write-verdict.mjs: evidence block; with no capture summary file → capture: no-app; local_loop parsed from the trusted PR text's Evidence loop: k/3 line as data.
  • Sanity Check: node --test .github/scripts/pr-verify/write-verdict.test.mjs exits 0 with no-app, blocked, and local_loop cases; CI check-plugins/schema validation passes.

Design excerpt

  • PR pipeline (.github/workflows/pr-verify.yml, write-verdict.mjs, prompt.md,
    docs/conventions/pr-pipeline.yaml + schema + README): merge.verify-capture key, capture
    job, judge jobs read the capture artifact as untrusted data, verdict.json evidence block.
components:
  schemas:
    PipelineKey:             # C7, docs/conventions/pr-pipeline.yaml merge.verify-capture
      type: object
      properties:
        app: {type: string}                          # unset: skip, verdict notes "no app check ran"
        retention-days: {type: integer, minimum: 1, maximum: 90, default: 30}
    VerdictEvidence:         # C8, verdict.json "evidence" (write-verdict.mjs)
      type: object
      properties:
        capture: {enum: [ran, skipped, blocked, not-applicable, no-app]}
        reason: {type: [string, "null"]}
        capture_count: {type: integer}
        features: {type: array, items: {type: string}}
        local_loop: {type: [integer, "null"]}        # from PR body "Evidence loop: k/3", as data; self-reported by the author

Acceptance criteria

Brief criteria this slice satisfies:

  • AC10: Every evidence artifact has a retention period.
  • AC11: Verdict, evidence-loop count and capture count are recorded per PR.
  • AC5: If a capture cannot run (blocked, or no usable driver), the verdict records why and does not fail the PR.

Done when:

  • Sanity Check passes: node --test .github/scripts/pr-verify/write-verdict.test.mjs exits 0 with no-app, blocked, and local_loop cases; CI check-plugins/schema validation passes.
  • Schema and README "Verifier verdict" row updated
  • local_loop is parsed as data from the trusted PR text, and a missing line gives null
  • ci-status is green on the PR head

🤖 Generated with Claude Code

https://claude.ai/code/session_01UJUn7KoThXoYQoxfvdCVi7

Activity

  1. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    on Oct 30, 2026
  2. github-actions commented on Oct 30, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: add a merge.verify-capture key (retention 30 days) to the PR pipeline config, with schema and README updates. Also have write-verdict.mjs record an evidence block in each verdict: capture: no-app when there is no capture summary, and local_loop parsed as data from the Evidence loop: k/3 line. The issue states the outcome, the files involved and a runnable check. I found no open duplicate and nothing missing.

    Automated triage, applied by the lanes App.

  3. github-actions commented on Oct 30, 2026

    @github-actions
    Contributor
    No description provided.
  4. github-actions commented on Oct 30, 2026

    @github-actions
    Contributor
    No description provided.
  5. melodic-automation-lanes commented on Oct 31, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue run that agent-ready started failed or was cancelled before it reported, or it stopped or the token broker refused it because its workflow files differ from main's. work-unblock removed and added agent-ready back to start a fresh run on main's workflow files. If this run ends the same way, it re-fires the issue again, waiting longer each time.

  6. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 31, 2026
  7. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
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

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions