Use when building data-heavy screens, analytics dashboards, metric visualizations, or inline charts for Copilot. Creates bar/line charts, renders data tables, aggregates KPI metrics, builds filterable dashboard layouts, and generates HTML previews for concept validation. Triggers: 'dashboard', 'métricas', 'gráfico', 'chart', 'visualización', 'analytics', 'KPI', 'reporte', 'muestra los datos', 'cómo van los números'.
72
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Communication: Spanish with the user. English in all artifacts (specs, component names, code examples).
Behavioral constraints:
Before starting, detect the user's intent — or ask directly if unclear:
| Signal from user | Mode | Flow |
|---|---|---|
| "Tengo estos datos y no sé cómo mostrarlos" | Data-first | Phases D1 → D4 → Spec |
| "Quiero ver cómo van mis anuncios / ventas / leads" | Question-first | Phases P1 → P4 → Spec |
| "Agrega un scorecard / chart a esta pantalla" | Micro-change | Direct to Spec (delta) |
| "Genera un gráfico inline para Copilot" | Copilot-inline | Simplified → HTML |
| Not clear | Ask | "¿Vienes con datos que necesitas mostrar, o con una pregunta de negocio que necesitas responder?" |
Announce the detected mode to the user before proceeding.
| Phase | Data-first | Question-first | Tools | Gate |
|---|---|---|---|---|
| 1 | D1: Understand data | P1: Understand question | Glob, Grep, Read / Conversation | data_inventory / question formulated |
| 2 | D2: Find the story | P2: Map required data | Conversation / Glob, Grep, Read | One-liner story statement |
| 3 | D3: Design visualization | P3: Design visualization | Read refs, MCP, WebSearch | 2-3 proposals presented |
| 4 | D4: Validate metrics | P4: Validate completeness | MCP, WebSearch | User confirms |
| Final | Spec | Spec | Read, Write | VIZ-SPEC written |
Tools: Glob, Grep, Read (read-only)
Grep: backend/src/modules/analytics/api/ → relevant endpoints
Read: corresponding DTOs → understand available fieldsGrep: backend/src/modules/analytics/infrastructure/providers/ → what sources extract whatGlob: frontend/src/features/growth-studio/components/**/*.tsx
Glob: frontend/src/features/{domain}/components/**/*.tsx (if not Growth Studio)Bash: docker exec -t visionarias_client_dev npm ls 2>/dev/null | grep -iE "chart|recharts|visx|tremor|nivo|apex"
Glob: frontend/src/components/ui/chart*.tsxGate: Do NOT proceed without knowing what data exists, what's missing, and what chart libraries are available.
Internal output: data_inventory
Available: [endpoints, fields, connected sources]
Missing: [data we need but don't have]
Chart libs: [what's installed, sufficiency evaluation]Tools: Conversation + optionally Read of docs/domains/INDEX.md
For Data-first (D2): Ask the user:
For Question-first (P1): Ask the user:
Gate: Must produce a one-liner: "This chart tells [persona] if [question], so they can [action]."
Tools: Conversation + Read of references/chart-selection-guide.md + MCP/WebSearch
references/chart-selection-guide.md → select chart type based on the storyFor channel color conventions and common design mistakes, refer to references/data-viz-conventions.md.
When the user asks to see a proposal:
/tmp/viz-preview-{timestamp}.htmlopen /tmp/viz-preview-{timestamp}.html (or xdg-open on Linux)Tools: Conversation + MCP/WebSearch
For Data-first (D4):
For Question-first (P4):
Gate: User confirms the proposal meets their need.
Tools: Read (verify code), Write (produce spec)
references/viz-spec-template.md with ReadGlob: frontend/src/components/ui/*.tsx
Glob: frontend/src/features/{domain}/components/**/*.tsxdocs/projects/active/PI-N/sprints/SN/stories/{story-id}/02-design-ui.md (sección charts) o docs/_archive/pre-sdd-2026-05-04/ui-specs/ legacyWhen you need to check if a metric can be obtained from a source:
| Platform | MCP | Quick Query |
|---|---|---|
| Meta Ads / IG / FB | context7 | resolve-library-id "Meta Marketing API" → query-docs "{metric_name}" |
| Google Ads | context7 | resolve-library-id "Google Ads API" → query-docs "{metric_name}" |
| GA4 | context7 | resolve-library-id "GA4 Data API" → query-docs "dimensions metrics" |
| YouTube | context7 | resolve-library-id "YouTube Analytics API" → query-docs "{metric_name}" |
| Shopify | shopify-dev-mcp | introspect_graphql_schema → search for the specific field |
| Any other | context7 | resolve-library-id "{platform} API" → if not found, Step 2 |
| Platform | Search Query |
|---|---|
| Meta | site:developers.facebook.com "{metric_name}" marketing API |
| Google Ads | site:developers.google.com/google-ads/api "{metric_name}" |
| GA4 | site:developers.google.com/analytics/devguides "{metric_name}" |
| TikTok | site:business-api.tiktok.com "{metric_name}" |
| YouTube | site:developers.google.com/youtube/analytics "{metric_name}" |
| Mailerlite | site:developers.mailerlite.com "{metric_name}" |
| Manychat | "manychat API" "{metric_name}" endpoint |
If neither MCP nor WebSearch confirms the metric:
| Scenario | Handling |
|---|---|
| No data yet | Spec includes empty state with CTA: "Conecta tu cuenta de {plataforma} para ver métricas" |
| Partial data | Show what's available + "Datos parciales" badge. Never block visualization for missing sources |
| Metric not in API | Declare explicitly, propose nearest alternative. Never invent |
| Multiple sources for same metric | Define source priority in spec (e.g., "Shopify revenue takes priority over Meta calculated revenue") |
| Mixed screen (form + data) | ux-disruptivo leads the design. data-storyteller consulted for data section only |
| Copilot inline | Output is direct HTML with embedded chart, not VIZ-SPEC |
| User requests wrong chart type | Explain why it doesn't work, propose alternative with justification |
| Real-time vs batch data | Document update frequency per source in spec. Don't design as "real-time" if ETL runs every 24h |
| Cross-stage visualization | The skill can cross Bowtie stages freely. Spec documents which stages it touches and why |
ux-disruptivo: Complementary. ux-disruptivo for interaction screens (forms, wizards), data-storyteller for data-driven screens. Mixed screens: ux-disruptivo leads, data-storyteller consulted for data section only.nicolify-feature: Can be invoked during UX phase for data-heavy features.frontend-expert: Consumes VIZ-SPEC.md for implementation. The VIZ-SPEC is a superset of what frontend-expert needs.nicolify-ux-designer agent: For mechanical data screens (simple tables), the agent is faster. data-storyteller is for visualization with story.d31f7bc
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.