Gunnar

mikronova/modgunn

.nornir/verdict-matrix-coverage.md

<!-- nornir:class: reasoning -->
# Verdict surface — full gate-decision matrix coverage

The engine-agnostic verdict assembly (`scan.rs::Policy::assemble`) folds vuln +
license + provenance into a `Decision` (`Pass` / `Warn` / `Block`) and emits a
`modgunn/verdict-assembly · policy_decision` functional-status marker so
`nornir test` SEES the policy evaluation itself (RED ⟺ `Block`, GREEN otherwise).

## The gap this closed
`tests/testmatrix_wiring.rs` drove that surface for only **two** of the three gate
outcomes — a clean `Pass` (GREEN) and a High-vuln `Block` (RED) — asserting exactly
2 assembly rows. The **`Warn`** branch (a Medium/Low advisory → not blocked, but not
clean either) was never driven onto the matrix, so the field could not distinguish
"warned" from "passed" via the test-matrix.

## The fix (in code, AI-free at runtime)
Added a `Severity::Low` advisory (`CVE-2099-LOWSEV` / `leftpad@1.0.0`) to the wiring
scanner and drove a third scan → `Decision::Warn`. The single-drain assertion now
expects **3** `scan_verdict` and **3** `verdict-assembly` rows and asserts the Warn
row is **GREEN and names the `Warn` decision** in its detail. All three gate
outcomes — **Pass · Warn · Block** — are now matrix-visible.

Reuses edda `nornir-testmatrix` (`drain_functional_rows`), no hand-rolled harness.
`cargo test --features testmatrix --test testmatrix_wiring` → green.

![verdict matrix coverage](assets/verdict-matrix-coverage.svg)