Skip to content

Shipped grids display formula columns the platform cannot sort — a console header click today silently returns unordered rows, and after #9313's widening the personalization PUT it persists is refused with 422 #10235

Description

@os-zhuang

Recorded while re-deriving the #9313 false-positive budget (PR #10234). Not claimed.

What is measured

A synthetic console column-sort PUT for every displayed column of every shipped list surface (180 PUTs across the four authoring lineages: examples/app-crm, examples/app-showcase, examples/app-todo, packages/qa/downstream-contract) yields 3 refusals, all sort-field-unsortable, all on formula columns shipped in grid columns:

  • crm_opportunity.expected_revenue — displayed in examples/app-crm opportunity views (views[2].list and views[2].listViews.all);
  • showcase_project.budget_remaining — displayed in examples/app-showcase project view (views[1].list).

The stored shipped corpus itself is clean — no shipped body declares a sort on a formula field (0 refusals / 0 advisories over all 50 shipped view-door bodies) — so #9313's rollback clause is not triggered. The 3 refusals only arise when a user clicks those column headers.

Why it is a defect today, independent of #9313

Clicking such a header already misbehaves, silently: the engine never refuses the persisted personalization, and a sort on a virtual formula field returns 'asc' and 'desc' in byte-identical order — unordered rows under a success (validate-sortable-fields.ts's own measured message; #6994 / #7095 are the engine-side measurements). The grid offers an ordering the platform cannot honor.

After #9313's widening lands (PR #10234), the same click becomes loud: the console's personalization PUT is refused 422 sort-field-unsortable. Loud beats silent-wrong, but the header should arguably never offer the click.

The open shape question

Where does the fix belong?

  • objectui: the grid marks formula columns non-sortable (no sort affordance on the header). Needs the column's field type, which the served object metadata already carries.
  • framework: serve an explicit per-column sortability signal with the view/object metadata, so the grid does not re-derive "virtual ⇒ unsortable" from field type — declared = enforced, one signal both sides read.

Repro harness: the lane-C section of the measurement script referenced in PR #10234's FP-budget section.

Refs

#9313 (the widening that makes the click loud), PR #10234, #9257 / #6994 / #7095 (the SORT axis measurements), #5074 (the console sort[].id decoration shape).


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions