The governed AI runtime

Let AI do more. Without doing too much.

Give AI real authority in production. Your rules, approvals where they matter, every action audited—enforced by the platform, not by the prompt.

  • No credit card
  • Bring your own model
  • Every action audited

Arbiter — Acme Support

Refund and notify Barbararunning

You

Refund order #1082 for Barbara — she got the damaged unit. Then email her the receipt.

Arbiter

Planning 3 steps…

orders.read({ id: 1082 })

completed

low risk — orders:read granted to this role

payments.refund({ order: 1082, amount: 42.50 })

completed

high risk — approval required before it runs

Run halted.

payments.refund · $42.50 — high risk, waiting on a human

RejectApprove

Approved by dana@acme.com

run resumed where it stopped

email.send({ to: 'barbara@…', template: 'receipt' })

completed

low risk — email:send granted to this role

Arbiter

Writing the summary…

Arbiter

Refunded $42.50 and emailed Barbara the receipt. One step needed you — the rest was already allowed.
0 of 3 actions · every step audited

Refund order #1082 for Barbara — she got the damaged unit. Then e

Watch the halt: a live agent run is safely stopped, approved by a human, and resumed.

Instruction-based safety is probabilistic.
Infrastructure-enforced safety is deterministic.

Most teams have already moved past trusting the prompt. The question worth asking is what a tool allowlist still cannot do for you.

A system prompt

Who enforces it
The model, if it complies
When the model is wrong
You find out afterwards
Governs the arguments, not just the tool
Nothing is enforced
Revoke a capability
Edit the prompt and hope
Record of what happened
Whatever you logged yourself
Covers third-party tools
No

A tool allowlist

Who enforces it
Your gateway, per call
When the model is wrong
The call is refused
Governs the arguments, not just the tool
Refund is allowed, or it isn't
Revoke a capability
Takes effect on the next call
Record of what happened
A log of calls
Covers third-party tools
One gateway at a time

Authoric

Who enforces it
The runtime, every action
When the model is wrong
The run pauses and waits for a person
Governs the arguments, not just the tool
Refund up to $5,000 is a policy
Revoke a capability
The tool leaves the toolbox
Record of what happened
Every action, attributed to a principal
Covers third-party tools
Same policy, same halt, same audit row

The safety model

Every action runs through the same rules.

People, services, and AI agents are all just principals. There is no separate AI path that skips the checks — which means there is nothing for an agent to escape to.

Your team

session · role: admin

Your services

api key · scoped

Your AI agents

trusted: false · role-bound

An agent is just another principal. No special path, nothing to escape.

One gate — every request

Authenticate

Session, API key, or agent key — every caller is identified.

Authorize

Declarative policies decide the action, down to the field.

Approve

High-risk actions pause for a human before they run.

Redact

Secret columns never leave the server unmasked.

Audit

Every action lands in the same queryable trail.

Your production

An isolated database per app — never client-facing.

Databases
Functions
Storage
Realtime

In practice

What governing it actually looks like.

Two documents and one SDK call. Nothing here is a diagram of how it could work — it is the shape of the real thing, and you can read all of it in under a minute.

01

The rule

A policy decides what an agent may do; the table config decides what it may see and what it has to ask about first. Neither one is code.

  • payments:create is not denied here — it is absent, and absent is denied
  • Redacted columns are stripped before the model ever receives the row
  • Risk is graded per operation, so routine work still runs unattended
// The role's policy. Deny by default; every grant is explicit.
{
  "version": "1.0",
  "defaultEffect": "deny",
  "actions": {
    "vendors:read_list": [{ "effect": "allow", "priority": 100 }],
    "invoices:read_list": [{ "effect": "allow", "priority": 100 }],
    "invoices:update": [{ "effect": "allow", "priority": 100 }]
  }
}

// The vendors table. Bank details never reach the model at all, and
// updating a vendor keeps the default risk — so it stops for a human.
{
  "redactColumns": ["bank_account_number", "bank_routing_number"]
}

// The invoices table. Marking one received is routine bookkeeping,
// declared low so it runs unattended. Money and identity still stop.
{
  "agentRisk": { "update": "low" }
}

This is the real configuration behind the demo above — a graded ladder, not a blanket block. Because the rule is data, revoking it revokes the capability: the tool leaves the agent's toolbox rather than staying in it and failing.

02

The code

Server-side handlers run under a frozen capability manifest. The two things hardest to get right by hand are the two things you do not write by hand.

  • A halt is one call — it pauses the run and resumes on the same line
  • The approver sees the real arguments, not a summary to trust
  • sdk.sql binds every value; concatenated SQL never reaches production
// Ask a human before the money moves. The run pauses here and
// resumes on this exact line once someone decides.
const approval = await sdk.awaitApproval({
  key: `payment:${data.invoiceId}`,
  requestType: "payment.issue",
  reason: `Pay invoice ${data.invoiceId} to ${vendor.name}`,
  requestData: { invoiceId: data.invoiceId, amount: data.amount },
  resumeData: { step: "issue" },
});

if (!approval.approved) {
  return { status: "held", decision: approval.status };
}

// Every interpolation binds as a parameter. Building SQL by
// concatenation is refused when you save the handler.
const [invoice] = await sdk.sql`
  SELECT * FROM invoices WHERE id = ${data.invoiceId}
`;

Approvals and injection-safety are primitives, not patterns you have to remember on the day you are shipping fast.

One catalog, two doors

Call the tool, or state the goal.

The same governed capabilities serve a strict door and a loose one. Deterministic when you want control, intent-driven when you want speed — same tools, same policies, same audit trail.

The strict door

POST /acme-support/mcp
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "orders_update",
    "arguments": {
      "id": 1082,
      "data": { "status": "refunded" }
    }
  }
}

A native MCP server, minus the open pipe: discovery is scoped to the caller's policy and every call is authorized — with the same approval halt.

The loose door

intent → governed run
const agent = app.agent({ apiKey: "plak_live_…" });

await agent.msg(
  "Refund order #1082, then email Barbara the receipt."
);

// → reads the order, halts on payments.refund,
//   resumes after human approval — same rails

State the goal and the orchestrator picks the tools, fills the schemas, and runs them — governed by construction. The caller never learns your API.

The console

Run agentic workflows from one command center.

Not mockups — these are live screenshots of an Authoric workspace: the inbox where risky actions wait for a human, and the agents doing the work.

The approval inbox

Risky actions wait for a human.

When an agent reaches for something your policy marks risky, the run pauses and the action lands here — the exact arguments, the agent's reasoning, and the risk level in plain sight. Approve and the run resumes where it stopped.

  • Risk levels set by your policy, not the model
  • The real payload, not a summary you have to trust
  • Approve, reject, or stop the run outright
The Authoric approval inbox showing three halted agent actions — creating a vendor with bank details, an ACH payment, and a record update — each with its risk level, full JSON payload, and Approve, Reject, and Stop run controls

The agents

Two agents. One may ask. One may not.

AP Assistant can issue a payment, but has to ask first. Vendor Analyst cannot issue one at all — not because a toggle is off, but because the grant does not exist in the role it is bound to. Capability is derived from policy, so revoking the policy removes the tool.

  • Toolbox derived from bound roles, not configured per agent
  • Bring your own LLM connection
  • Delegation between agents, each under its own policy
The Authoric agents page listing AP Assistant and Vendor Analyst, each active with its own capability role, LLM connection, and effort setting

Where it matters

Built for the systems you can't be wrong about.

AI is easy to allow where mistakes are cheap. These are the places it isn't — and the reason the halt is the feature rather than the caveat.

Healthcare

Patient data an agent can help with, but never leak.

An intake agent reads and summarises records all day. The columns that identify a patient are stripped before the model ever receives the row, and any write to a clinical record stops for a clinician.

Always pauses: Writes to a clinical record

Financial operations

Reconcile freely. Pause before the money moves.

An AP agent matches invoices to purchase orders and drafts payments unattended. Two things it cannot finish alone: issuing a payment, and changing a vendor's bank details — the quiet one that business email compromise relies on.

Always pauses: Payments and bank-detail changes

B2B SaaS

One agent, many tenants, no cross-contamination.

Support and ops agents work across every customer you serve. Isolation is enforced by the runtime evaluating the acting principal, not by an agent remembering which tenant it is currently reasoning about.

Always pauses: Anything reaching outside the acting org

Born governed

Built for the moment AI is wrong.

Most platforms are built for the happy path. Authoric is engineered around the other one — the moment an agent tries something it shouldn't.

Agents are principals

An agent gets roles and policies just like your people — trusted: false, no special path. What it may do is a dial you set, not a hope.

Human-in-the-loop approvals

High-risk actions pause mid-run and wait in an approval inbox. Approve, and the run resumes exactly where it stopped.

A real policy engine

Declarative policies decide every request — role, ownership, org, time window — with field-level filtering. The database is never client-facing.

Tools derived from policy

An agent's toolbox is computed from what its roles grant. Revoke the policy and the tool disappears — nothing extra to configure or forget.

Governed functions

Server code runs under a frozen capability manifest with an auto-parameterized SQL wall — and a dry-run mode that shows what it would do first.

Governed realtime

Every streamed event is re-checked against the subscriber's own policy and column redactions before it leaves the server. Revocation applies mid-stream.

AI on your own rows

Classify, extract, and search your data by meaning — through the same policy and redaction wall as every other read. A column can't be derived from one you've redacted, and a person's correction is never overwritten by a model.

The runtime

Everything you expect from a backend. Plus the part nobody else has.

Governance isn't a proxy bolted in front of someone else's stack — it's enforced inside a complete, multi-tenant backend. All of this is here, and all of it is documented.

The Authoric table editor showing the vendors table scrolled to bank_account_number and bank_routing_number, both displayed masked
An editable grid over a real, isolated database — with the vendor banking columns declared sensitive, so they are stripped from the row before an agent or an API consumer ever receives it.
The Authoric schema visualizer showing the vendor_ops tables connected by foreign-key relationships
Your schema, drawn live from the database rather than from a diagram that drifts — click any table to trace what it is related to.

Straight answers

The questions you were going to ask anyway.

Including the one most vendors leave off the page.

Isn't this just row-level security?

Row-level security decides which rows a query returns, and Authoric covers that ground too. It was never meant to cover the rest: holding a run open while a human decides, governing a value rather than a row, or attributing every action to the principal that took it. And RLS governs your database — a large share of the actions worth fearing happen in someone else's tool.

Can't I do this with a system prompt and a tool allowlist?

Not with the prompt — a guardrail written in a prompt is a request, and every public incident of an agent destroying production began with an instruction it was supposed to follow. An allowlist gets you meaningfully further; it really does refuse a call it does not recognise. What it cannot do is pause a run for a person, govern “refund up to $5,000” rather than “may refund”, or leave a record an auditor will accept.

Can't I just give the agent its own account?

Yes — and you should. But an account settles who the agent is, not what it may do. Whatever tool you create it in hands it that tool’s coarse roles: your bot’s payments login holds the entire refund API, not “refunds under $500, on orders this workflow opened”. Ten bot accounts across ten tools is then ten places to audit and ten places to remember to revoke. Here the agent is a principal in the same policy engine as your people, so the unit is the grant rather than the account — one place to see what it may do, and one place to take it away.

Do I have to move my data or rewrite my agent?

No. Point an agent you already run — Claude, Cursor, something in-house — at Authoric over MCP, and its calls go through the same policy checks, the same approval halt, and the same audit trail as everything else. No migration and no data move. Building directly on the platform gets you more, but that is a decision for later, not a precondition.

Which models can I use?

Yours. Connect your own Anthropic or OpenAI key and your agents run on your model under your policies. We never resell tokens and never mark them up, which also means your usage stays a matter between you and your provider.

What happens when the agent is wrong?

That is the case the platform is designed around rather than the one it hopes to avoid. Low-risk work runs unattended. Anything above it stops mid-run and waits in an approval inbox showing the exact arguments it intended to use — approve and the run resumes on the line it stopped at, reject and it does not. If the policy never granted the capability there is nothing to approve: it is refused outright, and no amount of persuading the model changes that.

Are you SOC 2 or HIPAA compliant?

No. We hold no certification today and would rather say so plainly than imply otherwise. What does exist is the substance those audits examine: deny-by-default authorization, approvals on high-risk actions, an audit trail attributing every action to a principal, encryption at rest, and model keys that stay yours. Our security page lists what we enforce and — first — what we do not have, so you can rule us in or out in a minute rather than in a third meeting. We are building toward the certifications and will not claim them before we have them.

Getting started

Your first governed workflow, in an afternoon.

01

Define the rails

Create your tables, roles, and policies in the console — what each principal may touch, and which actions need a human.

02

Connect your model

Bring your own Anthropic or OpenAI key. Your agents run on your model, under your policies — we never resell your tokens.

03

Put agents to work

Drive them by chat, API, or MCP. Every action is checked, redacted, logged — and when it matters, halted for approval.

"Your agent will surprise you. The only question is whether that ends in an approval — or an incident."
Authoric is built for that moment — every action governed, every risky one paused for a human, every step on the record.

Put your agents on rails.

Start free, bring your own model, and set the blast radius before your AI touches production.