Do not make me open eleven repositories.
Fourteen agents, four frameworks, three teams, two of them contractors. A control that requires a library upgrade in each one is a control that ships next quarter, partially, and then drifts.
USE CASES / PLATFORM & AI ENGINEERING
Governance usually arrives as a request to change every agent. GovernorAI is designed so that the common answer is you change nothing in the agent at all — the decision drops into the Envoy filter chain, the MCP proxy, the forward-auth check or the AI-gateway webhook you already operate. Where an SDK is the better fit, it is one import and one decorator on the function that makes the call. Your policy engine, your pipeline, your keys.
Five ways in, and they do not all carry the same powers. Forward-auth cannot rewrite a body; an LLM gateway decides but does not shape. failure_mode_allow must be false on ext_proc or the gate is decorative.
WHAT YOUR JOB ACTUALLY IS HERE
The platform team ends up holding AI governance because it is the only team that can reach the code. That is a bad place for it to live: the policy is not yours, the review process is not yours, and every change becomes a deployment you have to schedule.
Do not make me open eleven repositories.
Fourteen agents, four frameworks, three teams, two of them contractors. A control that requires a library upgrade in each one is a control that ships next quarter, partially, and then drifts.
We already have a policy engine, and it has an owner.
If OPA is already doing Kubernetes admission control, there is a Rego codebase, a review process and a team that answers for it. A second policy system is a migration, not an integration — and nobody asked for one.
Nothing sits in front of the model on day one.
An availability incident caused by a governance layer is the fastest way to have the governance layer removed. The first question is what happens when it is slow, and the second is what happens when it is unreachable.
Each adapter parses a tool call off the wire, builds the canonical execute request, and asks the gateway for the verdict. Policy, data controls, injection deny, approvals, the kill switch and the hash-chained evidence live in one place — adapters never re-implement any of it. That is why adding a second enforcement point does not mean maintaining a second set of rules.
GOVERN WITH NO SDK IN THE AGENT
Read the topology line on each card: the orange box is where GovernorAI sits, and the green one is something that stays yours. Read the right-hand list before you choose — an insertion point that cannot rewrite a body is honest about it rather than pretending.
A gRPC external processor for Envoy Gateway, Istio, Gloo, Envoy AI Gateway and agentgateway. The identity travels in governor.* request headers, so the agent itself is unchanged. Allow continues, redact becomes a body mutation, approval returns 202, deny returns 403.
Non-negotiable: failure_mode_allow must be false. An unreachable processor has to be a deny, not a pass.
Point the MCP client's server URL at the proxy — that is the whole integration. tools/call is governed; initialize, tools/list, ping and notifications pass through untouched. Allow forwards, redact rewrites the call arguments, approval and deny return a JSON-RPC error.
Argument-aware inspection runs here even where prompt or response classification would be a no-op, and a retrieval body an operator declared as a fetch is inspected as untrusted content.
NGINX auth_request, Traefik ForwardAuth, an AWS Lambda authorizer, Apigee, Azure API Management. Allow returns 200; approval and deny return 403. A JSON verdict mode returns the decision and shaped arguments for guardrail webhooks.
The cheapest thing on this page to wire, and the most limited. Choose it when the decision is allow-or-not, not when a payload must be rewritten.
X-Governor-Shaping-RequiredA Portkey bring-your-own-guardrail webhook and a LiteLLM custom guardrail govern the model call itself, where those products already sit. GovernorAI does not replace them and does not read your provider keys — it answers the verdict question they ask it.
Our endpoint answers with an explicit negative verdict rather than a 5xx, because those hosts treat a server error as a pass.
Python, Go and JavaScript SDKs consult the gateway out of process for a verdict on a call the agent is about to make. The decorator wraps the function that makes the call; govern(agent) auto-detects a LangChain, LangGraph, LlamaIndex or CrewAI agent and applies the right adapter. Adapters also ship for the OpenAI Agents SDK, Semantic Kernel, AutoGen, Bedrock, Vertex AI, Azure AI Foundry and Databricks.
Denials and approvals surface as typed exceptions, and the client is fail-closed by default: if the gateway is unreachable the call denies rather than silently proceeding.
# identity travels in governor.* request headers:
# x-governor-agent-id · x-governor-org-id · x-governor-tool
http_filters:
- name: envoy.filters.http.ext_proc
typed_config:
grpc_service: { envoy_grpc: { cluster_name: governor_extproc } }
processing_mode:
request_header_mode: SEND
request_body_mode: BUFFERED
failure_mode_allow: false # REQUIRED — fail closed # pip install governor-sdk
from governor import governed
@governed(agent_id="refund-agent-v1", namespace="governor.prod")
def run_refund(request, __gov_ctx__=None):
# the tool call is what gets a verdict — not the prompt
return __gov_ctx__.execute(
"erp.process_refund",
{"amount": request.amount, "customer": request.id},
) Which of the six outcomes an insertion point can execute is a property of that enforcement point, published as a capability registry the runtime consults on every call. Ask an enforcement point for an outcome it does not declare and the result is a deny, marked as a downgrade — never a silent fallback to something weaker. Forward-auth is allow, deny and approval only because auth_request has no body mutation; it emits a header so the operator knows a redaction was requested and did not happen. The out-of-process SDK path likewise returns a decision rather than receiving a shaped payload back.
Third-party hosts are outside our control and we will not describe them otherwise: Portkey's guardrail webhook fails open on timeout, and LiteLLM's post-call hook on streaming is audit-only. Our endpoint always fails closed; the gateway-side hook must be configured to treat a webhook error as a deny, and that configuration is yours to verify per deployment.
KEEP WHAT YOU ALREADY OPERATE
Three engines ship in the box — native rules, CEL and Rego. If your organisation has standardised on OPA, GovernorAI can call your existing server for the verdict instead: your policies stay in your repository, in your language, under your review process, owned by your team. GovernorAI contributes the agent action boundary and the evidence.
GovernorAI never holds the policy. Authentication by API key, bearer token or mTLS; the server is operated by you. Configuration is per tenant, so embedded and remote can coexist across an organisation.
an integration, not a migrationWhere you do not already run OPA, it runs as a Go library inside the decision path with policies managed here or loaded from the filesystem. Nothing external to operate.
no second serveraudit_only records and never changes an outcome. shadow runs against live traffic in parallel with the decision in force. enforcement is the outcome at the action boundary. Nobody has to be brave on day one.
Project what a change would have allowed, denied or held. Similarity checks surface rules that overlap or contradict, and dead-policy detection finds rules nothing reaches.
see Policy & GovernanceRemote OPA is a deployment configuration, not a default. A tenant-supplied server address is treated as untrusted and cannot be pointed at loopback, private or cluster-internal addresses; only an operator-configured address may reach a sidecar. Policy semantics can differ between engines, and where a policy is transpiled the divergence is reported rather than silently resolved. The full picture is on Policy & Governance.
GOVERNANCE THAT LIVES IN YOUR PIPELINE
Policy is a versioned artifact with a review process, not a setting in a UI. The provider makes the governance objects declarable alongside the infrastructure they govern, and the API makes the resulting state queryable rather than exportable-on-request.
# policy declared alongside the infrastructure it governs
resource "governor_policy" "refund_approval" {
name = "refund-approval-v4"
governance_mode = "shadow" # promote when the diff is boring
fail_closed = true
engine = "rego"
source = file("${path.module}/policy/refunds.rego")
} # introspectable schema at /api/v1/graphql/schema
{
agents(namespace: "governor.prod", limit: 50) {
id
name
status
}
policies(namespace: "governor.prod") {
id
name
}
} Policies, assignments, namespaces, approval workflows and kill switches are declarable resources. Changes go through the review your team already uses, versions are retained so a rollback is a selection rather than a rewrite, and rollout is staged rather than all at once.
THE AVAILABILITY QUESTION
The objection that kills governance layers is the one about becoming a single point of failure for inference. GovernorAI is architected to answer a verdict question, not to relay your traffic — and where it does sit inline, the failure mode is stated rather than discovered.
On the AWS Bedrock inbound path, invocations arrive from inside AWS and the Lambda proxy executes the tool after the gateway returns a decision — the gateway does not make the outbound model call. On the AI-gateway webhooks, the host holds the provider credentials and asks us only for the verdict.
verdict in, decision outThe cluster-side egress agent governs each outbound CONNECT tunnel at host and port level, then opens raw TCP forwarding on allow. The body stays encrypted end to end between the caller and the destination — one decision per tunnel open, and that limit is stated rather than papered over.
not a man in the middleThe decision client carries an explicit timeout — five seconds by default, configurable per deployment — and expiry resolves to deny, never to allow. A transport error is synthesized as a deny and marked as fail-closed, so it is distinguishable in your logs from a genuine policy deny.
you can measure it before you trust itDiscovery reads the telemetry and control planes you already run — no agent to install in the request path, no configuration change to the systems being inventoried. A source can be previewed end to end with a test payload through the real adapter that persists nothing, before you point live telemetry at it.
see Discovery & Shadow AIGovernorAI does not host your agent, replace its harness, or require a rewrite. It evaluates and governs an agent you already built, on a framework you already chose. Adding agent creation would erase the reason to trust the governance.
no agent-builder replacementEach discovery source gets its own bearer token, bound to that source and that account, rotatable and revocable on its own — a full account API key is never handed to a forwarder. Rate limits run per key, endpoint and role.
per-source, revocableFour of the five insertion points above put GovernorAI on the request path, and an inline component is an availability dependency you have to plan for. That is why the timeout is explicit, why the failure mode is deny rather than a guess, and why audit_only and shadow exist so a policy can be proved against production traffic before it is allowed to block anything.
End-to-end redaction on an inbound self-execute caller depends on the gateway returning shaped arguments, which it materialises for the Bedrock enforcement point today. Until that is generalised, ext_proc and the MCP proxy are the paths that enforce allow, deny and approval end to end. We would rather write that sentence than let a diagram imply otherwise.
THE PAGES THAT ANSWER THE REST
A persona page is a route, not a specification. These four are where the mechanics — and the crosses in the capability tables — actually live.