data-quality-gatelisted
Install: claude install-skill Lukehle/closeloop
# Data quality gate
A gate that warns is not a gate. **This one blocks.**
The economics are one-sided: catching a bad extract at the boundary costs minutes; catching it after
it has flowed into a reconciliation, a metric, a board deck, and an external commitment costs days
and a credibility hit. Every check below runs *before* anything downstream reads the data.
Load `tie-out` — the gate emits the same PASS/FAIL discipline, with thresholds declared in advance.
---
## The seven checks
Run in this order. Order matters: a failed row count makes every later check meaningless, so stop at
the first `BLOCK`.
### 1. Row count within expected bounds
```
expected: 14,000 - 16,000 (prior 3 periods: 14,882 / 15,104 / 14,655)
actual: 14,882 PASS
```
Derive bounds from history, not from a guess. **A row count of zero is always a BLOCK**, never an
empty period — an empty result is far more often a broken query, a permissions failure, or a wrong
date filter than a genuinely quiet month.
### 2. Control total agrees to source
```
source (NetSuite AR aging report): 12,441,520.11
extract sum(amount_usd): 12,441,520.11 PASS (exact)
```
This is the check that matters most, because it catches the failures the others cannot see —
truncation, a fan-out join doubling amounts, a partial load. **Exact match required.** A control
total tolerance is not a tolerance, it is a decision to ship unknown differences.