Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Rules for charts and visualization. Use when the user asks for charts, graphs, plots, or visual representations (line, bar, pie, timeseries).
.claude/skills/frankchen021-visualization/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-20 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 58% | 0% |
| case-13 | ✓→✗ | ▼ Worse | 8% | 0% |
| case-17 | ✓→✗ | ▼ Worse | 71% | 0% |
| case-21 | ✓→✗ | ▼ Worse | 166% | 0% |
a) Generate or obtain SQL:
sql-expert skill.sql-expert skill is loaded.skill tool with ['sql-expert'] IMMEDIATELY. Do not proceed to generate SQL until the skill is loaded.sql-expert skill (including Schema Discovery, Schema Fidelity, ProfileEvents handling, and Performance Optimization).system.query_log visualization requests: Do NOT call search_query_log. Load the clickhouse-system-queries skill, then load references/system-query-log.md via skill_resource, generate the SQL, and validate it.b) VALIDATION (MANDATORY):
validate_sql with the SQL before including the chart spec in your response.sql-expert skill rules) and validating again.c) After validation passes:
chart-spec. The content must be valid JSON matching the OUTPUT FORMAT below, and must include datasource: { "sql": "<the validated SQL>" }. Derive type, titleOption, legendOption, etc. from the CHART TYPE RULES and OUTPUT FORMAT above. Do not call any tool for this—put the complete spec in your reply.d) Execution:
execute_sql. The chart component in the client will automatically execute the query found in the chart-spec. Calling it here wastes tokens and causes duplicate execution.If user question contains ANY of these keywords, use the corresponding chart type:
chart-spec code block)Put the full chart spec in a markdown code block with language chart-spec. The JSON must include datasource.sql (the validated SQL). The client parses this block to render the chart.
chart-spec{ "type": "line", "titleOption": { "title": "Descriptive chart title", "align": "center" }, "width": 6, "legendOption": { "placement": "bottom", "values": ["min", "max", "sum"] }, "datasource": { "sql": "SELECT ..." } }
chart-spec{ "type": "pie", "titleOption": { "title": "Distribution by Category", "align": "center" }, "width": 6, "legendOption": { "placement": "right" }, "labelOption": { "show": true, "format": "name-percent" }, "valueFormat": "short_number", "datasource": { "sql": "SELECT ..." } }
sql-expert skill.sql-expert Skill → Validation → Include chart spec in response.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→fail | 11,177 | 5,684 | -49% | 1 | 1 | 0% | 1,942 | 1,663 | -14% | 0 | 0 | — |
case-01 | fail→fail | 14,563 | 24,946 | +71% | 1 | 1 | 0% | 2,868 | 1,480 | -48% | 0 | 0 | — |
case-02 | fail→fail | 11,670 | 4,926 | -58% | 1 | 1 | 0% | 2,253 | 1,556 | -31% | 0 | 0 | — |
case-03 | fail→fail | 9,357 | 3,830 | -59% | 1 | 1 | 0% | 1,721 | 1,458 | -15% | 0 | 0 | — |
case-04 | fail→fail | 6,744 | 4,731 | -30% | 1 | 1 | 0% | 1,064 | 1,518 | +43% | 0 | 0 | — |
case-19 | fail→fail | 9,363 | 5,684 | -39% | 1 | 1 | 0% | 1,510 | 1,642 | +9% | 0 | 0 | — |
case-05 | pass→fail | 5,780 | 6,863 | +19% | 1 | 1 | 0% | 1,033 | 1,636 | +58% | 0 | 0 | — |
case-06 | fail→fail | 8,038 | 8,975 | +12% | 1 | 1 | 0% | 1,443 | 1,911 | +32% | 0 | 0 | — |
case-07 | fail→fail | 12,716 | 4,961 | -61% | 1 | 1 | 0% | 2,403 | 1,576 | -34% | 0 | 0 | — |
case-08 | fail→fail | 8,254 | 4,738 | -43% | 1 | 1 | 0% | 1,452 | 1,534 | +6% | 0 | 0 | — |
case-09 | fail→fail | 6,999 | 5,411 | -23% | 1 | 1 | 0% | 1,331 | 1,670 | +25% | 0 | 0 | — |
case-10 | fail→fail | 15,691 | 5,179 | -67% | 1 | 1 | 0% | 2,715 | 1,527 | -44% | 0 | 0 | — |
case-11 | pass→pass | 5,505 | 2,909 | -47% | 1 | 1 | 0% | 889 | 1,776 | +100% | 0 | 0 | — |
case-12 | fail→fail | 17,352 | 5,152 | -70% | 1 | 1 | 0% | 3,205 | 1,543 | -52% | 0 | 0 | — |
case-13 | pass→fail | 7,817 | 5,057 | -35% | 1 | 1 | 0% | 1,434 | 1,553 | +8% | 0 | 0 | — |
case-14 | fail→fail | 32,174 | 4,678 | -85% | 1 | 1 | 0% | 5,970 | 1,527 | -74% | 0 | 0 | — |
case-15 | fail→fail | 7,006 | 9,215 | +32% | 1 | 1 | 0% | 982 | 1,859 | +89% | 0 | 0 | — |
case-16 | fail→fail | 9,578 | 3,903 | -59% | 1 | 1 | 0% | 1,727 | 1,433 | -17% | 0 | 0 | — |
case-17 | pass→fail | 5,616 | 5,516 | -2% | 1 | 1 | 0% | 982 | 1,681 | +71% | 0 | 0 | — |
case-20 | fail→pass | 15,913 | 8,704 | -45% | 1 | 1 | 0% | 2,455 | 2,741 | +12% | 0 | 0 | — |
case-21 | pass→fail | 3,612 | 6,281 | +74% | 1 | 1 | 0% | 640 | 1,705 | +166% | 0 | 0 | — |
case-22 | pass→pass | 15,113 | 14,034 | -7% | 1 | 1 | 0% | 2,399 | 3,577 | +49% | 0 | 0 | — |
case-23 | pass→fail | 10,860 | 4,822 | -56% | 1 | 1 | 0% | 1,757 | 1,617 | -8% | 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. 23 cases were attempted, and 3 counted toward the lift figure. The other 20 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -17 percentage points is the difference between those two pass rates over the 3 comparable cases. 10 cases got worse with the skill loaded, and they are included in that figure.
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.