#Glossary
A running reference for the terms used across these docs. Most map to a field on a decision or a policy.
#Adapter
The small package that wires Flowplane into a specific engine — e.g. @flowplane/adapter-inngest. It exposes awaitApproval and translates between the engine's pause/resume primitive and a Flowplane decision. One adapter per engine; the rest of Flowplane is engine-agnostic.
#Approver
A person who can decide, not just an email. An approver carries channels (how we reach them) and methods (which surfaces they can bind a verdict on), each with its own verification state — pending, verified, or failed. email and inbox verify on registration; slack and docusign must be proven first. Only verified approvers count toward a quorum on that surface, which is why an unsatisfiable policy is rejected at save time. Managed in the dashboard under Approvers.
#awaitApproval
The one call you add inside your own engine function to pause for a human: flowplane.awaitApproval(ctx, config). It opens a decision and lets the engine park the run until that decision resolves. Flowplane is a step in your path, not the orchestrator.
#Channel
A single mechanism for reaching an approver — email, slack, phone, sms, or webhook. One or more channels make up a route. (Email is wired today; the rest are the declared model.)
#Context
Everything the reviewer sees on a decision — the headline prompt plus structured Present blocks (fields, ai_output, diff, tool_call, text). Context is what makes a Flowplane approval AI-native: the reviewer judges the actual action, not a bare yes/no. See the HITL guide.
#Decision
The root object. A human approval requested at a point in a run, keyed by the engine's run — engine + externalRunId + stepRef. It carries the context, the assignee/approvers, the quorum thresholds, the SLA, the route/surface, and the verdict — which lives on the decision and nowhere else. Status: PENDING → APPROVED | REJECTED | EXPIRED.
#Engine
The durable execution engine that runs your workflow steps — you bring your own (Inngest today; Temporal/Trigger.dev planned). Flowplane runs on top of it and never executes your steps.
#Escalation
A route strategy (strategy: 'escalate') that walks an approver's channels in order as the SLA deadline nears — e.g. Slack first, then phone if it goes unanswered. The opposite of fanout (notify all at once).
#External run id
The engine's identifier for the run a decision sits on (externalRunId). It's how a resolved decision is correlated back to the paused step so the engine can resume.
#Floor
The mandatory minimum of a policy. If any floor condition matches (e.g. amount ≥ $10,000), approval is required — regardless of what the caller or an AI proposed. The floor can force a human, never skip one.
#Gate
The decision of whether a human is needed at all. The caller (or an AI triage step) proposes required; the policy floor bounds it. If the gate resolves "not required," awaitApproval returns immediately and the run continues without parking.
#Inbox
The reviewer-first dashboard — the home surface. It lists decisions awaiting a human, sorted by SLA urgency, each with its context. Approving or rejecting here resolves the decision and resumes the engine.
#Outbox
The durable, idempotent delivery queue (notification_outbox). Notifications and reminders are written here, then delivered by a sweeper — so a channel outage never drops an ask, and nothing is delivered twice.
#Policy
A named, org-scoped set of approval rules. Combines a floor (when a human is mandatory) with defaults: assignee, approver group + quorum, and route/surface. Referenced by name when opening a decision. Managed in the dashboard under Policies, or declared as code via the API — both keyed by (org, name), and both rejected if the quorum can never be met.
#Quorum
The M-of-N approval rule. approvalsRequired approve votes resolve APPROVED; rejectionsRequired reject votes resolve REJECTED (reject-wins by default). Votes dedupe by voter.
#Reminder
A one-time nudge sent to the assignee as the SLA deadline nears, via the outbox. Distinct from escalation, which spreads across channels.
#Route
How we reach the approver — a delivery strategy made of one or more channels, used fanout (all at once) or escalate (in order). One of the two independent delivery axes; the other is surface.
#SLA
The decision's deadline (timeoutAt). The decisions sweeper sends a reminder as it nears and auto-expires the decision if it passes — resuming the engine on the reject branch so a workflow never wedges.
#Step ref
The logical id of the gate within a run (stepRef, e.g. human_review) where a decision was requested. Part of the decision's key.
#Surface
How the approver records the binding verdict — inbox (click) and email (signed action-link) are live today; slack (yes/no), docusign (signed envelope, with legal weight), and api are roadmap. Independent of route: you can be reached one way and approve another. A signed surface is how a high-stakes decision is committed, not how it was announced.
#Verdict
The recorded outcome of a decision — approve / reject, plus who decided, when, and any note. It lives on the decision row and is the single source of truth; resolving it resumes the engine.