Data Quality Framework — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Data Quality Framework (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Bad data costs most when it is discovered by the consumer - an executive quoting a dashboard built on a half-loaded table, or a model trained on duplicated rows. The costly mistake this skill prevents is the all-or-nothing test suite: either no checks, or hundreds of untiered checks that page someone nightly until they are all silenced. The output is a small, tiered check suite where every failure has a defined severity and action.
Severity tiering (Step 3) comes before implementation because a check without a defined response is future alert fatigue.
Every table gets, at minimum: unique + not_null on the primary key, freshness on its source, and one row-count anomaly check. Add business-rule checks only where a failure has a named consequence.
The asymmetry is deliberate: key integrity failures corrupt every downstream join, so they block; distribution wobbles usually have benign causes, so they warn.
Generic tests in schema YAML:
models:
- name: orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['pending', 'shipped', 'delivered', 'cancelled']
- name: customer_id
tests:
- relationships:
to: ref('customers')
field: customer_idSingular tests (SQL that returns failing rows) for business rules:
-- tests/assert_positive_amount.sql
select order_id from {{ ref('orders') }} where amount <= 0Use dbt_utils and dbt_expectations for tests like expect_column_values_to_be_between, freshness checks, and row-count anomalies rather than hand-rolling them.
sources:
- name: raw
tables:
- name: events
freshness:
warn_after: {count: 6, period: hour}
error_after: {count: 12, period: hour}
loaded_at_field: ingested_atDerive the numbers from consumption, not habit: warn at roughly 2x the normal load interval, error at the point a consumer makes a wrong decision on stale data. A daily-refreshed executive dashboard tolerates 24 hours; a fraud feature does not tolerate 15 minutes.
Static thresholds miss slow rot. Track per table, trended daily against a rolling 28-day baseline: row counts per load, null rate per column, and distribution summaries (mean, p50, p95) on key numeric columns. Alert when a metric deviates more than 3 standard deviations from its recent history; compare same-weekday to avoid weekend false positives.
TABLE: [FILL: schema.table] OWNER: [FILL: team/person]
CONSUMERS: [FILL: dashboards/models]
Check Dimension Severity Threshold Action on failure
PK unique + not_null Uniqueness ERROR 0 violations Block load; page owner
Source freshness Timeliness WARN/ERROR [FILL]h / [FILL]h Alert; block at error
Row count vs 4wk baseline Completeness WARN/ERROR ±30% warn / ±50% error Alert; block at error
status accepted_values Validity WARN <0.5% of rows Alert; ticket if recurring
[FILL: business rule] Consistency [FILL] [FILL] [FILL]
Reconciliation vs [FILL: sot] Accuracy WARN >1% divergence Alert finance/ownerProduce a data quality specification containing: the scoped tables with owners, the filled check-spec per table with severities and thresholds, the dbt YAML and singular tests implementing them, freshness SLAs justified by consumption, and the alert routing with defined actions per severity.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.