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: align product docs with framework 15.x→16.0 changes (#52)
* docs(build/data): align data-modeling pages with framework 16.0
- enable.softDelete → enable.trash in the capability example (softDelete
is a 16.0 tombstone; object.zod.ts throws with guidance); added a
'Changed in 16.0' callout covering the removed object props
(versioning, search→searchableFields, recordName→autonumber
nameField, keyPrefix, tags, active, abstract).
- referenceFilters warning upgraded from 'accepted but unread' to
removed-in-16.0 (stripped at parse; lookupFilters + dependsOn is the
only form).
- summaryOperations example gains the new 16.0 filter (filtered
roll-ups, #1868) with re-aggregation semantics.
- Validation rules: 'delete' event removed (guard deletions with
beforeDelete — the evaluator never ran on delete); state_machine
gains initialStates (#3165) with the events:['insert','update']
requirement called out (events gates dispatch, so insert must be
listed or initialStates is dead); noted 16.0 evaluates rules on
multi-row updates (#3106).
- Formulas: 'New in 16.0' — date-vs-number arithmetic is a build-time
error pointing at daysBetween/daysFromNow/addDays/addMonths (#3306);
null-guard ternary compiles; floor/ceil registered; date equality
now matches via temporal coercion (#3183).
- zh-Hans twins updated faithfully; other locale twins' code blocks
fixed mechanically.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Kj2MJEPXoUXC4LiC3XYJc
* docs(reference): align field-types and env-vars with framework 16.0
field-types (all 7 locales):
- referenceFilters example → structured lookupFilters
[{ field, operator, value }] with the operator enum noted
(removed #2377/ADR-0049);
- fileAttachmentConfig block → flat multiple/accept/maxSize
(nested config removed);
- vector row → flat dimensions only (distanceMetric/indexed/indexType
removed);
- summary row gains the 16.0 summaryOperations.filter (#1868);
- removed the columnName and field-level index rows (column always
equals field name / indexes live on object indexes[]), with one
migration note.
environment-variables (all 7 locales):
- OS_MCP_SERVER_ENABLED row rewritten: ON by default since 16.0,
governs only the HTTP /api/v1/mcp surface, explicit false/0/off/no
disables (types/src/env.ts); notes the one-release deprecated
=true stdio auto-start;
- added OS_MCP_STDIO_ENABLED (own switch, default off) and
OS_MCP_STDIO_API_KEY (osk_... principal, same verify+authz chain as
HTTP, fail-closed boot refusal — ADR-0101).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Kj2MJEPXoUXC4LiC3XYJc
* docs(interface+automation): align with framework 16.0 strict widgets, approvals, time-relative triggers
pages + dashboards (en + zh-Hans):
- widget examples rewritten from the pre-ADR-0021 inline-analytics
shape (object/categoryField/valueField/aggregate) onto the dataset
shape (dataset + dimensions + values) — DashboardWidgetSchema is
.strict() since 16.0 and the legacy keys are parse errors naming the
key (#3251); the dashboards note now states that instead of
'silently stripped'.
approvals (en + zh-Hans):
- approver-type warning aligned with #3133: canonical
org_membership_level, role = one-release deprecated alias, position
names → type:'position'; real lint ids;
- new 16.0 section: behavior first_response|unanimous|quorum|per_group
with minApprovals (runtime-clamped, never deadlocks), approver group
labels (会签), open-time snapshot + OOO substitution, decision file
attachments, server-computed decision_progress, and the
declared-actions inbox model (approve/reject/reassign/send-back/
request-info/remind/recall/resubmit as type:'api' actions on
sys_approval_request).
flows + workflows (en + zh-Hans):
- new time-relative trigger section: start-node config.timeRelative
(object, dateField, offsetDays xor withinDays, optional filter,
maxRecords 1000, default daily 08:00 UTC schedule) with a defineFlow
example and os validate readiness notes (#1874);
- workflows migration table splits 'N days before a date' (time-
relative) from fixed-clock scheduled flows and warns off the
date-equality-on-record-change pattern; notes date equality now
matches for same-day checks (#3183).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Kj2MJEPXoUXC4LiC3XYJc
* docs(configure+changelog): align MCP, batch, and user-import docs with 16.0; add 16.0 changelog entry
mcp (en + zh-Hans):
- new 'The stdio transport (16.0)' section: OS_MCP_STDIO_ENABLED own
switch (default off; legacy OS_MCP_SERVER_ENABLED=true trigger for
one release with a deprecation warning) and the mandatory
OS_MCP_STDIO_API_KEY principal — same verify+authz chain as HTTP,
RLS/FLS/tenant apply, revocation live, fail-closed boot, no system
bypass (ADR-0101);
- tool table gains validate_expression (read-only, data:read-scoped,
fail-closed on sys_*); dev-banner claude mcp add note; new
troubleshooting row.
api-access (all 7 locales):
- MCP row reflects default-on (disable with =false);
- /api/v1/batch documented as atomic-only with per-op gating before
the transaction, ids required, {$ref} resolution enforced,
atomic:false → 400 BATCH_NOT_ATOMIC (#1604); discovery advertises
capabilities.transactionalBatch (#3298).
users + authentication (en + zh-Hans):
- import-users default passwordPolicy is 'auto' since 16.0 (invite
deliverable rows; temp password only for unreachable; pass 'none'
for the old identity-only behavior; rows[].delivery outcomes).
changelog (en + zh-Hans):
- new 16.0 entry in the page's own style (organizationId rename,
approvals quorum/会签 + metadata-driven inbox, time-relative
automations, filtered roll-ups, strict widgets, MCP stdio principal,
enforce-or-remove sweep, engine-owned read-only rows, date-equality
fix + date-arithmetic build errors, bulk-import auto policy);
14.x entry no longer claims to be the current train.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Kj2MJEPXoUXC4LiC3XYJc
---------
Co-authored-by: Claude <noreply@anthropic.com>
|`object`| Object (machine name) whose records the sweep queries |
154
+
|`dateField`|`date` / `datetime` field evaluated relative to today (day-granular) |
155
+
|`offsetDays`|**Offset mode** — fire when `dateField` is exactly today + each listed offset (`[60, 30, 7]`; negative = past, e.g. `[-1]` the day after) |
156
+
|`withinDays`|**Range mode** — fire every day `dateField` is within N days of today: positive = upcoming ("expiring soon"), negative = bounded overdue lookback, `0` = due today |
157
+
|`filter`| Optional ObjectQL where-map AND-ed with the computed date window (e.g. `{ status: 'active' }`) |
158
+
|`maxRecords`| Cap on records launched per sweep (default 1000; the sweep logs when it clamps) |
159
+
160
+
Exactly **one** of `offsetDays` or `withinDays` must be set. The two other
161
+
common shapes:
162
+
163
+
```ts
164
+
// "Expiring soon" — fires every day a document is within 30 days of expiry.
Copy file name to clipboardExpand all lines: content/docs/build/automation/workflows.mdx
+7-3Lines changed: 7 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -137,15 +137,19 @@ If you're coming from a platform with Workflow Rules, here's the mapping:
137
137
| Old concept | Current equivalent |
138
138
|---|---|
139
139
| Workflow Rule | Flow |
140
-
| Time trigger | Scheduled flow |
140
+
| Time trigger ("N days before/after a date") | Time-relative trigger — `config.timeRelative` on a flow's start node (16.0, see [Flows](/docs/build/automation/flows)) |
141
+
| Time trigger (fixed clock) | Scheduled flow |
141
142
| Field update action |`update_record` node |
142
143
| Email alert |`notify` node |
143
144
| HTTP call |`http` node |
144
145
| Approval Process | Flow with one or more `approval` nodes |
145
146
146
147
The test: if the old rule was "when X happens, do Y", model it as a small
147
-
flow. If it was "this record must move through controlled states", model the
148
-
lifecycle as a state machine and use flows for the side effects.
148
+
flow. If it was "N days before/after a date field, do Y", declare a
149
+
time-relative trigger — never a date-equality condition on a record-change
150
+
flow, which only evaluates when the record happens to change. If it was
151
+
"this record must move through controlled states", model the lifecycle as a
0 commit comments