Skip to content

Commit 647e8fd

Browse files
committed
docs(flows): scope the null-guard callout to TOTAL bindings (#8975)
The flow `condition` callout closed with "Guard emptiness with `record.x != null` / `isBlank(record.x)`, same as everywhere else CEL runs". The callout is correct about flows — it explicitly scopes itself to the total binding — but that trailing generalization is exactly what the rest of this PR makes false: on the sparse action `visible`/`disabled` face, `!= null` alone faults with `No such key` on a column the list row never projected. Amended to "the same rule every other TOTAL binding carries", plus one paragraph naming the single sparse face and its conjunction guard, so an author reading this page cannot carry the flows rule across to a face it breaks on. The flows rule itself is unchanged and still holds here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTKPDRoynY8i3HmdSFUxFj
1 parent 3c5c594 commit 647e8fd

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

‎content/docs/automation/flows.mdx‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,9 +1259,17 @@ evaluate cleanly instead of aborting with `No such key`. `has(record.x)` is
12591259
therefore uniformly `true` for a *declared* field the moment it's present at
12601260
all — including when its value is `null` — so it answers "is `x` declared on
12611261
this object", never "does `x` have a value". Guard emptiness with
1262-
`record.x != null` / `isBlank(record.x)`, same as everywhere else CEL runs
1263-
(see the [`has()` gotcha](/docs/data-modeling/formulas#cel-primer) above).
1264-
`has()` still earns its keep against a genuinely *undeclared* key.
1262+
`record.x != null` / `isBlank(record.x)` — the same rule every other ***total***
1263+
binding carries (see the [`has()` gotcha](/docs/data-modeling/formulas#cel-primer)
1264+
above). `has()` still earns its keep against a genuinely *undeclared* key.
1265+
1266+
⚠️ **That scoping is load-bearing, not pedantry.** One binding on the platform
1267+
is *sparse* by decision: an [action](/docs/ui/actions) `visible` / `disabled`
1268+
predicate is evaluated against whatever record the client already fetched —
1269+
on a list row, only the columns that view actually projected. There
1270+
`record.x != null` **is itself a fault** on an absent key, and the guard is the
1271+
conjunction `has(record.x) && record.x != null`. Flows are not that face; the
1272+
rule above holds here. Just don't carry it across to one where it doesn't.
12651273
</Callout>
12661274

12671275
## Run a flow via API

0 commit comments

Comments
 (0)