3.7.1 is the verification release. 3.7.0 made charts receivable — describable, navigable, repairable; this version makes them checkable. A server render now returns ground-truth evidence that data marks actually drew, diagnoseConfig() learns to flag designs that mislead, every shipped theme is held to WCAG-derived contrast floors, and the capability scorecard reports the strict top-1 number instead of hiding behind top-3. Full release notes are onGitHub.
Why Verification
An agent loop that renders a chart and gets back an SVG string has learned almost nothing. The SVG might be an empty plot with perfect axes; the data might have silently failed to bind; the pie might have nineteen slices. Humans catch these by looking. Agents — and CI — need the render path itself to testify. The thread through this release is that every claim a chart makes ("I drew your data", "I am legible", "I am the right chart for this") now has a machine-checkable counterpart.
Render Evidence
renderChartWithEvidence() in semiotic/serverreturns the SVG plus a RenderEvidence object computed from the rendered scene graph — mark counts by scene type, resolved axis domains, an empty flag, category/node/edge counts, annotation count, and the accessible name. Agent repair loops and CI assertions can verify a chart drew data marks without pixel inspection, and the MCP renderChart tool returns the same evidence block alongside its SVG/PNG output. SeeUsing SSR for the server-side details.
Misleading-Design Diagnostics
diagnoseConfig() gains a deception-check pack: inverted extents (INVERTED_AXIS), unlabeled dual-axis series (DUAL_AXIS_UNLABELED), trend windows cropped to a favorable slice (CHERRY_PICKED_WINDOW), negative values in part-to-whole encodings (PART_TO_WHOLE_NEGATIVE — an error for pie, donut, and funnel), non-interpolatingcurve="basis" smoothing (NON_PASSING_CURVE), slope-distorting aspect ratios (EXTREME_ASPECT_RATIO), and over-sliced pies (PIE_TOO_MANY_SLICES).
The motivation is double-edged: these patterns mislead human readers, and — per the growing chart-deception literature — they mislead vision-language models the same way. A chart that cherry-picks its window doesn't just fool the person reading it; it fools the agent summarizing it. The checks run through the samediagnoseConfig surface as the existing validation, encoding, and accessibility packs, sonpx semiotic-ai --doctor and the MCPdiagnoseConfig tool pick them up automatically.
Theme Contrast Conformance
Every shipped theme preset is now tested against WCAG-derived floors — 4.5:1 for text, tooltip, and annotation roles, 3:1 for the focus indicator — with sub-3:1 mark colors pinned in an exact-match known-exceptions ledger. A palette regression fails the build, and an improvement must shrink the ledger; the axe integration scan re-enables its color-contrast rule on the strength of the gate.
The gate immediately paid for itself: pastelstextSecondary/focus/annotation,bi-tooltextSecondary, and thetufte-dark/journalist/playfulannotation colors were all deepened to clear the floors, and the empty-state fallback color moved from #999 (2.8:1) to#666. Browse the presets onthe theming page.
ChatGPT Apps Widget (Experimental)
The MCP server gains renderInteractiveChart, which renders a static-data chart through the same server path asrenderChart and returns atext/html;profile=mcp-app widget with fit, zoom, data, hover, and render-evidence controls — usable from ChatGPT developer-mode connectors over semiotic-mcp --http. A deployment playbook lives in the repo asCHATGPT_APPS_DEPLOYMENT.md, and an MCP protocol test suite covers the tool and the widget resource end to end. The MCP surface is documented onCLI & MCP.
Scorecard Honesty
The capability quality scorecard now reports stricttop1AgreementRate beside the lenient top-3 rate — the current canonical set sits at 93% top-1 / 100% top-3 — and ranks the top-3 over distinct components rather than variants of one chart. Fixtures were added for the previously unexercised Heatmap, GaugeChart, FlowMap, and DistanceCartogram descriptors.
Three capability descriptors had their judgment corrected along the way: DifferenceChart no longer takes fullcompare-series marks when it would silently drop series beyond its native two, flat BarChart yields on crossed two-categorical matrices and raw-observation data, andChoroplethMap requires at least two area features — a one-region choropleth has nothing to compare.
Docs Routes For Agent Readers
The docs build now emits one prerendered HTML file per route, each embedding sanitized, route-specific machine-readable content in its<noscript> fallback, plus allms-routes.json route index. Crawlers and agent readers get resolved content per page instead of an SPA shell.
Upgrade Notes
3.7.1 is additive on the API surface — no prop contracts changed. Two things may be visible: the theme legibility fixes shift a handful of secondary-text, focus, and annotation colors in the affected presets (visual snapshots against pastels, bi-tool,tufte-dark, journalist, orplayful may drift by design), andcontrastRatio() now parses 3-digit hex shorthand, so previously unmeasurable colors participate in audits. If you consume the AI schema programmatically, update expectations to version3.7.1.