Skip to content

review: require a concrete failure_scenario on every finding#226

Merged
jwbron merged 1 commit into
mainfrom
review-failure-scenario
Jul 9, 2026
Merged

review: require a concrete failure_scenario on every finding#226
jwbron merged 1 commit into
mainfrom
review-failure-scenario

Conversation

@jwbron

@jwbron jwbron commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Summary

First of three PRs split out of #224 (stack: this PR, then #227 provenance gate, then #228 prompt disciplines). Each lands independently revertable; the three together are byte-identical to #224.

Every finding (not just blocking ones) now carries a concrete failure_scenario: the specific inputs or state and the wrong outcome they produce. The field is required in the structured finding schema (FINDING_SCHEMA_VERSION bumped to 2), emitted by every producer (label-shape reviewers and all 11 specialist lenses), and carried verbatim into claims.json. The claim-validator now attacks exactly that stated scenario: confirmed means the named scenario occurs on the cited lines, and a scenario too vague to check caps at plausible.

FINDING_SCHEMA_VERSION is now 2 (a required field invalidates previously serialized findings, per the schema module's own rule); every corpus fixture is migrated with a hand-written failure scenario.

cc @jeresig

Testing

  • npx vitest run workflows/review: 410 tests green, including the smoke set.
  • npx tsc --noEmit clean.

Every finding (not just blocking ones) now carries a failure_scenario:
the specific inputs or state and the wrong outcome they produce. The
field is required in the structured finding schema
(FINDING_SCHEMA_VERSION bumped to 2), emitted by every producer
(label-shape reviewers and all 11 specialist lenses), and carried
verbatim into claims.json. The claim-validator attacks exactly that
stated scenario: confirmed means the named scenario occurs on the cited
lines, and a scenario too vague to check caps at plausible.

Every corpus fixture is migrated with a hand-written failure scenario,
per the schema module's rule that a required field invalidates
previously serialized findings.
@changeset-bot

changeset-bot Bot commented Jul 9, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8306d13

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
review Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@jeresig jeresig left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great!

@jwbron jwbron merged commit 4a57d01 into main Jul 9, 2026
4 checks passed
@jwbron jwbron deleted the review-failure-scenario branch July 9, 2026 18:06
jwbron added a commit that referenced this pull request Jul 9, 2026
…tripped diffs (#227)

## Summary

Second of three PRs split out of #224; stacked on #226 (retarget to main when it merges). The follow-up prompt-disciplines PR stacks on this one.

**Change-provenance gate, enforced in code.** New `lib/diff.ts` (unified-diff parsing) and `lib/provenance.ts` (gate + CLI) compute a per-file changed-line map (`provenance.json`). A finding whose anchor is not an added or modified line of the diff cannot carry a blocking label, and pre-existing observations collapse into at most one non-blocking collapsed note (`renderPreExistingNote`). Deletion findings pass via `removedAdjacent` lines. The gate fails open (gates nothing, with a review-body note) whenever the parsed map cannot be trusted: an unparseable diff, hunk headers not attributable to any file section, or a changed file whose patch is missing from the parse (`files.json` now carries a `hasPatch` flag so binary/too-large files do not false-positive the check). Wired through the no-post eval runner and covered by unit tests plus a new smoke corpus case (`provenance-pre-existing-note`).

**Generated-stripped whole-change diffs (measured cost fix).** The provenance CLI also stages `full-stripped.diff` (the full diff minus files the router classifies `linguist-generated`; `routing.json` now exposes `generatedFiles`). Every whole-change reviewer and specialist lens reads it instead of the full diff; `pattern-triage` keeps the full diff since classification is its job. These ship together because the same CLI writes both artifacts.

No trigger config or consumer files touched.

cc @jeresig

## Testing

- `npx vitest run workflows/review`: 452 tests green, including the new end-to-end smoke case for the provenance gate.
- New unit suites: `lib/diff.test.ts`, `lib/provenance.test.ts`, plus `renderPreExistingNote` rendering tests and router `generatedFiles` coverage.
- `npx tsc --noEmit` clean under the repo's strict compiler options.

Author: jwbron

Reviewers: jeresig, jwbron, somewhatabstract, kevinb-khan

Required Reviewers:

Approved By: jeresig

Checks: ✅ 3 checks were successful

Pull Request URL: #227
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.

2 participants