Filed by the domain:metadata execution seat (#6367, session session_012WMpuAfA2KSdDjGF6tm1bH) out of #8296's review. Unassigned and deliberately NOT lane-labelled — it lands in content/docs/**, which is domain:devx; triage should route it.
Blocked-by: #8296
The gap
formula is the one field type no driver materialises a column for. Three query axes can name a field, and as of #8296 all three refuse it with the same remedy:
| axis | refusal | remedy sentence |
|---|
| SORT | 400 INVALID_SORT (#6994 ingress, #7095 engine) | "Denormalise the value onto '' (a stored field, written when the source changes) and sort by that." |
| SEARCH | 400 INVALID_FIELD (#6674) | mirror onto a stored text field |
| FILTER | 400 INVALID_FIELD (#8296, ingress + engine) | "…and filter that." |
content/docs/protocol/objectql/query-syntax.mdx already teaches this for two of them:
- line ~602 — "Do not denormalise onto a
formula field to sort by it. A formula field …" - line ~1006 — "The mirror must be stored: a
formula …" (the search axis)
⇒ The filter axis is now the only one of the three that refuses without the page saying so. An author who reads this page learns the rule for sort and search, applies the same mental model to a where, and meets a 400 the page never mentioned.
⚠️This is an incompleteness, not an inaccuracy — nothing currently on the page becomes false. ⛔ It is not a blocker for #8296 and was not treated as one.
Why it is worth a card rather than a rider
#8296 spent real effort making four doors (filter-ingress, filter-engine, sort-ingress, sort-engine) share the remedy word-for-word, with an agreement pin in query-expression-conformance.test.ts that fails if they drift. The page that teaches that remedy to humans is the natural fifth consumer of the same vocabulary, and it is the one that is not covered by that pin.
Suggested shape (not decided here)
A filter-axis paragraph beside the existing sort one, using the same wording the runtime now emits, and ideally noting the two facts that make this axis worse than sort:
- both directions return nothing —
{is_open: false}, which against a stored boolean returns every row, silently returned none; - the formula reads correctly in the very same response that cannot filter on it, so the field is visibly populated and simultaneously unfilterable.
⛔ summary and autonumber must not be described as affected — both get real stored columns and filter correctly; the set is exactly formula. #8296 pins both as controls through both doors.
Related: #8296 · #7095 · #6994 · #6674 · #6924.
Filed by the
domain:metadataexecution seat (#6367, sessionsession_012WMpuAfA2KSdDjGF6tm1bH) out of #8296's review. Unassigned and deliberately NOT lane-labelled — it lands incontent/docs/**, which isdomain:devx; triage should route it.Blocked-by: #8296
The gap
formulais the one field type no driver materialises a column for. Three query axes can name a field, and as of #8296 all three refuse it with the same remedy:400 INVALID_SORT(#6994 ingress, #7095 engine)400 INVALID_FIELD(#6674)400 INVALID_FIELD(#8296, ingress + engine)content/docs/protocol/objectql/query-syntax.mdxalready teaches this for two of them:formulafield to sort by it. Aformulafield …"formula…" (the search axis)⇒ The filter axis is now the only one of the three that refuses without the page saying so. An author who reads this page learns the rule for sort and search, applies the same mental model to a
where, and meets a 400 the page never mentioned.Why it is worth a card rather than a rider
#8296 spent real effort making four doors (filter-ingress, filter-engine, sort-ingress, sort-engine) share the remedy word-for-word, with an agreement pin in
query-expression-conformance.test.tsthat fails if they drift. The page that teaches that remedy to humans is the natural fifth consumer of the same vocabulary, and it is the one that is not covered by that pin.Suggested shape (not decided here)
A filter-axis paragraph beside the existing sort one, using the same wording the runtime now emits, and ideally noting the two facts that make this axis worse than sort:
{is_open: false}, which against a stored boolean returns every row, silently returned none;⛔
summaryandautonumbermust not be described as affected — both get real stored columns and filter correctly; the set is exactlyformula. #8296 pins both as controls through both doors.Related: #8296 · #7095 · #6994 · #6674 · #6924.