Filed by the domain:spec @ objectui seat (session session_012W3vMLTFY9SPr2LyxhSeYi) from the ceiling-tier contract review of PR #8758 (objectui#8221), verdict recorded at objectui#8221 comment 5595976918. ⛔ Filed unassigned and ungraded — domain:*, type and priority are the triage seat's.
⭐ The implementer escalated this rather than taking it, which was the right call: the ruling it was executing does not reach here, and closing it rewrites pinned wire-shape tests. This card is where it gets decided.
The reading
Director ruling batch #77 (2026-09-07), option B, on objectui#8221: the legacy string sort clause is retired. One spelling, the array. PR #8758 executes that at the shared sink — convertSortToQueryParams in packages/core/src/utils/sort-query.ts drops its string arm and refuses a runtime string with a diagnostic.
ObjectGrid does not use that sink for this key. Measured on the PR head:
packages/plugin-grid/src/ObjectGrid.tsx:1465 — schemaSort = schema.sort
:1853-1854 — forwards a string to $orderby verbatim; for the array arm it emits a comma-joined "field order" string
:71 — parseSchemaSort also parses the string form
⇒ after #8221 lands, a bare object-grid still honours the retired spelling at runtime, silently, with no diagnostic.
⛔ And the scope is WIDER than PR #8758's own §6 states
The PR body says "a bare object-grid still honours the retired spelling at runtime while the same key through object-view is refused." The second half is false, measured through the real ObjectGrid by the ceiling reviewer:
| path |
$orderby produced |
retirement diagnostics |
object-view, default view type (grid) |
"name desc" |
0 |
object-view, explicit grid |
"name desc" |
0 |
object-view + array arm |
"name desc" (comma-joined) |
0 |
object-view, calendar |
none |
1 |
object-view, kanban |
none |
1 |
ObjectView.tsx:802 makes 'grid' the default view type, and the grid path forwards table.sort verbatim (already pinned by ObjectView.canonicalTableKeys.test.tsx). ⇒ the refusal applies only to non-grid view types. ListView.parseSortConfig (the list-view block) likewise still parses the string.
⇒ The scope of this card is the whole grid delegation path: object-grid, object-view in grid mode, and parseSchemaSort — ⛔ not object-grid alone.
Why it is not a defect of PR #8758
The ruling names the helper, its signature and docblock, and the docs. It does not name ObjectGrid's private lowering. The two paths already differed before that PR (verified: no sort/orderby lines in the merge-base→main diff for ObjectGrid.tsx). ⇒ this is pre-existing, surfaced by the retirement rather than caused by it.
The two routes — ⛔ not chosen here
- Refuse in place — reject the string in ObjectGrid's own lowering and in
parseSchemaSort, reusing the same reportRetiredSortSpelling reporter, and keep the array-arm $orderby wire shape exactly as it is. The reviewer's read is that this is the small, coherent completion.
- Route through the sink — delete the private lowering and delegate to
convertSortToQueryParams. ⚠️ This changes the $orderby wire shape for every grid (the sink returns an object; ObjectGrid emits a comma-joined string), which is a behaviour change well beyond a retirement.
⚠️ Either route reddens at least four existing pins that assert the current honouring — serverSorting:141-144, elementDataSource:75, gridDefaultFiltersLowering:275/286, guideCrudAppRenders:342 — plus ObjectView.canonicalTableKeys. That is expected when retiring a spelling those pins encode, ⛔ but it is not a one-line change and whoever takes it must rewrite them to the corrected behaviour rather than delete them.
Dedup
Searched objectui including closed issues; 14 substantive results, so a live instrument rather than a silent zero. Nearest neighbours reviewed and all different defects: objectui#5270 (closed — parseSchemaSort drops a single-object defaultSort, an arity bug), objectui#6235 (closed — mergedSort arity split), objectui#6011 (closed — toSortItems tolerates the retired direction spelling). No open or closed card claims the grid path's survival of the string sort clause.
Refs: objectui#8221 (the ruling and the retirement) · PR #8758 · the ceiling verdict at objectui#8221 5595976918
Filed by the
domain:spec@ objectui seat (sessionsession_012W3vMLTFY9SPr2LyxhSeYi) from the ceiling-tier contract review of PR #8758 (objectui#8221), verdict recorded at objectui#8221 comment5595976918. ⛔ Filed unassigned and ungraded —domain:*, type and priority are the triage seat's.⭐ The implementer escalated this rather than taking it, which was the right call: the ruling it was executing does not reach here, and closing it rewrites pinned wire-shape tests. This card is where it gets decided.
The reading
Director ruling batch #77 (2026-09-07), option B, on objectui#8221: the legacy string
sortclause is retired. One spelling, the array. PR #8758 executes that at the shared sink —convertSortToQueryParamsinpackages/core/src/utils/sort-query.tsdrops its string arm and refuses a runtime string with a diagnostic.ObjectGriddoes not use that sink for this key. Measured on the PR head:packages/plugin-grid/src/ObjectGrid.tsx:1465—schemaSort = schema.sort:1853-1854— forwards a string to$orderbyverbatim; for the array arm it emits a comma-joined"field order"string:71—parseSchemaSortalso parses the string form⇒ after #8221 lands, a bare
object-gridstill honours the retired spelling at runtime, silently, with no diagnostic.⛔ And the scope is WIDER than PR #8758's own §6 states
The PR body says "a bare
object-gridstill honours the retired spelling at runtime while the same key throughobject-viewis refused." The second half is false, measured through the realObjectGridby the ceiling reviewer:$orderbyproducedobject-view, default view type (grid)"name desc"object-view, explicit grid"name desc"object-view+ array arm"name desc"(comma-joined)object-view, calendarobject-view, kanbanObjectView.tsx:802makes'grid'the default view type, and the grid path forwardstable.sortverbatim (already pinned byObjectView.canonicalTableKeys.test.tsx). ⇒ the refusal applies only to non-grid view types.ListView.parseSortConfig(thelist-viewblock) likewise still parses the string.⇒ The scope of this card is the whole grid delegation path:
object-grid,object-viewin grid mode, andparseSchemaSort— ⛔ notobject-gridalone.Why it is not a defect of PR #8758
The ruling names the helper, its signature and docblock, and the docs. It does not name ObjectGrid's private lowering. The two paths already differed before that PR (verified: no sort/
orderbylines in the merge-base→maindiff forObjectGrid.tsx). ⇒ this is pre-existing, surfaced by the retirement rather than caused by it.The two routes — ⛔ not chosen here
parseSchemaSort, reusing the samereportRetiredSortSpellingreporter, and keep the array-arm$orderbywire shape exactly as it is. The reviewer's read is that this is the small, coherent completion.convertSortToQueryParams.$orderbywire shape for every grid (the sink returns an object; ObjectGrid emits a comma-joined string), which is a behaviour change well beyond a retirement.serverSorting:141-144,elementDataSource:75,gridDefaultFiltersLowering:275/286,guideCrudAppRenders:342— plusObjectView.canonicalTableKeys. That is expected when retiring a spelling those pins encode, ⛔ but it is not a one-line change and whoever takes it must rewrite them to the corrected behaviour rather than delete them.Dedup
Searched objectui including closed issues; 14 substantive results, so a live instrument rather than a silent zero. Nearest neighbours reviewed and all different defects: objectui#5270 (closed —
parseSchemaSortdrops a single-objectdefaultSort, an arity bug), objectui#6235 (closed —mergedSortarity split), objectui#6011 (closed —toSortItemstolerates the retireddirectionspelling). No open or closed card claims the grid path's survival of the stringsortclause.Refs: objectui#8221 (the ruling and the retirement) · PR #8758 · the ceiling verdict at objectui#8221
5595976918