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
ADR-0021 Phase 2: migrate example dashboards/reports to dataset dual-form + reconciliation harness
Migrate inline analytics (report/dashboard widgets) in app-todo, app-crm and
app-showcase to the semantic `dataset` form (dual-form, side-by-side with the
legacy inline query), and add a read-only reconciliation harness that asserts
both forms return identical numbers — the hard gate before deleting old form.
Harness (scripts/analytics-reconcile/): boots each app's real kernel and runs
legacy engine.aggregate() vs dataset queryDataset(), diffing numbers group by
group; exits non-zero on mismatch. 52 surfaces reconcile green, 0 mismatch.
Two real runtime bugs the gate caught, both fixed in ObjectQLStrategy (+regression tests):
- same-field filter-operator overwrite dropped a bound of a $gte/$lte range
- timeDimensions were ignored, so date dimensions never bucketed — now lowered
to a structured {field, dateGranularity} groupBy that engine.aggregate buckets
Also:
- record-list reports (app-todo overdue_tasks, showcase task_list) -> ListViews
- joined report: added block-level dataset dual-form to JoinedReportBlockSchema
and bound the analytics block (showcase task_overview/open_block)
- fixed example bugs surfaced by reconciliation (created_date->created_at,
invalid date macros, crm sales_by_stage flat-list -> real grouped sum)
Spec: 6666 tests pass. service-analytics: 89 tests pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments