The MATRIX files in hydrahyperscaler docs/testbooks/region-qualification/results/ have been written BY HAND. That does not survive the real campaign: roughly 7 venues x 4 regions x 3 paths x 6 runs is a few hundred documents, and a hand-tabulated matrix will drift. A stale matrix is worse than none, because it reads as authoritative.
Add hydraprobe matrix <dir>:
- Read every *.yaml in the directory (PLAN 4.6 schema).
- Group by venue, region and path.
- Take the WORST run per cell, never the best (PLAN 4.8).
- Score each cell against the two tiers from the 2026-09-14c ruling and report the HIGHEST tier reached: vr, flat or unfit.
- Emit markdown: the tier table, plus per-cell RTT p50/p99, IPDV p99, loss and run count.
- Flag cells that do not yet satisfy PLAN 4.5 coverage (fewer than 6 runs, or missing one of the three daily windows, or no weekend day). A cell short of coverage is reported as INDICATIVE, never as qualified. This matters: every number taken so far is a single evening run and must not read as a verdict.
- Carry instrument context: show the rx_timestamp source and the worst pacing error in the cell, so a reader can see what measured it (#724 is what happens when that is invisible).
- Exit non-zero if any file fails to parse, so a malformed result cannot silently vanish from the map.
Dependencies: do this AFTER #725 (tier scoring in the result package), since the matrix reuses that logic rather than reimplementing the thresholds. Do not duplicate the tier table in two places.
Rationale and the wider data-home decision: hydrahyperscaler docs/DATA-HOME.md.