Skip to content

The published skills corpus still presents the row-predicate three-way binding as peers, with no sign that two of the three now warn (Phase 1 shipped) #5759

Description

@os-sam

Filed as an out-of-scope finding by the dev seat working #5738 (session session_01E7snar5mwF7qoXJazqKhys). Not assigned.

What was found

While sweeping objectui's documentation corpus for Phase 0 of the row-predicate deprecation (#5738, PR #5758), the published skills guide skills/objectui/guides/schema-expressions.md was found to describe the row-predicate binding like this, in the "List-view conditional tier" section (~line 305):

The predicate binds the row three ways — record.status (canonical), bare status, and data.status (legacy) — plus the host predicate scope (features.*, user.*).

That sentence is accurate about the binding and it already labels record.* as canonical, so it is not "teaching a non-canonical spelling" and was correctly left alone by #5738's sweep. What it does not say is that, since PR #5737 landed, the other two spellings emit a one-time dev-console deprecation warning and are slated for retirement once a stored-metadata survey sizes the window (#5741 is the Phase 2 carrier).

Why this is worth a card

This is the same contradiction #5738 exists to close, one surface over. An author reading the guide learns that three spellings are available and that one of them is "canonical" — a word that reads as a style preference. They then write data.status, and the console warns them about a spelling the published guide just handed them as a working option. packages/core/src/evaluator/listConditional.ts corrected exactly this framing in its own docblock when Phase 1 landed:

Those three are NOT peers, and this doc comment used to read as though they were.

The skills guide still reads as though they were.

There is a second, sharper reason specific to data.*. Per packages/core/src/evaluator/rowPredicateCanon.ts, data is in @objectstack/formula's SCOPE_ROOTS, so the server's authoring oracle silently accepts a data.* row predicate and it then binds nothing at runtime — not an error, a constant false. A guide that offers it as a peer spelling is pointing authors at the one arm that passes every authoring gate and still fails silently.

Suggested shape (for triage, not a decision)

Annotate the three-way sentence with the deprecation state — canonical / deprecated-and-warned / deprecated-and-warned — and point at the canon. The nearby data-model-tier and conditional-formatting examples in the same file are already written in record.*, so no example needs rewriting; this is prose only.

⚠️ Two constraints a doer should carry:

  • skills/** is the published skills corpus — the maintainer's 2026-08-21 ruling applies (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」 /「……不能为了一个小功能扩写很多。」). This should be a small net-line-count change, and the PR owes the two line-count readings that ruling requires.
  • The ${…}/On-suffix tier earlier in the same file is a different engine (SafeExpressionParser) where data.* is correct, and the flow tier (isFieldVisibleWhen, previews/screen-spec.ts) is a third. Only the List-view/CEL row-predicate tier is in question here. Do not let a fix bleed across those boundaries.

Refs


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions