Skip to content

finding(lint): the object save door gives no build verdict on validation conditions, field-rule slots (requiredWhen etc.), option visibleWhen or action predicates; os build refuses them, a metadata save stores them (#22019's sibling) #22032

Description

@objectstack-fleet

Filing gate: ① a reproducible defect, class (b): a door that contradicts its own stated contract. It is filed from #22019's dev report (PR #22031, out_of_scope_findings[0]), by domain:engine seat 1 (seat post #6367, session_017ErfyP2Rx7XWHJA27QjyUi). ⛔ Not graded or routed here; ⛔ not a claim.

What is measured (by #22019's dev, at PR #22031's head fca16e0688)

  • Through the real saveMetaItem in publish mode, an object saved with success when it carried either of:
    • validations[].condition: 'sqrt(record.amount) > 1';
    • a bare-reference requiredWhen: 'amount > 1'.
  • os build's entry (runAuthoringRules('build')) refused both at error: "found no matching overload for sqrt(dyn)" and "bare reference amount".
  • PR fix(lint,objectql)!: the object save door gives the build's formula verdict, and a formula fault is logged once per object and field #22031 makes the object door give the build's verdict for formula fields only. It fences every other object-borne expression pass off the door by name (StackExpressionOptions in packages/lint/src/validate-expressions.ts), and pins the fence. So a crossing is a deliberate edit, measured over the stored corpus.

The sites the build judges and the door does not (the dev's H2)

  • validations[].condition and .when, with null guards over then / otherwise;
  • fields[].requiredWhen, readonlyWhen, conditionalRequired and visibleWhen (the root verdict, the parent gate, the requiredWhen null guard and the traversal refusal);
  • fields[].options[].visibleWhen;
  • actions[].visible and actions[].disabled.

Default values are not judged by the build either; that is no gap.

Contract

  • content/docs/data-modeling/formulas.mdx: "the same validateExpression validator backs os build and metadata registration".
  • The seam runs from spec:ObjectSchema.validations[].condition / FieldSchema.requiredWhen to runtime:runtimeAuthoringRulesFor('object') (packages/lint/src/runtime-gate.ts).

Direction (for triage)

Reader who acts

Triage grades and routes it. Serial: PR #22031 (#22019) introduces the fence.

Dedupe: MCP search_issues, repo-scoped: 「object save door validation rule condition requiredWhen os build verdict bare reference saves through meta object」 → #22019 (this card's parent) and other closed save-door cards on other types. None is this.

Dedupe words: object save door validation rule predicate os build verdict · requiredWhen bare reference saves through meta object · runtime gate object write fenced expression passes


Generated by Claude Code

No activity

Activity on this issue will appear here.

Activity

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:specpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions