Skip to content

aibi-dashboards: theme/color guidance, audit fixes, runnable example#561

Open
QuentinAmbard wants to merge 3 commits into
experimentalfrom
dashboard-skill-polish-2
Open

aibi-dashboards: theme/color guidance, audit fixes, runnable example#561
QuentinAmbard wants to merge 3 commits into
experimentalfrom
dashboard-skill-polish-2

Conversation

@QuentinAmbard

Copy link
Copy Markdown
Collaborator

Summary

A larger polish pass on the dashboard skill, validated end-to-end by deploying the worked example against synthetic data on e2-demo-field-eng and visually inspecting the result.

Live test dashboard: https://e2-demo-field-eng.cloud.databricks.com/dashboardsv3/01f164c9a2fb1700a60fb84c447a262e

What changed

Theme & color (SKILL.md)

  • Rename theme section "Theme & Color (always set this — it makes or breaks the dashboard)"
  • Palette-design rules: one coherent family per dashboard, semantic colors pinned as literal hex (not palette position), non-categorical widget coloring, pastel-tweak guidance
  • Adjacent-stop contrast rule: viewer must distinguish neighboring categories at a glance
  • Single-color faded toward white = a quantitative ramp, not a categorical palette
  • 8 starter palettes (bare hex, no names) for first-shot color selection
  • Fix: positions are 0-indexed (was incorrectly documented as 1-indexed everywhere)
  • Default theme matches the live Customer Support warm-sunset palette

Widget docs (audit findings from 4 real dashboards)

  • frame.description / showDescription documented
  • Value formatting: number-plain, currencyCode, suffix, formatTemplate; MEASURE() + plain "number" format warning
  • Pie: label.show
  • Symbol-map: bubble-map encouragement, colorRamp modes (scheme enum + custom-sequential as preferred), mark.opacity
  • Heatmap: axis.hideTitle
  • Forecast-line: 3-CTE (actuals / bridge / forecast) pattern explained, with the explicit column-list UNION ALL that avoids NUM_COLUMNS_MISMATCH

Worked example (4-examples.md)

  • Full incident narrative in the header: "Product release 4.1" spike story
  • Forecast chart vertical-line annotation at the release date (coral)
  • Reopen rate measure outputs 0-1 (was 0-100) so number-percent renders correctly
  • queryLines lines use explicit \n (was relying on trailing whitespace)
  • Theme matches the live customer-support dashboard
  • Symbol-map colorRamp uses family-aligned gradient (coral → mint)
  • Semantic colors (SLA breach, critical cells) pinned as literal hex

Runnable verification harness (.tests/)

  • generate_test_data.py: databricks-connect script that seeds main.dashboard_skill_test.support_cases with 5000 rows of synthetic data including a 700-row post-release spike around 2026-02-16, biased toward Critical/High priorities + slower resolution + higher reopen — so the dashboard's incident story is grounded in actual data
  • dashboard.lvdash.json: portable dashboard JSON (bare FROM support_cases)
  • create_dashboard.py: pushes the JSON via Lakeview SDK with sidecar .dashboard_id for idempotent redeploys (avoids slow lakeview.list() on large workspaces)
  • README + .gitignore

Test plan

  • Generate data: python .tests/generate_test_data.py → 5000 rows written, sanity-check KPIs non-degenerate
  • Deploy dashboard: python .tests/create_dashboard.py → dashboard renders all widgets
  • Visual inspection on field-eng: all 4 KPIs, sparkline counter, forecast-line with release annotation, symbol map, pivot/heatmap, pie, detail table — theme coherent, story readable
  • SQL fixes verified live (the bare-name + UNION column-mismatch errors that surfaced during the first deploy are fixed in this PR)

This pull request and its description were written by Isaac.

Quentin Ambard added 3 commits June 10, 2026 16:12
A larger polish pass on the dashboard skill, validated by deploying the
worked example end-to-end against synthetic data on field-eng.

Theme & color (SKILL.md):
- Rename theme section "Theme & Color (always set this — it makes or breaks the dashboard)"
- Palette-design rules: one coherent family, semantic colors pinned as literal hex,
  non-categorical widget coloring, pastel-tweak guidance
- Adjacent-stop contrast rule: viewer must distinguish neighboring categories
- "Single-color faded toward white" is a quantitative ramp, not a categorical palette
- 8 starter palettes (bare hex, no names)
- Fix: positions are 0-indexed (was incorrectly documented as 1-indexed everywhere)
- Default theme matches the live Customer Support warm-sunset palette

Widget docs (audit findings from 4 real dashboards):
- frame.description / showDescription documented
- Value formatting: number-plain, currencyCode, suffix, formatTemplate;
  MEASURE() + plain "number" format warning
- Pie: label.show
- Symbol-map: bubble-map encouragement, colorRamp modes (scheme enum + custom-sequential
  as preferred), mark.opacity
- Heatmap: axis.hideTitle
- Forecast-line: 3-CTE (actuals / bridge / forecast) pattern explained, with the
  explicit column-list UNION ALL that avoids NUM_COLUMNS_MISMATCH

Worked example (4-examples.md):
- Full incident narrative in the header: "Product release 4.1" spike story
- Forecast chart vertical-line annotation at the release date
- Reopen rate measure outputs 0-1 (was 0-100) so number-percent format renders correctly
- queryLines lines use explicit \n (was relying on trailing whitespace)
- Theme matches the live customer-support dashboard
- Symbol-map colorRamp uses family-aligned gradient (coral → mint)
- Semantic colors (SLA breach, critical cells) pinned as literal hex

Runnable verification harness (.tests/):
- generate_test_data.py: databricks-connect script that seeds main.dashboard_skill_test.support_cases
  with 5000 rows of synthetic data including a 700-row post-release spike around 2026-02-16,
  biased toward Critical/High priorities + slower resolution + higher reopen — so the
  dashboard's incident story is grounded in actual data
- dashboard.lvdash.json: portable dashboard JSON (bare FROM support_cases)
- create_dashboard.py: pushes the JSON via Lakeview SDK with sidecar .dashboard_id
  for idempotent redeploys (avoids slow lakeview.list() on large workspaces)
- README + .gitignore

Co-authored-by: Isaac
…idgets

- Palette-design rules in SKILL.md compressed from 8 bullets to 4
  punchier ones; same content, less prose
- Move Symbol Map from 2-advanced-widget-specifications.md to
  1-widget-specifications.md — it's the most-recommended widget when
  geo data is present, so it belongs alongside counter/table/bar/pie,
  not in the "advanced" file
- Update widget-index links in SKILL.md and version table in file 1

Co-authored-by: Isaac
13 of 20 entries pointed at wrong lines (drift from earlier section
additions + symbol-map move). Recomputed against current files and
reordered the table so widgets within each file appear in document
order:

  file 1: text → counter → table → bar/line → pie → symbol-map
  file 2: area → scatter → combo → choropleth → forecast → pivot
          → histogram → sankey → heatmap → funnel → box → waterfall
  file 3: filter-* → range-slider

Also fills in the missing line number for symbol-map (L451).

Co-authored-by: Isaac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant