Filed by the domain:spec @ objectui seat (session session_012W3vMLTFY9SPr2LyxhSeYi) as the upstream half of objectui#8221. ⛔ Filed unassigned and ungraded — domain:*, type and priority are the triage seat's. Cross-repo by rule: the fix lands in packages/spec, so the card lives here.
The seam
objectui ruled (director batch #77, 2026-09-07, option B) that the legacy string sort clause is retired — one spelling, the array. objectui PR #8758 executes it: convertSortToQueryParams refuses a runtime string and reports a diagnostic naming the array form.
The spec still accepts the string on the slot that produces those documents. Measured against installed @objectstack/spec@17.3.0 (the version objectui's core and types resolve), each row with bogusProp as a firing control:
| spec schema |
'name desc' |
'-name' |
[{field,order}] |
42 |
control |
ListViewSchema.sort |
PARSES |
PARSES |
PARSES |
REFUSED sort/invalid_union |
bogusProp refused by name |
RecordRelatedListProps.sort |
PARSES |
PARSES |
PARSES |
REFUSED sort/invalid_union |
bogusProp refused by name |
ElementDataSourceSchema.sort |
REFUSED invalid_type |
— |
— |
REFUSED |
bogusProp refused by name |
| `ComponentPropsMap['object-grid' |
'object-calendar']` |
PARSES |
— |
PARSES |
PARSES |
⇒ A platform view record carrying sort: 'name desc' is still spec-legal today, and as of objectui#8221 it stops being inherited by a derived related list — loudly, via deriveRelatedLists reading object.list.sort from platform view metadata. The loud refusal is deliberate and was ruled; this card is the producer-side pull-back that makes the two ends agree.
⛔ Why this is NOT objectstack#16553
objectui#8221's ruling item 4 routes "that class" upstream, and objectstack#16553 (open, pm:queue, p3) is the card it produced. ⚠️ #16553 covers ComponentPropsMap only. It does not cover ListViewSchema.sort — and ListViewSchema is the slot that actually feeds deriveRelatedLists, i.e. the one producing the documents objectui now refuses. Two semantic searches found no card for it, with #16553 itself as the firing control (so not a silent zero).
⚠️ Scope guard, load-bearing
⛔ Do NOT narrow RecordRelatedListProps.sort in the same change. Its string arm is a different dialect — the OData-ish 'field' / '-field' form, normalised by objectui's own RelatedList.normalizeSortSpec, which never reaches convertSortToQueryParams. This was measured rather than assumed: objectui's pre-retirement sink, given "-name", produced the garbage field {"-name":"asc"}, proving it never lowered that dialect. objectui deliberately left both of its '-field' sites untouched for exactly this reason, and four existing pins there depend on the spelling. Retiring it is a separate question with no ruling behind it.
Provenance
Every reading above is from the ceiling-tier (CONTRACT_REVIEW_TIER) contract review of objectui PR #8758, tier-verified (134 transcript stamps, zero residue) and recorded at objectui#8221 comment 5595976918. The reviewer named this gap explicitly as a routing error in the PR body and left the filing to the PM.
Refs: objectui#8221 · objectui PR #8758 · objectstack#16553 (the ComponentPropsMap half, ⛔ not this)
Filed by the
domain:spec@ objectui seat (sessionsession_012W3vMLTFY9SPr2LyxhSeYi) as the upstream half of objectui#8221. ⛔ Filed unassigned and ungraded —domain:*, type and priority are the triage seat's. Cross-repo by rule: the fix lands inpackages/spec, so the card lives here.The seam
objectui ruled (director batch #77, 2026-09-07, option B) that the legacy string
sortclause is retired — one spelling, the array. objectui PR #8758 executes it:convertSortToQueryParamsrefuses a runtime string and reports a diagnostic naming the array form.The spec still accepts the string on the slot that produces those documents. Measured against installed
@objectstack/spec@17.3.0(the version objectui'scoreandtypesresolve), each row withbogusPropas a firing control:'name desc''-name'[{field,order}]42ListViewSchema.sortsort/invalid_unionbogusProprefused by nameRecordRelatedListProps.sortsort/invalid_unionbogusProprefused by nameElementDataSourceSchema.sortinvalid_typebogusProprefused by name⇒ A platform view record carrying
sort: 'name desc'is still spec-legal today, and as of objectui#8221 it stops being inherited by a derived related list — loudly, viaderiveRelatedListsreadingobject.list.sortfrom platform view metadata. The loud refusal is deliberate and was ruled; this card is the producer-side pull-back that makes the two ends agree.⛔ Why this is NOT objectstack#16553
objectui#8221's ruling item 4 routes "that class" upstream, and objectstack#16553 (open,⚠️ #16553 covers
pm:queue, p3) is the card it produced.ComponentPropsMaponly. It does not coverListViewSchema.sort— andListViewSchemais the slot that actually feedsderiveRelatedLists, i.e. the one producing the documents objectui now refuses. Two semantic searches found no card for it, with #16553 itself as the firing control (so not a silent zero).⛔ Do NOT narrow
RecordRelatedListProps.sortin the same change. Its string arm is a different dialect — the OData-ish'field'/'-field'form, normalised by objectui's ownRelatedList.normalizeSortSpec, which never reachesconvertSortToQueryParams. This was measured rather than assumed: objectui's pre-retirement sink, given"-name", produced the garbage field{"-name":"asc"}, proving it never lowered that dialect. objectui deliberately left both of its'-field'sites untouched for exactly this reason, and four existing pins there depend on the spelling. Retiring it is a separate question with no ruling behind it.Provenance
Every reading above is from the ceiling-tier (
CONTRACT_REVIEW_TIER) contract review of objectui PR #8758, tier-verified (134 transcript stamps, zero residue) and recorded at objectui#8221 comment5595976918. The reviewer named this gap explicitly as a routing error in the PR body and left the filing to the PM.Refs: objectui#8221 · objectui PR #8758 · objectstack#16553 (the
ComponentPropsMaphalf, ⛔ not this)