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
Deep-cleanup follow-up from the report-chart disposition (#3441, umbrella #1878). #3441 was the non-breaking accuracy fix; these two items are breaking / cross-repo and were deferred.
1. Prune the dangling ReportColumnSchema / ReportGroupingSchema
After the ADR-0021 single-form cutover, a dataset-bound report expresses columns/grouping as dataset measure/dimension name arrays (rows/columns/values = z.array(z.string())). ReportColumnSchema / ReportGroupingSchema (packages/spec/src/ui/report.zod.ts:26-41) are referenced by no schema body — they survive only as public type exports (ReportColumn/ReportGrouping/…Input) and were marked @deprecated in #3441.
Remove the schemas + their type exports from @objectstack/spec.
Remove the objectui re-exports (@object-ui/typesspec-report.tsSpecReportColumn* / SpecReportGrouping*, index.ts:694-712).
Breaking (public exports) → schedule with a major + a one-line migration note. Coordinated framework + objectui PRs.
2. Retire the legacy ReportViewer chart path
DatasetReportRenderer (objectui) is the live, primary report renderer — it plots the spec chart.xAxis/yAxis as dataset dimension/measure via useDatasetRows. The older ReportViewer (reads the invented xAxisField/yAxisFields, ReportViewer.tsx:326-330) is only a fallback now (app-shell/.../ReportView.tsx:502-508).
2. Retired the legacy ReportViewer chart fallback ✅
The ReportViewer fallback branch in app-shell ReportView.tsx was confirmed unreachable by any shipped metadata: it fired only when a report had neither dataset nor objectName, the Studio inspector only ever writes the dataset-bound shape, and no seed/example authored type: 'report-viewer'. objectstack-ai/objectui#2816:
ReportView now routes every report through the spec ReportRenderer dispatcher (dataset → DatasetReportRenderer, stored pre-9.0 JSON → presentation bridge, pre-spec { data, columns } → LegacyReportRenderer). Deleted the ReportViewer last-resort branch, the mapReportForViewer spec→legacy chart-section adapter (the sole producer of xAxisField / yAxisFields), and the now-dead data-fetch loading flag.
plugin-reportReportViewer.tsx: removed the chart-section branch (it read the invented xAxisField / yAxisFields, never the spec's xAxis / yAxis, and was only fed by the deleted adapter).
Why ReportViewer the component was kept (not deleted outright): its table / summary / text sections still back the registered report-viewer component and the pre-9.0 specReportToPresentation bridge in ReportRenderer. Only the dead chart branch and the fallback routing were retired.
Shipped as minor
Per the launch-window breaking-as-minor policy (precedent: remove-enable-trash-mru) — the major guard would otherwise block the PR. Both changesets carry the FROM→TO migration.
Verification
Browser-dogfooded against the showcase backend: the summary (Hours by Status), matrix (Status × Priority, with server totals) and joined (Task Overview) reports all render correctly through DatasetReportRenderer after the fallback removal. Framework: 6857 spec tests + all generated-artifact / API-surface / changeset / liveness gates green. objectui: 60/60 dependent type-checks + all test shards green.
Activity
feat(spec)!: prune dead ReportColumnSchema/ReportGroupingSchema expor…
os-zhuang commentedon Jul 25, 2026
Both deferred items shipped across two coordinated PRs.
1. Pruned the dangling
ReportColumnSchema/ReportGroupingSchema✅ReportColumnSchema/ReportGroupingSchema+ their type exports (ReportColumn/ReportGrouping/…Input) from@objectstack/spec/ui, dropped the manifest keysui/ReportColumn/ui/ReportGrouping, and regeneratedcontent/docs/references/ui/report.mdx+ the API-surface snapshot.SpecReportColumn*/SpecReportGrouping*re-exports from@object-ui/types(spec-report.ts+index.ts) and the matching assertion inspec-ui-schema-reexports.test.ts.ReportChart.groupBy(the[EXPERIMENTAL — not enforced]field from docs(spec): correct ReportChart xAxis/yAxis semantics; mark dead report surface (#1890) #3441) — nothing read it after theReportViewerretirement below.ReportChartSchemais non-strict, so residualchart.groupByin stored metadata is silently stripped on parse; no tombstone needed.2. Retired the legacy
ReportViewerchart fallback ✅The
ReportViewerfallback branch in app-shellReportView.tsxwas confirmed unreachable by any shipped metadata: it fired only when a report had neitherdatasetnorobjectName, the Studio inspector only ever writes the dataset-bound shape, and no seed/example authoredtype: 'report-viewer'. objectstack-ai/objectui#2816:ReportViewnow routes every report through the specReportRendererdispatcher (dataset →DatasetReportRenderer, stored pre-9.0 JSON → presentation bridge, pre-spec{ data, columns }→LegacyReportRenderer). Deleted theReportViewerlast-resort branch, themapReportForViewerspec→legacy chart-section adapter (the sole producer ofxAxisField/yAxisFields), and the now-dead data-fetch loading flag.plugin-reportReportViewer.tsx: removed the chart-section branch (it read the inventedxAxisField/yAxisFields, never the spec'sxAxis/yAxis, and was only fed by the deleted adapter).Why
ReportViewerthe component was kept (not deleted outright): its table / summary / text sections still back the registeredreport-viewercomponent and the pre-9.0specReportToPresentationbridge inReportRenderer. Only the dead chart branch and the fallback routing were retired.Shipped as
minorPer the launch-window breaking-as-minor policy (precedent:
remove-enable-trash-mru) — themajorguard would otherwise block the PR. Both changesets carry the FROM→TO migration.Verification
Browser-dogfooded against the showcase backend: the summary (Hours by Status), matrix (Status × Priority, with server totals) and joined (Task Overview) reports all render correctly through
DatasetReportRendererafter the fallback removal. Framework: 6857 spec tests + all generated-artifact / API-surface / changeset / liveness gates green. objectui: 60/60 dependent type-checks + all test shards green.Refs #1878, #1890, #3441.
feat(spec)!: prune dead aria/performance from ReportSchema + dogfood …