Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .changeset/report-order-liveness-live.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
"@objectstack/spec": patch
---

chore(liveness): `report.order` is live — objectui now lowers it onto the selection (#3916)

`ReportSchema.order` shipped as `planned` + `authorWarn`: the framework half was
complete (schema, `reportSelectionOrder`, executor), but objectui's
`DatasetReportRenderer` built the selection it posted and never carried the
declaration into it, so an authored ordering reached no query. Marking it `live`
then would have been the exact failure the gate exists to catch.

objectui#2964 landed that wiring — `useDatasetRows`, the single fetch choke point
behind every report path, now carries the lowered ordering across all four call
sites (grouped table, embedded chart, matrix cross-tab, each joined block), with
the ordering in the refetch signature and scoped per sub-selection so the
chart's narrower x/y query cannot post a key it never selected.

So the ledger entry flips to `live`, gains the framework evidence paths, and
drops `authorWarn` / `authorHint` — an authored `order` now does what it says,
and the advisory that it did not is no longer true.

No behaviour change in this repo; the ledger is the deliverable.
8 changes: 4 additions & 4 deletions packages/spec/liveness/report.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@
"note": "objectui: render-time scope filter ANDed at query time (`?? filter`, mergeFilters) — DatasetReportRenderer."
},
"order": {
"status": "planned",
"authorWarn": true,
"authorHint": "A selected date dimension is ALREADY chronological (ascending) without `order` — that default is live server-side. Only the explicit declaration is pending its renderer wiring.",
"note": "[planned] framework#3916. The FRAMEWORK half is complete and live: the schema accepts `order`, `reportSelectionOrder` (ui/report.zod.ts) lowers it to `DatasetSelection.order`, and the executor applies that ordering over the assembled grid (services/service-analytics/src/dataset-executor.ts, resolveOrdering/applyOrdering). What is NOT yet wired is the objectui side — `DatasetReportRenderer` builds the selection it posts and does not carry `report.order` into it, so an authored `order` does not reach the server yet. Marked `planned` + authorWarn until objectui lowers it, per enforce-or-mark. NOTE the separate, already-live default this issue also shipped: a selected TIME dimension defaults to ascending server-side, so month/quarter matrix columns are chronological with no `order` declared at all."
"status": "live",
"verifiedAt": "2026-07-29",
"evidence": "packages/spec/src/ui/report.zod.ts (reportSelectionOrder), packages/services/service-analytics/src/dataset-executor.ts (resolveOrdering/applyOrdering)",
"note": "framework#3916. Authored ordering, most significant key first; each `by` names a `rows`/`columns` dimension or a `values` measure the report selects (validated by the schema's superRefine; a `joined` report orders per block). `reportSelectionOrder` lowers the list to `DatasetSelection.order` and the executor applies it over the ASSEMBLED grid — after measure-scoped filters merge, `__compare` columns attach and derived measures evaluate — so a derived measure is a valid sort key. objectui: `DatasetReportRenderer`'s `useDatasetRows` (the single fetch choke point) carries it onto the posted selection across all four paths — grouped table, embedded chart, matrix cross-tab, per joined block — with `readOrder` lowering and `scopeOrder` narrowing it to each sub-selection, plus the ordering in the refetch signature (objectui#2964). Flipped from `planned` + authorWarn once that landed. Separate and independently live: a selected TIME dimension defaults to ascending server-side, so month/quarter matrix columns are chronological with no `order` declared at all."
},
"drilldown": {
"status": "live",
Expand Down
Loading