nornir-testmatrix 0.2.1

Reusable, multi-aspect Rust test-matrix engine: wrap a repo's native cargo test/nextest plus build/clippy/fmt/audit/coverage/doctest aspects, parse the results into rows, and ship them to any TestSink. Pure std + serde — no iceberg, arrow, eframe. The portable core of nornir's `nornir test` matrix.
Documentation

nornir-testmatrix

The portable core of nornir's multi-aspect test matrix — wrap a repo's native Rust test framework and test many aspects of its health (build, doctest, clippy, fmt, audit, coverage, feature-powerset, msrv, examples), parse the results into rows, and ship them to any TestSink.

Pure std + serde/serde_json + anyhow. No iceberg, arrow, eframe, tantivy, or skade — so any leaf repo can pull it cheaply.

use nornir_testmatrix::{run_full_matrix, Aspect, JsonFileSink, TestSink};
use std::path::Path;

let aspects = Aspect::DEFAULT; // build, unit, doctest, clippy, fmt, audit
let rows = run_full_matrix(Path::new("."), aspects);
JsonFileSink::new("target/nornir-testmatrix.json").append(&rows).unwrap();

A missing tool (clippy/audit/llvm-cov/hack/fmt) is recorded as a neutral skip row — never a hard failure. See .nornir/testmatrix-crate.md.

Functional-status mode (testmatrix feature)

A component can report whether it actually works — even when the result can't be eyeballed (a map that renders nothing). Behind the testmatrix cargo feature (off for release → zero cost), call from your self-test path:

nornir_testmatrix::functional_status("facett-map", "basemap_rendered", ok, "0 ways, blank framebuffer");

Aspect::Functional drains these into test_results rows (ok=false → a RED matrix row), so a dead render shows up in nornir test / the viz Test pane without anyone looking at a GUI. With the feature off, functional_status is an inlined no-op. See .nornir/testmatrix-functional-status.md.