This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+1 more
ReleasePort's take
Moderate signalVersion v3.6.0 introduces the `semiotic/ai` API surface with new hooks, an MCP server for chart operations, and CLI extensions, while altering several chart components to single‑series behavior.
Why it matters: Breaking changes affect AreaChart (now single‑series) and DifferenceChart (2+ series via top‑2 subselection) – severity 70; plan migration before upgrading.
Summary
AI summaryAdded the semiotic/ai subpath with AI‑driven chart recommendation, profiling, audience calibration, capability descriptors, hooks, an MCP server, CLI extensions, and case‑study blog posts.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | High |
Changes AreaChart to a single‑series chart; multi‑series inputs are subselected. Changes AreaChart to a single‑series chart; multi‑series inputs are subselected. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Breaking | High |
Changes DifferenceChart to accept 2+ series via top‑2 subselection, adding caveats for extra series. Changes DifferenceChart to accept 2+ series via top‑2 subselection, adding caveats for extra series. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Adds semiotic/ai subpath with AI‑facing API surface. Adds semiotic/ai subpath with AI‑facing API surface. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Adds useChartInterrogation and useChartFocus hooks for headless conversational primitives. Adds useChartInterrogation and useChartFocus hooks for headless conversational primitives. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Adds semiotic-ai CLI extensions: --doctor, --schema, --compact, and --examples. Adds semiotic-ai CLI extensions: --doctor, --schema, --compact, and --examples. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Updates Scatterplot and ConnectedScatterplot to prefer canonical 2‑numeric form when a sequence axis is present. Updates Scatterplot and ConnectedScatterplot to prefer canonical 2‑numeric form when a sequence axis is present. Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Enhances X_FIELD_HINT to recognize calendar‑segment field names (quarter, qtr, fiscal, week). Enhances X_FIELD_HINT to recognize calendar‑segment field names (quarter, qtr, fiscal, week). Source: llm_adapter@2026-05-26 Confidence: high |
— |
| Feature | Medium |
Adds semiotic-mcp server exposing MCP tools for chart rendering, interrogation, suggestion, and diagnosis. Adds semiotic-mcp server exposing MCP tools for chart rendering, interrogation, suggestion, and diagnosis. Source: llm_adapter@2026-05-26 Confidence: low |
— |
| Feature | Low |
Introduces recommendation capabilities (`suggestCharts`, `suggestDashboard`, etc.) in `semiotic/ai`. Introduces recommendation capabilities (`suggestCharts`, `suggestDashboard`, etc.) in `semiotic/ai`. Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
| Feature | Low |
Adds profiling functions (`profileData`, `diffProfile`, `inferIntent`) to `semiotic/ai`. Adds profiling functions (`profileData`, `diffProfile`, `inferIntent`) to `semiotic/ai`. Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
| Feature | Low |
Implements audience calibration via `AudienceProfile` and built‑in personas in `semiotic/ai`. Implements audience calibration via `AudienceProfile` and built‑in personas in `semiotic/ai`. Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
| Feature | Low |
Provides capability descriptors per chart (`<ChartName>.capability.ts`) for extensibility. Provides capability descriptors per chart (`<ChartName>.capability.ts`) for extensibility. Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
| Feature | Low |
Defines 13 built‑in intents in `intents.ts` with descriptors and default scorers. Defines 13 built‑in intents in `intents.ts` with descriptors and default scorers. Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
| Feature | Low |
Introduces `semiotic-mcp` server exposing MCP tools (`renderChart`, `interrogateChart`, etc.). Introduces `semiotic-mcp` server exposing MCP tools (`renderChart`, `interrogateChart`, etc.). Source: granite4.1:30b@2026-05-26-audit Confidence: low |
— |
Full changelog
Added
semiotic/aisubpath — the AI-facing API surface as a first-class entry point. 211 KB gzip; the heuristic engine works without any LLM call, but every primitive returns LLM-friendly structured context so a model can ride on top. The entry covers four families of capability:- Recommendation.
suggestCharts(data, options?)returns ranked chart suggestions for a profiled dataset and optional intent; each suggestion carries a runnablepropsobject, an intent-score breakdown, the chart's rubric (familiarity / accuracy / precision), human-readablereasons[], andcaveats[].suggestDashboardreturns a multi-panel composite covering distinct analytical intents (withintentsMissingfor honesty about what the data can't show).suggestStretchChartsreturns the literacy-growth surface — charts the audience is unfamiliar with but the data actually supports.scoreChartandexplainCapabilityFitgive single-chart introspection.useChartSuggestionsis the React hook wrapping the same engine for live UI. - Profiling.
profileData(data)returns aChartDataProfilewith candidate fields per role (x / y / size / category / series / time), distinct counts, monotonicity, structure detection (hierarchy / network / geo).diffProfilereports schema changes between two profiles.inferIntentis a zero-dependency regex classifier that maps natural-language phrases ("why is X different?","compare these","trend over time") to one of 13 built-in intents. - Audience calibration.
AudienceProfileis a serializable per-organization config —familiarity(chart → 1-5 number map) andtargets(chart →{direction: "increase" | "decrease", weight, reason}) — that biases recommendations toward what a specific audience already knows AND toward charts the organization is trying to grow into. Three built-in personas (executivePersona,analystPersona,dataScientistPersona) ship as starting points; bias is meaningful (target weight 2 = ±2.0 on a 5-point composite score) and visible (the audience's verbatim rationale string lands onreasons[]so the policy is auditable in the UI). - Capability descriptors per chart. Every chart now ships a
<ChartName>.capability.tsnext to its TSX, declaringfamily,rubric,fits(profile) → reason | null,intentScores, optionalvariants,caveats, andbuildProps. The registry is runtime-extensible viaregisterChartCapability/unregisterChartCapabilityso consumers can add their own charts to the recommendation pool without forking the engine. - 13 built-in intents in
intents.ts:trend,compare-series,compare-categories,rank,part-to-whole,distribution,correlation,flow,hierarchy,geo,outlier-detection,composition-over-time,change-detection. Each carries a descriptor with synonyms, alias phrases, and a default scorer;registerIntentextends the taxonomy at runtime.
- Recommendation.
useChartInterrogationanduseChartFocushooks (semiotic/ai) — the headless conversational primitives.useChartInterrogationgives consumers a{ ask, history, summary, annotations, loading, error, reset }surface; the consumer brings their own LLM viaonQuery, and the hook supplies it with the profiled summary, the suggestion list, and the current focus datum as structured context. Returned annotations route directly to the chart's standardannotationsprop so the AI's response can render as callouts, threshold lines, and bands, not just text.useChartFocussubscribes to the chart's observation store and returns the current point-of-focus ({ datum, x, y, source }), with configurable event-type filtering for sticky-focus UIs.semiotic-mcpserver — Model Context Protocol server (npx semiotic-mcp) exposingrenderChart,interrogateChart,suggestCharts, anddiagnoseConfigas MCP tools so agents inside Claude Code, Cursor, Windsurf, and other MCP-aware environments can drive Semiotic directly. The interrogation tool returns the same statistical summary and AI-facing instructions the hook produces; the suggestion tool returns ranked structured content with runnable props.semiotic-aiCLI extensions —--doctorvalidates a{component, props, data}JSON spec againstvalidateProps+diagnoseConfig;--schemaemits the chart-schema JSON;--compactand--examplesproduce LLM-prompt-sized context. Pair with the MCP server for agent workflows that need both schema and validation in one place.- Three case-study blog posts —
/blog/charts-that-know-what-theyre-for(the recommendation engine and audience layer),/blog/anchored-conversations(point-anchored AI conversation viauseChartFocus+useChartInterrogation), and/blog/live-conversational-dashboard(the streaming + interrogation + annotation composition). The three together describe the product surface 3.6.0 makes possible.
Changed
- AreaChart is now a single-series chart. Multi-series area overlays are an occlusion nightmare; the capability rejects the multi-series intent scores it previously claimed and
buildPropssubselects to the leading series (largest cumulative y) when the input has 2+ groups, surfacing acaveats[]line so the reader knows they're looking at one slice. Gradient (gradientFill: true,areaOpacity: 0.55) is the baseline default.trendscore is 5 for clean single-series and 3 when subselected.LineChart.trendyields to AreaChart on single-series (4 vs AreaChart's 5) but still wins on multi-series (5 vs AreaChart's 3) because LineChart shows the whole dataset. - DifferenceChart accepts 2+ series via top-2 subselection. Previously rejected anything other than
seriesCount === 2; now picks the two series with the highest cumulative y from the input and emits acaveats[]line when subselecting from 3+ series. Same ordered-x guard the other time-series capabilities apply (xProvenance === "scatter" && !monotonicXis rejected) so the chart no longer shows up for scatter-shaped data with two categorical groups. - Scatterplot and ConnectedScatterplot prefer the canonical 2-numeric form when a sequence axis is present. With a strong-x (time or named) AND 2+ other numerics in the dataset, both charts plot the two numerics against each other (revenue × profit) instead of recapitulating a line chart on the sequence axis. ConnectedScatterplot threads the sequence as
orderAccessorso the path encodes temporal progression. ConnectedScatterplot'scorrelationintent scores 5 when canonical (vs 4 otherwise), and Scatterplot'scorrelationsteps back to 4 when canonical is available so ConnectedScatterplot wins the tiebreak — both charts fit, but the one with the temporal annotation is strictly more informative. X_FIELD_HINTrecognizes calendar-segment field names. The profiler's x-axis name regex now matchesquarter,qtr,fiscal, andweekin addition to the existingyear/month/day/date/time/timestamp. Without this, data shaped as{quarter, revenue, region}fell into scatter-fallback provenance and series detection never fired —lineBy/areaBywere silently dropped and multi-series time-series charts zigzagged across regions.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About nteract/semiotic
React data visualization MCP server with 30+ chart types. 5 tools: suggest charts for a dataset, render validated React configs to SVG, diagnose configuration anti-patterns, get component schemas, and report issues.
Related context
Beta — feedback welcome: [email protected]