Filed by the dev seat working #5330 (session session_01E7snar5mwF7qoXJazqKhys), as an out-of-scope finding. Not assigned.
What landed
PR #5737 implements the 2026-08-20 ruling on #5330: the row-predicate canon is record.*, and the bare shorthand (status == 'active') and data.* now emit a one-time dev-console deprecation warning from both evaluation tiers (evalRowPredicate and useCondition).
What is missing
The precedent this ruling mirrors — the bare-string globalFilters[].options shorthand (#4356 / objectstack#7917 option ②) — shipped Phase 0 in the same PR as Phase 1, and its own source says why:
Phase 0 shipped in the same PR: objectui's own docs, its plugin-dashboard README and its schema-catalog corpus stopped TEACHING the shorthand, so the stored population is no longer growing while this warning asks authors to migrate. Warning authors while the docs still taught the form would have been a contradiction users report as a bug.
(packages/core/src/utils/dashboard-filters.ts)
For the row-predicate window, that Phase 0 has not been done and was outside #5330's declared file surface. Nobody has yet checked whether objectui's docs (content/docs/**), example apps, and schema-catalog corpus still teach a row predicate written as a bare field or as data.*. If they do, authors will now be warned about a spelling the documentation hands them — the exact contradiction the precedent calls out.
What the work is
- Sweep
content/docs/**, the example apps, and any schema-catalog / README corpus for visible / disabled / enabled row predicates written with a bare field root or a data. root on a runtime record surface. - Rewrite them to the canon
record.*. - Leave metadata-editing-form predicates alone —
data is the canonical root on that layer (ADR-0089 D3 CANONICAL_ROOT_BY_LAYER = { runtime: 'record', metadata: 'data' }), and objectui's own app-shell metadata-admin SchemaForm binds { data: row } deliberately. A blanket find-and-replace would break that layer.
Sizing note
This is plausibly zero-diff — nobody has measured it. A sweep that finds nothing is a good outcome and closes the question; the point is that the answer is currently unknown while a warning is already shipping.
Refs
Generated by Claude Code
Filed by the dev seat working #5330 (session
session_01E7snar5mwF7qoXJazqKhys), as an out-of-scope finding. Not assigned.What landed
PR #5737 implements the 2026-08-20 ruling on #5330: the row-predicate canon is
record.*, and the bare shorthand (status == 'active') anddata.*now emit a one-time dev-console deprecation warning from both evaluation tiers (evalRowPredicateanduseCondition).What is missing
The precedent this ruling mirrors — the bare-string
globalFilters[].optionsshorthand (#4356 / objectstack#7917 option ②) — shipped Phase 0 in the same PR as Phase 1, and its own source says why:(
packages/core/src/utils/dashboard-filters.ts)For the row-predicate window, that Phase 0 has not been done and was outside #5330's declared file surface. Nobody has yet checked whether objectui's docs (
content/docs/**), example apps, and schema-catalog corpus still teach a row predicate written as a bare field or asdata.*. If they do, authors will now be warned about a spelling the documentation hands them — the exact contradiction the precedent calls out.What the work is
content/docs/**, the example apps, and any schema-catalog / README corpus forvisible/disabled/enabledrow predicates written with a bare field root or adata.root on a runtime record surface.record.*.datais the canonical root on that layer (ADR-0089 D3CANONICAL_ROOT_BY_LAYER={ runtime: 'record', metadata: 'data' }), and objectui's ownapp-shellmetadata-adminSchemaFormbinds{ data: row }deliberately. A blanket find-and-replace would break that layer.Sizing note
This is plausibly zero-diff — nobody has measured it. A sweep that finds nothing is a good outcome and closes the question; the point is that the answer is currently unknown while a warning is already shipping.
Refs
record.*, or do the bare shorthand anddata.*spellings stay? (the uncarried "#4075 step 3" question) #5330 — the canon ruling (work carrier); PR feat(core,react): declarerecord.*the row-predicate canon and warn on the two deprecated spellings #5737 — Phase 1 (canon statement + warning)normalizeFilterOptionsaccepts a bare-stringglobalFilters[].optionsshorthand that@objectstack/specrejects at publish #4356 — the sibling deprecation that shipped Phase 0 alongside Phase 1packages/core/src/evaluator/rowPredicateCanon.ts— the canon statement and the server accept-set measurementGenerated by Claude Code