# Dstack Profile

> Data quality audit for a table or dataset. Checks null rates, cardinality, duplicates, value distributions, date ranges, and referential integrity. Outputs a quality scorecard with OK/WARN/FAIL ratings per dimension. Run before building models, pipelines, or reports on top of a dataset. Trigger phrases: "audit this table", "check data quality", "profile this dataset", "how clean is this data?", "is this table safe to use?".

- Skill: `upsolve-labs/dstack-profile` (Agent Skill)
- Install (CLI): `npx skillmds@latest add upsolve-labs/dstack-profile`
- Raw SKILL.md: https://api.skillmd.com/api/skills/upsolve-labs/dstack-profile/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: MIT
- Author: Upsolve-Labs (https://skillmd.com/u/upsolve-labs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/upsolve-labs/dstack-profile

---


## Update Check (run first)

```bash
_UPD=$(~/.claude/skills/data-stack/bin/data-stack-update-check 2>/dev/null || .claude/skills/data-stack/bin/data-stack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
```

If output shows `UPGRADE_AVAILABLE <old> <new>`: read `~/.claude/skills/data-stack/skills/dstack-upgrade/SKILL.md` and follow the "Inline upgrade flow". If `JUST_UPGRADED <from> <to>`: tell user "Running data-stack v{to} (just updated!)" and continue.

# /profile

You are running a data quality audit on a specific table or dataset.

## Before Starting

If the user hasn't specified a table, AskUserQuestion: "Which table or dataset do you want to profile?"

## Phase 1: Schema & Volume

Open an Upsolve thread:

```
analyze_data("Profile the table <table_name>: show total row count, column names and data types, and a sample of 5 rows.")
```

## Phase 2: Null & Completeness Check

```
analyze_data("For each column in <table_name>, show: null count, null percentage, and distinct value count.", thread_id=<id>)
```

Flag: >5% nulls → WARN, >20% nulls → FAIL.

## Phase 3: Duplicates

```
analyze_data("Check for duplicate rows in <table_name>. Show exact duplicate count and, if there is a primary key column, show the duplicate key count.", thread_id=<id>)
```

## Phase 4: Distribution & Outliers

```
analyze_data("For numeric columns in <table_name>: show min, max, mean, median, and values >3 standard deviations from the mean. For date columns: show min date, max date, and flag any gaps greater than 7 days.", thread_id=<id>)
```

## Phase 5: Output Scorecard

```
DATA QUALITY REPORT: <table_name>
As of: <date>
────────────────────────────────────────
Volume:    X,XXX rows    [OK / WARN / FAIL]
Nulls:     X cols >5%    [OK / WARN / FAIL]
Dupes:     X duplicates  [OK / WARN / FAIL]
Ranges:    <summary>     [OK / WARN / FAIL]

COLUMN DETAILS:
  col_name   type    nulls%   distinct   notes
  ...

ISSUES FOUND:
  FAIL  <specific issue>
  WARN  <specific issue>

RECOMMENDATION:
  <1–2 sentences on whether this data is safe to use and for what purpose>
```

Thresholds: OK = no issues, WARN = minor concern, FAIL = data is unreliable for this dimension.

## Rules

- Run all 4 phases before outputting the scorecard — never skip.
- If a table has >100 columns, profile the first 50 plus any columns the user calls out.
- Report what the data shows. Don't speculate about what it should mean.

