Skip to content

feat(verification): make confirm consume affected and add the evidence loop #11389

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

Outcome

/verification:confirm takes touched features from affected (presence-gated), keeps the evidence loop (cap 3) in evidence-loop.<branch-slug>.json, and never fails a verdict on a capture that could not run.

Demo: run /skill-quality:check validate-evals confirm; the loop-count, cap, blocked-capture and app-control-absent cases pass.

Plan (phase S2b)

Satisfies: AC3, AC5, AC6, AC7, AC10, AC11
Size Medium. Depends on: S1 (#11384) (S2a (#11388) for the summary shape, by contract only; no S3 (#11387) fields used). Plugin: verification. Design: Contracts C5, T6, T10.

  • plugins/verification/skills/confirm/SKILL.md: replace the touched-feature parsing at plugins/verification/skills/confirm/SKILL.md:168 with affected, presence-gated: when /app-control:drive does not resolve, report touched features not matched (app-control not installed) and keep the e2e-* path categories (eval for that case); fresh verifier reads the full local run dir (never uploaded; publishable gates uploads only); at cap with the last verdict NEEDS WORK the manifest says Evidence loop: 3/3 cap reached, last NEEDS WORK; evidence-loop.json keyed by branch (evidence-loop.<branch-slug>.json), written atomically (write temp, rename), counting NEEDS WORK evidence verdicts on distinct heads (a rebase-only head judged NEEDS WORK counts), cap 3, at cap no loop-back and Next routes to the PR and pipeline park path; manifest line Evidence loop: <k>/3; evidence dirs kept for the last 3 heads; capture not run → verdict notes why, never NEEDS WORK for that alone.
  • context/outcome.md: report rows for capture status and loop count.
  • Sanity Check: evals "NEEDS WORK at count 2 → count 3, loop-back", "count 3 → no loop-back, cap line", "capture blocked → verdict notes reason, not NEEDS WORK" and "app-control absent → fallback line" pass under /skill-quality:check validate-evals confirm; grep -n "Evidence loop" plugins/verification/skills/confirm/SKILL.md matches.
  • Run budget: at most 2 runs per eval case, 1 rerun after a fix; stop on the first usage-limit error.

Design excerpt

  • verification / confirm: calls affected (replaces plugins/verification/skills/confirm/SKILL.md:168 parsing); verifier reads the
    full local run dir (publishable gates uploads only); owns evidence-loop.json (cap 3) and local evidence retention (last 3 heads).
components:
  schemas:
    EvidenceLoop:            # C5, <memory_dir>/<slug>/verification/evidence-loop.json
      type: object
      required: [cap, count, heads]
      properties:
        cap: {const: 3}
        count: {type: integer, minimum: 0, maximum: 3}
        heads:
          type: array
          items: {type: object, properties: {sha: {type: string}, verdict: {enum: [CONFIRMED, NEEDS WORK, NOT VERIFIED]}, at: {type: string, format: date-time}}}
  • confirm: evidence-loop.<branch-slug>.json; manifest line Evidence loop: <k>/3; at 3 no loop-back, Next =
    open the PR so pr-verify FAIL → max-verify-fails → fresh attempt → park
    (docs/conventions/pr-pipeline.yaml:1068-1082).

Acceptance criteria

Brief criteria this slice satisfies:

  • AC3: Diff-to-feature matching lives only in app-control; confirm and run-e2e call it instead of parsing control skills.
  • AC5: If a capture cannot run (blocked, or no usable driver), the verdict records why and does not fail the PR.
  • AC6: A failed evidence verdict sends the work back to implementation, up to a cap of 3.
  • AC7: While the loop counter is at its cap, no further loop-back runs and the existing park-and-retry path takes over.
  • AC10: Every evidence artifact has a retention period.
  • AC11: Verdict, evidence-loop count and capture count are recorded per PR.

Done when:

  • Sanity Check passes: evals "NEEDS WORK at count 2 → count 3, loop-back", "count 3 → no loop-back, cap line", "capture blocked → verdict notes reason, not NEEDS WORK" and "app-control absent → fallback line" pass under /skill-quality:check validate-evals confirm; grep -n "Evidence loop" plugins/verification/skills/confirm/SKILL.md matches.
  • The glob-parsing copy at the old confirm/SKILL.md:168 is removed (dead-code removal folded into this slice)
  • evidence-loop.<branch-slug>.json is written atomically (temp file, rename)
  • Manifest line Evidence loop: <k>/3 is written
  • The plugin's version and CHANGELOG are bumped per the repository's release convention
  • 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.
    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: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: make /verification:confirm take touched features from affected (presence-gated on app-control), keep a per-branch evidence loop (cap 3) in evidence-loop.<branch-slug>.json written atomically, and never fail a verdict on a capture that could not run.

    The admission note flagged "retention" as a charge. Here it means keeping the last 3 local evidence directories on disk. Nothing bills, so no cost decision is needed.

    The stated dependency #11384 is not in the open-issues list, so I treated it as not blocking. The outcome and done-when items are exact. I found no duplicates.

    Automated triage, applied by the lanes App.

  3. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 30, 2026
  4. melodic-automation-lanes commented on Oct 30, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: its title or stated work names a charge (retention), which needs an owner decision. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  5. melodic-automation-lanes commented on Oct 30, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: needs-decision; its comment says why.

  6. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 31, 2026
  7. kyle-sexton commented on Oct 31, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded.

    Admission held this issue on a charge word that names nothing billable. Asked on 2026-10-31 about the charge-word rule, the owner replied with the standing direction: "Go with whatever is in line with this". Its §3 limits cost to what can bill the owner. On this public repository, standard GitHub-hosted runners are free (GitHub Actions billing), and the retention this issue sets is for local run directories and a retention period on each artifact, which bills nothing and caps storage. The Issue Triage session reads the hold as false and releases the issue; its criteria are unchanged. The word list itself is narrowed separately (billed moves to the private-repository list), and retention keeps holding elsewhere, because §3 names artifact retention beyond the free quota as a cost.

  8. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Oct 31, 2026
  9. kyle-sexton commented on Oct 31, 2026

    @kyle-sexton
    MemberAuthor

    Correction to the record above, from the Issue Triage session: the charge-word list is not changing. Moving billed to the private-repository list would let a public-repo issue about Azure or over-quota storage pass admission, and section 3 names both as cost. This issue's release stands on its own reason: its retention bills nothing.

  10. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  11. github-actions commented on Oct 31, 2026

    @github-actions
    Contributor
    No description provided.
  12. melodic-automation-lanes commented on Nov 1, 2026

    @melodic-automation-lanes
    Contributor

    This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41231702342, the work-resolve-issue run that agent-ready started, before it did any work; that run ended at 2026-10-31T19:27:25Z. work-unblock has now removed and added agent-ready back to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last added agent-ready or a run last reported, work-unblock waits longer before each one, up to 24 hours.

  13. 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 Nov 1, 2026
  14. github-actions commented on Nov 1, 2026

    @github-actions
    Contributor
    No description provided.
  15. github-actions commented on Nov 1, 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