Report QA before publication
Purpose
The expensive data failures are not wrong queries; they are silent ones. A
pipeline stopped three days ago and the dashboard shows a plausible flat line. A
join dropped 4% of rows and the total still looks reasonable. A segment filter
excluded the largest region and nobody noticed because nobody knew what the total
should be. This skill is the fixed set of checks that catch silent failure before
a decision is made on the number, and the honest statement of limits that goes
out with it.
Prerequisites
- Inputs: the report or figures in final form; the query, model, or extract
behind them; the metric definitions in use; at least one independent source to
reconcile against; the prior period's published figures.
- Runtime: ability to re-run the underlying query or inspect the pipeline's
last successful run. A QA pass done by reading the output alone catches
formatting errors and nothing else.
If there is no independent source to reconcile against, say so explicitly in the
output rather than skipping the check silently — unreconciled is a materially
different claim from reconciled.
Procedure
Run all seven. They are ordered so the cheap checks that invalidate everything
come first.
Freshness. What is the maximum timestamp in the underlying data, and when
did the pipeline last complete successfully? Compare against the expected
cadence. Stale data that renders without error is the most common silent
failure, and a chart of a stalled feed looks like a stable business.
Completeness. Row counts per period against the same periods historically.
A drop or spike beyond the normal band is a defect until proven otherwise.
Check the tail explicitly: the current period is usually partial, and a
partial period plotted next to complete ones reads as a collapse. Either
exclude it or mark it.
Reconciliation. Tie the headline figure to something computed by a
different path — the source system's own report, the finance ledger, the
billing export, a count from the operational database. Record the difference
and whether it is within the agreed tolerance. Two figures from the same
pipeline agreeing is not reconciliation; it is the same computation twice.
Additivity. Do the segments sum to the total? If not, identify why:
overlapping membership, nulls in the dimension, a filter applied at one level
and not another, or rounding. Every one of those is a finding; unknown
residual is the worst kind, because it means the segmentation cannot be
trusted at all.
Movement plausibility. For every figure moved more than a set threshold
from the prior period, you must be able to name the cause — a real business
event, a known change, or a data defect. An unexplained large move is a defect
until proven otherwise. The failure this prevents is the analyst who explains a
pipeline bug as a business story and is believed.
Definition alignment. Confirm each figure was computed with the current
agreed definition, and that any definition change since the last publication
is disclosed with its effective date and step size. Charts spanning a
definition change without a marker are misleading even when every number is
correct.
Filter and grain audit. Re-read the query's filters and grouping against
what the report title claims. Common defects: an inner join silently acting as
a filter; a date filter on the wrong column (created vs updated vs event); a
deduplication that removes legitimate repeats; a leftover development limit
clause.
Severity and what to do
| Finding |
Severity |
Action |
| Stale data, unexplained completeness gap, reconciliation outside tolerance |
Blocking |
Do not publish; notify anyone who received a prior version |
| Unexplained material movement |
Blocking until explained |
Investigate before publishing |
| Segments do not sum, cause known and stated |
Publish with a note |
Note in the report, not in a footnote nobody reads |
| Partial current period |
Publish with a marker |
Mark it on the chart, not only in text |
| Undisclosed definition change |
Blocking |
Disclose or revert to the prior definition |
| Cosmetic or formatting |
Non-blocking |
Fix if time allows |
The limits statement
Every published set of numbers carries three lines: what the data covers (period,
population, source, as-of timestamp); what it does not support (the questions
readers will try to answer with it and cannot); and known caveats (open
reconciliation differences, partial periods, definition changes). This is the
section that prevents a directional figure being used as a precise one, and it is
the section most often cut for space. Do not cut it.
Failure modes this skill exists to prevent
- The plausible flat line. A stopped feed renders as stability. Caught by
check 1 only; no visual inspection catches it.
- Join loss. A join drops rows and the total is still credible. Caught by
checks 2 and 3.
- Filter drift. A dashboard filter left set from a previous investigation.
Caught by check 7; screenshotting a filtered dashboard into a deck is how this
reaches a board.
- Narrative fitting. A defect gets an interesting business explanation.
Prevented by check 5's requirement to name a specific cause, verifiable
independently.
- Silent republication. A corrected number is republished with no notice, so
people holding the old figure never learn. Restatements are announced.
Data handling
Classification: inherits from the underlying data — treat as Confidential if
the report contains personal, financial, or client-level data. Aggregate before
distribution wherever the decision does not require row-level detail, and check
small-cell disclosure: a segment with a handful of entities can re-identify them
even in an aggregate. Never paste raw customer records, account numbers, or
positions into a conversation to have them checked; work from aggregates or
masked extracts. If such data is supplied, flag it and stop.
Boundaries
- Two teams disagree about what the metric means —
data-analytics-metric-definition;
QA cannot resolve a definitional dispute and will keep producing "reconciles to
neither".
- The query itself needs correctness or cost review —
data-analytics-sql-review.
- The report is an experiment readout and the question is statistical validity
rather than data integrity — that needs an experiment readout procedure; these
checks still apply first.
- The numbers concern an incident's customer impact for an external statement —
run these checks, then hand to
engineering-incident-postmortem.
Hand-offs
- Receives from:
data-analytics-sql-review (a query cleared for correctness
still needs these output-level checks); data-analytics-metric-definition
(the contract this pass verifies compliance with).
- Routes to:
data-analytics-metric-definition when reconciliation failures
turn out to be definitional; data-analytics-sql-review when a check points at
the query rather than the data.
- See also:
it-access-review and engineering-incident-postmortem, both of
which publish figures that should pass this gate before circulation.
1---2name: data-analytics-report-qa3description: The pre-publication check for any report, dashboard, or number going to decision-makers: freshness, completeness, reconciliation to an independent source, segment additivity, period-over-period sanity, and a statement of what the numbers cannot support. Use before a report ships, when a figure looks surprising, when a dashboard has quietly stopped updating, or when a stakeholder asks whether a number can be trusted. Trigger on 'check this report before I send it', 'does this number look right', 'sanity check these figures', 'the dashboard looks off', 'can we trust this number', 'QA the deck numbers'. Not for settling what a metric means when two teams disagree — that is data-analytics-metric-definition; not for reviewing query correctness and cost, which is data-analytics-sql-review.4---56# Report QA before publication78## Purpose910The expensive data failures are not wrong queries; they are silent ones. A11pipeline stopped three days ago and the dashboard shows a plausible flat line. A12join dropped 4% of rows and the total still looks reasonable. A segment filter13excluded the largest region and nobody noticed because nobody knew what the total14should be. This skill is the fixed set of checks that catch silent failure before15a decision is made on the number, and the honest statement of limits that goes16out with it.1718## Prerequisites1920- **Inputs:** the report or figures in final form; the query, model, or extract21 behind them; the metric definitions in use; at least one independent source to22 reconcile against; the prior period's published figures.23- **Runtime:** ability to re-run the underlying query or inspect the pipeline's24 last successful run. A QA pass done by reading the output alone catches25 formatting errors and nothing else.2627If there is no independent source to reconcile against, say so explicitly in the28output rather than skipping the check silently — unreconciled is a materially29different claim from reconciled.3031## Procedure3233Run all seven. They are ordered so the cheap checks that invalidate everything34come first.35361. **Freshness.** What is the maximum timestamp in the underlying data, and when37 did the pipeline last complete successfully? Compare against the expected38 cadence. Stale data that renders without error is the most common silent39 failure, and a chart of a stalled feed looks like a stable business.40412. **Completeness.** Row counts per period against the same periods historically.42 A drop or spike beyond the normal band is a defect until proven otherwise.43 Check the tail explicitly: the current period is usually partial, and a44 partial period plotted next to complete ones reads as a collapse. Either45 exclude it or mark it.46473. **Reconciliation.** Tie the headline figure to something computed by a48 different path — the source system's own report, the finance ledger, the49 billing export, a count from the operational database. Record the difference50 and whether it is within the agreed tolerance. Two figures from the same51 pipeline agreeing is not reconciliation; it is the same computation twice.52534. **Additivity.** Do the segments sum to the total? If not, identify why:54 overlapping membership, nulls in the dimension, a filter applied at one level55 and not another, or rounding. Every one of those is a finding; unknown56 residual is the worst kind, because it means the segmentation cannot be57 trusted at all.58595. **Movement plausibility.** For every figure moved more than a set threshold60 from the prior period, you must be able to name the cause — a real business61 event, a known change, or a data defect. An unexplained large move is a defect62 until proven otherwise. The failure this prevents is the analyst who explains a63 pipeline bug as a business story and is believed.64656. **Definition alignment.** Confirm each figure was computed with the current66 agreed definition, and that any definition change since the last publication67 is disclosed with its effective date and step size. Charts spanning a68 definition change without a marker are misleading even when every number is69 correct.70717. **Filter and grain audit.** Re-read the query's filters and grouping against72 what the report title claims. Common defects: an inner join silently acting as73 a filter; a date filter on the wrong column (created vs updated vs event); a74 deduplication that removes legitimate repeats; a leftover development limit75 clause.7677### Severity and what to do7879| Finding | Severity | Action |80| --- | --- | --- |81| Stale data, unexplained completeness gap, reconciliation outside tolerance | Blocking | Do not publish; notify anyone who received a prior version |82| Unexplained material movement | Blocking until explained | Investigate before publishing |83| Segments do not sum, cause known and stated | Publish with a note | Note in the report, not in a footnote nobody reads |84| Partial current period | Publish with a marker | Mark it on the chart, not only in text |85| Undisclosed definition change | Blocking | Disclose or revert to the prior definition |86| Cosmetic or formatting | Non-blocking | Fix if time allows |8788### The limits statement8990Every published set of numbers carries three lines: what the data covers (period,91population, source, as-of timestamp); what it does not support (the questions92readers will try to answer with it and cannot); and known caveats (open93reconciliation differences, partial periods, definition changes). This is the94section that prevents a directional figure being used as a precise one, and it is95the section most often cut for space. Do not cut it.9697## Failure modes this skill exists to prevent9899- **The plausible flat line.** A stopped feed renders as stability. Caught by100 check 1 only; no visual inspection catches it.101- **Join loss.** A join drops rows and the total is still credible. Caught by102 checks 2 and 3.103- **Filter drift.** A dashboard filter left set from a previous investigation.104 Caught by check 7; screenshotting a filtered dashboard into a deck is how this105 reaches a board.106- **Narrative fitting.** A defect gets an interesting business explanation.107 Prevented by check 5's requirement to name a *specific* cause, verifiable108 independently.109- **Silent republication.** A corrected number is republished with no notice, so110 people holding the old figure never learn. Restatements are announced.111112## Data handling113114Classification: inherits from the underlying data — treat as **Confidential** if115the report contains personal, financial, or client-level data. Aggregate before116distribution wherever the decision does not require row-level detail, and check117small-cell disclosure: a segment with a handful of entities can re-identify them118even in an aggregate. Never paste raw customer records, account numbers, or119positions into a conversation to have them checked; work from aggregates or120masked extracts. If such data is supplied, flag it and stop.121122## Boundaries123124- Two teams disagree about what the metric means — `data-analytics-metric-definition`;125 QA cannot resolve a definitional dispute and will keep producing "reconciles to126 neither".127- The query itself needs correctness or cost review — `data-analytics-sql-review`.128- The report is an experiment readout and the question is statistical validity129 rather than data integrity — that needs an experiment readout procedure; these130 checks still apply first.131- The numbers concern an incident's customer impact for an external statement —132 run these checks, then hand to `engineering-incident-postmortem`.133134## Hand-offs135136- **Receives from:** `data-analytics-sql-review` (a query cleared for correctness137 still needs these output-level checks); `data-analytics-metric-definition`138 (the contract this pass verifies compliance with).139- **Routes to:** `data-analytics-metric-definition` when reconciliation failures140 turn out to be definitional; `data-analytics-sql-review` when a check points at141 the query rather than the data.142- **See also:** `it-access-review` and `engineering-incident-postmortem`, both of143 which publish figures that should pass this gate before circulation.