data-dashboard-intelligence
Installation
SKILL.md
Data Dashboard Intelligence
This skill teaches you how to turn normalized event data into dashboards that look and feel premium — not generic template outputs. It works on field semantics (what the data looks like), not platform names (where it came from). By the time you use this skill, platform skills have already normalized fields into universal types like status, duration_ms, cost, and timestamp.
The core idea is simple: every field in a dataset has a shape (numeric, categorical, temporal, textual) and a semantic (it measures time, money, status, identity, etc.). The shape tells you which component to use. The semantic tells you how to aggregate it and what to call it. Together, they produce a dashboard that tells a story instead of just displaying numbers.
1. Field-to-Component Mapping
When you see a field from getEventSamples or analyzeSchema, pick the right component based on what the field is, not what it's named.
| Field Shape | How to Detect | Component | Why This Works |
|---|---|---|---|
| ID (unique, high cardinality) | uniqueValues / totalRows > 0.9 |
MetricCard (count) |
IDs exist to be counted — "Total Executions" |
| Status (categorical, 2–8 values) | String, uniqueValues 2–8 |
PieChart / DonutChart | People intuitively read status distributions as pie slices |
| Binary (exactly 2 values) | uniqueValues === 2, one is positive |
MetricCard (percentage) |
Success/fail is best shown as "94% Success Rate" |
| Timestamp (datetime) | Parseable as date, sequential | TimeseriesChart | Trends over time need a time axis |
| Duration (numeric, positive) | Name contains duration, time, elapsed, ms |
MetricCard (average) |
Average duration is more useful than total |
| Money (numeric, currency-like) | Name contains cost, amount, price, spend |
MetricCard (sum) + trend |
You sum money — "Total Spend: $4,200" |
| Rate (numeric, 0–100 or 0–1) | Name contains rate, ratio, percent, score |
MetricCard (average) |
Rates are averaged or shown as latest |
| Label (medium cardinality, 3–50 values) | String, uniqueValues 3–50 |
BarChart | Bar charts handle medium-cardinality breakdowns well |
| High-cardinality text (>50 values) | String, uniqueValues > 50 |
DataTable column | Too many values for any chart — show in table |
| Long text (avg length > 100 chars) | String, avg(length) > 100 |
DataTable column (truncated) | Transcripts, error messages — table only |
| Override rules (these exist because edge cases produce ugly charts): |
- Timestamp with < 5 distinct dates → MetricCard fallback (sparse timeseries look broken)