SLA escalation switch. Defaults to true: an escalation block carrying timeoutHours is live unless this is explicitly false — the feature-level switch is whether the escalation block exists at all
timeoutHours
number
✅
Calendar (wall-clock) hours before escalation triggers — nights, weekends and holidays count. The platform ships no business-hours calendar: a request opened at 17:00 on a Friday with timeoutHours 4 escalates at 21:00 that same Friday
Approval step approver type. manager is resolved from the directory rather than configured here: it reads the submitter's sys_user.manager_id at runtime, and that column is not a profile field an author edits, so until an operator populates it, a manager step resolves to nobody and the request falls to the node's onEmptyApprovers policy. os lint reports that at authoring time as approval-approvers-may-resolve-empty, and os explain approval-approvers-may-resolve-empty carries the graded population routes and the full remedy, the node-level onEmptyApprovers fallback included; the Approvals guide states the same remedy in prose.
value
string
optional
User id / membership tier / position / team / department / field — per type; for expression, a CEL expression over current.* / trigger.* / vars.*
resolveAs
Enum<'user' | 'department' | 'position' | 'team'>
optional
How an expression result is expanded into approvers (default 'user')
group
string
optional
Group label for per_group sign-off (e.g. "legal", "finance")
organization
string
optional
ADR-0105 D9 — organization whose directory resolves this approver: $root (group org), $parent (one level up), or an organization slug. Omitted = the request's own organization.
Behavior when no concrete approver resolves at node entry — 'admin_rescue' (default) opens the request on the organization's administrators; 'fallback' opens it on fallbackApprovers instead, naming who decides
Approval step approver type. manager is resolved from the directory rather than configured here: it reads the submitter's sys_user.manager_id at runtime, and that column is not a profile field an author edits, so until an operator populates it, a manager step resolves to nobody and the request falls to the node's onEmptyApprovers policy. os lint reports that at authoring time as approval-approvers-may-resolve-empty, and os explain approval-approvers-may-resolve-empty carries the graded population routes and the full remedy, the node-level onEmptyApprovers fallback included; the Approvals guide states the same remedy in prose.
value
string
optional
User id / membership tier / position / team / department / field — per type; for expression, a CEL expression over current.* / trigger.* / vars.*
resolveAs
Enum<'user' | 'department' | 'position' | 'team'>
optional
How an expression result is expanded into approvers (default 'user')
group
string
optional
Group label for per_group sign-off (e.g. "legal", "finance")
organization
string
optional
ADR-0105 D9 — organization whose directory resolves this approver: $root (group org), $parent (one level up), or an organization slug. Omitted = the request's own organization.
Approval step approver type. manager is resolved from the directory rather than configured here: it reads the submitter's sys_user.manager_id at runtime, and that column is not a profile field an author edits, so until an operator populates it, a manager step resolves to nobody and the request falls to the node's onEmptyApprovers policy. os lint reports that at authoring time as approval-approvers-may-resolve-empty, and os explain approval-approvers-may-resolve-empty carries the graded population routes and the full remedy, the node-level onEmptyApprovers fallback included; the Approvals guide states the same remedy in prose.
value
string
optional
User id / membership tier / position / team / department / field — per type; for expression, a CEL expression over current.* / trigger.* / vars.*
resolveAs
Enum<'user' | 'department' | 'position' | 'team'>
optional
How an expression result is expanded into approvers (default 'user')
group
string
optional
Group label for per_group sign-off (e.g. "legal", "finance")
organization
string
optional
ADR-0105 D9 — organization whose directory resolves this approver: $root (group org), $parent (one level up), or an organization slug. Omitted = the request's own organization.
Decision-dialog input widget (default 'text'). The user, department and team pickers commit record ids; the position picker commits position machine names
multiple
boolean
optional
Collect multiple values (an array of what the picker commits)
SLA escalation switch. Defaults to true: an escalation block carrying timeoutHours is live unless this is explicitly false — the feature-level switch is whether the escalation block exists at all
timeoutHours
number
✅
Calendar (wall-clock) hours before escalation triggers — nights, weekends and holidays count. The platform ships no business-hours calendar: a request opened at 17:00 on a Friday with timeoutHours 4 escalates at 21:00 that same Friday
Approval step approver type. manager is resolved from the directory rather than configured here: it reads the submitter's sys_user.manager_id at runtime, and that column is not a profile field an author edits, so until an operator populates it, a manager step resolves to nobody and the request falls to the node's onEmptyApprovers policy. os lint reports that at authoring time as approval-approvers-may-resolve-empty, and os explain approval-approvers-may-resolve-empty carries the graded population routes and the full remedy, the node-level onEmptyApprovers fallback included; the Approvals guide states the same remedy in prose.
Decision-dialog input widget (default 'text'). The user, department and team pickers commit record ids; the position picker commits position machine names
multiple
boolean
optional
Collect multiple values (an array of what the picker commits)