Summary
DatasetReportChart forwards only six keys to the registered chart component. Everything else ReportChartSchema declares as authorable chrome never leaves the report renderer, so it is inert metadata: the author writes it, the schema accepts it, nothing reads it.
Found while implementing #4020 (which fixes one neighbouring symptom — the measure display name — and deliberately does not widen). Filed separately because the fix is a different mechanism with different acceptance criteria.
Measured
Rendered a dataset-bound report whose chart authors showLegend: false, colors: ['#f00'] and showDataLabels: true, and captured the props the registered chart component was handed. The full key list:
chartType, data, height, isAnimationActive, series, xAxisKey
showLegend, colors and showDataLabels are simply absent. Downstream, AdvancedChartImpl computes legendVisible = showLegend !== false, so an absent value means the legend is on — the author's explicit false is not merely ignored, it is inverted in effect.
Source: packages/plugin-report/src/DatasetReportRenderer.tsx, the ChartComponent schema literal (the series: [...] / height block near the end of DatasetReportChart).
The declared-but-unread set
ReportChartSchema (spec page.zod) declares, and this path drops: showLegend, showDataLabels, colors, subtitle, description, annotations, interaction, aria. Also dropped are every series[] presentation key other than label — color, stack, type, yAxis, dashArray, opacity, variant. (title IS honoured: the renderer paints it as its own h3 above the chart. series[].label became live in #4020.)
Note this is the same card's evidence: the reporter's own report authored showLegend: false alongside the label defect.
Why it matters beyond cosmetics
normalizeChartSchema in plugin-charts already accepts every one of these keys — the translation layer is built and tested. The report path just never hands them over, so an AI-authored report that spells valid, schema-passing chart chrome renders as if it had authored nothing. That is the "declared = enforced" line: a key the schema accepts and no renderer reads is a trap for exactly the metadata authors this stack is built for.
Suggested direction
The dashboard solved this shape already — mergeAuthoredPresentation (packages/plugin-dashboard/src/DatasetWidget.tsx) merges the authored presentation onto the derived bindings under a ruled data/presentation split (#4229), keeping series MEMBERSHIP with the dataset. Reusing it here would need care: the report's chart.xAxis / chart.yAxis are bare dimension/measure NAME strings, not the ChartAxis objects that helper expects, so passing the report chart wholesale would feed axisPresentation a string and synthesise a meaningless empty y-axis entry. Scope it to the series + chrome keys, or lift the split into a shared helper both surfaces call.
Related
Summary
DatasetReportChartforwards only six keys to the registered chart component. Everything elseReportChartSchemadeclares as authorable chrome never leaves the report renderer, so it is inert metadata: the author writes it, the schema accepts it, nothing reads it.Found while implementing #4020 (which fixes one neighbouring symptom — the measure display name — and deliberately does not widen). Filed separately because the fix is a different mechanism with different acceptance criteria.
Measured
Rendered a dataset-bound report whose chart authors
showLegend: false,colors: ['#f00']andshowDataLabels: true, and captured the props the registeredchartcomponent was handed. The full key list:showLegend,colorsandshowDataLabelsare simply absent. Downstream,AdvancedChartImplcomputeslegendVisible = showLegend !== false, so an absent value means the legend is on — the author's explicitfalseis not merely ignored, it is inverted in effect.Source:
packages/plugin-report/src/DatasetReportRenderer.tsx, theChartComponentschema literal (theseries: [...]/heightblock near the end ofDatasetReportChart).The declared-but-unread set
ReportChartSchema(specpage.zod) declares, and this path drops:showLegend,showDataLabels,colors,subtitle,description,annotations,interaction,aria. Also dropped are everyseries[]presentation key other thanlabel—color,stack,type,yAxis,dashArray,opacity,variant. (titleIS honoured: the renderer paints it as its ownh3above the chart.series[].labelbecame live in #4020.)Note this is the same card's evidence: the reporter's own report authored
showLegend: falsealongside the label defect.Why it matters beyond cosmetics
normalizeChartSchemain plugin-charts already accepts every one of these keys — the translation layer is built and tested. The report path just never hands them over, so an AI-authored report that spells valid, schema-passing chart chrome renders as if it had authored nothing. That is the "declared = enforced" line: a key the schema accepts and no renderer reads is a trap for exactly the metadata authors this stack is built for.Suggested direction
The dashboard solved this shape already —
mergeAuthoredPresentation(packages/plugin-dashboard/src/DatasetWidget.tsx) merges the authored presentation onto the derived bindings under a ruled data/presentation split (#4229), keeping series MEMBERSHIP with the dataset. Reusing it here would need care: the report'schart.xAxis/chart.yAxisare bare dimension/measure NAME strings, not theChartAxisobjects that helper expects, so passing the report chart wholesale would feedaxisPresentationa string and synthesise a meaningless empty y-axis entry. Scope it to the series + chrome keys, or lift the split into a shared helper both surfaces call.Related
nameas the axis title, ignoring the measure'slabel— the same measure on a dashboard chart resolves correctly #4020 — the same forwarding line, the measure display name half (fixed there).combodashboard widgets render as grouped bars — DatasetWidget has nocombofamily and refuses to forwardseries/xAxis/yAxison the dataset path #4229 — the data/presentation split this should respect.