Assess whether a dataset is trustworthy enough for analysis, modeling,
dashboards, experiments, or downstream pipelines. Start with the intended use and grain, run the highest-value checks for the data shape, and report concrete evidence, analytical risk, likely causes, and the smallest useful remediation or automated test.
Mandatory pre-answer gate: Invoke
data-analytics:user-context in preflight mode by loading
data-analytics:user-context and running its preflight script before answering, searching connectors, retrieving evidence, creating artifacts, or drafting output. Do not look for a callable MCP tool named
data-analytics:user-context. Use the returned
data_analytics_preflight envelope as the source of truth for saved context, source-category mapping, semantic-layer registry, onboarding/final-response obligations, and conditional guidance; use saved context and semantic layers as source-selection inputs, not as substitutes for workflow-time reads from connected or provided sources. Do not read or reinterpret raw plugin state files unless preflight fails, declares required content omitted, local shell access is unavailable, or the user explicitly asks for raw state inspection.
-
Clarify the quality question and operating context.
Establish what the dataset represents, the intended unit of analysis, the downstream use, whether the user cares about raw ingestion quality,
transformed-model quality, or both, and the comparison baseline such as prior weeks, prior schema, or a trusted reference table. Identify expected grain,
primary keys or candidate keys, important date columns, timezone assumptions,
domain rules, allowed values, and business thresholds. If context is missing,
infer cautiously and label assumptions.
-
Choose an inspectable analysis path.
When checks require SQL or Python, default to a companion notebook so the user can inspect the exact code behind the findings. Use $jupyter-notebooks when a dedicated notebook scaffold or refactor workflow would help. For queryable tables, use ~~structured_data to confirm schema, grain, sample rows, and query rules through the relevant source connector before heavier checks. Use ~~operations_logs for freshness and lineage when those checks matter.
-
Build a compact profile.
Start with row count, column count, column names and types, candidate keys,
duplicate rates on likely identifiers, min/max timestamps for relevant date columns, null rates, distinct counts for likely categorical columns, and basic numeric summaries for measure columns. Confirm grain before interpreting anomalies; many apparent quality problems are mixed-grain data,
partial backfills, late-arriving data, or duplicated joins.
-
Run core quality checks.
Select checks that match the dataset and task. Default to the most relevant checks across completeness, uniqueness, validity, consistency, integrity,
timeliness, volume, and shape. Compare rates, not just counts, and segment by time, source, country, platform, model version, or other key dimensions when that helps distinguish real issues from expected variation.
-
Run shape-specific checks.
Adapt the checks to the data shape:
- Event data: duplicate event IDs, future event timestamps, session or user
coverage gaps, and abrupt event-mix changes after releases.
- Dimension tables: non-unique business keys, orphan surrogate keys, status
changes without corresponding timestamps, and unexpected churn in reference
values.
- Fact tables: mixed grain, impossible measures such as negative revenue or
quantity, join blowups to dimensions, and late-arriving or partially loaded
partitions.
- ML feature or scoring tables: leakage from post-outcome fields, feature
sparsity spikes, range shifts after model or feature-store changes, and
class-label drift.
- Experiment data: duplicate assignments, variant imbalance beyond
expectation, exposure without assignment, and events before assignment
timestamp.
-
Run temporal and distribution checks when history exists.
Prioritize temporal diagnostics when the user mentions "after X date",
"suddenly", "recently", or "only started appearing". Check first-seen dates,
last-seen dates, daily or weekly null-rate trends, duplicate-rate trends, row count trends, category-share shifts, distribution drift, and change points around launches, migrations, incidents, model changes, or backfills.
-
Investigate analytical risks and likely causes.
Tie each issue to the downstream risk: broken trusted analysis, biased decisions, broken joins, stale dashboards, incorrect experiments, leakage,
unreliable model features, or misleading segments. When possible, identify whether the issue is isolated to a source, segment, partition, time window,
release, migration, backfill, or upstream pipeline change.
-
Recommend fixes or automated tests.
Recommend the smallest set of follow-up fixes, monitoring, or automated tests that would materially reduce risk. Suggest automation only when the rule is stable and worth maintaining. Include or save the notebook/query path when code produced the findings.
Do not dump raw profiling output without interpretation. Tie each finding to an analytical risk and likely impact.
When code was used, include or save a notebook containing the key SQL and Python checks and make the notebook path easy to find.