Skip to content

spec(ui): ListViewSchema.sort still accepts the legacy "field desc" string — it is the PRODUCER whose documents objectui now refuses loudly, and #16553 does not cover it #17053

Description

@os-bill

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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions