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
{{ message }}
Repository navigation
Commit 8aa2f28
Browse filesBrowse the repository at this point in the historyBrowse files
feat(spec)!: retire the bare string sort clause on the list-view doors
`ListViewSchema.sort` accepted both the legacy string clause (`"field desc"`)
and the structured `{ field, order }[]` array. objectui ruled one sort
orthography platform-wide -- the array (objectui#8221, decision batch #77,
2026-09-07, option B) -- and objectui PR #8758 executes it: its
`convertSortToQueryParams` refuses a runtime string outright.
That made this schema the PRODUCER of documents its own consumer rejects: a
view authored with `sort: 'created_at desc'` validated here, cleanly, and then
failed downstream, with the author told off by the wrong layer. The grade sat
on that asymmetry, not on the string.
`sort` survives as a key, one union arm lighter, so this is a VALUE narrowing
with no `retiredKey()` tombstone to hang a prescription on. The surviving array
member's own `error` map carries it, keyed on `issue.input` being a string --
the shape `view.type`'s retired `'page'` and `view.exportOptions`' retired
`'pdf'` already use here. Every other invalid value, and any string reaching a
descendant, keeps zod's default report.
The narrowing is not free, so the population was measured rather than assumed:
a tree-wide census read as structures (not counted as tokens) found the clause
authored on three live sites, all converted here -- the shipped showcase list
view, the frozen lint snapshot of that same shape, and the published
objectstack-ui list-view rule. It therefore carries a D2 conversion,
`list-view-sort-string-clause-to-array`, wired into the protocol-18 chain step:
the rewrite is lossless and wholly mechanical. A clause that does not parse as
`<field> [asc|desc]` is deliberately left alone -- the `'-field'` dialect
belongs to `RecordRelatedListProps.sort`, never reaches
`convertSortToQueryParams`, and retiring it was not ruled.
Retiring the string arm also made the sort entry's own keys visible to the
liveness walk, which reported `view/list.sort` as an undeclared container.
Drilled with in-repo evidence rather than recorded in the shrink-only baseline:
`normalizeSortNodes` reads both `field` and `order`.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH
feat(spec)!: `ListViewSchema.sort` retires the bare string clause — the PRODUCER half of the sort seam, so the contract stops minting documents its own consumer refuses (#17053; objectui#8221, decision batch #77 option B)
|**searchableFields**|`string[]`| optional | Fields enabled for search |
1637
1637
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
1722
1722
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
371
371
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
794
794
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
795
795
|**userFilters**|`{ element?: Enum<'dropdown' \| 'tabs' \| 'toggle'>; fields?: object[]; tabs?: object[]; showAllRecords?: boolean; … }`| optional | End-user quick-filter bar: dropdown/toggle fields or tab presets. Omit to let the renderer derive filters from select/boolean fields |
@@ -1195,7 +1195,7 @@ Tab configuration for multi-tab view interface
|**searchableFields**|`string[]`| optional | Fields enabled for search |
1200
1200
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
1796
1796
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
1881
1881
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
|**searchableFields**|`string[]`| optional | Fields enabled for search |
2121
2121
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
2122
2122
|**userFilters**|`{ element?: Enum<'dropdown' \| 'tabs' \| 'toggle'>; fields?: object[]; tabs?: object[]; showAllRecords?: boolean; … }`| optional | End-user quick-filter bar: dropdown/toggle fields or tab presets. Omit to let the renderer derive filters from select/boolean fields |
@@ -2292,7 +2292,7 @@ This schema accepts one of the following structures:
|**searchableFields**|`string[]`| optional | Fields enabled for search |
2297
2297
|**filterableFields**|`string[]`| optional | Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
2298
2298
|**userFilters**|`{ element?: Enum<'dropdown' \| 'tabs' \| 'toggle'>; fields?: object[]; tabs?: object[]; showAllRecords?: boolean; … }`| optional | End-user quick-filter bar: dropdown/toggle fields or tab presets. Omit to let the renderer derive filters from select/boolean fields |
0 commit comments