Uh oh!
There was an error while loading. Please reload this page.
docs(plugin-form): Phase 0 of the row-predicate deprecation — stop teaching the bare shorthand (#5738) - #5758
Merged
Conversation
…e canon (#5738) Phase 0 of the objectui#5330 row-predicate deprecation: stop TEACHING a spelling the Phase-1 warning (PR #5737) now flags. `packages/plugin-form/README.md` illustrated a field-level conditional rule as `requiredWhen: 'status == "scheduled"'` — the bare shorthand. The same README's own table two hundred lines up says these are "CEL predicates over the live record, evaluated by `@objectstack/formula` — the same engine and dialect the server enforces", and on that engine `buildScope({ record })` mounts exactly `['record']`: the bare root faults there with `Unknown variable: status`. `requiredWhen` is one of the two rules enforced client AND server, so this was not merely non-canonical — it was the one arm the server refuses outright, handed to authors as the example. Confirmed with the shipped oracle rather than a regex: the exported `detectNonCanonicalRowSpelling` reports `bare-shorthand → record.status` on the old text and reports nothing on the new, so this cannot disagree with the warning authors are seeing in the console. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E7snar5mwF7qoXJazqKhys
This was referenced Aug 23, 2026
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
os-sam
marked this pull request as ready for review
August 23, 2026 05:06
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#5738
Phase 0 of the row-predicate deprecation ruled on #5330 (2026-08-20, option B): stop teaching a spelling that the Phase-1 warning (PR #5737) now flags in the dev console. The card's own sizing note said this was plausibly zero-diff and that nobody had measured it — so the measurement is the deliverable, and it is reported in full below.
Result
One defect found and fixed, in
packages/plugin-form/README.md:This one is the bad arm, not merely the non-canonical one. The same README's own table says these rules are "CEL predicates over the live record, evaluated by
@objectstack/formula— the same engine and dialect the server enforces", and on that enginebuildScope({ record })mounts exactly['record'], so the bare root faults there withUnknown variable: status.requiredWhenis one of the two rules enforced client and server, so the README was handing authors the spelling the server refuses outright.How the sweep was controlled
Driven by the shipped oracle, not by a regex:
detectNonCanonicalRowSpelling, exported from@object-ui/core, is the same detector behind the live warning, so this cannot disagree with what authors see in their console. It reportsbare-shorthandon the old text and nothing on the new.Discovery was key-agnostic rather than a guess at which keys carry predicates — every string literal in the corpus containing a comparison or boolean operator, then classified by root identifier. Roots scanned, with the literal counts that prove the scanner reached them:
content/docsexamples(incl. schema-catalog, 427 JSON)appspackages/*/README.mdskillsdocsThat yielded 441 predicate-shaped strings (top roots:
record98,data56). Positive control: the neighbouring termsrecord.,data.,${,columnsandobjectqlall return hits across the corpus, so a zero in any class is a measured zero rather than a scanner that never arrived. Negative control: the canonical examples and the host-scope roots (current_user.*,previous.*) are run through the detector too and it reports nothing on them.The schema-catalog corpus is clean: every predicate across its 427 JSON files is a static boolean, a canonical
record.*, or a host-scopecurrent_user.*.The three stand-downs, each verified rather than assumed
The layer rule is the whole difficulty here, and a blanket rewrite of either
data.or the bare root would have broken a working tier. Three classes were deliberately left alone:${…}-dialect predicates — in that dialectdata.*is the correct spelling, andevalRowPredicateroutes those strings to the legacy engine before the warning, so they cannot be what an author is being warned about. Alldata.*hits incontent/docsare of this class.visibleOn/hiddenOn/disabledOnin the published skills guides) — a different engine (SafeExpressionParser), wheredatais the widget data scope rather than a row. Verified against the detector both ways: withdataNamesRow: falseit reports nothing, and the counterfactual withdataNamesRow: trueshows what it would say on a record surface. The stand-down rests on the tier, and that is stated rather than hidden.apps/console/src/preview-samples.ts—visibleWhen: 'discount > 0'on a flow screen node reads as a bare-shorthand row predicate and is not one. Confirmed in code:isFieldVisibleWhen(previews/screen-spec.ts) evaluates it withevalCondition(normalized, variables)against flow variables, neverevalRowPredicate— so the Phase-1 warning cannot fire there, anddiscountcorrectly names a sibling screen field.FlowRunner.visibleWhen.test.tsxpins the same shape from HotCRM's real lead-conversion screen. The neighbouring flow trigger, decision-edge and validation-rule conditions in that file are the same story.Verification
Gate union run after the final commit, on
f7074a8, each exit code captured before any pipe:check:control-bytesOK (scanned 4799 tracked text file(s); skipped 85 binary)docs:check-linksLinks are valid across 13 scan roots.check:skills-pathsOK (93/94 stated path(s) resolve across 18 guide file(s); 1 baselined)check:doc-typesEvery documented component type is registered.check:doc-snippetsEvery covered documentation snippet compiles against the built types.check:changeset-presenceNo source of a released package changed in this range, so no changeset is owed.pnpm build43 successful, 43 totalcheck:doc-snippetsneeded the build to run at all (it refuses on unbuilt packages) and its self-checks fired — resolution, aThisNameIsDefinitelyNotExportedsentinel producing TS2305, and a positive import producing zero. One honest limit:packages/plugin-form/README.mdsits in that gate's ungated ledger (63 documents "declared in this script, NOT verified by it"), so the green above is not coverage of the file this PR edits.Declared narrowing. Repo-wide
pnpm lintwas not run. The diff is a single.mdfile, and eslint's own configuration is the authority on whether that can matter:npx eslint packages/plugin-form/README.md --format jsonreturnsFile ignored because no matching configuration was supplied. No eslint configuration matches.mdat all, so this diff can move neither its own verdict nor any untouched file's. CI runs the full farm regardless.No changeset, on the repo's own rule rather than an assumption:
check-changeset-presence.mjsguards a released package'ssrctree only, and a README sits outside it — the gate says so itself in the table above.Out of scope, filed separately
The published skills guide
skills/objectui/guides/schema-expressions.mdstill presents the three-way row binding without noting that two of the three now warn and are slated for retirement. That is stale post-#5737, butskills/**is outside this card's declared file surface and carries its own net-increase budget, so it is filed rather than edited here. See the linked finding.Generated by Claude Code