[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-cline-plotting":3,"mdc--3r3xhk-key":39,"related-org-cline-plotting":2265,"related-repo-cline-plotting":2463},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":28,"repoUrl":29,"updatedAt":30,"license":31,"forks":32,"topics":33,"repo":34,"sourceUrl":37,"mdContent":38},"plotting","create charts from analytics results","Create standardized charts and visual assets from analytics query results. Prefer dependency-free plain HTML\u002FCSS\u002FJavaScript\u002FSVG for interactive exploratory charts; use local plotting tools such as matplotlib, seaborn, or Plotly when static\u002Freport-ready exports or specialized charting libraries are more appropriate. Use for trends, comparisons, distributions, report assets, CSV-to-chart work, and presentation-ready data visuals.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"cline","Cline","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fcline.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"Data Visualization","data-visualization","tag",{"name":17,"slug":18,"type":15},"HTML","html",{"name":20,"slug":21,"type":15},"Charts","charts",{"name":23,"slug":24,"type":15},"Analytics","analytics",{"name":26,"slug":27,"type":15},"SVG","svg",10,"https:\u002F\u002Fgithub.com\u002Fcline\u002Fskills","2026-07-12T08:14:04.393809",null,4,[],{"repoUrl":29,"stars":28,"forks":32,"topics":35,"description":36},[],"A collection of skills used at Cline","https:\u002F\u002Fgithub.com\u002Fcline\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fdata-analyst\u002Fskills\u002Fplotting","---\nname: plotting\ndescription: Create standardized charts and visual assets from analytics query results. Prefer dependency-free plain HTML\u002FCSS\u002FJavaScript\u002FSVG for interactive exploratory charts; use local plotting tools such as matplotlib, seaborn, or Plotly when static\u002Freport-ready exports or specialized charting libraries are more appropriate. Use for trends, comparisons, distributions, report assets, CSV-to-chart work, and presentation-ready data visuals.\n---\n\n# Plotting\n\nCreate charts when they make the analysis easier to understand or when the user requests a report\u002Fpresentation artifact.\n\nFirst goal: create a useful local plot artifact from a bounded query result. Do not turn a plotting request into a dashboard, presentation builder, or broad report unless the user explicitly asks for that.\n\n## When to plot\n\nPlot for:\n\n- time-series trends\n- before\u002Fafter comparisons\n- segment comparisons\n- distributions and percentiles\n- funnels\n- presentation\u002Freport assets\n\nAvoid plotting when the metric definition or query is still uncertain unless the chart is clearly labeled exploratory.\n\nDo not show charts too early by default when doing exploratory analysis if the metric, population, time window, or grouping could bias interpretation. Prefer one concise clarification question or an explicitly labeled exploratory chart.\n\n## Plot intent contract\n\nBefore generating a plot, know or infer:\n\n- chart type\n- x-axis\n- y-axis \u002F primary metric\n- grouping, color, or breakdown dimension\n- time window and filters\n- source query\u002Fmodel\u002Ftable\n- audience: exploratory, report-ready, presentation\u002Fblog asset, or quick internal check\n\nIf the mapping is obvious from the user's request or the result shape, proceed and state the inferred mapping in the response. If multiple reasonable mappings exist, ask one concise clarification question before plotting. For report-ready or presentation assets, confirm ambiguous choices before generating.\n\nKeep simple plotting requests lightweight. Do not ask an exhaustive questionnaire when the user has already provided enough context.\n\n## Default chart selection\n\nUse these defaults unless the user asks otherwise:\n\n| Result shape | Default chart |\n| --- | --- |\n| date\u002Ftime + one numeric metric | line chart |\n| date\u002Ftime + one numeric metric + one low-cardinality category | multi-line chart colored by category |\n| category + one numeric metric | sorted bar chart |\n| ordered funnel\u002Fstage + count or rate | ordered bar or funnel-style chart |\n| numeric distribution | histogram or box plot; ask if the intended distribution view is unclear |\n| multiple numeric metrics | ask which metric to emphasize unless one is clearly primary |\n\nFor high-cardinality categories, choose a bounded top-N only when the ranking metric is clear. Default to top 5 for multi-line time series and top 10 for bar charts. State the top-N rule in the caveats.\n\nChoose the chart based on analytical intent, not only result shape:\n\n- Trend over time: line chart, small multiples, slope chart, or indexed trend.\n- Compare categories\u002Frankings: sorted bar, dot plot, or lollipop.\n- Part-to-whole: stacked bar\u002Farea only when composition is the point; avoid pie\u002Fdonut except for very simple cases.\n- Distribution: histogram, box plot, violin, strip\u002Fbeeswarm, or percentile summary.\n- Relationship: scatterplot, heatmap, or connected scatter when order matters.\n\nIf the intended message is unclear, ask one concise question such as: \"Should this emphasize absolute volume, trend shape, ranking, composition, distribution, or relationship?\"\n\n## Complexity limits for the first pass\n\n- Use one x-axis and one primary y-axis by default.\n- Use at most one grouping\u002Fcolor dimension by default.\n- Avoid dual-axis charts unless explicitly requested.\n- Avoid dense legends, many small multiples, or complex multi-measure charts in the first pass.\n- Prefer basic line and bar charts for MVP plotting.\n- For interactive MVP plotting, do not default to Plotly. Prefer plain HTML\u002FCSS\u002FJavaScript\u002FSVG unless the user requests a specific charting library or the interaction would be unreasonably complex to implement cleanly.\n- Include uncertainty\u002Ferror bars only when the query explicitly provides uncertainty values or the user asks for them.\n- If a chart would need substantial transformation or statistical modeling, explain the needed transformation before generating it.\n\nAvoid common chart traps:\n\n- Do not create spaghetti charts. If a time-series chart has too many lines, overlapping lines, or hard-to-read labels, reduce to top-N, highlight a subset, facet into small multiples, or ask what to focus on.\n- Do not use a log scale as the automatic fix for one dominant series. Use log scale only when multiplicative\u002Frate-of-change comparison is the intended message, and label it clearly.\n- Do not use dual axes to compare unrelated metrics. Use separate panels, normalization, percent change, or another chart type.\n- Do not use 3D, rainbow palettes, radial bars, radar charts, or pie\u002Fdonut charts by default for business\u002Freporting assets.\n\n## Chart standards\n\n- Use a clear, factual title and subtitle.\n- By default, chart text should explain what is plotted, not interpret what it means.\n- Label axes with units, but avoid repeating the same unit in title, subtitle, axis title, and panel labels.\n- Prefer a 0 baseline for y-axes, especially for counts, volumes, revenue, rates, proportions, and comparison charts unless there is a strong analytical reason to do otherwise.\n- Compact large y-axis tick labels so charts remain readable, such as `250,000` to `250k`, `1,200,000` to `1.2M`, and `3,400,000,000` to `3.4B`.\n- Keep axis titles explicit about the metric and units even when tick labels are compacted, such as `Daily active users`, `Revenue (USD)`, or `Tokens`.\n- Use date formatting appropriate to the grain.\n- Annotate known events, releases, data-quality caveats, or specific values only when they help the reader understand the encoding\u002Fcontext.\n- Include source\u002Fmodel and caveat note in a caption or adjacent text.\n- Prefer consistent, restrained colors over default rainbow palettes.\n- Save chart files locally and report their absolute paths.\n\nFactual chart text policy:\n\n- Do not use interpretive\u002Ftakeaway headlines by default. Avoid titles such as \"X dominates,\" \"Y collapsed,\" \"A drives B,\" \"Z is recovering,\" or \"conversion is weak\" unless the user explicitly asks for a takeaway chart or presentation narrative.\n- Default title pattern: `\u003Cmetric> by \u003Cdimension\u002Fgrouping>` or `\u003Cmetric> over time by \u003Cgrouping>`.\n  - Good: `Daily orders by region`\n  - Good: `Revenue by plan and product`\n  - Avoid by default: `Mobile dominates order volume`\n  - Avoid by default: `Enterprise plan drives revenue`\n- Use the subtitle\u002Fcaption for factual context: time window, grain, filters, top-N rule, current-day exclusion, aggregation, and whether values are counts, rates, currency, or percentages.\n- Keep interpretive analysis in the surrounding written response, not embedded in the chart, unless requested. The chart should remain reusable as a neutral evidence artifact.\n- If a user asks for a slide\u002Freport \"headline\" or \"takeaway,\" still keep claims mechanically checkable: name the metric, comparison basis, population, and time window. Prefer `Top two plans account for 62% of revenue` over `Top two plans drive revenue`.\n- Annotations should be factual labels, not conclusions. Prefer `May 13 high` or `Release date` over `backfill spike`, `collapse`, or `recovery` unless that cause is verified.\n- Alt text and metadata should be factual descriptions of the chart contents and encodings. Put caveats and interpretation in separate `caveats` or analysis fields.\n\nTitle, axis, and legend checklist:\n\n- Title: identifies the plotted metric and primary dimension\u002Fgrouping; no unexplained conclusion verbs.\n- Subtitle: adds time window, grain, filters, and top-N\u002Fcoverage rules when needed.\n- X-axis: labeled unless the tick labels and title\u002Fsubtitle make the dimension unambiguous, such as obvious calendar years; do not make readers guess.\n- Y-axis\u002Fvalue scale: labeled with metric and unit, such as `Orders`, `Revenue (USD)`, `Active users`, or `Share of users (%)`.\n- Legend\u002Fdirect labels: identify what color, line style, marker, or panel represents. Prefer direct labels when they fit; otherwise keep the legend outside the data region and ordered to match the visual order.\n- Caption\u002Fsource note: includes source table\u002Fmodel, freshness\u002Fcurrent-day exclusion if relevant, important filters, top-N truncation, and scale caveats such as independent axes or log scale.\n\nChart integrity rules:\n\n- Bar charts must start their value axis at zero.\n- Line charts do not always require a zero baseline, but for report-quality count\u002Fvolume charts, prefer zero-anchored axes unless there is a clear reason not to. If using a nonzero axis, disclose it or make the design choice obvious.\n- When comparing absolute magnitudes across groups, prefer shared axes\u002Fscales.\n- When the goal is per-series trend readability and one group dwarfs the others, prefer small multiples or indexed trends over a single shared-axis line chart.\n- If using independent y-axes in small multiples, make that choice explicit through panel design\u002Fcontext and preserve magnitude context with totals, averages, or summary labels.\n- If one series is more than roughly 5-10x larger than the others, do not default to a single multi-line shared-axis chart. Consider small multiples, split panels, indexed trends, or asking whether the user cares about absolute volume or trend shape.\n\nLabeling and annotation rules:\n\n- Prefer direct labels, end labels, or panel titles over legends when practical.\n- Keep legends outside the data region and order legend entries to match the chart order.\n- Use annotations sparingly to label a known event, data-quality caveat, notable value\u002Foutlier, or how to read an uncommon chart. Do not annotate interpretive conclusions by default.\n- Do not add reference lines such as means unless they support the question or improve interpretation.\n\nAccessibility\u002Freporting rules:\n\n- Use high-contrast text and avoid relying on color alone when distinctions are important.\n- Use plain language in titles, labels, notes, and caveats.\n- Keep enough context for the chart to be understood outside the conversation: metric, grain, time window, filters, source, and caveats.\n\n## Visual style\n\nDefault to a clean, neutral style that reads well in any report. This skill is brand-agnostic; do not apply any organization's branding unless the user asks.\n\n- Plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive artifact on a white or off-white background.\n- Dark, high-contrast text.\n- A clean sans-serif font stack, such as `system-ui`, Inter, or similar.\n- A small, restrained, consistent palette (about 4-6 colors); avoid rainbow defaults.\n- Title left-aligned when supported.\n- Legend above or to the right, not overlapping the data.\n- Clear axis labels with units, e.g. `Orders`, `Cost (USD)`, `Active users`.\n- Date ticks matched to grain: daily, weekly, or monthly.\n- Chart dimensions suitable for reports: about 1000x600 for HTML\u002Fstatic exports unless the user requests otherwise.\n\nIf the user or project has its own brand palette and fonts, use those. Otherwise the neutral defaults above are fine. Do not invent \"official\" brand colors for an organization.\n\n### Optional: Cline brand tokens\n\nA ready-made token set is bundled at `styles\u002Fcline-chart-tokens.css` (self-contained CSS custom properties: palette, fonts, backgrounds, and chart dimensions) encoding the Cline web brand ([cline-web](https:\u002F\u002Fgithub.com\u002Fcline\u002Fcline-web)). It is entirely optional and provided as one example, use it if you want that look, or swap in your own tokens. If you reference it but cannot load the exact tokens in another environment, say the style is an approximation. Do not add Cline (or any other) branding to charts by default.\n\n## Artifact contract\n\nEvery successful plotting run should save the underlying data and the chart locally.\n\nDefault artifact location:\n\n```text\nartifacts\u002Fdata-analyst\u002F\u003Cdescriptive-slug>\u002F\n```\n\nUse the current workspace as the base directory. Create the directory if needed. Report absolute paths in the final response.\n\nPreferred outputs:\n\n1. CSV of the underlying plotted data.\n2. Plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive chart for exploratory interactive artifacts.\n3. PNG when requested or useful for reports\u002Fpresentations and static export dependencies are available.\n4. Plotly\u002FVega\u002FECharts\u002Fetc. HTML only when the user asks for that library, the chart needs library-specific features, or custom vanilla SVG would be disproportionately complex.\n5. Optional metadata\u002Fnotes file for report-ready assets.\n\nIf the user explicitly asks for a PNG and static export dependencies are unavailable, install them in a local workspace virtual environment when reasonable instead of hand-rolling rasterization. Prefer:\n\n```bash\npython3 -m venv .venv-plotting\n.venv-plotting\u002Fbin\u002Fpython -m pip install plotly kaleido pandas\n```\n\nIf dependency installation is impossible, save the CSV and explain what chart would have been generated. Do not create low-quality manual SVG\u002FPNG renderers as a fallback for report assets.\n\nFor report-ready assets, consider saving a small sidecar metadata file such as `chart_metadata.json` with:\n\n```json\n{\n  \"title\": \"...\",\n  \"alt_text\": \"...\",\n  \"chart_type\": \"...\",\n  \"data_source\": \"...\",\n  \"metric\": \"...\",\n  \"grain\": \"...\",\n  \"time_window\": \"...\",\n  \"filters\": [\"...\"],\n  \"caveats\": [\"...\"],\n  \"generated_files\": [\"...\"]\n}\n```\n\nUse this response shape after plotting:\n\n```md\nChart: \u002Fabsolute\u002Fpath\u002Fchart.html\nData: \u002Fabsolute\u002Fpath\u002Fdata.csv\n\nMapping:\n- chart type: ...\n- x: ...\n- y: ...\n- color\u002Fgroup: ...\n\nSource:\ndatabase.model_or_table, query, or artifact path\n\nCaveats:\ntime window, filters, top-N rule, freshness, exploratory\u002Freport-ready status\n```\n\n## Recommended implementation\n\nFor interactive exploratory charts, prefer a self-contained vanilla artifact:\n\n1. Plain HTML\u002FCSS\u002FJavaScript\u002FSVG with the bounded aggregate data embedded as JSON or CSV.\n2. Include the necessary interaction directly in vanilla JS: legend\u002Ffilter toggles, hover tooltip, click details, metric\u002Fview toggles, share vs count normalization, small multiples, etc.\n3. Avoid external network\u002FCDN dependencies by default; the artifact should work when opened locally\u002Foffline.\n4. Keep the chart code simple and inspectable. Do not build a broad dashboard unless the user asks for it.\n\nUse local Python\u002Fcharting libraries in this order when a static export, report asset, or specialized chart is more appropriate:\n\n1. Matplotlib\u002Fseaborn for static PNG\u002FSVG report assets.\n2. Plotly PNG export when Plotly\u002FKaleido are already available or explicitly requested.\n3. Plotly\u002FVega\u002FECharts\u002Fetc. for interactive HTML only when the user asks for that library or vanilla SVG would be a poor fit.\n4. CSV output only if plotting is not feasible.\n\nFor bounded aggregate analytics data, a self-contained vanilla HTML\u002FCSS\u002FJavaScript\u002FSVG chart is usually the preferred interactive artifact. Prefer this over Plotly-by-default and over low-quality static fallbacks when the user wants exploration and the data volume is small enough to embed safely.\n\nRecommended features for self-contained interactive HTML\u002FSVG charts:\n\n- Embed only aggregate, non-sensitive plotted data.\n- Use inline SVG for marks, axes, gridlines, labels, and accessibility text.\n- Provide hover and keyboard-focus tooltips for datapoints.\n- Include useful controls such as metric selector, y-axis scale selector, label toggle, or segment\u002Fhighlight toggles only when they aid exploration.\n- Include source\u002Fcaveat captions visible next to the chart.\n- Include the underlying data table when practical.\n- Provide CSV\u002FSVG download buttons when browser security context allows them.\n- Keep the artifact usable offline and avoid external network\u002FCDN dependencies unless the user explicitly wants them.\n- Prefer custom SVG marks over canvas when axes, labels, tooltips, legends, and click targets need to remain easy to inspect and modify.\n- Add lightweight summary metrics or a details table when they materially improve exploration.\n\nAlways keep the underlying data artifact, such as CSV or query output, when generating a chart.\n\nPrefer a small local script or a clearly structured HTML file over ad hoc shell one-liners when generating a chart so the mapping, style, file paths, embedded data, and dependencies are easy to inspect.\n\nBefore returning a chart artifact, inspect or validate the rendered output. Reject and fix charts with clipped captions, missing legends, labels running off canvas, unreadable axes, confusing log ticks, misleading baselines, or badly compressed series. If one series dwarfs the rest, consider small multiples, split panels, indexed trends, normalization, or a clearly labeled log scale depending on the analytical intent.\n\nWhen possible, open or read the actual image artifact before finalizing. Do not rely only on code inspection.\n\n## Interactive HTML validation\n\nBefore reporting an interactive HTML artifact as complete:\n\n1. Validate that expected controls, labels, source notes, and embedded data are present in the generated file.\n2. If the file contains inline JavaScript, extract `\u003Cscript>` blocks and run `node --check` when Node is available.\n3. Watch for generator escaping bugs, especially literal newlines inside JavaScript string literals, unescaped backticks in template literals, and manually concatenated JSON. Prefer `json.dumps`\u002Fequivalent for embedded data.\n4. If the artifact is generated by a script, fix the generator and regenerate the artifact. Do not only hand-patch the generated HTML unless the generator is also updated or clearly marked obsolete.\n5. For local interactive HTML, note that opening via `file:\u002F\u002F` can restrict downloads, object URLs, module imports, or other browser features. If relevant, include local serving instructions such as:\n\n```bash\ncd \u002Fpath\u002Fto\u002Fartifact-directory\npython3 -m http.server 8000\n```\n\nThen open `http:\u002F\u002Flocalhost:8000\u002Fchart.html`.\n\n## Smoke-test query for plotting changes\n\nUse a bounded query like this as a basic plotting smoke test against any daily aggregate table you have. Adapt the table and column names to your schema. It should produce a multi-line or small-multiple time-series chart with the date on x, a count metric on y, and a low-cardinality category as the color\u002Fgroup dimension. Save both CSV and a plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive artifact.\n\n```sql\nWITH top_categories AS (\n  SELECT category\n  FROM analytics.daily_events\n  WHERE event_date >= today() - 30\n    AND event_date \u003C today()\n    AND category IS NOT NULL\n    AND category != ''\n  GROUP BY category\n  ORDER BY sum(event_count) DESC\n  LIMIT 5\n)\nSELECT\n  event_date,\n  category,\n  sum(event_count) AS events,\n  uniqExact(user_id) AS active_users,\n  round(events \u002F nullIf(active_users, 0), 2) AS events_per_active_user\nFROM analytics.daily_events\nWHERE event_date >= today() - 30\n  AND event_date \u003C today()\n  AND category IN (SELECT category FROM top_categories)\nGROUP BY event_date, category\nORDER BY event_date, events DESC\n```\n\nExpected plot contract for this query:\n\n- chart type: start with a multi-line chart only if the top categories are comparable in magnitude; otherwise prefer small multiples or ask whether the user wants absolute volume or trend-shape comparison\n- x: `event_date`\n- y: `events`\n- color\u002Fgroup: `category`\n- source: `analytics.daily_events`\n- caveats: last 30 complete days; top 5 categories by total event count\n",{"data":40,"body":41},{"name":4,"description":6},{"type":42,"children":43},"root",[44,52,58,63,70,75,110,115,120,126,131,169,174,179,185,190,296,301,306,334,339,345,388,393,416,422,549,554,712,717,777,782,815,820,843,848,866,872,877,952,957,964,988,994,999,1004,1016,1021,1026,1055,1060,1135,1140,1153,1568,1573,1713,1719,1724,1747,1752,1775,1780,1785,1838,1843,1848,1853,1858,1864,1869,1929,1972,1984,1990,1995,2197,2202,2259],{"type":45,"tag":46,"props":47,"children":48},"element","h1",{"id":4},[49],{"type":50,"value":51},"text","Plotting",{"type":45,"tag":53,"props":54,"children":55},"p",{},[56],{"type":50,"value":57},"Create charts when they make the analysis easier to understand or when the user requests a report\u002Fpresentation artifact.",{"type":45,"tag":53,"props":59,"children":60},{},[61],{"type":50,"value":62},"First goal: create a useful local plot artifact from a bounded query result. Do not turn a plotting request into a dashboard, presentation builder, or broad report unless the user explicitly asks for that.",{"type":45,"tag":64,"props":65,"children":67},"h2",{"id":66},"when-to-plot",[68],{"type":50,"value":69},"When to plot",{"type":45,"tag":53,"props":71,"children":72},{},[73],{"type":50,"value":74},"Plot for:",{"type":45,"tag":76,"props":77,"children":78},"ul",{},[79,85,90,95,100,105],{"type":45,"tag":80,"props":81,"children":82},"li",{},[83],{"type":50,"value":84},"time-series trends",{"type":45,"tag":80,"props":86,"children":87},{},[88],{"type":50,"value":89},"before\u002Fafter comparisons",{"type":45,"tag":80,"props":91,"children":92},{},[93],{"type":50,"value":94},"segment comparisons",{"type":45,"tag":80,"props":96,"children":97},{},[98],{"type":50,"value":99},"distributions and percentiles",{"type":45,"tag":80,"props":101,"children":102},{},[103],{"type":50,"value":104},"funnels",{"type":45,"tag":80,"props":106,"children":107},{},[108],{"type":50,"value":109},"presentation\u002Freport assets",{"type":45,"tag":53,"props":111,"children":112},{},[113],{"type":50,"value":114},"Avoid plotting when the metric definition or query is still uncertain unless the chart is clearly labeled exploratory.",{"type":45,"tag":53,"props":116,"children":117},{},[118],{"type":50,"value":119},"Do not show charts too early by default when doing exploratory analysis if the metric, population, time window, or grouping could bias interpretation. Prefer one concise clarification question or an explicitly labeled exploratory chart.",{"type":45,"tag":64,"props":121,"children":123},{"id":122},"plot-intent-contract",[124],{"type":50,"value":125},"Plot intent contract",{"type":45,"tag":53,"props":127,"children":128},{},[129],{"type":50,"value":130},"Before generating a plot, know or infer:",{"type":45,"tag":76,"props":132,"children":133},{},[134,139,144,149,154,159,164],{"type":45,"tag":80,"props":135,"children":136},{},[137],{"type":50,"value":138},"chart type",{"type":45,"tag":80,"props":140,"children":141},{},[142],{"type":50,"value":143},"x-axis",{"type":45,"tag":80,"props":145,"children":146},{},[147],{"type":50,"value":148},"y-axis \u002F primary metric",{"type":45,"tag":80,"props":150,"children":151},{},[152],{"type":50,"value":153},"grouping, color, or breakdown dimension",{"type":45,"tag":80,"props":155,"children":156},{},[157],{"type":50,"value":158},"time window and filters",{"type":45,"tag":80,"props":160,"children":161},{},[162],{"type":50,"value":163},"source query\u002Fmodel\u002Ftable",{"type":45,"tag":80,"props":165,"children":166},{},[167],{"type":50,"value":168},"audience: exploratory, report-ready, presentation\u002Fblog asset, or quick internal check",{"type":45,"tag":53,"props":170,"children":171},{},[172],{"type":50,"value":173},"If the mapping is obvious from the user's request or the result shape, proceed and state the inferred mapping in the response. If multiple reasonable mappings exist, ask one concise clarification question before plotting. For report-ready or presentation assets, confirm ambiguous choices before generating.",{"type":45,"tag":53,"props":175,"children":176},{},[177],{"type":50,"value":178},"Keep simple plotting requests lightweight. Do not ask an exhaustive questionnaire when the user has already provided enough context.",{"type":45,"tag":64,"props":180,"children":182},{"id":181},"default-chart-selection",[183],{"type":50,"value":184},"Default chart selection",{"type":45,"tag":53,"props":186,"children":187},{},[188],{"type":50,"value":189},"Use these defaults unless the user asks otherwise:",{"type":45,"tag":191,"props":192,"children":193},"table",{},[194,213],{"type":45,"tag":195,"props":196,"children":197},"thead",{},[198],{"type":45,"tag":199,"props":200,"children":201},"tr",{},[202,208],{"type":45,"tag":203,"props":204,"children":205},"th",{},[206],{"type":50,"value":207},"Result shape",{"type":45,"tag":203,"props":209,"children":210},{},[211],{"type":50,"value":212},"Default chart",{"type":45,"tag":214,"props":215,"children":216},"tbody",{},[217,231,244,257,270,283],{"type":45,"tag":199,"props":218,"children":219},{},[220,226],{"type":45,"tag":221,"props":222,"children":223},"td",{},[224],{"type":50,"value":225},"date\u002Ftime + one numeric metric",{"type":45,"tag":221,"props":227,"children":228},{},[229],{"type":50,"value":230},"line chart",{"type":45,"tag":199,"props":232,"children":233},{},[234,239],{"type":45,"tag":221,"props":235,"children":236},{},[237],{"type":50,"value":238},"date\u002Ftime + one numeric metric + one low-cardinality category",{"type":45,"tag":221,"props":240,"children":241},{},[242],{"type":50,"value":243},"multi-line chart colored by category",{"type":45,"tag":199,"props":245,"children":246},{},[247,252],{"type":45,"tag":221,"props":248,"children":249},{},[250],{"type":50,"value":251},"category + one numeric metric",{"type":45,"tag":221,"props":253,"children":254},{},[255],{"type":50,"value":256},"sorted bar chart",{"type":45,"tag":199,"props":258,"children":259},{},[260,265],{"type":45,"tag":221,"props":261,"children":262},{},[263],{"type":50,"value":264},"ordered funnel\u002Fstage + count or rate",{"type":45,"tag":221,"props":266,"children":267},{},[268],{"type":50,"value":269},"ordered bar or funnel-style chart",{"type":45,"tag":199,"props":271,"children":272},{},[273,278],{"type":45,"tag":221,"props":274,"children":275},{},[276],{"type":50,"value":277},"numeric distribution",{"type":45,"tag":221,"props":279,"children":280},{},[281],{"type":50,"value":282},"histogram or box plot; ask if the intended distribution view is unclear",{"type":45,"tag":199,"props":284,"children":285},{},[286,291],{"type":45,"tag":221,"props":287,"children":288},{},[289],{"type":50,"value":290},"multiple numeric metrics",{"type":45,"tag":221,"props":292,"children":293},{},[294],{"type":50,"value":295},"ask which metric to emphasize unless one is clearly primary",{"type":45,"tag":53,"props":297,"children":298},{},[299],{"type":50,"value":300},"For high-cardinality categories, choose a bounded top-N only when the ranking metric is clear. Default to top 5 for multi-line time series and top 10 for bar charts. State the top-N rule in the caveats.",{"type":45,"tag":53,"props":302,"children":303},{},[304],{"type":50,"value":305},"Choose the chart based on analytical intent, not only result shape:",{"type":45,"tag":76,"props":307,"children":308},{},[309,314,319,324,329],{"type":45,"tag":80,"props":310,"children":311},{},[312],{"type":50,"value":313},"Trend over time: line chart, small multiples, slope chart, or indexed trend.",{"type":45,"tag":80,"props":315,"children":316},{},[317],{"type":50,"value":318},"Compare categories\u002Frankings: sorted bar, dot plot, or lollipop.",{"type":45,"tag":80,"props":320,"children":321},{},[322],{"type":50,"value":323},"Part-to-whole: stacked bar\u002Farea only when composition is the point; avoid pie\u002Fdonut except for very simple cases.",{"type":45,"tag":80,"props":325,"children":326},{},[327],{"type":50,"value":328},"Distribution: histogram, box plot, violin, strip\u002Fbeeswarm, or percentile summary.",{"type":45,"tag":80,"props":330,"children":331},{},[332],{"type":50,"value":333},"Relationship: scatterplot, heatmap, or connected scatter when order matters.",{"type":45,"tag":53,"props":335,"children":336},{},[337],{"type":50,"value":338},"If the intended message is unclear, ask one concise question such as: \"Should this emphasize absolute volume, trend shape, ranking, composition, distribution, or relationship?\"",{"type":45,"tag":64,"props":340,"children":342},{"id":341},"complexity-limits-for-the-first-pass",[343],{"type":50,"value":344},"Complexity limits for the first pass",{"type":45,"tag":76,"props":346,"children":347},{},[348,353,358,363,368,373,378,383],{"type":45,"tag":80,"props":349,"children":350},{},[351],{"type":50,"value":352},"Use one x-axis and one primary y-axis by default.",{"type":45,"tag":80,"props":354,"children":355},{},[356],{"type":50,"value":357},"Use at most one grouping\u002Fcolor dimension by default.",{"type":45,"tag":80,"props":359,"children":360},{},[361],{"type":50,"value":362},"Avoid dual-axis charts unless explicitly requested.",{"type":45,"tag":80,"props":364,"children":365},{},[366],{"type":50,"value":367},"Avoid dense legends, many small multiples, or complex multi-measure charts in the first pass.",{"type":45,"tag":80,"props":369,"children":370},{},[371],{"type":50,"value":372},"Prefer basic line and bar charts for MVP plotting.",{"type":45,"tag":80,"props":374,"children":375},{},[376],{"type":50,"value":377},"For interactive MVP plotting, do not default to Plotly. Prefer plain HTML\u002FCSS\u002FJavaScript\u002FSVG unless the user requests a specific charting library or the interaction would be unreasonably complex to implement cleanly.",{"type":45,"tag":80,"props":379,"children":380},{},[381],{"type":50,"value":382},"Include uncertainty\u002Ferror bars only when the query explicitly provides uncertainty values or the user asks for them.",{"type":45,"tag":80,"props":384,"children":385},{},[386],{"type":50,"value":387},"If a chart would need substantial transformation or statistical modeling, explain the needed transformation before generating it.",{"type":45,"tag":53,"props":389,"children":390},{},[391],{"type":50,"value":392},"Avoid common chart traps:",{"type":45,"tag":76,"props":394,"children":395},{},[396,401,406,411],{"type":45,"tag":80,"props":397,"children":398},{},[399],{"type":50,"value":400},"Do not create spaghetti charts. If a time-series chart has too many lines, overlapping lines, or hard-to-read labels, reduce to top-N, highlight a subset, facet into small multiples, or ask what to focus on.",{"type":45,"tag":80,"props":402,"children":403},{},[404],{"type":50,"value":405},"Do not use a log scale as the automatic fix for one dominant series. Use log scale only when multiplicative\u002Frate-of-change comparison is the intended message, and label it clearly.",{"type":45,"tag":80,"props":407,"children":408},{},[409],{"type":50,"value":410},"Do not use dual axes to compare unrelated metrics. Use separate panels, normalization, percent change, or another chart type.",{"type":45,"tag":80,"props":412,"children":413},{},[414],{"type":50,"value":415},"Do not use 3D, rainbow palettes, radial bars, radar charts, or pie\u002Fdonut charts by default for business\u002Freporting assets.",{"type":45,"tag":64,"props":417,"children":419},{"id":418},"chart-standards",[420],{"type":50,"value":421},"Chart standards",{"type":45,"tag":76,"props":423,"children":424},{},[425,430,435,440,445,497,524,529,534,539,544],{"type":45,"tag":80,"props":426,"children":427},{},[428],{"type":50,"value":429},"Use a clear, factual title and subtitle.",{"type":45,"tag":80,"props":431,"children":432},{},[433],{"type":50,"value":434},"By default, chart text should explain what is plotted, not interpret what it means.",{"type":45,"tag":80,"props":436,"children":437},{},[438],{"type":50,"value":439},"Label axes with units, but avoid repeating the same unit in title, subtitle, axis title, and panel labels.",{"type":45,"tag":80,"props":441,"children":442},{},[443],{"type":50,"value":444},"Prefer a 0 baseline for y-axes, especially for counts, volumes, revenue, rates, proportions, and comparison charts unless there is a strong analytical reason to do otherwise.",{"type":45,"tag":80,"props":446,"children":447},{},[448,450,457,459,465,467,473,474,480,482,488,489,495],{"type":50,"value":449},"Compact large y-axis tick labels so charts remain readable, such as ",{"type":45,"tag":451,"props":452,"children":454},"code",{"className":453},[],[455],{"type":50,"value":456},"250,000",{"type":50,"value":458}," to ",{"type":45,"tag":451,"props":460,"children":462},{"className":461},[],[463],{"type":50,"value":464},"250k",{"type":50,"value":466},", ",{"type":45,"tag":451,"props":468,"children":470},{"className":469},[],[471],{"type":50,"value":472},"1,200,000",{"type":50,"value":458},{"type":45,"tag":451,"props":475,"children":477},{"className":476},[],[478],{"type":50,"value":479},"1.2M",{"type":50,"value":481},", and ",{"type":45,"tag":451,"props":483,"children":485},{"className":484},[],[486],{"type":50,"value":487},"3,400,000,000",{"type":50,"value":458},{"type":45,"tag":451,"props":490,"children":492},{"className":491},[],[493],{"type":50,"value":494},"3.4B",{"type":50,"value":496},".",{"type":45,"tag":80,"props":498,"children":499},{},[500,502,508,509,515,517,523],{"type":50,"value":501},"Keep axis titles explicit about the metric and units even when tick labels are compacted, such as ",{"type":45,"tag":451,"props":503,"children":505},{"className":504},[],[506],{"type":50,"value":507},"Daily active users",{"type":50,"value":466},{"type":45,"tag":451,"props":510,"children":512},{"className":511},[],[513],{"type":50,"value":514},"Revenue (USD)",{"type":50,"value":516},", or ",{"type":45,"tag":451,"props":518,"children":520},{"className":519},[],[521],{"type":50,"value":522},"Tokens",{"type":50,"value":496},{"type":45,"tag":80,"props":525,"children":526},{},[527],{"type":50,"value":528},"Use date formatting appropriate to the grain.",{"type":45,"tag":80,"props":530,"children":531},{},[532],{"type":50,"value":533},"Annotate known events, releases, data-quality caveats, or specific values only when they help the reader understand the encoding\u002Fcontext.",{"type":45,"tag":80,"props":535,"children":536},{},[537],{"type":50,"value":538},"Include source\u002Fmodel and caveat note in a caption or adjacent text.",{"type":45,"tag":80,"props":540,"children":541},{},[542],{"type":50,"value":543},"Prefer consistent, restrained colors over default rainbow palettes.",{"type":45,"tag":80,"props":545,"children":546},{},[547],{"type":50,"value":548},"Save chart files locally and report their absolute paths.",{"type":45,"tag":53,"props":550,"children":551},{},[552],{"type":50,"value":553},"Factual chart text policy:",{"type":45,"tag":76,"props":555,"children":556},{},[557,562,628,633,638,658,699],{"type":45,"tag":80,"props":558,"children":559},{},[560],{"type":50,"value":561},"Do not use interpretive\u002Ftakeaway headlines by default. Avoid titles such as \"X dominates,\" \"Y collapsed,\" \"A drives B,\" \"Z is recovering,\" or \"conversion is weak\" unless the user explicitly asks for a takeaway chart or presentation narrative.",{"type":45,"tag":80,"props":563,"children":564},{},[565,567,573,575,581,583],{"type":50,"value":566},"Default title pattern: ",{"type":45,"tag":451,"props":568,"children":570},{"className":569},[],[571],{"type":50,"value":572},"\u003Cmetric> by \u003Cdimension\u002Fgrouping>",{"type":50,"value":574}," or ",{"type":45,"tag":451,"props":576,"children":578},{"className":577},[],[579],{"type":50,"value":580},"\u003Cmetric> over time by \u003Cgrouping>",{"type":50,"value":582},".\n",{"type":45,"tag":76,"props":584,"children":585},{},[586,597,607,618],{"type":45,"tag":80,"props":587,"children":588},{},[589,591],{"type":50,"value":590},"Good: ",{"type":45,"tag":451,"props":592,"children":594},{"className":593},[],[595],{"type":50,"value":596},"Daily orders by region",{"type":45,"tag":80,"props":598,"children":599},{},[600,601],{"type":50,"value":590},{"type":45,"tag":451,"props":602,"children":604},{"className":603},[],[605],{"type":50,"value":606},"Revenue by plan and product",{"type":45,"tag":80,"props":608,"children":609},{},[610,612],{"type":50,"value":611},"Avoid by default: ",{"type":45,"tag":451,"props":613,"children":615},{"className":614},[],[616],{"type":50,"value":617},"Mobile dominates order volume",{"type":45,"tag":80,"props":619,"children":620},{},[621,622],{"type":50,"value":611},{"type":45,"tag":451,"props":623,"children":625},{"className":624},[],[626],{"type":50,"value":627},"Enterprise plan drives revenue",{"type":45,"tag":80,"props":629,"children":630},{},[631],{"type":50,"value":632},"Use the subtitle\u002Fcaption for factual context: time window, grain, filters, top-N rule, current-day exclusion, aggregation, and whether values are counts, rates, currency, or percentages.",{"type":45,"tag":80,"props":634,"children":635},{},[636],{"type":50,"value":637},"Keep interpretive analysis in the surrounding written response, not embedded in the chart, unless requested. The chart should remain reusable as a neutral evidence artifact.",{"type":45,"tag":80,"props":639,"children":640},{},[641,643,649,651,657],{"type":50,"value":642},"If a user asks for a slide\u002Freport \"headline\" or \"takeaway,\" still keep claims mechanically checkable: name the metric, comparison basis, population, and time window. Prefer ",{"type":45,"tag":451,"props":644,"children":646},{"className":645},[],[647],{"type":50,"value":648},"Top two plans account for 62% of revenue",{"type":50,"value":650}," over ",{"type":45,"tag":451,"props":652,"children":654},{"className":653},[],[655],{"type":50,"value":656},"Top two plans drive revenue",{"type":50,"value":496},{"type":45,"tag":80,"props":659,"children":660},{},[661,663,669,670,676,677,683,684,690,691,697],{"type":50,"value":662},"Annotations should be factual labels, not conclusions. Prefer ",{"type":45,"tag":451,"props":664,"children":666},{"className":665},[],[667],{"type":50,"value":668},"May 13 high",{"type":50,"value":574},{"type":45,"tag":451,"props":671,"children":673},{"className":672},[],[674],{"type":50,"value":675},"Release date",{"type":50,"value":650},{"type":45,"tag":451,"props":678,"children":680},{"className":679},[],[681],{"type":50,"value":682},"backfill spike",{"type":50,"value":466},{"type":45,"tag":451,"props":685,"children":687},{"className":686},[],[688],{"type":50,"value":689},"collapse",{"type":50,"value":516},{"type":45,"tag":451,"props":692,"children":694},{"className":693},[],[695],{"type":50,"value":696},"recovery",{"type":50,"value":698}," unless that cause is verified.",{"type":45,"tag":80,"props":700,"children":701},{},[702,704,710],{"type":50,"value":703},"Alt text and metadata should be factual descriptions of the chart contents and encodings. Put caveats and interpretation in separate ",{"type":45,"tag":451,"props":705,"children":707},{"className":706},[],[708],{"type":50,"value":709},"caveats",{"type":50,"value":711}," or analysis fields.",{"type":45,"tag":53,"props":713,"children":714},{},[715],{"type":50,"value":716},"Title, axis, and legend checklist:",{"type":45,"tag":76,"props":718,"children":719},{},[720,725,730,735,767,772],{"type":45,"tag":80,"props":721,"children":722},{},[723],{"type":50,"value":724},"Title: identifies the plotted metric and primary dimension\u002Fgrouping; no unexplained conclusion verbs.",{"type":45,"tag":80,"props":726,"children":727},{},[728],{"type":50,"value":729},"Subtitle: adds time window, grain, filters, and top-N\u002Fcoverage rules when needed.",{"type":45,"tag":80,"props":731,"children":732},{},[733],{"type":50,"value":734},"X-axis: labeled unless the tick labels and title\u002Fsubtitle make the dimension unambiguous, such as obvious calendar years; do not make readers guess.",{"type":45,"tag":80,"props":736,"children":737},{},[738,740,746,747,752,753,759,760,766],{"type":50,"value":739},"Y-axis\u002Fvalue scale: labeled with metric and unit, such as ",{"type":45,"tag":451,"props":741,"children":743},{"className":742},[],[744],{"type":50,"value":745},"Orders",{"type":50,"value":466},{"type":45,"tag":451,"props":748,"children":750},{"className":749},[],[751],{"type":50,"value":514},{"type":50,"value":466},{"type":45,"tag":451,"props":754,"children":756},{"className":755},[],[757],{"type":50,"value":758},"Active users",{"type":50,"value":516},{"type":45,"tag":451,"props":761,"children":763},{"className":762},[],[764],{"type":50,"value":765},"Share of users (%)",{"type":50,"value":496},{"type":45,"tag":80,"props":768,"children":769},{},[770],{"type":50,"value":771},"Legend\u002Fdirect labels: identify what color, line style, marker, or panel represents. Prefer direct labels when they fit; otherwise keep the legend outside the data region and ordered to match the visual order.",{"type":45,"tag":80,"props":773,"children":774},{},[775],{"type":50,"value":776},"Caption\u002Fsource note: includes source table\u002Fmodel, freshness\u002Fcurrent-day exclusion if relevant, important filters, top-N truncation, and scale caveats such as independent axes or log scale.",{"type":45,"tag":53,"props":778,"children":779},{},[780],{"type":50,"value":781},"Chart integrity rules:",{"type":45,"tag":76,"props":783,"children":784},{},[785,790,795,800,805,810],{"type":45,"tag":80,"props":786,"children":787},{},[788],{"type":50,"value":789},"Bar charts must start their value axis at zero.",{"type":45,"tag":80,"props":791,"children":792},{},[793],{"type":50,"value":794},"Line charts do not always require a zero baseline, but for report-quality count\u002Fvolume charts, prefer zero-anchored axes unless there is a clear reason not to. If using a nonzero axis, disclose it or make the design choice obvious.",{"type":45,"tag":80,"props":796,"children":797},{},[798],{"type":50,"value":799},"When comparing absolute magnitudes across groups, prefer shared axes\u002Fscales.",{"type":45,"tag":80,"props":801,"children":802},{},[803],{"type":50,"value":804},"When the goal is per-series trend readability and one group dwarfs the others, prefer small multiples or indexed trends over a single shared-axis line chart.",{"type":45,"tag":80,"props":806,"children":807},{},[808],{"type":50,"value":809},"If using independent y-axes in small multiples, make that choice explicit through panel design\u002Fcontext and preserve magnitude context with totals, averages, or summary labels.",{"type":45,"tag":80,"props":811,"children":812},{},[813],{"type":50,"value":814},"If one series is more than roughly 5-10x larger than the others, do not default to a single multi-line shared-axis chart. Consider small multiples, split panels, indexed trends, or asking whether the user cares about absolute volume or trend shape.",{"type":45,"tag":53,"props":816,"children":817},{},[818],{"type":50,"value":819},"Labeling and annotation rules:",{"type":45,"tag":76,"props":821,"children":822},{},[823,828,833,838],{"type":45,"tag":80,"props":824,"children":825},{},[826],{"type":50,"value":827},"Prefer direct labels, end labels, or panel titles over legends when practical.",{"type":45,"tag":80,"props":829,"children":830},{},[831],{"type":50,"value":832},"Keep legends outside the data region and order legend entries to match the chart order.",{"type":45,"tag":80,"props":834,"children":835},{},[836],{"type":50,"value":837},"Use annotations sparingly to label a known event, data-quality caveat, notable value\u002Foutlier, or how to read an uncommon chart. Do not annotate interpretive conclusions by default.",{"type":45,"tag":80,"props":839,"children":840},{},[841],{"type":50,"value":842},"Do not add reference lines such as means unless they support the question or improve interpretation.",{"type":45,"tag":53,"props":844,"children":845},{},[846],{"type":50,"value":847},"Accessibility\u002Freporting rules:",{"type":45,"tag":76,"props":849,"children":850},{},[851,856,861],{"type":45,"tag":80,"props":852,"children":853},{},[854],{"type":50,"value":855},"Use high-contrast text and avoid relying on color alone when distinctions are important.",{"type":45,"tag":80,"props":857,"children":858},{},[859],{"type":50,"value":860},"Use plain language in titles, labels, notes, and caveats.",{"type":45,"tag":80,"props":862,"children":863},{},[864],{"type":50,"value":865},"Keep enough context for the chart to be understood outside the conversation: metric, grain, time window, filters, source, and caveats.",{"type":45,"tag":64,"props":867,"children":869},{"id":868},"visual-style",[870],{"type":50,"value":871},"Visual style",{"type":45,"tag":53,"props":873,"children":874},{},[875],{"type":50,"value":876},"Default to a clean, neutral style that reads well in any report. This skill is brand-agnostic; do not apply any organization's branding unless the user asks.",{"type":45,"tag":76,"props":878,"children":879},{},[880,885,890,903,908,913,918,942,947],{"type":45,"tag":80,"props":881,"children":882},{},[883],{"type":50,"value":884},"Plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive artifact on a white or off-white background.",{"type":45,"tag":80,"props":886,"children":887},{},[888],{"type":50,"value":889},"Dark, high-contrast text.",{"type":45,"tag":80,"props":891,"children":892},{},[893,895,901],{"type":50,"value":894},"A clean sans-serif font stack, such as ",{"type":45,"tag":451,"props":896,"children":898},{"className":897},[],[899],{"type":50,"value":900},"system-ui",{"type":50,"value":902},", Inter, or similar.",{"type":45,"tag":80,"props":904,"children":905},{},[906],{"type":50,"value":907},"A small, restrained, consistent palette (about 4-6 colors); avoid rainbow defaults.",{"type":45,"tag":80,"props":909,"children":910},{},[911],{"type":50,"value":912},"Title left-aligned when supported.",{"type":45,"tag":80,"props":914,"children":915},{},[916],{"type":50,"value":917},"Legend above or to the right, not overlapping the data.",{"type":45,"tag":80,"props":919,"children":920},{},[921,923,928,929,935,936,941],{"type":50,"value":922},"Clear axis labels with units, e.g. ",{"type":45,"tag":451,"props":924,"children":926},{"className":925},[],[927],{"type":50,"value":745},{"type":50,"value":466},{"type":45,"tag":451,"props":930,"children":932},{"className":931},[],[933],{"type":50,"value":934},"Cost (USD)",{"type":50,"value":466},{"type":45,"tag":451,"props":937,"children":939},{"className":938},[],[940],{"type":50,"value":758},{"type":50,"value":496},{"type":45,"tag":80,"props":943,"children":944},{},[945],{"type":50,"value":946},"Date ticks matched to grain: daily, weekly, or monthly.",{"type":45,"tag":80,"props":948,"children":949},{},[950],{"type":50,"value":951},"Chart dimensions suitable for reports: about 1000x600 for HTML\u002Fstatic exports unless the user requests otherwise.",{"type":45,"tag":53,"props":953,"children":954},{},[955],{"type":50,"value":956},"If the user or project has its own brand palette and fonts, use those. Otherwise the neutral defaults above are fine. Do not invent \"official\" brand colors for an organization.",{"type":45,"tag":958,"props":959,"children":961},"h3",{"id":960},"optional-cline-brand-tokens",[962],{"type":50,"value":963},"Optional: Cline brand tokens",{"type":45,"tag":53,"props":965,"children":966},{},[967,969,975,977,986],{"type":50,"value":968},"A ready-made token set is bundled at ",{"type":45,"tag":451,"props":970,"children":972},{"className":971},[],[973],{"type":50,"value":974},"styles\u002Fcline-chart-tokens.css",{"type":50,"value":976}," (self-contained CSS custom properties: palette, fonts, backgrounds, and chart dimensions) encoding the Cline web brand (",{"type":45,"tag":978,"props":979,"children":983},"a",{"href":980,"rel":981},"https:\u002F\u002Fgithub.com\u002Fcline\u002Fcline-web",[982],"nofollow",[984],{"type":50,"value":985},"cline-web",{"type":50,"value":987},"). It is entirely optional and provided as one example, use it if you want that look, or swap in your own tokens. If you reference it but cannot load the exact tokens in another environment, say the style is an approximation. Do not add Cline (or any other) branding to charts by default.",{"type":45,"tag":64,"props":989,"children":991},{"id":990},"artifact-contract",[992],{"type":50,"value":993},"Artifact contract",{"type":45,"tag":53,"props":995,"children":996},{},[997],{"type":50,"value":998},"Every successful plotting run should save the underlying data and the chart locally.",{"type":45,"tag":53,"props":1000,"children":1001},{},[1002],{"type":50,"value":1003},"Default artifact location:",{"type":45,"tag":1005,"props":1006,"children":1011},"pre",{"className":1007,"code":1009,"language":50,"meta":1010},[1008],"language-text","artifacts\u002Fdata-analyst\u002F\u003Cdescriptive-slug>\u002F\n","",[1012],{"type":45,"tag":451,"props":1013,"children":1014},{"__ignoreMap":1010},[1015],{"type":50,"value":1009},{"type":45,"tag":53,"props":1017,"children":1018},{},[1019],{"type":50,"value":1020},"Use the current workspace as the base directory. Create the directory if needed. Report absolute paths in the final response.",{"type":45,"tag":53,"props":1022,"children":1023},{},[1024],{"type":50,"value":1025},"Preferred outputs:",{"type":45,"tag":1027,"props":1028,"children":1029},"ol",{},[1030,1035,1040,1045,1050],{"type":45,"tag":80,"props":1031,"children":1032},{},[1033],{"type":50,"value":1034},"CSV of the underlying plotted data.",{"type":45,"tag":80,"props":1036,"children":1037},{},[1038],{"type":50,"value":1039},"Plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive chart for exploratory interactive artifacts.",{"type":45,"tag":80,"props":1041,"children":1042},{},[1043],{"type":50,"value":1044},"PNG when requested or useful for reports\u002Fpresentations and static export dependencies are available.",{"type":45,"tag":80,"props":1046,"children":1047},{},[1048],{"type":50,"value":1049},"Plotly\u002FVega\u002FECharts\u002Fetc. HTML only when the user asks for that library, the chart needs library-specific features, or custom vanilla SVG would be disproportionately complex.",{"type":45,"tag":80,"props":1051,"children":1052},{},[1053],{"type":50,"value":1054},"Optional metadata\u002Fnotes file for report-ready assets.",{"type":45,"tag":53,"props":1056,"children":1057},{},[1058],{"type":50,"value":1059},"If the user explicitly asks for a PNG and static export dependencies are unavailable, install them in a local workspace virtual environment when reasonable instead of hand-rolling rasterization. Prefer:",{"type":45,"tag":1005,"props":1061,"children":1065},{"className":1062,"code":1063,"language":1064,"meta":1010,"style":1010},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python3 -m venv .venv-plotting\n.venv-plotting\u002Fbin\u002Fpython -m pip install plotly kaleido pandas\n","bash",[1066],{"type":45,"tag":451,"props":1067,"children":1068},{"__ignoreMap":1010},[1069,1097],{"type":45,"tag":1070,"props":1071,"children":1074},"span",{"class":1072,"line":1073},"line",1,[1075,1081,1087,1092],{"type":45,"tag":1070,"props":1076,"children":1078},{"style":1077},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1079],{"type":50,"value":1080},"python3",{"type":45,"tag":1070,"props":1082,"children":1084},{"style":1083},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1085],{"type":50,"value":1086}," -m",{"type":45,"tag":1070,"props":1088,"children":1089},{"style":1083},[1090],{"type":50,"value":1091}," venv",{"type":45,"tag":1070,"props":1093,"children":1094},{"style":1083},[1095],{"type":50,"value":1096}," .venv-plotting\n",{"type":45,"tag":1070,"props":1098,"children":1100},{"class":1072,"line":1099},2,[1101,1106,1110,1115,1120,1125,1130],{"type":45,"tag":1070,"props":1102,"children":1103},{"style":1077},[1104],{"type":50,"value":1105},".venv-plotting\u002Fbin\u002Fpython",{"type":45,"tag":1070,"props":1107,"children":1108},{"style":1083},[1109],{"type":50,"value":1086},{"type":45,"tag":1070,"props":1111,"children":1112},{"style":1083},[1113],{"type":50,"value":1114}," pip",{"type":45,"tag":1070,"props":1116,"children":1117},{"style":1083},[1118],{"type":50,"value":1119}," install",{"type":45,"tag":1070,"props":1121,"children":1122},{"style":1083},[1123],{"type":50,"value":1124}," plotly",{"type":45,"tag":1070,"props":1126,"children":1127},{"style":1083},[1128],{"type":50,"value":1129}," kaleido",{"type":45,"tag":1070,"props":1131,"children":1132},{"style":1083},[1133],{"type":50,"value":1134}," pandas\n",{"type":45,"tag":53,"props":1136,"children":1137},{},[1138],{"type":50,"value":1139},"If dependency installation is impossible, save the CSV and explain what chart would have been generated. Do not create low-quality manual SVG\u002FPNG renderers as a fallback for report assets.",{"type":45,"tag":53,"props":1141,"children":1142},{},[1143,1145,1151],{"type":50,"value":1144},"For report-ready assets, consider saving a small sidecar metadata file such as ",{"type":45,"tag":451,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":50,"value":1150},"chart_metadata.json",{"type":50,"value":1152}," with:",{"type":45,"tag":1005,"props":1154,"children":1158},{"className":1155,"code":1156,"language":1157,"meta":1010,"style":1010},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"title\": \"...\",\n  \"alt_text\": \"...\",\n  \"chart_type\": \"...\",\n  \"data_source\": \"...\",\n  \"metric\": \"...\",\n  \"grain\": \"...\",\n  \"time_window\": \"...\",\n  \"filters\": [\"...\"],\n  \"caveats\": [\"...\"],\n  \"generated_files\": [\"...\"]\n}\n","json",[1159],{"type":45,"tag":451,"props":1160,"children":1161},{"__ignoreMap":1010},[1162,1171,1214,1251,1287,1324,1361,1398,1435,1478,1517,1559],{"type":45,"tag":1070,"props":1163,"children":1164},{"class":1072,"line":1073},[1165],{"type":45,"tag":1070,"props":1166,"children":1168},{"style":1167},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1169],{"type":50,"value":1170},"{\n",{"type":45,"tag":1070,"props":1172,"children":1173},{"class":1072,"line":1099},[1174,1179,1185,1190,1195,1200,1205,1209],{"type":45,"tag":1070,"props":1175,"children":1176},{"style":1167},[1177],{"type":50,"value":1178},"  \"",{"type":45,"tag":1070,"props":1180,"children":1182},{"style":1181},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1183],{"type":50,"value":1184},"title",{"type":45,"tag":1070,"props":1186,"children":1187},{"style":1167},[1188],{"type":50,"value":1189},"\"",{"type":45,"tag":1070,"props":1191,"children":1192},{"style":1167},[1193],{"type":50,"value":1194},":",{"type":45,"tag":1070,"props":1196,"children":1197},{"style":1167},[1198],{"type":50,"value":1199}," \"",{"type":45,"tag":1070,"props":1201,"children":1202},{"style":1083},[1203],{"type":50,"value":1204},"...",{"type":45,"tag":1070,"props":1206,"children":1207},{"style":1167},[1208],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1210,"children":1211},{"style":1167},[1212],{"type":50,"value":1213},",\n",{"type":45,"tag":1070,"props":1215,"children":1217},{"class":1072,"line":1216},3,[1218,1222,1227,1231,1235,1239,1243,1247],{"type":45,"tag":1070,"props":1219,"children":1220},{"style":1167},[1221],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1223,"children":1224},{"style":1181},[1225],{"type":50,"value":1226},"alt_text",{"type":45,"tag":1070,"props":1228,"children":1229},{"style":1167},[1230],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1232,"children":1233},{"style":1167},[1234],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1236,"children":1237},{"style":1167},[1238],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1240,"children":1241},{"style":1083},[1242],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1244,"children":1245},{"style":1167},[1246],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1248,"children":1249},{"style":1167},[1250],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1252,"children":1253},{"class":1072,"line":32},[1254,1258,1263,1267,1271,1275,1279,1283],{"type":45,"tag":1070,"props":1255,"children":1256},{"style":1167},[1257],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1259,"children":1260},{"style":1181},[1261],{"type":50,"value":1262},"chart_type",{"type":45,"tag":1070,"props":1264,"children":1265},{"style":1167},[1266],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1268,"children":1269},{"style":1167},[1270],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1272,"children":1273},{"style":1167},[1274],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1276,"children":1277},{"style":1083},[1278],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1280,"children":1281},{"style":1167},[1282],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1284,"children":1285},{"style":1167},[1286],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1288,"children":1290},{"class":1072,"line":1289},5,[1291,1295,1300,1304,1308,1312,1316,1320],{"type":45,"tag":1070,"props":1292,"children":1293},{"style":1167},[1294],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1296,"children":1297},{"style":1181},[1298],{"type":50,"value":1299},"data_source",{"type":45,"tag":1070,"props":1301,"children":1302},{"style":1167},[1303],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1305,"children":1306},{"style":1167},[1307],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1309,"children":1310},{"style":1167},[1311],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1313,"children":1314},{"style":1083},[1315],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1317,"children":1318},{"style":1167},[1319],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1321,"children":1322},{"style":1167},[1323],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1325,"children":1327},{"class":1072,"line":1326},6,[1328,1332,1337,1341,1345,1349,1353,1357],{"type":45,"tag":1070,"props":1329,"children":1330},{"style":1167},[1331],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1333,"children":1334},{"style":1181},[1335],{"type":50,"value":1336},"metric",{"type":45,"tag":1070,"props":1338,"children":1339},{"style":1167},[1340],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1342,"children":1343},{"style":1167},[1344],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1346,"children":1347},{"style":1167},[1348],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1350,"children":1351},{"style":1083},[1352],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1354,"children":1355},{"style":1167},[1356],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1358,"children":1359},{"style":1167},[1360],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1362,"children":1364},{"class":1072,"line":1363},7,[1365,1369,1374,1378,1382,1386,1390,1394],{"type":45,"tag":1070,"props":1366,"children":1367},{"style":1167},[1368],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1370,"children":1371},{"style":1181},[1372],{"type":50,"value":1373},"grain",{"type":45,"tag":1070,"props":1375,"children":1376},{"style":1167},[1377],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1379,"children":1380},{"style":1167},[1381],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1383,"children":1384},{"style":1167},[1385],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1387,"children":1388},{"style":1083},[1389],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1391,"children":1392},{"style":1167},[1393],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1395,"children":1396},{"style":1167},[1397],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1399,"children":1401},{"class":1072,"line":1400},8,[1402,1406,1411,1415,1419,1423,1427,1431],{"type":45,"tag":1070,"props":1403,"children":1404},{"style":1167},[1405],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1407,"children":1408},{"style":1181},[1409],{"type":50,"value":1410},"time_window",{"type":45,"tag":1070,"props":1412,"children":1413},{"style":1167},[1414],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1416,"children":1417},{"style":1167},[1418],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1420,"children":1421},{"style":1167},[1422],{"type":50,"value":1199},{"type":45,"tag":1070,"props":1424,"children":1425},{"style":1083},[1426],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1428,"children":1429},{"style":1167},[1430],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1432,"children":1433},{"style":1167},[1434],{"type":50,"value":1213},{"type":45,"tag":1070,"props":1436,"children":1438},{"class":1072,"line":1437},9,[1439,1443,1448,1452,1456,1461,1465,1469,1473],{"type":45,"tag":1070,"props":1440,"children":1441},{"style":1167},[1442],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1444,"children":1445},{"style":1181},[1446],{"type":50,"value":1447},"filters",{"type":45,"tag":1070,"props":1449,"children":1450},{"style":1167},[1451],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1453,"children":1454},{"style":1167},[1455],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1457,"children":1458},{"style":1167},[1459],{"type":50,"value":1460}," [",{"type":45,"tag":1070,"props":1462,"children":1463},{"style":1167},[1464],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1466,"children":1467},{"style":1083},[1468],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1470,"children":1471},{"style":1167},[1472],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1474,"children":1475},{"style":1167},[1476],{"type":50,"value":1477},"],\n",{"type":45,"tag":1070,"props":1479,"children":1480},{"class":1072,"line":28},[1481,1485,1489,1493,1497,1501,1505,1509,1513],{"type":45,"tag":1070,"props":1482,"children":1483},{"style":1167},[1484],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1486,"children":1487},{"style":1181},[1488],{"type":50,"value":709},{"type":45,"tag":1070,"props":1490,"children":1491},{"style":1167},[1492],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1494,"children":1495},{"style":1167},[1496],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1498,"children":1499},{"style":1167},[1500],{"type":50,"value":1460},{"type":45,"tag":1070,"props":1502,"children":1503},{"style":1167},[1504],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1506,"children":1507},{"style":1083},[1508],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1510,"children":1511},{"style":1167},[1512],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1514,"children":1515},{"style":1167},[1516],{"type":50,"value":1477},{"type":45,"tag":1070,"props":1518,"children":1520},{"class":1072,"line":1519},11,[1521,1525,1530,1534,1538,1542,1546,1550,1554],{"type":45,"tag":1070,"props":1522,"children":1523},{"style":1167},[1524],{"type":50,"value":1178},{"type":45,"tag":1070,"props":1526,"children":1527},{"style":1181},[1528],{"type":50,"value":1529},"generated_files",{"type":45,"tag":1070,"props":1531,"children":1532},{"style":1167},[1533],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1535,"children":1536},{"style":1167},[1537],{"type":50,"value":1194},{"type":45,"tag":1070,"props":1539,"children":1540},{"style":1167},[1541],{"type":50,"value":1460},{"type":45,"tag":1070,"props":1543,"children":1544},{"style":1167},[1545],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1547,"children":1548},{"style":1083},[1549],{"type":50,"value":1204},{"type":45,"tag":1070,"props":1551,"children":1552},{"style":1167},[1553],{"type":50,"value":1189},{"type":45,"tag":1070,"props":1555,"children":1556},{"style":1167},[1557],{"type":50,"value":1558},"]\n",{"type":45,"tag":1070,"props":1560,"children":1562},{"class":1072,"line":1561},12,[1563],{"type":45,"tag":1070,"props":1564,"children":1565},{"style":1167},[1566],{"type":50,"value":1567},"}\n",{"type":45,"tag":53,"props":1569,"children":1570},{},[1571],{"type":50,"value":1572},"Use this response shape after plotting:",{"type":45,"tag":1005,"props":1574,"children":1578},{"className":1575,"code":1576,"language":1577,"meta":1010,"style":1010},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Chart: \u002Fabsolute\u002Fpath\u002Fchart.html\nData: \u002Fabsolute\u002Fpath\u002Fdata.csv\n\nMapping:\n- chart type: ...\n- x: ...\n- y: ...\n- color\u002Fgroup: ...\n\nSource:\ndatabase.model_or_table, query, or artifact path\n\nCaveats:\ntime window, filters, top-N rule, freshness, exploratory\u002Freport-ready status\n","md",[1579],{"type":45,"tag":451,"props":1580,"children":1581},{"__ignoreMap":1010},[1582,1591,1599,1608,1616,1629,1641,1653,1665,1672,1680,1688,1695,1704],{"type":45,"tag":1070,"props":1583,"children":1584},{"class":1072,"line":1073},[1585],{"type":45,"tag":1070,"props":1586,"children":1588},{"style":1587},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1589],{"type":50,"value":1590},"Chart: \u002Fabsolute\u002Fpath\u002Fchart.html\n",{"type":45,"tag":1070,"props":1592,"children":1593},{"class":1072,"line":1099},[1594],{"type":45,"tag":1070,"props":1595,"children":1596},{"style":1587},[1597],{"type":50,"value":1598},"Data: \u002Fabsolute\u002Fpath\u002Fdata.csv\n",{"type":45,"tag":1070,"props":1600,"children":1601},{"class":1072,"line":1216},[1602],{"type":45,"tag":1070,"props":1603,"children":1605},{"emptyLinePlaceholder":1604},true,[1606],{"type":50,"value":1607},"\n",{"type":45,"tag":1070,"props":1609,"children":1610},{"class":1072,"line":32},[1611],{"type":45,"tag":1070,"props":1612,"children":1613},{"style":1587},[1614],{"type":50,"value":1615},"Mapping:\n",{"type":45,"tag":1070,"props":1617,"children":1618},{"class":1072,"line":1289},[1619,1624],{"type":45,"tag":1070,"props":1620,"children":1621},{"style":1167},[1622],{"type":50,"value":1623},"-",{"type":45,"tag":1070,"props":1625,"children":1626},{"style":1587},[1627],{"type":50,"value":1628}," chart type: ...\n",{"type":45,"tag":1070,"props":1630,"children":1631},{"class":1072,"line":1326},[1632,1636],{"type":45,"tag":1070,"props":1633,"children":1634},{"style":1167},[1635],{"type":50,"value":1623},{"type":45,"tag":1070,"props":1637,"children":1638},{"style":1587},[1639],{"type":50,"value":1640}," x: ...\n",{"type":45,"tag":1070,"props":1642,"children":1643},{"class":1072,"line":1363},[1644,1648],{"type":45,"tag":1070,"props":1645,"children":1646},{"style":1167},[1647],{"type":50,"value":1623},{"type":45,"tag":1070,"props":1649,"children":1650},{"style":1587},[1651],{"type":50,"value":1652}," y: ...\n",{"type":45,"tag":1070,"props":1654,"children":1655},{"class":1072,"line":1400},[1656,1660],{"type":45,"tag":1070,"props":1657,"children":1658},{"style":1167},[1659],{"type":50,"value":1623},{"type":45,"tag":1070,"props":1661,"children":1662},{"style":1587},[1663],{"type":50,"value":1664}," color\u002Fgroup: ...\n",{"type":45,"tag":1070,"props":1666,"children":1667},{"class":1072,"line":1437},[1668],{"type":45,"tag":1070,"props":1669,"children":1670},{"emptyLinePlaceholder":1604},[1671],{"type":50,"value":1607},{"type":45,"tag":1070,"props":1673,"children":1674},{"class":1072,"line":28},[1675],{"type":45,"tag":1070,"props":1676,"children":1677},{"style":1587},[1678],{"type":50,"value":1679},"Source:\n",{"type":45,"tag":1070,"props":1681,"children":1682},{"class":1072,"line":1519},[1683],{"type":45,"tag":1070,"props":1684,"children":1685},{"style":1587},[1686],{"type":50,"value":1687},"database.model_or_table, query, or artifact path\n",{"type":45,"tag":1070,"props":1689,"children":1690},{"class":1072,"line":1561},[1691],{"type":45,"tag":1070,"props":1692,"children":1693},{"emptyLinePlaceholder":1604},[1694],{"type":50,"value":1607},{"type":45,"tag":1070,"props":1696,"children":1698},{"class":1072,"line":1697},13,[1699],{"type":45,"tag":1070,"props":1700,"children":1701},{"style":1587},[1702],{"type":50,"value":1703},"Caveats:\n",{"type":45,"tag":1070,"props":1705,"children":1707},{"class":1072,"line":1706},14,[1708],{"type":45,"tag":1070,"props":1709,"children":1710},{"style":1587},[1711],{"type":50,"value":1712},"time window, filters, top-N rule, freshness, exploratory\u002Freport-ready status\n",{"type":45,"tag":64,"props":1714,"children":1716},{"id":1715},"recommended-implementation",[1717],{"type":50,"value":1718},"Recommended implementation",{"type":45,"tag":53,"props":1720,"children":1721},{},[1722],{"type":50,"value":1723},"For interactive exploratory charts, prefer a self-contained vanilla artifact:",{"type":45,"tag":1027,"props":1725,"children":1726},{},[1727,1732,1737,1742],{"type":45,"tag":80,"props":1728,"children":1729},{},[1730],{"type":50,"value":1731},"Plain HTML\u002FCSS\u002FJavaScript\u002FSVG with the bounded aggregate data embedded as JSON or CSV.",{"type":45,"tag":80,"props":1733,"children":1734},{},[1735],{"type":50,"value":1736},"Include the necessary interaction directly in vanilla JS: legend\u002Ffilter toggles, hover tooltip, click details, metric\u002Fview toggles, share vs count normalization, small multiples, etc.",{"type":45,"tag":80,"props":1738,"children":1739},{},[1740],{"type":50,"value":1741},"Avoid external network\u002FCDN dependencies by default; the artifact should work when opened locally\u002Foffline.",{"type":45,"tag":80,"props":1743,"children":1744},{},[1745],{"type":50,"value":1746},"Keep the chart code simple and inspectable. Do not build a broad dashboard unless the user asks for it.",{"type":45,"tag":53,"props":1748,"children":1749},{},[1750],{"type":50,"value":1751},"Use local Python\u002Fcharting libraries in this order when a static export, report asset, or specialized chart is more appropriate:",{"type":45,"tag":1027,"props":1753,"children":1754},{},[1755,1760,1765,1770],{"type":45,"tag":80,"props":1756,"children":1757},{},[1758],{"type":50,"value":1759},"Matplotlib\u002Fseaborn for static PNG\u002FSVG report assets.",{"type":45,"tag":80,"props":1761,"children":1762},{},[1763],{"type":50,"value":1764},"Plotly PNG export when Plotly\u002FKaleido are already available or explicitly requested.",{"type":45,"tag":80,"props":1766,"children":1767},{},[1768],{"type":50,"value":1769},"Plotly\u002FVega\u002FECharts\u002Fetc. for interactive HTML only when the user asks for that library or vanilla SVG would be a poor fit.",{"type":45,"tag":80,"props":1771,"children":1772},{},[1773],{"type":50,"value":1774},"CSV output only if plotting is not feasible.",{"type":45,"tag":53,"props":1776,"children":1777},{},[1778],{"type":50,"value":1779},"For bounded aggregate analytics data, a self-contained vanilla HTML\u002FCSS\u002FJavaScript\u002FSVG chart is usually the preferred interactive artifact. Prefer this over Plotly-by-default and over low-quality static fallbacks when the user wants exploration and the data volume is small enough to embed safely.",{"type":45,"tag":53,"props":1781,"children":1782},{},[1783],{"type":50,"value":1784},"Recommended features for self-contained interactive HTML\u002FSVG charts:",{"type":45,"tag":76,"props":1786,"children":1787},{},[1788,1793,1798,1803,1808,1813,1818,1823,1828,1833],{"type":45,"tag":80,"props":1789,"children":1790},{},[1791],{"type":50,"value":1792},"Embed only aggregate, non-sensitive plotted data.",{"type":45,"tag":80,"props":1794,"children":1795},{},[1796],{"type":50,"value":1797},"Use inline SVG for marks, axes, gridlines, labels, and accessibility text.",{"type":45,"tag":80,"props":1799,"children":1800},{},[1801],{"type":50,"value":1802},"Provide hover and keyboard-focus tooltips for datapoints.",{"type":45,"tag":80,"props":1804,"children":1805},{},[1806],{"type":50,"value":1807},"Include useful controls such as metric selector, y-axis scale selector, label toggle, or segment\u002Fhighlight toggles only when they aid exploration.",{"type":45,"tag":80,"props":1809,"children":1810},{},[1811],{"type":50,"value":1812},"Include source\u002Fcaveat captions visible next to the chart.",{"type":45,"tag":80,"props":1814,"children":1815},{},[1816],{"type":50,"value":1817},"Include the underlying data table when practical.",{"type":45,"tag":80,"props":1819,"children":1820},{},[1821],{"type":50,"value":1822},"Provide CSV\u002FSVG download buttons when browser security context allows them.",{"type":45,"tag":80,"props":1824,"children":1825},{},[1826],{"type":50,"value":1827},"Keep the artifact usable offline and avoid external network\u002FCDN dependencies unless the user explicitly wants them.",{"type":45,"tag":80,"props":1829,"children":1830},{},[1831],{"type":50,"value":1832},"Prefer custom SVG marks over canvas when axes, labels, tooltips, legends, and click targets need to remain easy to inspect and modify.",{"type":45,"tag":80,"props":1834,"children":1835},{},[1836],{"type":50,"value":1837},"Add lightweight summary metrics or a details table when they materially improve exploration.",{"type":45,"tag":53,"props":1839,"children":1840},{},[1841],{"type":50,"value":1842},"Always keep the underlying data artifact, such as CSV or query output, when generating a chart.",{"type":45,"tag":53,"props":1844,"children":1845},{},[1846],{"type":50,"value":1847},"Prefer a small local script or a clearly structured HTML file over ad hoc shell one-liners when generating a chart so the mapping, style, file paths, embedded data, and dependencies are easy to inspect.",{"type":45,"tag":53,"props":1849,"children":1850},{},[1851],{"type":50,"value":1852},"Before returning a chart artifact, inspect or validate the rendered output. Reject and fix charts with clipped captions, missing legends, labels running off canvas, unreadable axes, confusing log ticks, misleading baselines, or badly compressed series. If one series dwarfs the rest, consider small multiples, split panels, indexed trends, normalization, or a clearly labeled log scale depending on the analytical intent.",{"type":45,"tag":53,"props":1854,"children":1855},{},[1856],{"type":50,"value":1857},"When possible, open or read the actual image artifact before finalizing. Do not rely only on code inspection.",{"type":45,"tag":64,"props":1859,"children":1861},{"id":1860},"interactive-html-validation",[1862],{"type":50,"value":1863},"Interactive HTML validation",{"type":45,"tag":53,"props":1865,"children":1866},{},[1867],{"type":50,"value":1868},"Before reporting an interactive HTML artifact as complete:",{"type":45,"tag":1027,"props":1870,"children":1871},{},[1872,1877,1898,1911,1916],{"type":45,"tag":80,"props":1873,"children":1874},{},[1875],{"type":50,"value":1876},"Validate that expected controls, labels, source notes, and embedded data are present in the generated file.",{"type":45,"tag":80,"props":1878,"children":1879},{},[1880,1882,1888,1890,1896],{"type":50,"value":1881},"If the file contains inline JavaScript, extract ",{"type":45,"tag":451,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":50,"value":1887},"\u003Cscript>",{"type":50,"value":1889}," blocks and run ",{"type":45,"tag":451,"props":1891,"children":1893},{"className":1892},[],[1894],{"type":50,"value":1895},"node --check",{"type":50,"value":1897}," when Node is available.",{"type":45,"tag":80,"props":1899,"children":1900},{},[1901,1903,1909],{"type":50,"value":1902},"Watch for generator escaping bugs, especially literal newlines inside JavaScript string literals, unescaped backticks in template literals, and manually concatenated JSON. Prefer ",{"type":45,"tag":451,"props":1904,"children":1906},{"className":1905},[],[1907],{"type":50,"value":1908},"json.dumps",{"type":50,"value":1910},"\u002Fequivalent for embedded data.",{"type":45,"tag":80,"props":1912,"children":1913},{},[1914],{"type":50,"value":1915},"If the artifact is generated by a script, fix the generator and regenerate the artifact. Do not only hand-patch the generated HTML unless the generator is also updated or clearly marked obsolete.",{"type":45,"tag":80,"props":1917,"children":1918},{},[1919,1921,1927],{"type":50,"value":1920},"For local interactive HTML, note that opening via ",{"type":45,"tag":451,"props":1922,"children":1924},{"className":1923},[],[1925],{"type":50,"value":1926},"file:\u002F\u002F",{"type":50,"value":1928}," can restrict downloads, object URLs, module imports, or other browser features. If relevant, include local serving instructions such as:",{"type":45,"tag":1005,"props":1930,"children":1932},{"className":1062,"code":1931,"language":1064,"meta":1010,"style":1010},"cd \u002Fpath\u002Fto\u002Fartifact-directory\npython3 -m http.server 8000\n",[1933],{"type":45,"tag":451,"props":1934,"children":1935},{"__ignoreMap":1010},[1936,1950],{"type":45,"tag":1070,"props":1937,"children":1938},{"class":1072,"line":1073},[1939,1945],{"type":45,"tag":1070,"props":1940,"children":1942},{"style":1941},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1943],{"type":50,"value":1944},"cd",{"type":45,"tag":1070,"props":1946,"children":1947},{"style":1083},[1948],{"type":50,"value":1949}," \u002Fpath\u002Fto\u002Fartifact-directory\n",{"type":45,"tag":1070,"props":1951,"children":1952},{"class":1072,"line":1099},[1953,1957,1961,1966],{"type":45,"tag":1070,"props":1954,"children":1955},{"style":1077},[1956],{"type":50,"value":1080},{"type":45,"tag":1070,"props":1958,"children":1959},{"style":1083},[1960],{"type":50,"value":1086},{"type":45,"tag":1070,"props":1962,"children":1963},{"style":1083},[1964],{"type":50,"value":1965}," http.server",{"type":45,"tag":1070,"props":1967,"children":1969},{"style":1968},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1970],{"type":50,"value":1971}," 8000\n",{"type":45,"tag":53,"props":1973,"children":1974},{},[1975,1977,1983],{"type":50,"value":1976},"Then open ",{"type":45,"tag":451,"props":1978,"children":1980},{"className":1979},[],[1981],{"type":50,"value":1982},"http:\u002F\u002Flocalhost:8000\u002Fchart.html",{"type":50,"value":496},{"type":45,"tag":64,"props":1985,"children":1987},{"id":1986},"smoke-test-query-for-plotting-changes",[1988],{"type":50,"value":1989},"Smoke-test query for plotting changes",{"type":45,"tag":53,"props":1991,"children":1992},{},[1993],{"type":50,"value":1994},"Use a bounded query like this as a basic plotting smoke test against any daily aggregate table you have. Adapt the table and column names to your schema. It should produce a multi-line or small-multiple time-series chart with the date on x, a count metric on y, and a low-cardinality category as the color\u002Fgroup dimension. Save both CSV and a plain HTML\u002FCSS\u002FJavaScript\u002FSVG interactive artifact.",{"type":45,"tag":1005,"props":1996,"children":2000},{"className":1997,"code":1998,"language":1999,"meta":1010,"style":1010},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","WITH top_categories AS (\n  SELECT category\n  FROM analytics.daily_events\n  WHERE event_date >= today() - 30\n    AND event_date \u003C today()\n    AND category IS NOT NULL\n    AND category != ''\n  GROUP BY category\n  ORDER BY sum(event_count) DESC\n  LIMIT 5\n)\nSELECT\n  event_date,\n  category,\n  sum(event_count) AS events,\n  uniqExact(user_id) AS active_users,\n  round(events \u002F nullIf(active_users, 0), 2) AS events_per_active_user\nFROM analytics.daily_events\nWHERE event_date >= today() - 30\n  AND event_date \u003C today()\n  AND category IN (SELECT category FROM top_categories)\nGROUP BY event_date, category\nORDER BY event_date, events DESC\n","sql",[2001],{"type":45,"tag":451,"props":2002,"children":2003},{"__ignoreMap":1010},[2004,2012,2020,2028,2036,2044,2052,2060,2068,2076,2084,2092,2100,2108,2116,2125,2134,2143,2152,2161,2170,2179,2188],{"type":45,"tag":1070,"props":2005,"children":2006},{"class":1072,"line":1073},[2007],{"type":45,"tag":1070,"props":2008,"children":2009},{},[2010],{"type":50,"value":2011},"WITH top_categories AS (\n",{"type":45,"tag":1070,"props":2013,"children":2014},{"class":1072,"line":1099},[2015],{"type":45,"tag":1070,"props":2016,"children":2017},{},[2018],{"type":50,"value":2019},"  SELECT category\n",{"type":45,"tag":1070,"props":2021,"children":2022},{"class":1072,"line":1216},[2023],{"type":45,"tag":1070,"props":2024,"children":2025},{},[2026],{"type":50,"value":2027},"  FROM analytics.daily_events\n",{"type":45,"tag":1070,"props":2029,"children":2030},{"class":1072,"line":32},[2031],{"type":45,"tag":1070,"props":2032,"children":2033},{},[2034],{"type":50,"value":2035},"  WHERE event_date >= today() - 30\n",{"type":45,"tag":1070,"props":2037,"children":2038},{"class":1072,"line":1289},[2039],{"type":45,"tag":1070,"props":2040,"children":2041},{},[2042],{"type":50,"value":2043},"    AND event_date \u003C today()\n",{"type":45,"tag":1070,"props":2045,"children":2046},{"class":1072,"line":1326},[2047],{"type":45,"tag":1070,"props":2048,"children":2049},{},[2050],{"type":50,"value":2051},"    AND category IS NOT NULL\n",{"type":45,"tag":1070,"props":2053,"children":2054},{"class":1072,"line":1363},[2055],{"type":45,"tag":1070,"props":2056,"children":2057},{},[2058],{"type":50,"value":2059},"    AND category != ''\n",{"type":45,"tag":1070,"props":2061,"children":2062},{"class":1072,"line":1400},[2063],{"type":45,"tag":1070,"props":2064,"children":2065},{},[2066],{"type":50,"value":2067},"  GROUP BY category\n",{"type":45,"tag":1070,"props":2069,"children":2070},{"class":1072,"line":1437},[2071],{"type":45,"tag":1070,"props":2072,"children":2073},{},[2074],{"type":50,"value":2075},"  ORDER BY sum(event_count) DESC\n",{"type":45,"tag":1070,"props":2077,"children":2078},{"class":1072,"line":28},[2079],{"type":45,"tag":1070,"props":2080,"children":2081},{},[2082],{"type":50,"value":2083},"  LIMIT 5\n",{"type":45,"tag":1070,"props":2085,"children":2086},{"class":1072,"line":1519},[2087],{"type":45,"tag":1070,"props":2088,"children":2089},{},[2090],{"type":50,"value":2091},")\n",{"type":45,"tag":1070,"props":2093,"children":2094},{"class":1072,"line":1561},[2095],{"type":45,"tag":1070,"props":2096,"children":2097},{},[2098],{"type":50,"value":2099},"SELECT\n",{"type":45,"tag":1070,"props":2101,"children":2102},{"class":1072,"line":1697},[2103],{"type":45,"tag":1070,"props":2104,"children":2105},{},[2106],{"type":50,"value":2107},"  event_date,\n",{"type":45,"tag":1070,"props":2109,"children":2110},{"class":1072,"line":1706},[2111],{"type":45,"tag":1070,"props":2112,"children":2113},{},[2114],{"type":50,"value":2115},"  category,\n",{"type":45,"tag":1070,"props":2117,"children":2119},{"class":1072,"line":2118},15,[2120],{"type":45,"tag":1070,"props":2121,"children":2122},{},[2123],{"type":50,"value":2124},"  sum(event_count) AS events,\n",{"type":45,"tag":1070,"props":2126,"children":2128},{"class":1072,"line":2127},16,[2129],{"type":45,"tag":1070,"props":2130,"children":2131},{},[2132],{"type":50,"value":2133},"  uniqExact(user_id) AS active_users,\n",{"type":45,"tag":1070,"props":2135,"children":2137},{"class":1072,"line":2136},17,[2138],{"type":45,"tag":1070,"props":2139,"children":2140},{},[2141],{"type":50,"value":2142},"  round(events \u002F nullIf(active_users, 0), 2) AS events_per_active_user\n",{"type":45,"tag":1070,"props":2144,"children":2146},{"class":1072,"line":2145},18,[2147],{"type":45,"tag":1070,"props":2148,"children":2149},{},[2150],{"type":50,"value":2151},"FROM analytics.daily_events\n",{"type":45,"tag":1070,"props":2153,"children":2155},{"class":1072,"line":2154},19,[2156],{"type":45,"tag":1070,"props":2157,"children":2158},{},[2159],{"type":50,"value":2160},"WHERE event_date >= today() - 30\n",{"type":45,"tag":1070,"props":2162,"children":2164},{"class":1072,"line":2163},20,[2165],{"type":45,"tag":1070,"props":2166,"children":2167},{},[2168],{"type":50,"value":2169},"  AND event_date \u003C today()\n",{"type":45,"tag":1070,"props":2171,"children":2173},{"class":1072,"line":2172},21,[2174],{"type":45,"tag":1070,"props":2175,"children":2176},{},[2177],{"type":50,"value":2178},"  AND category IN (SELECT category FROM top_categories)\n",{"type":45,"tag":1070,"props":2180,"children":2182},{"class":1072,"line":2181},22,[2183],{"type":45,"tag":1070,"props":2184,"children":2185},{},[2186],{"type":50,"value":2187},"GROUP BY event_date, category\n",{"type":45,"tag":1070,"props":2189,"children":2191},{"class":1072,"line":2190},23,[2192],{"type":45,"tag":1070,"props":2193,"children":2194},{},[2195],{"type":50,"value":2196},"ORDER BY event_date, events DESC\n",{"type":45,"tag":53,"props":2198,"children":2199},{},[2200],{"type":50,"value":2201},"Expected plot contract for this query:",{"type":45,"tag":76,"props":2203,"children":2204},{},[2205,2210,2221,2232,2243,2254],{"type":45,"tag":80,"props":2206,"children":2207},{},[2208],{"type":50,"value":2209},"chart type: start with a multi-line chart only if the top categories are comparable in magnitude; otherwise prefer small multiples or ask whether the user wants absolute volume or trend-shape comparison",{"type":45,"tag":80,"props":2211,"children":2212},{},[2213,2215],{"type":50,"value":2214},"x: ",{"type":45,"tag":451,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":50,"value":2220},"event_date",{"type":45,"tag":80,"props":2222,"children":2223},{},[2224,2226],{"type":50,"value":2225},"y: ",{"type":45,"tag":451,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":50,"value":2231},"events",{"type":45,"tag":80,"props":2233,"children":2234},{},[2235,2237],{"type":50,"value":2236},"color\u002Fgroup: ",{"type":45,"tag":451,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":50,"value":2242},"category",{"type":45,"tag":80,"props":2244,"children":2245},{},[2246,2248],{"type":50,"value":2247},"source: ",{"type":45,"tag":451,"props":2249,"children":2251},{"className":2250},[],[2252],{"type":50,"value":2253},"analytics.daily_events",{"type":45,"tag":80,"props":2255,"children":2256},{},[2257],{"type":50,"value":2258},"caveats: last 30 complete days; top 5 categories by total event count",{"type":45,"tag":2260,"props":2261,"children":2262},"style",{},[2263],{"type":50,"value":2264},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2266,"total":2462},[2267,2286,2306,2323,2339,2355,2374,2386,2398,2416,2436,2449],{"slug":2268,"name":2268,"fn":2269,"description":2270,"org":2271,"tags":2272,"stars":28,"repoUrl":29,"updatedAt":2285},"amazon-location-service","integrate Amazon Location Service APIs","Integrates Amazon Location Service APIs for AWS applications. Use this skill when users want to add maps (interactive MapLibre or static images); geocode addresses to coordinates or reverse geocode coordinates to addresses; calculate routes, travel times, or service areas; find places and businesses through text search, nearby search, or autocomplete suggestions; retrieve detailed place information including hours, contacts, and addresses; monitor geographical boundaries with geofences; or track device locations. Covers authentication, SDK integration, and all Amazon Location Service capabilities.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2273,2276,2279,2282],{"name":2274,"slug":2275,"type":15},"API Development","api-development",{"name":2277,"slug":2278,"type":15},"AWS","aws",{"name":2280,"slug":2281,"type":15},"Maps","maps",{"name":2283,"slug":2284,"type":15},"Navigation","navigation","2026-07-12T08:13:53.294026",{"slug":2287,"name":2287,"fn":2288,"description":2289,"org":2290,"tags":2291,"stars":28,"repoUrl":29,"updatedAt":2305},"amplify-workflow","build full-stack apps with AWS Amplify","Build and deploy full-stack web and mobile apps with AWS Amplify Gen2 (TypeScript code-first). Covers auth (Cognito), data (AppSync\u002FDynamoDB including schema modeling, enum types, relationships, authorization rules), storage (S3), functions, APIs, and AI (Amplify AI Kit with Bedrock). Supports React, Next.js, Vue, Angular, React Native, Flutter, Swift, and Android. Always use this skill for Amplify Gen2 topics — even for questions you think you know — it contains validated, version-specific patterns that prevent common mistakes. TRIGGER when: user mentions Amplify Gen2; project has amplify\u002F directory or amplify_outputs; code imports @aws-amplify packages; user asks about defineBackend, defineAuth, defineData, defineStorage, or npx ampx. SKIP: Amplify Gen1 (amplify CLI v6), standalone SAM\u002FCDK without Amplify (use aws-serverless), direct Bedrock without Amplify AI Kit (use bedrock).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2292,2295,2296,2299,2302],{"name":2293,"slug":2294,"type":15},"Auth","auth",{"name":2277,"slug":2278,"type":15},{"name":2297,"slug":2298,"type":15},"Database","database",{"name":2300,"slug":2301,"type":15},"Frontend","frontend",{"name":2303,"slug":2304,"type":15},"TypeScript","typescript","2026-07-12T08:13:47.134012",{"slug":2307,"name":2307,"fn":2308,"description":2309,"org":2310,"tags":2311,"stars":28,"repoUrl":29,"updatedAt":2322},"analyzer","analyze queried data for trends","Analyze queried data for trends, week-over-week comparisons, distributions, funnels, cohorts, top-N lists, anomalies, sanity checks, and report-ready findings. Use after or alongside ClickHouse queries when the user wants insight rather than raw rows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2312,2313,2316,2319],{"name":23,"slug":24,"type":15},{"name":2314,"slug":2315,"type":15},"ClickHouse","clickhouse",{"name":2317,"slug":2318,"type":15},"Data Analysis","data-analysis",{"name":2320,"slug":2321,"type":15},"Statistics","statistics","2026-07-12T08:14:05.606036",{"slug":2324,"name":2324,"fn":2325,"description":2326,"org":2327,"tags":2328,"stars":28,"repoUrl":29,"updatedAt":2338},"artifact-management","manage and organize analysis artifacts","Save, organize, and describe reusable analysis artifacts such as SQL, result snapshots, CSV exports, summaries, caveats, plots, and report-ready files. Use when users ask to save, export, share, cite, reproduce, or organize data-analysis outputs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2329,2330,2333,2336],{"name":2317,"slug":2318,"type":15},{"name":2331,"slug":2332,"type":15},"Productivity","productivity",{"name":2334,"slug":2335,"type":15},"Reporting","reporting",{"name":2337,"slug":1999,"type":15},"SQL","2026-07-12T08:14:09.265555",{"slug":2340,"name":2340,"fn":2341,"description":2342,"org":2343,"tags":2344,"stars":28,"repoUrl":29,"updatedAt":2354},"attorney-assist","connect with attorneys for legal consultation","Connects the user with a LegalZoom attorney for legal consultation. Use when a user asks about attorneys, lawyers, or legal help, or when contract review reveals high risks or low-confidence findings.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2345,2348,2351],{"name":2346,"slug":2347,"type":15},"Contracts","contracts",{"name":2349,"slug":2350,"type":15},"Legal","legal",{"name":2352,"slug":2353,"type":15},"Risk Assessment","risk-assessment","2026-07-12T08:13:45.878361",{"slug":2356,"name":2356,"fn":2357,"description":2358,"org":2359,"tags":2360,"stars":28,"repoUrl":29,"updatedAt":2373},"building-pydantic-ai-agents","build AI agents with Pydantic AI","Build AI agents with Pydantic AI — tools, capabilities (including on-demand loading), structured output, streaming, testing, and multi-agent patterns. Use when the user mentions Pydantic AI, imports pydantic_ai, or asks to build an AI agent, add tools\u002Fcapabilities, defer capability loading, stream output, define agents from YAML, or test agent behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2361,2364,2367,2370],{"name":2362,"slug":2363,"type":15},"Agents","agents",{"name":2365,"slug":2366,"type":15},"LLM","llm",{"name":2368,"slug":2369,"type":15},"Multi-Agent","multi-agent",{"name":2371,"slug":2372,"type":15},"Python","python","2026-07-12T08:14:01.893781",{"slug":2315,"name":2315,"fn":2375,"description":2376,"org":2377,"tags":2378,"stars":28,"repoUrl":29,"updatedAt":2385},"query ClickHouse databases via CLI","Connect to and query ClickHouse (a local server or a ClickHouse Cloud service) from the terminal using the official clickhousectl CLI, including the browser OAuth login flow. Use when the user wants to run SQL against ClickHouse, explore schemas and tables, inspect Cloud services, or authenticate clickhousectl. For building a local dev environment or deploying to Cloud, defer to the official ClickHouse skills (see Scope).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2379,2380,2383,2384],{"name":23,"slug":24,"type":15},{"name":2381,"slug":2382,"type":15},"CLI","cli",{"name":2314,"slug":2315,"type":15},{"name":2297,"slug":2298,"type":15},"2026-07-12T08:14:06.829692",{"slug":2387,"name":2387,"fn":2388,"description":2389,"org":2390,"tags":2391,"stars":28,"repoUrl":29,"updatedAt":2397},"cline-session-history","search and browse Cline session history","Search and browse Cline session history. Use when the user asks to find, list, inspect, or export Cline sessions by time period, prompt content, status, model, provider, source, mode, workspace, or other criteria. Also use when the user wants to read a session transcript or export sessions to a directory. Trigger phrases include \"find my session\", \"search my session history\", \"show me past sessions\", \"what was that session where\", \"find the session that started with\", and any mention of past Cline conversations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2392,2393,2396],{"name":2362,"slug":2363,"type":15},{"name":2394,"slug":2395,"type":15},"History","history",{"name":2331,"slug":2332,"type":15},"2026-07-19T06:03:13.945151",{"slug":2399,"name":2399,"fn":2400,"description":2401,"org":2402,"tags":2403,"stars":28,"repoUrl":29,"updatedAt":2415},"convex-design","build reactive backends with Convex","Design and build reactive, type-safe, production-grade backends on Convex. Covers schema, queries\u002Fmutations\u002Factions, indexes, auth, file storage, scheduling, real-time multiplayer, mobile backends, and LLM\u002Fagent workflows on Convex's one-platform stack.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2404,2405,2408,2409,2412],{"name":2293,"slug":2294,"type":15},{"name":2406,"slug":2407,"type":15},"Backend","backend",{"name":2297,"slug":2298,"type":15},{"name":2410,"slug":2411,"type":15},"Real-time","real-time",{"name":2413,"slug":2414,"type":15},"Storage","storage","2026-07-12T08:13:37.101253",{"slug":2417,"name":2417,"fn":2418,"description":2419,"org":2420,"tags":2421,"stars":28,"repoUrl":29,"updatedAt":2435},"cosmosdb-best-practices","optimize Azure Cosmos DB performance","Azure Cosmos DB performance optimization and best practices guidelines for NoSQL,\npartitioning, queries, SDK usage, and vector search. Use when writing, reviewing,\nor refactoring code that interacts with Azure Cosmos DB, designing data models,\noptimizing queries, or implementing high-performance database operations.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2422,2425,2428,2429,2432],{"name":2423,"slug":2424,"type":15},"Azure","azure",{"name":2426,"slug":2427,"type":15},"Cosmos DB","cosmos-db",{"name":2297,"slug":2298,"type":15},{"name":2430,"slug":2431,"type":15},"NoSQL","nosql",{"name":2433,"slug":2434,"type":15},"Performance","performance","2026-07-12T08:13:54.531719",{"slug":2437,"name":2437,"fn":2438,"description":2439,"org":2440,"tags":2441,"stars":28,"repoUrl":29,"updatedAt":2448},"data-analyst","analyze ClickHouse analytics data","Act as an interactive data analyst for ClickHouse-backed analytics. Use when the user asks questions about internal data, metrics, dashboards, telemetry, active users, revenue, funnels, trends, distributions, or wants an analyst-style conversation, ad hoc SQL, charts, or a data export against ClickHouse (local or ClickHouse Cloud).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2442,2443,2444,2447],{"name":23,"slug":24,"type":15},{"name":2314,"slug":2315,"type":15},{"name":2445,"slug":2446,"type":15},"Dashboards","dashboards",{"name":2317,"slug":2318,"type":15},"2026-07-12T08:13:31.975246",{"slug":2450,"name":2450,"fn":2451,"description":2452,"org":2453,"tags":2454,"stars":28,"repoUrl":29,"updatedAt":2461},"dataproc-skills","manage Dataproc clusters and jobs","Skills to interact with your Dataproc clusters and jobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2455,2458],{"name":2456,"slug":2457,"type":15},"Data Engineering","data-engineering",{"name":2459,"slug":2460,"type":15},"Operations","operations","2026-07-12T08:13:42.179275",45,{"items":2464,"total":2514},[2465,2472,2480,2487,2494,2500,2507],{"slug":2268,"name":2268,"fn":2269,"description":2270,"org":2466,"tags":2467,"stars":28,"repoUrl":29,"updatedAt":2285},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2468,2469,2470,2471],{"name":2274,"slug":2275,"type":15},{"name":2277,"slug":2278,"type":15},{"name":2280,"slug":2281,"type":15},{"name":2283,"slug":2284,"type":15},{"slug":2287,"name":2287,"fn":2288,"description":2289,"org":2473,"tags":2474,"stars":28,"repoUrl":29,"updatedAt":2305},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2475,2476,2477,2478,2479],{"name":2293,"slug":2294,"type":15},{"name":2277,"slug":2278,"type":15},{"name":2297,"slug":2298,"type":15},{"name":2300,"slug":2301,"type":15},{"name":2303,"slug":2304,"type":15},{"slug":2307,"name":2307,"fn":2308,"description":2309,"org":2481,"tags":2482,"stars":28,"repoUrl":29,"updatedAt":2322},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2483,2484,2485,2486],{"name":23,"slug":24,"type":15},{"name":2314,"slug":2315,"type":15},{"name":2317,"slug":2318,"type":15},{"name":2320,"slug":2321,"type":15},{"slug":2324,"name":2324,"fn":2325,"description":2326,"org":2488,"tags":2489,"stars":28,"repoUrl":29,"updatedAt":2338},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2490,2491,2492,2493],{"name":2317,"slug":2318,"type":15},{"name":2331,"slug":2332,"type":15},{"name":2334,"slug":2335,"type":15},{"name":2337,"slug":1999,"type":15},{"slug":2340,"name":2340,"fn":2341,"description":2342,"org":2495,"tags":2496,"stars":28,"repoUrl":29,"updatedAt":2354},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2497,2498,2499],{"name":2346,"slug":2347,"type":15},{"name":2349,"slug":2350,"type":15},{"name":2352,"slug":2353,"type":15},{"slug":2356,"name":2356,"fn":2357,"description":2358,"org":2501,"tags":2502,"stars":28,"repoUrl":29,"updatedAt":2373},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2503,2504,2505,2506],{"name":2362,"slug":2363,"type":15},{"name":2365,"slug":2366,"type":15},{"name":2368,"slug":2369,"type":15},{"name":2371,"slug":2372,"type":15},{"slug":2315,"name":2315,"fn":2375,"description":2376,"org":2508,"tags":2509,"stars":28,"repoUrl":29,"updatedAt":2385},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2510,2511,2512,2513],{"name":23,"slug":24,"type":15},{"name":2381,"slug":2382,"type":15},{"name":2314,"slug":2315,"type":15},{"name":2297,"slug":2298,"type":15},43]