# CSV reporter + evidence bundler refinements

**Task**: AZ-445_csv_reporter_evidence_bundler
**Name**: Per-NFR machine-readable outputs, traceability-status.json, regression-detector inputs
**Description**: Build out the CSV reporter + evidence bundler beyond AZ-406's bootstrap — add per-NFR machine-readable outputs for performance / resilience / security / resource-limit suites, generate `traceability-status.json` mapping AC → status, emit regression-detector inputs.
**Complexity**: 2 points
**Dependencies**: AZ-406, all 39 prior scenario tasks (consumes their output)
**Component**: Blackbox Tests / Reporting (epic AZ-262)
**Tracker**: AZ-445
**Epic**: AZ-262 (E-BBT)

## Problem

The bootstrap CSV reporter handles the basics (one row per `(scenario, fc_adapter, vio_strategy, tier)` with PASS/FAIL/PARTIAL). But the project also needs per-NFR machine-readable outputs (so `nft-perf-01-partition.csv` can be diffed across runs), a `traceability-status.json` aligning to the matrix, and explicit regression-detector inputs so future runs can tell quickly whether a regression occurred.

## Outcome

- `e2e/runner/evidence_bundler.py` extended:
  - For each NFT scenario: emit a per-scenario JSON with the canonical metrics (latency p95, drift, cov, etc.) into `e2e-results/run-${RUN_ID}/per-nfr/<scenario_id>.json`.
  - Emit `traceability-status.json` mapping each AC ID → `{Covered, PARTIAL, NOT COVERED}` with the source scenario IDs.
  - Emit `regression-baseline.json` with all numeric metrics from the run (consumable by a future diff tool).

## Scope

### Included
- Per-NFR JSON emission.
- `traceability-status.json` generation by aggregating each scenario's `traces_to` field.
- `regression-baseline.json` emission.
- Updates to existing `report.csv` with PARTIAL annotation pulled from each scenario's `traceability-status` contribution.

### Excluded
- The diff tool itself — out of scope (a separate future task).
- Per-scenario assertion logic — owned by each scenario task.

## Acceptance Criteria

**AC-1: per-NFR JSON emission**
Given any NFT scenario completes
Then `e2e-results/run-${RUN_ID}/per-nfr/<scenario_id>.json` exists with the documented schema (one well-known field per metric the scenario emits).

**AC-2: traceability-status.json**
Given a full CI run
Then `traceability-status.json` lists every AC ID (from `traceability-matrix.md`) with status `Covered | PARTIAL | NOT COVERED` AND the source scenario IDs.

**AC-3: regression-baseline.json**
Given a full CI run
Then `regression-baseline.json` contains every numeric metric per scenario per parameterization, in a stable schema diffable across runs.

**AC-4: PARTIAL propagation**
Given any scenario's per-NFR JSON marks an AC PARTIAL
Then `traceability-status.json` reflects it; `report.csv` shows the scenario row as `PARTIAL` rather than `PASS`.

## System Under Test Boundary

This task is reporting-only. It consumes test outputs and produces evidence files.

## Document Dependencies

- `_docs/02_document/tests/traceability-matrix.md` (the AC-ID universe)
- `_docs/02_document/tests/test-data.md` § Reporting & Evidence
