Data quality — provenance, coverage, freshness & completeness
Cairn's data quality is, before anything else, a provenance property: every
figure traces back to an immutable official source, pinned by sha256 in an
append-only manifest. This page reports that chain's integrity for each source —
observable facts from the manifests, not a confidence score. It deliberately
does not rate how "good" a number is; it shows whether the number is still pinned
to the source it came from.
Configured sources
Pinned to immutable storage
Raw rows pinned by hash
What each status means
The pin status is derived deterministically from where a source's raw file is stored — it is a fact about the snapshot, not a judgement about the data:
pinned_r2— the raw file sits in immutable object storage and is pinned bysha256. This is the auditable pin of record: the figure cannot drift without a manifest change and a failing build.pinned_local— afile://pin from an--offlinerun. Useful locally, but it is never the committed pin of record, so apinned_localrow in a published build is an integrity flag worth investigating.unpinned— the source is configured but has no snapshot yet. It is shown honestly as unpinned, never filled in with a placeholder hash or row count.
Current pin of record per source
The hash shown is the claim; CI verifies it. This page reports the SHA256 each source is pinned to. A weekly reproducibility job re-downloads each raw file, recomputes its SHA256, and rebuilds the warehouse from it — so a silently mutated source file is a failing build, not a number that quietly drifts. See Architecture → for the full CI rail and Methodology & sources → for per-figure provenance.
How complete is the coverage?
Provenance answers "is the number still pinned?". Coverage answers a different
question: how much of each source's official aggregate does Cairn's mart
actually capture, and how much of the CBS national total can be attributed to
a NACE sector? These are the same reconciliation figures the CI benchmark
already computes — assert_national_total_reconciles (CBS) and
assert_euets_coverage_within_eea (EU ETS) — surfaced here as standing facts
rather than discarded once the test goes green.
Descriptive, not a score. covered_share describes how completely each
source's official aggregate is captured, and — for CBS — unmapped_share
describes how much of the national total cannot be attributed to a single
NACE section. Neither is a confidence or quality score on any individual
figure. reconciliation_drift near zero confirms the mart's own total still
matches the official aggregate it derives from.
How current is the data?
Provenance and coverage answer "is it pinned?" and "how much does it capture?". This section answers a third question: how current is it? For each source, the pinned release and ingest date, the latest calendar year its benchmark mart actually covers, and the observed lag between "now" (this page's own build time) and those two facts.
Descriptive, not an SLA or alarm. ingest_age_days and coverage_lag_years
are measured against this page's own build time, so they drift with every
rebuild — they are not pinned figures. latest_covered_year is NULL for a
source with no benchmark mart yet. No "expected next release" date is ever
computed: several sources publish on no fixed cadence, so only the observed
lag is shown, never a predicted one. Watching for an actually new upstream
release is the weekly reproducibility job's and the no-LLM dispatcher's job
(scripts/check_freshness.py), not this page.
How complete are the nullable columns?
Provenance, coverage, and freshness answer "is it pinned?", "how much does it
capture?", and "how current is it?". This section answers a fourth question:
for columns that are deliberately nullable, how fully are they populated?
lei, allocated_total_t_co2eq, and surrendered_allowances_t_co2eq on the
two EU ETS marts, and the UNMAPPED sentinel NACE on the CBS sector mart, are
each legitimately NULL (or UNMAPPED) some of the time — not-yet-mapped in a
reviewed seed, or genuinely absent upstream. This tracks that completeness as
an observable fact, letting reviewed-seed coverage (e.g. the LEI mapping) be
watched as it grows over time.
Counts only, never a fix. A NULL (or UNMAPPED) value here is a
legitimate, documented state, not an error — this page never imputes or fills
one in, and populated_share is never a quality verdict on the underlying
emissions figures themselves. The tracked columns are a curated list, not
every nullable column in every mart.
