feat(spec)!: ADR-0021 single-form cutover — dataset is the only analytics form (#1658)#1676
Merged
Merged
Conversation
…dataset is the only form
BREAKING CHANGE (spec major): dashboard widgets, reports, and list-charts no
longer accept the inline query form. Every analytics surface must now bind a
semantic `dataset` (ADR-0021) and select dimensions/measures BY NAME.
Removed from the spec author surface:
- DashboardWidget: `object`, `categoryField`, `categoryGranularity`,
`valueField`, `aggregate`, `measures` (+ `WidgetMeasure` schema/type).
`dataset` + `values` are now required; `filter` is the presentation-scope
runtimeFilter; `dimensions`/`compareTo` retained.
- Report: top-level `objectName`, `columns`, `groupingsDown`,
`groupingsAcross`, `filter` (and the same on joined blocks). A non-joined
report now requires `dataset` + `values`; `rows` are the dimensions.
- ListChart: `xAxisField`, `yAxisFields`, `aggregation`, `groupByField`.
`dataset` + `values` required.
This is the convergence step of ADR-0021 Phase 2 (#1658): the dual-form period
is over. All in-repo consumers were migrated to dataset-form first (#1673/#1674
and prior), reconciled old==new by the analytics harness, so this cut is
mechanical, not behavioural.
Migrated in this commit:
- spec ui schemas (dashboard/report/view) + focused dataset-form test suites.
- stack.test strict-config Todo/CRM fixtures → dataset form.
- objectql metadata-write fixtures (protocol-meta, validation-sweep,
overlay-precedence) → dataset form.
- examples app-todo / app-crm / app-showcase dashboards, reports, views;
the CRM trend widget's monthly bucketing moves onto the dataset's
close_date dimension (`dateGranularity: 'month'`).
- platform-objects system_overview dashboard.
- regenerated ui reference docs.
Incidental: lite-kernel.test uses a unique per-process temp log path instead of
a shared hardcoded /tmp file (the shared file can be owned by another user,
causing non-deterministic EACCES under concurrent turbo runs).
Full `turbo build` (72/72) and `turbo test` (123/123) green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Jun 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is the convergence step of ADR-0021 Phase 2 (#1658). The dual-form period is over: the inline analytics query form is deleted, and every dashboard widget / report / list-chart must now bind a semantic
datasetand select dimensions/measures by name.This PR is intentionally not auto-merged — it's a spec-major breaking change and wants a human review.
What's removed (author surface)
object,categoryField,categoryGranularity,valueField,aggregate,measures(+WidgetMeasure)dataset+values;filter→runtimeFilter;dimensions/compareTokeptobjectName,columns,groupingsDown,groupingsAcross,filter(top-level and joined blocks)dataset+values;rows= dimensionsxAxisField,yAxisFields,aggregation,groupByFielddataset+valuesWhy this is safe
The dual-form rollout migrated every in-repo consumer to dataset-form first (#1673 / #1674 and prior), and the read-only analytics reconciliation harness verified old == new across all 52 framework + 49 hotcrm + ~72 templates analytics surfaces (0 mismatch). This cut is mechanical, not behavioural.
Migrated in this PR
datasets:arrays).protocol-meta,metadata-validation-sweep,overlay-precedence) → dataset form.close_datedimension (dateGranularity: 'month'). The showcase's former flattabularreport stays reclassified as a ListView (a flat list is a row lens, not analytics) — coverage/seed tests updated to match.system_overviewdashboard.Incidental
lite-kernel.testnow uses a unique per-process temp log path instead of a shared hardcoded/tmp/test-kernel.log— the shared file can be owned by another user, causing non-deterministicEACCESunder concurrentturboruns (this was masking the real signal).Verification
pnpm turbo build→ 72/72 ✅pnpm turbo test→ 123/123 ✅@objectstack/spec→ 6526/6526 ✅Closes the Phase 2 convergence track of #1658.
🤖 Generated with Claude Code