Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
7b4fd19
docs: SEO titles for the 67 English pages whose title tag was two wor…
objectstack-fleet[bot] Oct 6, 2026
50f7841
Merge remote-tracking branch 'origin/main' into ff/issue-301
claude Oct 6, 2026
b421fbd
docs: muted-text and code-comment contrast, phone table affordance, F…
claude Oct 6, 2026
c5740f9
docs: record the measured search cold start and the smoke search requ…
claude Oct 6, 2026
21ef209
docs: state the measured contrast ratios in the theme and code-theme …
claude Oct 6, 2026
911a174
docs(views): declare views in a defineView container; list only the s…
claude Oct 6, 2026
c49dc6d
Merge remote-tracking branch 'origin/main' into ff/issue-311
claude Oct 6, 2026
5e666c3
fix(docs): run the awaited fumadocs-mdx write after next typegen in t…
claude Oct 6, 2026
5ad14ce
Merge remote-tracking branch 'origin/main' into ff/issue-305
claude Oct 6, 2026
41a1994
docs: localize fumadocs' accessible names, mark English page-tree ent…
claude Oct 6, 2026
c47c544
Merge remote-tracking branch 'origin/main' into ff/issue-307
claude Oct 6, 2026
69f7f1e
docs: make the views and flows code samples parse with @objectstack/s…
claude Oct 6, 2026
9709c50
Merge remote-tracking branch 'origin/main' into ff/issue-308
claude Oct 6, 2026
7c161c3
docs: a main landmark, a language switcher named by its text, a decor…
claude Oct 6, 2026
cc14430
ci: read the built pages for English chrome names and unmarked page-t…
claude Oct 6, 2026
77ad6ba
docs: the docs page's table-of-contents bar is not a second banner
claude Oct 6, 2026
5a07fbc
docs: the heading-anchor and code-copy buttons keep their own languag…
claude Oct 6, 2026
fa2390f
ci: the built-pages guard counts docs pages only
claude Oct 6, 2026
f8920d5
Merge remote-tracking branch 'origin/main' into ff/issue-312
claude Oct 6, 2026
482ff8f
docs: legal pages mark their English fallback lang="en" with the noti…
claude Oct 6, 2026
7c17974
docs: legal pages render an article inside HomeLayout's main, not a s…
claude Oct 6, 2026
0dd5019
Merge remote-tracking branch 'origin/main' into ff/issue-256-p3
claude Oct 7, 2026
e463447
docs(translation): delete siblings only when a correction reverses a …
claude Oct 6, 2026
c886c06
Merge remote-tracking branch 'origin/main' into ff/issue-316-a
claude Oct 7, 2026
c57caa2
docs: data model, actions and automation samples parse with @objectst…
claude Oct 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 37 additions & 8 deletions content/docs/build/automation/approvals.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ cross-tenant or cross-owner reach — elevation is opt-in and auditable.
The node declares **who approves** and how their decisions aggregate:

```ts
// One flow node; the flow around it is omitted (see the complete flow below).
{
id: 'manager_approval',
type: 'approval',
Expand Down Expand Up @@ -102,6 +103,7 @@ Beyond `first_response` and `unanimous`, 16.0 adds two aggregation modes.
**Quorum** finalizes on M-of-N approvals:

```ts
// The `config` of an `approval` node; the node around it is omitted.
config: {
approvers: [
{ type: 'user', value: 'director_a' },
Expand All @@ -118,6 +120,7 @@ approvers with `group`, and the node advances only once every group has
`minApprovals` approvals (default 1 per group):

```ts
// The `config` of an `approval` node; the node around it is omitted.
config: {
approvers: [
{ type: 'position', value: 'legal_counsel', group: 'legal' },
Expand Down Expand Up @@ -151,17 +154,22 @@ including upstream node outputs). The result becomes the approver
slate:

```ts
// The `config` of an `approval` node; the node around it is omitted.
config: {
approvers: [
{ type: 'expression', value: 'vars.legal_review.picked_departments' },
{
type: 'expression',
value: 'vars.legal_review.picked_departments',
resolveAs: 'department', // each value is a department id, fanned out to its members
},
],
resolveAs: 'department', // each value is a department id, fanned out to its members
}
```

`resolveAs` (`'user'` by default, or `'department'` / `'position'` /
`'team'`) says what kind of id the expression returned, and expands each
through the same graph lookups the static approver types use. Under
`resolveAs`, a key of the `expression` approver itself (`'user'` by default,
or `'department'` / `'position'` / `'team'`), says what kind of id the
expression returned, and expands each through the same graph lookups the
static approver types use. Under
`behavior: 'per_group'`, each returned value forms its own group — one
sign-off per returned department.

Expand All @@ -176,9 +184,11 @@ fill in values. Accepted outputs resume the run as
cannot shadow an author's variable:

```ts
// One flow node; the flow around it is omitted.
{
id: 'legal_review',
type: 'approval',
label: 'Legal Review',
config: {
approvers: [{ type: 'position', value: 'legal_counsel' }],
decisionOutputs: [
Expand Down Expand Up @@ -224,6 +234,7 @@ export const opportunityApproval = defineFlow({
{
id: 'start',
type: 'start',
label: 'Proposal over 50,000',
config: {
triggerType: 'record-after-update',
objectName: 'opportunity',
Expand All @@ -241,9 +252,27 @@ export const opportunityApproval = defineFlow({
lockRecord: true,
},
},
{ id: 'mark_approved', type: 'update_record', label: 'Mark Approved' },
{ id: 'mark_rejected', type: 'update_record', label: 'Mark Rejected' },
{ id: 'end', type: 'end' },
{
id: 'mark_approved',
type: 'update_record',
label: 'Mark Approved',
config: {
objectName: 'opportunity',
filter: { id: '{record.id}' },
fields: { stage: 'negotiation' },
},
},
{
id: 'mark_rejected',
type: 'update_record',
label: 'Mark Rejected',
config: {
objectName: 'opportunity',
filter: { id: '{record.id}' },
fields: { stage: 'closed_lost' },
},
},
{ id: 'end', type: 'end', label: 'End' },
],
edges: [
{ id: 'e1', source: 'start', target: 'manager_approval' },
Expand Down
8 changes: 4 additions & 4 deletions content/docs/build/automation/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ description: Pick the right tool for the job — flows for steps, workflows for
| You need | Use | Read |
|---|---|---|
| "When X happens, do Y" — steps that run on a record change, a schedule, or a button click | **Flow** | [Flows](/docs/build/automation/flows) |
| "This record may only move through these states, by these events" — a controlled lifecycle | **Workflow** (state machine) | [Workflows](/docs/build/automation/workflows) |
| "This record may only move through these states" — a controlled lifecycle | **Workflow** (state machine) | [Workflows](/docs/build/automation/workflows) |
| "A person must sign off before this proceeds" — routed human decisions | **Approval** | [Approvals](/docs/build/automation/approvals) |

Rule of thumb: model **state** with workflows, model **steps** with flows. Approvals are not a separate engine — an approval is a flow that pauses at an approval node until a human decides.
Expand All @@ -20,7 +20,7 @@ Rule of thumb: model **state** with workflows, model **steps** with flows. Appro

The three compose rather than compete:

- A **workflow** constrains which lifecycle transitions are valid at all — states, transitions, and guards, nothing else.
- A **workflow** constrains which lifecycle transitions are valid at all — states and the moves between them, nothing else.
- A **flow** performs the side effects around those transitions: send an email, update records, call an external service, wait, branch.
- An **approval node** inside a flow blocks execution until an approver acts, then resumes down the approve or reject branch.

Expand All @@ -33,6 +33,6 @@ So "a case moves new → assigned → resolved" is a workflow; "notify the manag
| Page | Why |
|---|---|
| [Flows](/docs/build/automation/flows) | The full flow reference — triggers, step types, error handling, CEL |
| [Workflows](/docs/build/automation/workflows) | States, transitions, and guards for strict lifecycles |
| [Workflows](/docs/build/automation/workflows) | States and their allowed transitions, for strict lifecycles |
| [Approvals](/docs/build/automation/approvals) | Approval nodes, run-as identity, and the approver experience |
| [CEL expressions](/docs/reference/cel) | The expression language used in conditions and guards |
| [CEL expressions](/docs/reference/cel) | The expression language used in conditions and validation rules |
41 changes: 0 additions & 41 deletions content/docs/build/automation/index.zh-Hans.mdx

This file was deleted.

42 changes: 0 additions & 42 deletions content/docs/build/automation/index.zh-Hant.mdx

This file was deleted.

Loading
Loading