Story 27: Coverage tracking (full-stack)

Add end-to-end coverage tracking: backend collects vitest coverage,
records metrics with threshold/baseline tracking, and blocks acceptance
on regression. Frontend displays coverage in gate/review panels with
a "Collect Coverage" button. Includes 20 Rust tests, 17 Vitest tests,
and 14 Playwright E2E tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dave
2026-02-19 14:45:57 +00:00
parent 8f0bc971bf
commit 8f684a6ca4
20 changed files with 1216 additions and 34 deletions

View File

View File

@@ -0,0 +1,37 @@
---
name: Coverage Tracking
test_plan: approved
---
# Story 27: Coverage Tracking
## User Story
As a user, I want the workflow to track test coverage and block acceptance when coverage regresses, so quality guardrails cannot be weakened silently.
## Acceptance Criteria
- [x] The workflow fails if coverage drops below the defined threshold.
- [x] Coverage regression is reported clearly before acceptance.
## Test Plan (Approved)
### Backend (Rust) — Unit
**AC1: Workflow fails if coverage drops below threshold**
- `workflow::check_coverage_threshold()` fails when coverage % < configured threshold
- Passes when coverage >= threshold
**AC2: Coverage regression reported clearly before acceptance**
- `workflow::evaluate_acceptance_with_coverage()` includes coverage delta when coverage dropped
- `AcceptanceDecision` extended with `coverage_report` field
- Acceptance blocked with clear message when baseline exists and current < baseline
### Frontend (Vitest + Playwright)
**AC1:** Gate panel shows "Coverage below threshold (X% < Y%)" and coverage display
**AC2:** Review/gate panels display coverage regression text and summary
**E2E:** Blocked acceptance displays coverage reasons; green coverage when above threshold
## Out of Scope
- Introducing new test frameworks beyond those listed in `specs/tech/STACK.md`.
- Large refactors solely to improve coverage.
- Path-based test file detection (not reliable for languages with inline tests like Rust).