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
docs: bring guides current with 16.0 (stale fixes + additive gaps)
Audit of content/docs + skills against the 16.0 changes. Fixes 5 genuinely
stale spots and fills the additive gaps the guides were missing (the release
page already covered these; the guides lagged).
Stale fixes:
- automation/hooks.mdx, kernel/events.mdx: ctx.session comment/table said
tenantId — now organizationId (#3290 removed the alias).
- skills/objectstack-data/.../data-hooks.md: drop the leftover deprecated
tenantId field from the session type; correct 'removed in v11' -> v16.
- data-modeling/field-types.mdx: readonly is a server contract (stripped on
INSERT+UPDATE, #2948/#3043), not a UI hint.
- data-modeling/formulas.mdx: the Expression envelope lists three dialects
(cel/cron/template) — the js expression dialect was retired (#3278).
Additive:
- formulas.mdx: floor/ceil in the stdlib; date arithmetic is now a build
error (use daysBetween/addDays, #3306); a callout that dateField == today()
now matches (#3183).
- automation/approvals.mdx: server-computed decision_progress block + the
/system/approvals?request=<id> notification deep link.
- ui/translations.mdx: the _actions.<action>.resultDialog translation slot
(#3347) + a note on collab-notification/storage localization (#3354).
- protocol/kernel/runtime-capabilities.mdx: the transactionalBatch discovery
capability (#3298).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHVoqyH9VAjmbyMN1Ri2jf
| `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