pub fn validate_coverage(
vocab: &[&str],
registry: &[SurfaceCoverage],
discovered: &[&str],
) -> Vec<String>Expand description
Hold a registry against the axis vocabulary and a mechanically discovered surface roster. Returns one finding per defect; an empty result is the only clean outcome. Pure and total: callers in tests pass the live vocabulary and their own live walk, fixtures pass synthetic ones.
The findings, each mapped to the failure it refuses:
- a discovered surface with no registry row (a surface landed without declaring),
- a registry row no walk discovers (a stale declaration reading as coverage),
- a duplicate row (two claims, no single truth),
- an axis named by a declaration that the vocabulary does not carry (a stale axis reading as coverage),
- an axis in the vocabulary that a verdict declaration neither examines nor excludes (a new axis met by silence: the clean verdict would cover it by omission),
- an axis both examined and excluded (a contradiction),
- an exclusion or no-verdict claim with an empty reason (a declaration that declares nothing).