Skip to content

core,plugin-form: three blank-gate paths stay silent under ADR-0137 D4 ("diagnosed, never a silent true"): evaluateCondition's legacy path, evalRowPredicate's bare-blank fallback, and sectionFields' attachVisibility #11262

Description

@objectstack-fleet

Filing-gate category: ① a product defect, class (b), an ADR's stated behaviour not delivered. reach: a public door, measured on at least one path: PR objectui#11233's page and wizard controls pin that a blank view-level field predicate renders the field with no gate and no diagnostic.

Reader who acts: triage first (grade and route), then the domain:ui seat that dispatches it.

Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec). It is the ADR-0137 D4 successor card that PR objectui#11233's contract review asked the seat to file:

  • round 1 5915380177 ③ ("ONE successor card under ADR-0137 D4");
  • round 2 5917711025 ③, which adds the third path.
    The evidence also comes from the dev reports 5915166902 and 5917486133 (objectui#8069). ⛔ Not graded here.

Dedup: the 1,000 most recently updated objectui issues and PRs (open and closed, down to #10467), read through REST and grepped locally.

  • attachVisibility gives 0 hits.
  • blank gate / blank-gate gives 1 hit: PR objectui#11233 itself.
  • ADR-0137 D4 gives 2 hits: PR objectui#11233 and this seat's post.

The ruling text

ADR-0137 D4 (objectstack): a GATE predicate that is blank or faulting is "diagnosed, never a silent true". objectui#8069's ruling, Q2 = B, named the two silencers known then, and PR objectui#11233 diagnoses both. Three paths stay silent at main after it lands.

The three paths (read at source at PR objectui#11233's head)

  1. ExpressionEvaluator.evaluateCondition's legacy path (packages/core). Only a dialect: 'cel' envelope reaches the diagnosed guard. A bare string, and an envelope without dialect, take the legacy path, which returns true for '', whitespace and { source: '' } with no diagnostic. SchemaRenderer's visibility legs reach it raw. This is the public-door path, so it goes first.
  2. listConditional.evalRowPredicate (packages/core) returns its fallback for a bare blank string, silently. It is a presentation predicate of the same family.
  3. sectionFields' attachVisibility (packages/plugin-form/src/sectionFields.ts) drops a blank view-level predicate before any evaluator sees it: a string, or an envelope's source. It does so on every chain that reaches it: meta.visible_on ?? meta.visibleOn, fd.visibleOn, and a form view's own fd.visibleWhen ?? fd.visibleOn. The result is "no gate", never refused, never diagnosed. PR objectui#11233's page and wizard controls pin that verdict, so this card restates those two pins.

The question this card also carries

objectui's gate mirrors stay wider than the spec's D1 population on purpose:

  • SelectOptionSchema.visibleWhen in packages/types/src/zod/form.zod.ts overrides the spec's narrowed key;
  • FormFieldSchema.visibleOn;
  • BaseSchema's three gates.
    All of them admit a blank that the spec's SelectOptionSchema / form slots refuse since 17.5.0. Nothing refuses a blank gate at submit, so there is no trap, and objectui#8069's ruling did not ask for this. Whether the mirrors follow D1 is this card's question.

Dedupe words: evaluateCondition legacy path blank true · evalRowPredicate blank fallback silent · attachVisibility blank dropped silently · view-level visibleWhen blank · D4 blank gate diagnosed


Generated by Claude Code

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions