You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
Render evidence.renderChartWithEvidence() (semiotic/server) returns the SVG plus a
machine-readable 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 — so agent repair loops and CI assertions can verify a chart actually drew
data marks without pixel inspection. The MCP renderChart tool now returns the same evidence block
alongside its SVG/PNG output.
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/funnel), non-interpolating curve="basis"
smoothing (NON_PASSING_CURVE), slope-distorting aspect ratios (EXTREME_ASPECT_RATIO), and
over-sliced pies (PIE_TOO_MANY_SLICES). These patterns mislead human readers and — per the
chart-deception literature — vision-language models the same way.
Theme contrast conformance gate. Every shipped theme preset is now tested against WCAG-derived
floors (4.5:1 for text/tooltip/annotation roles, 3:1 for the focus indicator), with sub-3:1 mark
colors pinned in an exact-match known-exceptions ledger so palette regressions fail and
improvements must shrink the ledger. The axe integration scan re-enables the color-contrast
rule on the strength of the gate.
Scorecard top-1 agreement. The capability quality scorecard now reports strict top1AgreementRate beside the lenient top-3 rate (current canonical set: 93% top-1 / 100% top-3),
ranks the top-3 over distinct components rather than variants of one chart, and gains fixtures
for the previously unexercised Heatmap, GaugeChart, FlowMap, and DistanceCartogram descriptors.
ChatGPT Apps widget (experimental). The MCP server gains renderInteractiveChart, which
renders a static-data chart through the same server render path as renderChart and returns a text/html;profile=mcp-app widget (ui://semiotic/chart-widget.html) with fit/zoom, data,
hover, and render-evidence controls for ChatGPT developer-mode connectors over semiotic-mcp --http. A deployment playbook lives in the repo as CHATGPT_APPS_DEPLOYMENT.md,
and an MCP protocol test suite covers the tool and widget resource end to end.
Docs prerender route artifacts. The docs build now emits one prerendered HTML file per
route with sanitized, route-specific machine-readable content in each page's <noscript>
fallback, plus a docs/build/llms-routes.json route index for agent readers; the docs route
check verifies the output.
Changed
Theme legibility fixes (WCAG AA).pastelstextSecondary/focus/annotation, bi-tool textSecondary, and the tufte-dark/journalist/playfulannotation colors were deepened to
clear the contrast floors; the empty-state / BigNumber-empty / data-table-caption fallback color
moved from #999 (2.8:1) to #666, matching the default theme's textSecondary.
Capability descriptor judgment fixes.DifferenceChart no longer takes full compare-series
marks when it would silently drop series beyond its native two; flat BarChart yields on crossed
two-categorical matrices (Grouped/Stacked/Heatmap show the matrix) and on raw-observation data; ChoroplethMap requires at least two area features (a one-region choropleth has nothing to
compare).
contrastRatio() now parses 3-digit hex shorthand (#333), making the default themes measurable.
Tests
Colocated tests for the NetworkCustomChart and OrdinalCustomChart escape hatches (the
XY variant was already covered).