Skip to main content
The coverage commands answer “is the corpus done?” without touching a browser. They re-match saved captures against the current .sightmap/ YAML and classify every interactive node into a tier: A view is a set of timestamped captures, and all three commands score the union of that set: real pages render differently load to load, so a component missing from one capture is not a dead selector. All three exit 0 on success and 1 on failure.
These commands read the .snap.tree.json files written by snapshot — see Capture commands for producing them and View sets for how the sets are organized. Coverage only scores nodes; validating the YAML itself is validate and lint (see Corpus commands).

coverage

Re-runs T1/T2/T3 coverage on saved captures. With no arguments it walks every capture under .sightmap/snapshots/; pass one or more FILE.snap paths to score just those (each needs its .snap.tree.json sibling). Counts visible nodes only by default — running with --include-hidden unintentionally inflates T3 with false failures. coverage prints a per-capture tier line (each capture describes one DOM), but judges component presence across the whole view set:
  • [Warnings] — components that matched 0 of N snaps while their leaf selector part does match nodes: the scoped selector is likely broken.
  • [Absent] — components that matched 0 of N snaps and whose leaf part matches nothing either: structurally valid selector, element simply not rendered in the captured scenarios.
  • [Presence] — components matched in only a subset of the set, with the last-matched capture stamp. These are not failures; they are what a union-scored set is for.
The check fails when a capture cannot be read or when any capture has T3 orphans; the dead-component sections ([Warnings], [Absent]) are reported without affecting the exit status. A trailing [Annotation gaps] section is purely advisory — it lists non-interactive content nodes whose accessible name carries real information but that have zero component context, and never affects the exit status. Flags:
With --trace, each failing capture also prints its orphan clusters, grouped by role and nearest stable-attribute ancestor with a suggested selector:
Do not treat a one-shot 0 matches on a fresh capture as a dead selector. Re-snap the view a few times — the novelty gate keeps only structurally new captures — and let the union decide. Confirm genuine absence with sel-probe against the live page.

multi-coverage

Builds the cross-page coverage matrix: one row per component, one column per view. A view’s captures fold into a single column whose cell is the maximum matched count across the set — “renders up to K of these” — and - marks a component that never matched in any of that view’s captures. The column header reads view·N when the view carries more than one capture. Below the matrix, multi-coverage lists global candidates: components that matched in 2 or more views but are not yet in components.yaml. Candidates count views, not capture files, so a single view snapped many times never trips the threshold. The promotion rule of thumb: 3+ views with the same selector, always promote; 2 views with identical selectors, usually promote; 2 views with different selectors, keep view-scoped. Flags:
Here the max-per-set cell rescues DigitalEndcap, a lazy carousel that rendered in only one of home’s three captures — it still reads 4, not dead. FacetFilter and PromoBanner each appear in a single view, so they are correctly not promotion candidates.

report

The corpus health table: one row per view with a URL, aggregated over the view’s whole view set. URLs come from each view’s top-level url: in views/*.yaml. Views with no saved captures show MISSING – run: sightmap snapshot --all. How a set of N captures rolls up to one row: The max-T3 gate is what keeps report and coverage in agreement: both fail iff some capture in a set has an orphan, so a clean final load can never mask an earlier capture’s gaps. After the table, a T2 quality section aggregates the largest T2 clusters across all views — each entry is a component whose subtree contains multiple unnamed interactive children, i.e. the next place to add child components. report exits 1 when any view fails the T3 gate or has no captures. Flags:
report is the natural CI gate: it fails on any orphaned node in any capture and on any view missing captures, and its summary line gives you the trend numbers (average T1/T2) to watch across commits.

Typical flow

1

Refresh captures

Run sightmap snapshot --all against a live session to append a novelty-gated capture for every view URL declared in views/*.yaml (see Capture commands).
2

Score the sets

Run sightmap coverage (add --trace on failures). Fix broken selectors flagged under [Warnings], and author components for any orphan clusters until every capture reads 0 orphaned T3 ✓.
3

Promote cross-page components

Run sightmap multi-coverage and move each global candidate that appears in 2+ views into components.yaml.
4

Check corpus health

Run sightmap report. You are done when every view shows , nothing is MISSING, and the T2 quality list contains only clusters you have deliberately accepted.