Docs

#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…UseWhat it looks like
An AI agent: Claude Code, Cursor, Claude Desktop, anything that speaks MCPMCP serverThe 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 MCPREST APITwo calls: POST /v1/worker/decisions, then poll GET …/:id for the verdict.
A durable workflow: Inngest today, with Temporal and Trigger.dev plannedEngine adapterOne 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.