You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| `readonly` | `boolean` | `false` | Server contract — non-system writes to this field are stripped on **both** INSERT and UPDATE (the value falls back to `defaultValue`), not just hidden in the UI (#2948 / #3043) |
@@ -211,6 +216,7 @@ come at two severities: **errors** fail the build; **warnings** are advisory
211
216
|**Field must exist** — a typo'd `record.<field>` is flagged with a did-you-mean. |`record.amont` → `record.amount`| error |
212
217
|**Unknown function** — a misspelled or nonexistent stdlib call. |`isBlnk(record.x)`| error |
213
218
|**Type soundness** — a text or boolean field used with an arithmetic (`+ - * / %`) or ordering (`< > <= >=`) operator against a number faults at runtime and evaluates to `null`. Store it as a number field, or drop the arithmetic. |`record.title * 2`| warning |
219
+
|**Date arithmetic** — a `date` / `datetime` field used with `+` / `-` against a number (a `YYYY-MM-DD` value is a string at runtime, so this always faulted to `null`). Use the date helpers instead. |`record.end_date - record.start_date + 1` → `daysBetween(record.start_date, record.end_date) + 1`; `today() + 30` → `daysFromNow(30)`; `record.date + n` → `addDays(record.date, n)`| error (#3306) |
214
220
215
221
> **Integer literals in arithmetic are fine.**`record.amount / 100`,
216
222
> `record.price * 2`, `record.total - fee` all work — the engine handles mixed
@@ -385,6 +391,18 @@ Field.formula({
385
391
})
386
392
```
387
393
394
+
<Callouttype="info">
395
+
**`dateField == today()` now matches (#3183).** A `date` field reads back as a
396
+
`YYYY-MM-DD` string, and CEL treats a string and a timestamp as unequal — so the
397
+
natural "is it due today" predicate used to silently return `false`. The engine
398
+
now rewrites temporal `==` / `!=` comparisons (coercing the field operand with
399
+
`date(...)`), so `record.due_date == today()` matches on the calendar day. This
400
+
applies to formulas, defaults, validation rules, and hook/flow conditions.
401
+
Ordering (`< > <= >=`) and string equality (`record.d == "2026-06-20"`) were
402
+
always fine. This is the read-side counterpart to the date-arithmetic build
403
+
error above — equality is rewritten and works; `+`/`-` arithmetic is rejected.
|`transactionalBatch`| — | Surfaced in **discovery** (`client.capabilities.transactionalBatch`, #3298): `true` iff the atomic cross-object batch route (`POST {basePath}/batch`, ADR-0034) is mounted **and** the engine can honour a transaction. Lets clients negotiate `client.data.batchTransaction(...)` at connect time instead of probing `404`/`405`/`501`. |
0 commit comments