Skip to main content
The coverage commands re-match saved captures against the current .sightmap/ YAML without opening a browser. They classify each interactive node into a tier: A view can have several timestamped captures. coverage reports tiers per capture and evaluates component presence across the set. multi-coverage takes the highest match count per component in each view. report aggregates each view into one row.
These commands read the .snap.tree.json files written by snapshot. See Capture commands for creating them and View sets for their layout. Use validate and lint to check the YAML itself; see Corpus commands.

coverage

Re-runs T1/T2/T3 coverage on saved captures. With no arguments, it reads captures under .sightmap/snapshots/ and legacy .snap files in the current directory. Pass one or more FILE.snap paths to score only those files; each needs a .snap.tree.json sibling. Coverage counts visible nodes by default. Use --include-hidden when hidden and off-screen nodes belong in the analysis. coverage prints tiers for each capture and evaluates component presence across the view set:
  • [Warnings] lists components that matched none of the captures even though their leaf selector matched nodes. The full scoped selector is likely wrong.
  • [Absent] lists components whose full selector and leaf selector matched nothing in the set.
  • [Presence] lists components that matched only some captures and shows the most recent matching capture.
The command exits with an error when it cannot read a capture or any capture has T3 orphans. [Warnings], [Absent], [Presence], and [Annotation gaps] do not affect the exit status. [Annotation gaps] lists non-interactive content nodes with no component context when their accessible names contain a letter and are at least 12 characters long. Flags:
With --trace, each failing capture also prints its orphan clusters, grouped by role and nearest stable-attribute ancestor with a suggested selector:
A component can be absent from one capture and present in another. Capture the relevant page states before treating 0 matches as a dead selector, then check the live page with sel-probe.

multi-coverage

Builds a cross-page matrix with one row per component and one column per view. Each cell is the highest match count for that component across the view’s captures. - means the component never matched in that view. The column header reads view·N when the view has more than one capture. Below the matrix, multi-coverage lists components that matched in at least two views but are not global components. It counts views rather than capture files. Flags:
DigitalEndcap matched four nodes in at least one home capture, so its cell reads 4. FacetFilter and PromoBanner each appear in one view and are not listed as global candidates.

report

Prints one row for each view with a top-level url. Each row aggregates the view set. A view with no saved captures shows MISSING – run: sightmap capture --all. How a set of N captures rolls up to one row: report fails if any capture has a T3 orphan or any view is missing captures. The maximum T3 count prevents a clean capture from hiding orphans in another capture. The T2 quality section lists up to 15 components whose subtrees contain at least three unnamed interactive children. Flags:
Run report in CI to fail on orphaned nodes or missing captures. Its summary includes average T1 and T2 percentages across the corpus.

Typical flow

1

Refresh captures

Run sightmap capture --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 review the global candidates. Move a component into the root components: collection only when it should match every view.
4

Check corpus health

Run sightmap report. Check that every view shows , no view is MISSING, and each remaining T2 cluster is intentional.