FlowplaneDocs

#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 verdictinbox (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 decisionapprove / 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.