{
  "schemaVersion": 1,
  "generator": "gen-chart/scripts/build-gallery.mjs",
  "generatorVersion": "0.32.0",
  "entryCount": 17,
  "entries": [
    {
      "id": "build-times",
      "title": "CI Build Duration by Pipeline",
      "question": "How do build times and outliers differ by pipeline?",
      "family": "distribution",
      "marks": [
        "boxplot"
      ],
      "featured": true,
      "prompt": "Use gen-chart to compare build durations across our pipelines as a boxplot in seconds. Show the outliers and highlight which pipeline is slowest and most variable.\n\nunit:        42 45 47 48 50 51 53 55 58 71\nintegration: 118 124 131 136 140 145 152 158 166 210\ne2e:         295 312 328 341 355 370 388 402 425 610\n",
      "promptSha256": "1e737c1fbb26fbfbde2008fad2e3a24a3d0ae4f5776023d2bfd835ab6e5a2de3",
      "source": "gallery/sources/build-times.distribution.json",
      "artifact": "gallery/build-times.html",
      "bytes": {
        "source": 1234,
        "artifact": 72031
      },
      "sha256": {
        "source": "9accd35ba71aa42ff8f82483a1e27a921323a2ba5c8f9a75e4d03b8324c9df65",
        "artifact": "939dd2f91ed3f8078eb4ac905fcd13ca8b62dd34f986ce7d55b18a304945b812"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "deploy-outcomes",
      "title": "Rollbacks fell from 10.5% to 7.7% of deploys over six months",
      "question": "How did the composition of deployment outcomes change over six months?",
      "family": "cartesian",
      "marks": [
        "area",
        "100% stacked"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show deployment outcomes over time as a 100%-stacked area chart. Keep the months in chronological order and compare clean, rolled-back, and failed deployments. Explain the change in outcome shares without hiding the deployment totals.\n\n| month | succeeded (deploys) | rolled back (deploys) | failed (deploys) |\n| --- | --- | --- | --- |\n| 2026-01 | 180 | 22 | 8 |\n| 2026-02 | 190 | 20 | 8 |\n| 2026-03 | 178 | 20 | 7 |\n| 2026-04 | 195 | 19 | 8 |\n| 2026-05 | 188 | 18 | 8 |\n| 2026-06 | 186 | 16 | 7 |\n",
      "promptSha256": "21b89fa3609ab564c2177950818cc7fe1e2eb022c4d788d803e7460a3bef9fa8",
      "source": "gallery/sources/deploy-outcomes.cartesian.json",
      "artifact": "gallery/deploy-outcomes.html",
      "bytes": {
        "source": 1449,
        "artifact": 72508
      },
      "sha256": {
        "source": "21fbc4633397ea0796b26409605841acfab0bfa8e23dc50c9c62391e44b7d0b3",
        "artifact": "ba71f1ef9f54ccbaf858b7845070e65eb5c6ed4c3631b5b176a0473713be52ba"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "forecast-range",
      "title": "Revenue forecast uncertainty widens into spring",
      "question": "How wide is the uncertainty around the monthly revenue forecast?",
      "family": "cartesian",
      "marks": [
        "range",
        "line",
        "brush zoom"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show the monthly revenue forecast as a line with an uncertainty band. Use the lower and upper columns as an 80% prediction interval and state that meaning explicitly. Keep the GBP-thousands unit, allow x-axis brush zoom, and explain how the interval changes.\n\n| Month | Lower forecast bound (GBP k) | Revenue forecast (GBP k) | Upper forecast bound (GBP k) |\n| --- | --- | --- | --- |\n| 2026-10 | 92 | 100 | 108 |\n| 2026-11 | 98 | 108 | 118 |\n| 2026-12 | 101 | 113 | 125 |\n| 2027-01 | 103 | 118 | 133 |\n| 2027-02 | 104 | 122 | 140 |\n| 2027-03 | 105 | 127 | 149 |\n| 2027-04 | 105 | 131 | 157 |\n| 2027-05 | 104 | 135 | 166 |\n",
      "promptSha256": "126a781478177f90b9585c086620276a0369df29db9a323fc40d8d6beb41423b",
      "source": "gallery/sources/forecast-range.cartesian.json",
      "artifact": "gallery/forecast-range.html",
      "bytes": {
        "source": 2208,
        "artifact": 73293
      },
      "sha256": {
        "source": "8ae738c37600ad72613959dc447294a15ce9e9f6e104765e2df8055519772046",
        "artifact": "a87fe019274ce937d5cc20431d3020fd470e06aefbeab514f244ebd36cf012fe"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "latency-distribution",
      "title": "API Response Time Distribution",
      "question": "What is the shape and right tail of API response times?",
      "family": "distribution",
      "marks": [
        "histogram"
      ],
      "featured": false,
      "prompt": "Use gen-chart to plot the raw API response-time observations as a histogram in milliseconds. Disclose the histogram bins. Call out the typical range and the long right tail.\n\nResponse time (ms):\n42 48 51 55 58 59 61 62 63 64 65 66 67 68 68 69 70 71 71 72 73 74 74 75 76 77 78 79 80 81 82 83 85 86 88 90 92 95 98 101 104 108 112 118 125 134 148 167 195 240\n",
      "promptSha256": "9146ba0e2f48f38b9503a3418d805ddbcd3adbc1dc3e1260389b476faea25e3f",
      "source": "gallery/sources/latency-distribution.distribution.json",
      "artifact": "gallery/latency-distribution.html",
      "bytes": {
        "source": 848,
        "artifact": 73022
      },
      "sha256": {
        "source": "09452a0e9b45df037eff72960a123b274209d0dd7bbff683724ebdbd6f72e8ec",
        "artifact": "150ff4599e6d81885b9980ae972a753b3e1cb65292e241064da357be72b13df9"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "mau-trend",
      "title": "Monthly Active Users",
      "question": "How did monthly active and paying users change around the v2 launch?",
      "family": "cartesian",
      "marks": [
        "line",
        "3 guided views",
        "brush zoom"
      ],
      "featured": false,
      "prompt": "Use gen-chart to compare monthly active users and paying users as two time-series lines. Annotate the February 2026 v2 launch and enable x-axis brush zoom. Include the full-year, post-launch, and paying-only guided views from the evidence.\n\n| month | mau (users) | paying (users) |\n| --- | --- | --- |\n| 2025-09 | 8200 | 610 |\n| 2025-10 | 8900 | 700 |\n| 2025-11 | 9400 | 780 |\n| 2025-12 | 9100 | 760 |\n| 2026-01 | 10500 | 940 |\n| 2026-02 | 12300 | 1180 |\n| 2026-03 | 13800 | 1420 |\n| 2026-04 | 14600 | 1560 |\n| 2026-05 | 15900 | 1810 |\n| 2026-06 | 17400 | 2050 |\n| 2026-07 | 18100 | 2230 |\n| 2026-08 | 19700 | 2540 |\n",
      "promptSha256": "f9fbbc1e941fcdcacf73659763f71e03f5bfbb09575986fc15afbede235bc0cc",
      "source": "gallery/sources/mau-trend.cartesian.json",
      "artifact": "gallery/mau-trend.html",
      "bytes": {
        "source": 2710,
        "artifact": 74701
      },
      "sha256": {
        "source": "ad05cbd3d5a13c780363a3adee4490c058fb58dcc77825a543bada9031f5d9f4",
        "artifact": "51e62291ebd4043ff8d9fcca8680f0d1f4a898c332e3d2ef7230d1fbf70130d3"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "observability-errors-by-version",
      "title": "Dataviz error count by version with web-ui deployment events",
      "question": "Do application error spikes align with deployment events?",
      "family": "cartesian",
      "marks": [
        "line",
        "brush zoom"
      ],
      "featured": false,
      "prompt": "Use gen-chart to plot error counts by application version with deployment events overlaid. Keep all nine authored versions and use vertical stems with compact top-edge deployment markers. Use the intraday UTC timeline, legend toggling, and x-axis brush zoom without claiming causation.\n\n| timestamp | 35.13768234 (errors) | 35.13769661 (errors) | 35.13774006 (errors) | 35.13786505 (errors) | 35.13812235 (errors) | 35.13813899 (errors) | 35.13815196 (errors) | 35.13826381 (errors) | 35.13829174 (errors) |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 2026-09-01T18:00:00.000Z | 420 | null | null | null | null | null | null | null | null |\n| 2026-09-01T21:00:00.000Z | 260 | null | null | null | null | null | null | null | null |\n| 2026-09-02T00:00:00.000Z | 70 | 60 | null | null | null | null | null | null | null |\n| 2026-09-02T03:00:00.000Z | 45 | 430 | null | null | null | null | null | null | null |\n| 2026-09-02T06:00:00.000Z | 110 | 440 | 80 | null | null | null | null | null | null |\n| 2026-09-02T09:00:00.000Z | 80 | 90 | 210 | null | null | null | null | null | null |\n| 2026-09-02T12:00:00.000Z | 140 | 120 | 520 | null | null | null | null | null | null |\n| 2026-09-02T15:00:00.000Z | 90 | 210 | 170 | 280 | null | null | null | null | null |\n| 2026-09-02T18:00:00.000Z | null | 70 | 55 | 90 | null | null | null | null | null |\n| 2026-09-02T21:00:00.000Z | null | 40 | 30 | 35 | null | null | null | null | null |\n| 2026-09-03T00:00:00.000Z | null | null | 20 | 2410 | 220 | null | null | null | null |\n| 2026-09-03T03:00:00.000Z | null | null | null | 55 | 350 | null | null | null | null |\n| 2026-09-03T06:00:00.000Z | null | null | null | 760 | 310 | 110 | null | null | null |\n| 2026-09-03T09:00:00.000Z | null | null | null | 110 | 460 | 240 | null | null | null |\n| 2026-09-03T12:00:00.000Z | null | null | null | null | 180 | 360 | null | null | null |\n| 2026-09-03T15:00:00.000Z | null | null | null | null | 240 | 610 | null | null | null |\n| 2026-09-03T18:00:00.000Z | null | null | null | null | 90 | 190 | null | null | null |\n| 2026-09-03T21:00:00.000Z | null | null | null | null | 35 | 520 | 260 | 170 | null |\n| 2026-09-04T00:00:00.000Z | null | null | null | null | null | 70 | 2830 | 2740 | null |\n| 2026-09-04T03:00:00.000Z | null | null | null | null | null | 20 | 1710 | 920 | null |\n| 2026-09-04T06:00:00.000Z | null | null | null | null | null | null | 160 | 90 | 40 |\n| 2026-09-04T09:00:00.000Z | null | null | null | null | null | null | 45 | 25 | 25 |\n| 2026-09-04T12:00:00.000Z | null | null | null | null | null | null | 20 | null | 80 |\n| 2026-09-04T15:00:00.000Z | null | null | null | null | null | null | null | null | 140 |\n| 2026-09-04T18:00:00.000Z | null | null | null | null | null | null | null | null | 55 |\n| 2026-09-04T21:00:00.000Z | null | null | null | null | null | null | null | null | 220 |\n| 2026-09-05T00:00:00.000Z | null | null | null | null | null | null | null | null | 75 |\n| 2026-09-05T03:00:00.000Z | null | null | null | null | null | null | null | null | 310 |\n| 2026-09-05T06:00:00.000Z | null | null | null | null | null | null | null | null | 60 |\n",
      "promptSha256": "311a36571bbf6c175b38f3dae1bee4c5005be9f708287e3dbd6d78d37f94de20",
      "source": "gallery/sources/observability-errors-by-version.cartesian.json",
      "artifact": "gallery/observability-errors-by-version.html",
      "bytes": {
        "source": 10393,
        "artifact": 89370
      },
      "sha256": {
        "source": "0297ff8507f007a5f0275194837e1c150187e7e3fd44361bf861eb58395bbb08",
        "artifact": "58122c14dc14095cca585921d73d2febbea77d6dc0d89a3e43e90d353de70735"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "observability-ci-duration",
      "title": "CI job max duration by branch with all web-ui merge events",
      "question": "Do CI duration spikes align with web-ui merge activity?",
      "family": "cartesian",
      "marks": [
        "line",
        "brush zoom"
      ],
      "featured": false,
      "prompt": "Use gen-chart to plot maximum CI job duration by branch with every authored web-ui merge event overlaid. Render merge events as a compact top-edge event strip over the intraday UTC timeline. Preserve every duration and event while describing temporal alignment without claiming causation.\n\n| timestamp | main (minutes) | release (minutes) | hotfix (minutes) |\n| --- | --- | --- | --- |\n| 2026-09-01T18:00:00.000Z | 20 | null | null |\n| 2026-09-01T21:00:00.000Z | 40 | null | null |\n| 2026-09-02T00:00:00.000Z | 55 | null | null |\n| 2026-09-02T03:00:00.000Z | 70 | null | null |\n| 2026-09-02T06:00:00.000Z | 120 | 80 | null |\n| 2026-09-02T09:00:00.000Z | 210 | 230 | null |\n| 2026-09-02T12:00:00.000Z | 35 | 210 | null |\n| 2026-09-02T15:00:00.000Z | 260 | 45 | null |\n| 2026-09-02T18:00:00.000Z | 25 | 40 | null |\n| 2026-09-02T21:00:00.000Z | 710 | 390 | null |\n| 2026-09-03T00:00:00.000Z | 40 | 280 | null |\n| 2026-09-03T03:00:00.000Z | 190 | 720 | null |\n| 2026-09-03T06:00:00.000Z | 30 | 35 | 20 |\n| 2026-09-03T09:00:00.000Z | 85 | 40 | 35 |\n| 2026-09-03T12:00:00.000Z | 120 | 25 | 40 |\n| 2026-09-03T15:00:00.000Z | 180 | 30 | 60 |\n| 2026-09-03T18:00:00.000Z | 210 | 45 | 150 |\n| 2026-09-03T21:00:00.000Z | 300 | 120 | 200 |\n| 2026-09-04T00:00:00.000Z | 45 | 160 | 210 |\n| 2026-09-04T03:00:00.000Z | 830 | 690 | 190 |\n| 2026-09-04T06:00:00.000Z | 650 | 710 | 170 |\n| 2026-09-04T09:00:00.000Z | 70 | 80 | 120 |\n| 2026-09-04T12:00:00.000Z | 40 | 35 | 80 |\n| 2026-09-04T15:00:00.000Z | 280 | 250 | 60 |\n| 2026-09-04T18:00:00.000Z | 190 | 130 | 45 |\n| 2026-09-04T21:00:00.000Z | 250 | 220 | 35 |\n| 2026-09-05T00:00:00.000Z | 50 | 40 | null |\n| 2026-09-05T03:00:00.000Z | 820 | 740 | null |\n| 2026-09-05T06:00:00.000Z | 45 | 35 | null |\n",
      "promptSha256": "16b5572048dc7b3d73ca10599f155f704f78897e5ba054d7ee54b53ffcee6a2b",
      "source": "gallery/sources/observability-ci-duration.cartesian.json",
      "artifact": "gallery/observability-ci-duration.html",
      "bytes": {
        "source": 6526,
        "artifact": 81187
      },
      "sha256": {
        "source": "8bad215bfffd724414faba5f74d037ee1b3ecb622513968987c23d7a7390cf10",
        "artifact": "fa734e67607e6412a3267f8ddcc0a9610c08251f6b4e3186d7fe110a9c68673b"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "plan-mix",
      "title": "Accounts grew 52%, and the paid tiers grew fastest",
      "question": "How did the account mix change as paid plans grew?",
      "family": "cartesian",
      "marks": [
        "area",
        "stacked"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show Free, Pro, and Enterprise account counts over time as a stacked area chart. Keep the values as absolute account counts rather than normalizing them to percentages. Explain both total growth and the changing share of paid tiers.\n\n| month | free (accounts) | pro (accounts) | enterprise (accounts) |\n| --- | --- | --- | --- |\n| 2026-01 | 6200 | 1800 | 240 |\n| 2026-02 | 6800 | 2100 | 300 |\n| 2026-03 | 7100 | 2500 | 380 |\n| 2026-04 | 7400 | 2900 | 470 |\n| 2026-05 | 7600 | 3400 | 590 |\n| 2026-06 | 7900 | 3900 | 720 |\n",
      "promptSha256": "314805a76c8e57d617b5c2a589a07254126c2c66732377e96a5de3fb500aa8bb",
      "source": "gallery/sources/plan-mix.cartesian.json",
      "artifact": "gallery/plan-mix.html",
      "bytes": {
        "source": 1370,
        "artifact": 72139
      },
      "sha256": {
        "source": "b9d3eae5c727d39fa75d4cd2da9142979084bc4dce3989223f2aa9769aedebaf",
        "artifact": "7f4a6eb255f1eb722074a255b463ef0b10d63063040dbd7ada631c822f9be93b"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "request-growth",
      "title": "Requests rose 34,000× in six years, but yearly growth is easing",
      "question": "How can six years of request growth be shown without flattening the early years?",
      "family": "cartesian",
      "marks": [
        "line",
        "log axis"
      ],
      "featured": false,
      "prompt": "Use gen-chart to plot monthly request volume over time as a line chart with a logarithmic y-axis. Disclose prominently that the y-axis is logarithmic. Explain why a log scale is necessary and what the curve says about the growth rate.\n\n| year | requests (requests/month) |\n| --- | --- |\n| 2020 | 12000 |\n| 2021 | 140000 |\n| 2022 | 1500000 |\n| 2023 | 9800000 |\n| 2024 | 64000000 |\n| 2025 | 410000000 |\n",
      "promptSha256": "c09ac562dab162072bbc4d2cf0e0b91d80d5fb5395298a91b8029f7e5066ee83",
      "source": "gallery/sources/request-growth.cartesian.json",
      "artifact": "gallery/request-growth.html",
      "bytes": {
        "source": 1192,
        "artifact": 70904
      },
      "sha256": {
        "source": "eb9159b51461124edade3fb7daaf5910ee61b04eac5e87477f62f042e4d68266",
        "artifact": "c64a097309767a248aafacfd968f054b8879b01184a1bb878984cad9c7c26089"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "revenue-by-region",
      "title": "Q2 Revenue by Region",
      "question": "How does Q2 revenue compare with Q1 across regions?",
      "family": "cartesian",
      "marks": [
        "bar"
      ],
      "featured": false,
      "prompt": "Use gen-chart to compare Q1 and Q2 revenue by region with grouped bars. Keep the USD-thousands unit and a zero baseline. Highlight the fastest-growing region and the largest contributor.\n\n| region | q2 (USD k) | q1 (USD k) |\n| --- | --- | --- |\n| North America | 1840 | 1650 |\n| Europe | 1420 | 1380 |\n| Asia-Pacific | 990 | 820 |\n| Latin America | 410 | 380 |\n| Middle East & Africa | 260 | 250 |\n",
      "promptSha256": "9cbc7e5124bfae84efc159e97098e1d74c87808b5a633a5fb70783e74619880d",
      "source": "gallery/sources/revenue-by-region.cartesian.json",
      "artifact": "gallery/revenue-by-region.html",
      "bytes": {
        "source": 998,
        "artifact": 71388
      },
      "sha256": {
        "source": "bd5c7ffe5bf0a59e6537ac5a6fe4d7862bcfa694d5e10c17d837e0d1ee4b25e0",
        "artifact": "afcd96eac2cbd8844d1ed6a8c123be9f46debcb1d18631dfbad7d14273a420c8"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "signups-vs-target",
      "title": "Weekly Signups vs Target",
      "question": "Which weeks beat the signup target, and is the gap changing?",
      "family": "cartesian",
      "marks": [
        "bar",
        "line"
      ],
      "featured": false,
      "prompt": "Use gen-chart to compare weekly signups with the weekly target using bars for actuals and a line for target. Use one signup unit and keep the bar axis at zero. Explain how often actuals beat target and call out the W31 dip.\n\n| week | signups | target (signups) |\n| --- | --- | --- |\n| W27 | 312 | 320 |\n| W28 | 298 | 330 |\n| W29 | 351 | 340 |\n| W30 | 389 | 350 |\n| W31 | 344 | 360 |\n| W32 | 412 | 370 |\n| W33 | 458 | 380 |\n| W34 | 471 | 390 |\n",
      "promptSha256": "2f0455a52871601dd2f8be2647e82273514af0adff57878336e3fb45ab1bfc8f",
      "source": "gallery/sources/signups-vs-target.cartesian.json",
      "artifact": "gallery/signups-vs-target.html",
      "bytes": {
        "source": 1126,
        "artifact": 72573
      },
      "sha256": {
        "source": "80c09d20aeca3e8b1bdd6116f2d0c2844ca8d6c9a31046c9610c39d6386943fd",
        "artifact": "4d28fb6c5605af92ce1e167a02629a7f1886b39f4e12b91134b352b9f4719fce"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "service-memory-change",
      "title": "Most services grew while a smaller group released memory",
      "question": "Which services grew or released memory compared with the previous hour?",
      "family": "cartesian",
      "marks": [
        "bar"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show the percentage change in memory by service as a horizontal diverging bar chart. Anchor every bar at zero and use semantic colors for increases, decreases, and no change. Show current memory beside each service and retain previous-hour memory in tooltips and exports.\n\n| Service | Current memory (MiB) | Change (%) | Previous-hour memory (MiB) |\n| --- | --- | --- | --- |\n| spanner | 141.2 | 35 | 104.6 |\n| analytics-intake | 292.3 | 28.8 | 226.9 |\n| trade-scheduler | 337.7 | 17.4 | 287.6 |\n| trade-receiver | 75.6 | 16.7 | 64.8 |\n| kafka | 806 | 13 | 713.3 |\n| emailer | 856.7 | 7.9 | 793.9 |\n| product-recommendation-db | 888.6 | 4.5 | 850.3 |\n| fraud-detector | 1740.8 | 3.4 | 1683.6 |\n| analytics-aggregator | 375.5 | 1.7 | 369.2 |\n| product-recommendation | 103.6 | 1.4 | 102.2 |\n| product-recommendation-lite | 79.7 | 0.8 | 79.1 |\n| balance-checker | 1638.4 | 0 | 1638.4 |\n| trade-executor | 973.6 | -2.4 | 997.5 |\n| authenticator | 525.6 | -3 | 541.9 |\n| trade-validator | 57.3 | -3.6 | 59.4 |\n| trade-enrichment | 51.5 | -6.1 | 54.8 |\n| notifier | 575.1 | -18.9 | 709.1 |\n| slow-kafka | 266.2 | -40.3 | 445.9 |\n",
      "promptSha256": "80bb53b9be8bff988c55e3e63e20ff8e718911cb8eb1b3d92405901421039deb",
      "source": "gallery/sources/service-memory-change.cartesian.json",
      "artifact": "gallery/service-memory-change.html",
      "bytes": {
        "source": 2445,
        "artifact": 87078
      },
      "sha256": {
        "source": "4d0c43f18e6ec4c7f0c99d067a5a68e16ee57317713d08f9244b0e7ba17c0fff",
        "artifact": "6d882221574d0a825a8abb0abd067cace485b1251e242657f3080b0988acb812"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "storage-mix",
      "title": "Storage grew 3.7× in five quarters, four-fifths of it cold archive",
      "question": "Which storage tier drove growth over the last five quarters?",
      "family": "cartesian",
      "marks": [
        "bar",
        "stacked"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show Hot, Warm, and Cold storage over time as stacked bars in terabytes. Keep the values as absolute terabytes with a zero baseline. Explain total growth and how much of the increase came from cold archive.\n\n| quarter | hot (TB) | warm (TB) | cold (TB) |\n| --- | --- | --- | --- |\n| 2025 Q3 | 42 | 38 | 30 |\n| 2025 Q4 | 48 | 47 | 62 |\n| 2026 Q1 | 51 | 61 | 118 |\n| 2026 Q2 | 55 | 74 | 190 |\n| 2026 Q3 | 58 | 86 | 264 |\n",
      "promptSha256": "c23951063715b62f4ea6ac084e8f39beb5b20c6e2f6231a028889df4f6416913",
      "source": "gallery/sources/storage-mix.cartesian.json",
      "artifact": "gallery/storage-mix.html",
      "bytes": {
        "source": 1806,
        "artifact": 72507
      },
      "sha256": {
        "source": "9313bf0a5f3f6f8b5b0bbe1e5ffa97de0376cacc3d2f787ecc16a60777ea23b5",
        "artifact": "6e30465acda113b3ea2a80e47582c96d750ecd3da125c4e3ad62e5db90605c6c"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "support-load",
      "title": "Support Tickets by Day and Shift",
      "question": "Which day and shift combinations create the heaviest support load?",
      "family": "matrix",
      "marks": [
        "heatmap",
        "sequential scale"
      ],
      "featured": false,
      "prompt": "Use gen-chart to plot support tickets by day and shift as a sequential heatmap. Keep the day and shift ordering and the ticket unit. Identify the weekday peak and the weekend pattern.\n\n| shift | day | tickets |\n| --- | --- | --- |\n| Morning | Mon | 48 |\n| Morning | Tue | 41 |\n| Morning | Wed | 39 |\n| Morning | Thu | 37 |\n| Morning | Fri | 44 |\n| Morning | Sat | 12 |\n| Morning | Sun | 9 |\n| Afternoon | Mon | 62 |\n| Afternoon | Tue | 55 |\n| Afternoon | Wed | 51 |\n| Afternoon | Thu | 49 |\n| Afternoon | Fri | 58 |\n| Afternoon | Sat | 18 |\n| Afternoon | Sun | 14 |\n| Night | Mon | 21 |\n| Night | Tue | 17 |\n| Night | Wed | 15 |\n| Night | Thu | 16 |\n| Night | Fri | 24 |\n| Night | Sat | 8 |\n| Night | Sun | 6 |\n",
      "promptSha256": "1e04c35079c6fc4404e716b9745f640fab2758bb8e749550b4fd7debb801cde2",
      "source": "gallery/sources/support-load.matrix.json",
      "artifact": "gallery/support-load.html",
      "bytes": {
        "source": 1369,
        "artifact": 79060
      },
      "sha256": {
        "source": "058d54911b7208cd4f742ebe5da16eb4908ad9823d33435471de028aadad6ecb",
        "artifact": "ad52e05d1f0bf8b98907863006b9d9cd6d676a7f5fd0ea4fb2321866564fc97e"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "traffic-sources",
      "title": "Signup Traffic by Source",
      "question": "What share of signups comes from each traffic source?",
      "family": "proportion",
      "marks": [
        "donut"
      ],
      "featured": false,
      "prompt": "Use gen-chart to show signup traffic sources as a donut chart. Keep all six categories and the signup unit. Explain the largest source and compare the smaller tracked channels.\n\n| source | signups |\n| --- | --- |\n| Organic search | 4820 |\n| Direct | 2310 |\n| Referral | 1640 |\n| Paid social | 980 |\n| Email | 610 |\n| Other | 340 |\n",
      "promptSha256": "27240f80129ef12621815bd767d2804d69c6468cf5a580f9cc7eeedf1d2750e6",
      "source": "gallery/sources/traffic-sources.proportion.json",
      "artifact": "gallery/traffic-sources.html",
      "bytes": {
        "source": 785,
        "artifact": 72825
      },
      "sha256": {
        "source": "95b0057d492483ca0e02bb54393b801ec00abd58f308d99ff9bf75c1d7a31695",
        "artifact": "5dd70cc5a12c9ba5ca849a2977fdf8db37810e1f57ac1ba92756932360085642"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "venue-performance",
      "title": "Higher-capacity venues occupy the strongest profit positions",
      "question": "How do advertising spend, event profit, and venue capacity relate?",
      "family": "cartesian",
      "marks": [
        "bubble"
      ],
      "featured": false,
      "prompt": "Use gen-chart to create a bubble chart with advertising spend on x, event profit on y, and bubble size representing venue capacity. Keep both financial measures in GBP thousands and capacity in seats. Show the capacity scale and keep every raw value available in the tooltip and data table.\n\n| Advertising spend (GBP k) | Event profit (GBP k) | Venue capacity (seats) |\n| --- | --- | --- |\n| 18 | 9 | 350 |\n| 24 | 14 | 520 |\n| 31 | 13 | 420 |\n| 39 | 22 | 850 |\n| 47 | 28 | 1100 |\n| 56 | 31 | 950 |\n| 68 | 38 | 1600 |\n| 75 | 44 | 2100 |\n",
      "promptSha256": "4d0f8a7dd3b7146350a9ea77fbe3bf75adf7565ab018ba86ddc6c97e0a85a553",
      "source": "gallery/sources/venue-performance.cartesian.json",
      "artifact": "gallery/venue-performance.html",
      "bytes": {
        "source": 1383,
        "artifact": 72015
      },
      "sha256": {
        "source": "8b6308c2d4d232a1e97fbe3458891d51f7656e4610634e1820b26b795f4312bd",
        "artifact": "83a86099a5cc457c1a7a5197987c00997b24adf73a73b663ce80f04be3074929"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    },
    {
      "id": "zh-revenue",
      "title": "各渠道季度营收",
      "question": "各渠道的季度营收如何变化？",
      "family": "cartesian",
      "marks": [
        "bar"
      ],
      "featured": false,
      "prompt": "使用 gen-chart 创建图表。使用分组柱状图比较直销与渠道伙伴的季度营收。保留中文标题、标签、结论和人民币百万元单位，并将查看器界面设为简体中文。说明第四季度总营收以及两种渠道的全年增速。\n\n| quarter | direct (万元) | partner (万元) |\n| --- | --- | --- |\n| 第一季度 | 1240 | 860 |\n| 第二季度 | 1380 | 910 |\n| 第三季度 | 1510 | 1040 |\n| 第四季度 | 1720 | 1180 |\n",
      "promptSha256": "3e986b3f5fdf64bcd7fa80d5d217dffeac314da07549c45ea40f60e6df6a9113",
      "source": "gallery/sources/zh-revenue.cartesian.json",
      "artifact": "gallery/zh-revenue.html",
      "bytes": {
        "source": 1100,
        "artifact": 71271
      },
      "sha256": {
        "source": "8f686b5cc667112e4d8879bfff56d56c39b9f5af44c23762dcda9a3165fad9b4",
        "artifact": "d976056bf2393803ab346b599e78372aeac1b46ba44dde7c332aaf430548e625"
      },
      "validation": {
        "quality": "showcase",
        "errors": 0,
        "warnings": 0
      }
    }
  ]
}
