- Sources — which of your systems exist at all during that step.
- Rules — which actions may run there, and with what arguments.
- Transitions — where the conversation may go next.
Rules
A rule matches an action (optionally narrowed by conditions on its arguments) and says what happens:
Rules combine most-restrictive-first, whatever order you wrote them in: a block
always wins over an approval, and an approval always wins over an allow. An
explicit allow never punches a hole through a block.
Conditions read the arguments of the pending action, so you can write the limit
rather than the action:
Approvals
An action held for approval is stored with exactly the arguments that will run. Approving replays that call — it doesn’t ask the assistant to try again, which could produce different values. A decision can be used once, and expires after 24 hours. Where a decision is made depends on where the conversation is happening:Panel chat
An Approve / Decline card appears under the conversation.
Widget
Your team decides under Widget → Approvals. The visitor never sees the
rule or the arguments.
API
Fetch and decide through the
approvals endpoints and render
them in your own product.
A widget visitor can never approve an action a rule held. That decision
belongs to your team — the rule exists to protect you from the request, not to
confirm it.
Asking the customer to confirm
Separately from your rules, an assistant in the widget never changes a visitor’s data without asking them first. When it wants to make a change, the visitor gets a plain-language prompt with Confirm and Cancel buttons, and nothing runs until they choose. This is about consent, not policy — so it doesn’t replace your rules, and it can’t soften one. If a rule sends an action to your team for approval, the visitor is not asked instead; your team still decides. The prompt the visitor sees is written from the action alone (“make a change in Billing”). Internal names, SQL, and arguments never reach the widget.What counts as a change
Anything that modifies the other system: a write to a database, a GraphQL mutation, or aPOST / PUT / PATCH / DELETE to an API. Reads never trigger
approval or confirmation.
Remember that writes are off by default everywhere — see
Governance. A guardrail decides when a write is
allowed to run; the source’s own setting decides whether it can happen at all.