Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Business intelligence across dashboard design, visualization, and reporting automation. Use when designing dashboards, building KPI frameworks, automating reports, creating data stories, or optimizing BI tool performance.
.claude/skills/borghei-business-intelligence/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-19 | ✗→✓ | ▲ Improved | 134% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 82% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 48% | 0% |
The agent operates as a senior BI specialist, designing dashboards, defining KPI frameworks, automating reporting pipelines, and translating data into executive-ready narratives.
Before designing the dashboard, confirm these inputs. If any is unknown or vague, ASK — do not assume:
metric_validator.py require)Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.
yaml# Copy and fill for each metric kpi: name: "Monthly Recurring Revenue" owner: "Finance" purpose: "Track subscription revenue health" formula: "SUM(subscription_amount) WHERE status = 'active'" data_source: "billing.subscriptions" granularity: "monthly" target: 1200000 warning_threshold: 1080000 # 90% of target critical_threshold: 960000 # 80% of target dimensions: ["region", "plan_tier", "cohort_month"] caveats: - "Excludes one-time setup fees" - "Currency normalized to USD at month-end rate"
Visual hierarchy:
#28A745 | Yellow #FFC107 | Red #DC3545 | Gray #6C757DChart selection matrix:
| Data question | Chart type | Alternative | |---------------|-----------|-------------| | Trend over time | Line | Area | | Part of whole | Donut / Treemap | Stacked bar | | Comparison across categories | Bar / Column | Bullet | | Distribution | Histogram | Box plot | | Relationship | Scatter | Bubble | | Geographic | Choropleth | Filled map |
+------------------------------------------------------------+
| EXECUTIVE SUMMARY |
| Revenue: $12.4M (+15% YoY) Pipeline: $45.2M (+22% QoQ) |
| Customers: 2,847 (+340 MTD) NPS: 72 (+5 pts) |
+------------------------------------------------------------+
| REVENUE TREND (12-mo line) | REVENUE BY SEGMENT (donut) |
+-------------------------------+-----------------------------+
| TOP 10 ACCOUNTS (table) | KPI STATUS (RAG cards) |
+-------------------------------+-----------------------------+Scheduled report (cron-style):
yamlreport: name: Weekly Sales Report schedule: "0 8 * * MON" recipients: [sales-team@company.com, leadership@company.com] format: PDF pages: [Executive Summary, Pipeline Analysis, Rep Performance]
Threshold alert:
yamlalert: name: Revenue Below Target metric: daily_revenue condition: "actual < target * 0.9" channels: email: finance@company.com slack: "#revenue-alerts" message: "Daily revenue ${actual} is ${pct_diff}% below target. Top factors: ${top_factors}"
Automated generation workflow (Python):
pythondef generate_report(config: dict) -> str: """Generate and distribute a scheduled report.""" # 1. Refresh data sources refresh_data_sources(config["sources"]) # 2. Calculate metrics metrics = calculate_metrics(config["metrics"]) # 3. Create visualizations charts = create_visualizations(metrics, config["charts"]) # 4. Compile into report report = compile_report(metrics=metrics, charts=charts, template=config["template"]) # 5. Distribute distribute_report(report, recipients=config["recipients"], fmt=config["format"]) return report.path
| Level | Capability | Users can... | |-------|-----------|-------------| | 1 - Consumers | View & filter | Open dashboards, apply filters, export data | | 2 - Explorers | Ad-hoc queries | Write simple queries, create basic charts, share findings | | 3 - Builders | Design dashboards | Combine data sources, create calculated fields, publish reports | | 4 - Modelers | Define data models | Create semantic models, define metrics, optimize performance |
Query optimization example:
sql-- Before: full table scan SELECT * FROM large_table WHERE date >= '2024-01-01'; -- After: partitioned, filtered, and column-pruned SELECT order_id, customer_id, amount FROM large_table WHERE partition_date >= '2024-01-01' AND status = 'active' LIMIT 10000;
The agent frames every insight using Situation-Complication-Resolution:
yamlsecurity_model: row_level_security: - rule: region_access filter: "region = user.region" object_permissions: - role: viewer permissions: [view, export] - role: editor permissions: [view, export, edit] - role: admin permissions: [view, export, edit, delete, publish]
references/dashboard_patterns.md -- Dashboard design patternsreferences/visualization_guide.md -- Chart selection guidereferences/kpi_library.md -- Standard KPI definitionsreferences/storytelling.md -- Data storytelling techniquesbashpython scripts/kpi_tracker.py --definitions kpis.json --data sales.csv python scripts/kpi_tracker.py --definitions kpis.json --data sales.csv --json python scripts/dashboard_spec_generator.py --definitions kpis.json --title "Sales Dashboard" python scripts/dashboard_spec_generator.py --definitions kpis.json --layout 3-column --json python scripts/metric_validator.py --definitions metrics.json --strict python scripts/metric_validator.py --definitions metrics.json --json
| Tool | Purpose | Key Flags | |------|---------|-----------| | kpi_tracker.py | Calculate KPIs from data against targets; report RAG status and variance | --definitions <json>, --data <csv/json>, --json | | dashboard_spec_generator.py | Generate dashboard layout specs (chart types, positions, filters) from KPI definitions | --definitions <json>, --title, --layout 2-column/3-column, --json | | metric_validator.py | Validate metric definitions for completeness, naming, threshold logic, and consistency | --definitions <json>, --strict, --json |
| Problem | Likely Cause | Resolution | |---------|-------------|------------| | Dashboard loads slowly (> 5 s) | Too many visualizations or live-connection queries hitting raw tables | Reduce widgets to 5-8 per page; switch to extracts or materialized views for heavy dashboards | | KPI values differ between dashboard and source query | Dashboard applies additional filters, currency conversion, or calculated fields not in the semantic layer | Centralize all metric logic in the semantic layer; remove dashboard-level computed fields | | RAG thresholds trigger false alerts | Warning/critical percentages are miscalibrated for seasonal patterns | Adjust thresholds per season or use rolling baselines; validate with metric_validator.py --strict | | Stakeholders ignore dashboards | Dashboard answers the wrong questions or lacks actionable context | Redesign using the Situation-Complication-Resolution storytelling framework; add annotations and targets | | Row-level security hides data unexpectedly | Security rules are too broad or user-role mapping is incorrect | Audit RLS rules; test with a sample user from each role; log filtered row counts | | Scheduled report emails land in spam | Large PDF attachments or sender reputation issues | Reduce attachment size; switch to embedded links; work with IT to whitelist the sender domain | | metric_validator.py reports formula-aggregation mismatch | The formula field (e.g., "SUM(...)") does not match the declared aggregation | Align the two fields; the aggregation field drives the tool while the formula documents intent |
metric_validator.py --strict with zero errors before production deployment.In scope: Dashboard design and layout, KPI framework definition, report automation patterns, data storytelling, self-service BI enablement, row-level security configuration, and visualization best practices.
Out of scope: Data warehouse infrastructure, ETL/ELT pipeline development, raw data ingestion, machine learning model building, and BI tool installation or licensing.
Limitations: The Python tools (kpi_tracker.py, dashboard_spec_generator.py, metric_validator.py) operate on local JSON and CSV files only -- they do not connect to live databases or BI platforms. All scripts use the Python standard library with no external dependencies. Dashboard specifications are platform-agnostic and require manual translation to specific BI tools (Tableau, Power BI, Looker, etc.).
data-analytics/analytics-engineer): Provides the mart models and semantic-layer metrics that dashboards consume; schema changes require dashboard updates.data-analytics/data-analyst): Creates ad-hoc analyses that may evolve into repeatable dashboards; shares visualization standards.product-team/): Defines product KPIs and user-facing analytics requirements.c-level-advisor/): Executive dashboards translate strategic objectives into measurable KPIs.finance/): Financial KPIs (MRR, CAC, LTV) require alignment between BI dashboards and finance team definitions.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-19 | fail→pass | 16,114 | 16,490 | +2% | 1 | 1 | 0% | 2,376 | 5,559 | +134% | 0 | 0 | — |
case-01 | fail→pass | 12,859 | 7,970 | -38% | 1 | 1 | 0% | 2,307 | 4,593 | +99% | 0 | 0 | — |
case-02 | fail→pass | 21,115 | 27,655 | +31% | 1 | 1 | 0% | 3,816 | 8,289 | +117% | 0 | 0 | — |
case-03 | fail→pass | 16,137 | 12,807 | -21% | 1 | 1 | 0% | 2,775 | 5,043 | +82% | 0 | 0 | — |
case-04 | pass→pass | 16,250 | 19,090 | +17% | 1 | 1 | 0% | 2,757 | 6,203 | +125% | 0 | 0 | — |
case-05 | fail→fail | 17,464 | 25,853 | +48% | 1 | 1 | 0% | 2,774 | 7,142 | +157% | 0 | 0 | — |
case-06 | fail→pass | 13,785 | 3,398 | -75% | 1 | 1 | 0% | 2,420 | 3,585 | +48% | 0 | 0 | — |
case-07 | fail→pass | 12,421 | 8,962 | -28% | 1 | 1 | 0% | 2,356 | 4,654 | +98% | 0 | 0 | — |
case-08 | pass→pass | 14,389 | 15,316 | +6% | 1 | 1 | 0% | 2,308 | 5,378 | +133% | 0 | 0 | — |
case-09 | fail→pass | 13,566 | 12,842 | -5% | 1 | 1 | 0% | 2,087 | 4,943 | +137% | 0 | 0 | — |
case-10 | fail→fail | 13,378 | 9,749 | -27% | 1 | 1 | 0% | 2,329 | 4,729 | +103% | 0 | 0 | — |
case-11 | pass→pass | 12,322 | 14,146 | +15% | 1 | 1 | 0% | 2,004 | 5,122 | +156% | 0 | 0 | — |
case-12 | fail→pass | 5,928 | 10,569 | +78% | 1 | 1 | 0% | 1,142 | 4,837 | +324% | 0 | 0 | — |
case-13 | pass→pass | 11,904 | 5,534 | -54% | 1 | 1 | 0% | 1,969 | 3,846 | +95% | 0 | 0 | — |
case-14 | fail→pass | 14,706 | 14,663 | -0% | 1 | 1 | 0% | 2,862 | 5,740 | +101% | 0 | 0 | — |
case-15 | fail→pass | 10,537 | 3,226 | -69% | 1 | 1 | 0% | 1,970 | 3,492 | +77% | 0 | 0 | — |
case-16 | pass→pass | 13,714 | 15,079 | +10% | 1 | 1 | 0% | 2,161 | 5,412 | +150% | 0 | 0 | — |
case-17 | pass→pass | 13,211 | 7,850 | -41% | 1 | 1 | 0% | 2,058 | 4,319 | +110% | 0 | 0 | — |
case-18 | fail→pass | 17,671 | 15,147 | -14% | 1 | 1 | 0% | 2,842 | 5,460 | +92% | 0 | 0 | — |
case-20 | fail→pass | 13,729 | 7,262 | -47% | 1 | 1 | 0% | 2,489 | 4,227 | +70% | 0 | 0 | — |
case-21 | pass→pass | 18,332 | 15,839 | -14% | 1 | 1 | 0% | 2,803 | 5,363 | +91% | 0 | 0 | — |
case-22 | fail→fail | 18,407 | 21,485 | +17% | 1 | 1 | 0% | 3,694 | 6,997 | +89% | 0 | 0 | — |
case-23 | fail→fail | 20,796 | 30,001 | +44% | 1 | 1 | 0% | 4,140 | 8,659 | +109% | 0 | 0 | — |
case-24 | fail→fail | 19,460 | 23,772 | +22% | 1 | 1 | 0% | 3,556 | 7,109 | +100% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +50 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.