Skip to content

docs(plugin-form): the fieldTabs[].visibleWhen example teaches the bare-field spelling status == "won", which the fieldRules engine never bound #7834

Description

@os-justin

Filed by the os-dev implementing objectui#5741 (dispatch of session_01BAZFhALsQsGqxui8sNqM8s), from a re-run of PR #5758's key-agnostic corpus sweep on origin/main 52cac388. Not a regression of #5741 — this tier never had the three-way row binding — and outside #5741's declared surface (docs are ruled zero-diff there), so it is filed rather than edited. No assignee; left for triage.

What the sweep found

Two copies of the same example, both teaching a bare field name as a tab predicate:

  • content/docs/plugins/plugin-form.mdx:173{ key: 'billing', label: 'Billing', fields: ['vat_id'], visibleWhen: 'status == "won"' }
  • packages/plugin-form/README.md:446 — the same line, in the fieldTabs example block.

Why it is a defect, not a style nit

FormFieldTab.visibleWhen carries the FormSection.visibleWhen predicate (packages/plugin-form/src/TabbedForm.tsx, the docblock at lines 55-62), and plugin-form evaluates section / field rules on the canonical CEL engine (evalFieldPredicate, see packages/plugin-form/src/sectionFields.ts). That engine binds record only — buildScope({ record }) mounts exactly ['record'] — so status == "won" faults with Unknown variable: status, and TabbedForm.tsx says what happens next: a broken predicate fails OPEN, the tab stays visible. The example therefore documents a gate that never gates. Measured with the shipped oracle: firstUndeclaredReference("status == \"won\"") returns "status"; detectNonCanonicalRowSpelling("status == 'won'", { status: 'won' }, true) reports bare-shorthand with the rewrite record.status.

This is the same class as the one fix PR #5758 made on this README (requiredWhen: 'status == "scheduled"' to record.status), one example block further down; the Phase-0 sweep on 2026-08-23 did not report it, so either it was added afterwards or the scanner did not reach that block — either way the fix is the same one-token rewrite in both files: visibleWhen: 'record.status == "won"'.

Suggested fix

Rewrite both occurrences to record.status == "won". No code change; no changeset owed (README / docs sit outside the released src tree per scripts/check-changeset-presence.mjs).

Refs: objectui#5738 (Phase 0), PR #5758, objectui#5741 (Phase 2, where the sweep was re-run).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions