#Ratifia
Ratifia is a human-in-the-loop (HITL) control plane. Anything that acts on your behalf, whether an AI agent, a durable workflow, or a service you wrote, can pause on a human decision and resume once it's answered.
You keep your code, your runtime, and your infra. Ratifia owns the decision: who needs to approve, what they see, the policy that gates it, the quorum, the SLA, and the durable record of what was decided and why.
The one-liner
Ratifia doesn't run your work. It makes the human decision inside that work a first-class, AI-native object: same inbox, same policies, same audit trail, no matter what asked for it.
#Three ways in
All three open the same decision and land in the same Inbox. Pick the one that matches what's doing the acting:
| You have… | Use | What it looks like |
|---|---|---|
| An AI agent: Claude Code, Cursor, Claude Desktop, anything that speaks MCP | MCP server | The agent calls request_decision before a risky step and await_decisions the verdict. An optional hook makes it non-bypassable. |
| Your own code: a service, a cron job, a Lambda, an agent framework that isn't MCP | REST API | Two calls: POST /v1/worker/decisions, then poll GET …/:id for the verdict. |
| A durable workflow: Inngest today, with Temporal and Trigger.dev planned | Engine adapter | One awaitApproval(ctx, …) step inside your own function; the engine parks on its own wait primitive and resumes on the verdict. |
The MCP server and the Inngest adapter are thin clients over that same REST API. There is one contract; the doors differ only in how the caller waits.
#The decision-first model
The root object in Ratifia is a decision, not a run. A decision is keyed by the caller's own ids (engine + externalRunId + stepRef), so Ratifia never has to execute or model your steps. Your agent, engine, or service runs the work; Ratifia tracks the decision on top of it.
That inversion is what lets Ratifia sit beside anything: the caller opens a decision, waits its own way (an MCP tool call, an engine waitForEvent, an HTTP poll), and Ratifia records what the reviewer saw and how they answered. When a human decides, the caller gets the verdict and continues. Ratifia is a step in your path, never the orchestrator.
#What you get
- One decision, from anywhere. The same request from an agent, a workflow, or plain HTTP.
- Rich context. Reviewers see the actual AI output, fields, diffs, and tool calls, not a bare yes/no prompt.
- Policies. Named, org-scoped defaults for who approves, the quorum they need to reach, and how they're reached.
- Quorum. Configurable M-of-N approvals; reject-wins by default.
- SLA + reminders. Decisions never rot silently.
- Shaped answers. Approve/reject, pick from options, type a value, or refine a draft before it goes out.
- The Inbox. A reviewer-first dashboard, plus email, Slack, and Discord.
Start with a quickstart, either for agents or for your code, then skim the core concepts or keep the glossary handy.