Skip to content

feat(triage): adjudicate a failing verifying test against its requirement [roadmap:regression-triage]#34

Merged
tcballard merged 4 commits into
mainfrom
claude/triage-verdict
Jul 2, 2026
Merged

feat(triage): adjudicate a failing verifying test against its requirement [roadmap:regression-triage]#34
tcballard merged 4 commits into
mainfrom
claude/triage-verdict

Conversation

@tcballard

@tcballard tcballard commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Slice 1 of the regression-triage roadmap — the flagship differentiator. Stacked on #33 (the roadmap artifact must exist for the corpus gates); merge #33 first, then retarget/merge this.

When a committed ## Verified By test goes red, the question that matters is which thing broke. Because the requirement is ground truth, Proofkeeper can adjudicate — agents without a requirements corpus cannot.

What

proofkeeper triage (--graph-file | --corpus) --capability <id> --url <url>

  1. Confirm — re-run the verifying spec (resolved from the capability's verified_by edges; --spec disambiguates multiples). Passing → NOT REPRODUCIBLE, done.
  2. Re-drive — the capability, with the requirement-derived goal, through the ordinary drive (trust boundary, prior-failure steering, resilience all apply).
  3. Adjudicate — the exit code is the contract:
    • 0 STALE TEST — the re-drive finished, asserted, and its compiled spec passed the fidelity gate: the capability still verifies; the repair candidate's path + fidelity are the evidence. (The automated repair PR is slice 2, through the human-reviewed write-back path.)
    • 1 PRODUCT REGRESSION — the re-drive gave up / exhausted its budget / asserted nothing: the requirement's outcomes could not be driven; the model's honest reason is the evidence, and it feeds failure-learning.
    • 3 INCONCLUSIVE — infrastructure noise (spec can't run, model outage, repair candidate errored or didn't stabilize). Conservatism is the invariant: neither actionable verdict is ever guessed.
    • 2 stays usage. --json emits the stable machine verdict.

New module src/triage/triage.ts (runTriage, resolveVerifier, verdict union — exported from the library); CLI command + USAGE + exit-code docs. Reuse only: capability selection, the drive seam, CodegenCompiler, assessFidelity, FileLearningStore — no new drive/gate/runner behavior.

Proven end to end

tests/triage.integration.test.ts (real browser, wired into the CI e2e job): a spec recorded against yesterday's UI fails against today's —

  • button renamed, requirement still met → STALE TEST with a stable repair candidate;
  • status never flips → PRODUCT REGRESSION naming the give-up.

Unit suite: 16 new tests — every verdict path with scripted doubles, verifier resolution, learning boundaries, parser, exit-code map, human/JSON rendering.

Corpus (dogfood)

req-regression-triage + design-regression-triage (Related Roadmaps → regression-triage), README "Triage a failing test" section, changelog entry. Gates: rac validate 43/43, relationships 0 issues, review clean, self-coverage 18/18.

Verification

  • 323 unit tests passed; lint zero diagnostics; typecheck/build green.
  • PROOFKEEPER_E2E=1 triage integration suite: both verdicts green in real Chromium.

tcballard added 4 commits July 2, 2026 06:03
Adjudicate a failing verifying test against its requirement: confirm
the failure by re-running the spec, re-drive the capability with the
requirement-derived goal, and issue a verdict — not_reproducible,
stale_test (with the compiled repair candidate and its fidelity as
evidence), product_regression (with the honest reason), or
inconclusive (infrastructure noise never masquerades as either
actionable verdict). Regression and inconclusive reasons feed the
failure-learning store. Composes existing seams only: capability
selection, the drive seam, the compiler, and the fidelity gate.

Signed-off-by: Tom Ballard <tom@armytage.co>
proofkeeper triage (--graph-file|--corpus) --capability <id> --url <u>
with --spec disambiguation, --json for the stable machine contract,
and the exit code as the verdict: 0 stale test / not reproducible,
1 product regression, 2 usage, 3 inconclusive.

Signed-off-by: Tom Ballard <tom@armytage.co>
…regression-triage]

Unit (default CI): verifier resolution (single/ambiguous/wrong/none),
all four verdicts with scripted runner/drive doubles, learning recorded
only for regression/inconclusive, parser guards, exit-code mapping, and
the human/JSON renderings. Real browser (PROOFKEEPER_E2E, wired into
the e2e job): a renamed button adjudicates as STALE TEST with a stable
repair candidate; a broken flow adjudicates as PRODUCT REGRESSION.

Signed-off-by: Tom Ballard <tom@armytage.co>
…admap:regression-triage]

Implements lore-proofkeeper/requirements/req-regression-triage.md.

Adds the requirement and design artifacts (slice 1: verdict core and
command; the repair PR and regression report are a later slice), the
README 'Triage a failing test' section, and the changelog entry.

Signed-off-by: Tom Ballard <tom@armytage.co>
@tcballard tcballard changed the title feat(triage): stale test or broken product — the re-drive verdict core feat(triage): adjudicate a failing verifying test against its requirement [roadmap:regression-triage] Jul 2, 2026
@tcballard
tcballard changed the base branch from claude/next-roadmaps to main July 2, 2026 06:23
@tcballard
tcballard merged commit 7d5a797 into main Jul 2, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant