Authorise every action. Be able to stop any of them.
You already own the identity, the network and the endpoint. What you do not own yet is the moment an agent decides to call erp.process_payment — because that call is made by a non-human principal, with arguments a model wrote, against a system of record. GovernorAI puts a policy decision point at that boundary: a per-call verdict, deterministic, recorded, and fail-closed when it cannot resolve.
Per-call authorization at supported enforcement pointsDeterministic — no model in the decision loopKill switch across four scopesRead-only entry
Every governed action takes the same five steps in the same order, and nothing in that path consults a model. The verdict is recorded whichever way it goes — an allow is evidence too.
per-call verdictdeterministicfail closedno model in the decision loop
WHAT YOUR JOB ACTUALLY IS HERE
Three sentences you have already said in a review.
Agent governance is usually sold as a compliance story. For a security team it is a much narrower problem: an unattended principal, holding real credentials, taking irreversible actions on instructions that partly came from text somebody else wrote.
AuthorisationI cannot tell you who authorised that call.
The agent authenticated as a service account and did fourteen things. Your access logs record that the service account acted; nothing records that this action, with these arguments, was permitted under a policy someone approved.
Untrusted inputThe instruction came from a ticket, not a person.
The prompt was clean. The retrieved document was not. Indirect injection is the case your prompt-level review never sees, because the hostile text arrives after the request has already been approved.
ContainmentIf this goes wrong at 2am, what do I pull?
Revoking a key stops everything the key touches, including the things that were fine. You want to stop one agent, one tool, or one session — now, everywhere, with the stop itself recorded.
The positionThis complements your access and traffic controls. It answers a different question: may this agent make this call, with these arguments, under policy.
Your SSE, CASB and endpoint tooling decide whether a destination may be reached and whether a payload may leave. GovernorAI decides whether a specific tool invocation may execute, against the policy attached to that agent, and leaves a record of the verdict. The two sit alongside each other — GovernorAI's discovery even reads the logs your egress vendors already produce rather than deploying a sensor of its own.
ONE GOVERNED ACTION
What happens between the agent deciding and the system of record changing.
Nothing here is inference. The verdict comes from policy evaluation and deterministic detectors — regular expressions, Luhn and range checks, keyword and path rules — so the same call with the same arguments under the same policy resolves the same way twice.
01Identity is required
Nothing is permitted because it arrived from a trusted network. The governed call carries an agent identity, an organisation and a namespace before it is evaluated at all.
governor.*
02Policy decides
Native rules, CEL or Rego — or your own OPA server, in remote mode, so the policy never leaves your repository. The verdict carries a matched rule id, an explain code and a reason.
allow · deny · require_approval
03Detectors inspect the payload
Argument-aware inspection reaches into JSON-encoded sub-fields of a tool call. Where an enforcement point supports it, response bodies are inspected too — including plain text and streaming, in flight.
request · response
04The enforcement point executes what it can
Each enforcement point declares the outcomes it can truthfully carry out. Ask for one it does not declare and the result is a deny marked as a downgrade — never a silent fallback to something weaker.
_DOWNGRADED
05The verdict is written down
Allow, deny and approval all land in the hash-chained audit ledger with the action context that produced them. An allow is evidence, not an absence of governance.
policy.decision
Fail closedGateway unreachable, decision timeout, a non-2xx answer, an unparseable answer, an outcome the enforcement point cannot execute, a redaction that rewrote zero fields, a rewritten body that still trips the detectors on re-scan, a structure past the inspection depth budget — every one of them resolves to deny, with a reason, recorded, and distinguishable in logs from a genuine policy deny.
Stated preciselyPer-call policy outcomes, approvals, data controls and kill switches — at supported enforcement points.
Six outcomes exist: allow, deny and require-approval decide the action; redact, mask and constrain change its payload. Which of the six a given enforcement point can actually execute is a published capability registry the runtime consults on every call, not a marketing table. An enforcement point that lets calls through when it is confused is a logging product with extra latency, so nothing here degrades to allow.
The decision timeout is explicit — five seconds by default, configurable per deployment — and its expiry resolves to deny, never to allow. Full mechanics on Runtime Enforcement.
PROMPT AND INDIRECT INJECTION
The hostile instruction usually arrives after your review.
Direct prompt injection is the easy half. The harder half is indirect: a retrieved document, a ticket body, a web page or an MCP tool result that carries instructions the agent then follows. Both are handled the same way — as untrusted content inspected at the action boundary, where the consequence would land.
RETRIEVED CONTENT
A fetched body is treated as untrusted
On the central gateway path, and on MCP invocations an operator declared as a fetch, the retrieval body is inspected as untrusted retrieved content rather than trusted context. That is the enforcement point where indirect injection is actually visible.
Instruction-override attempts are matched against a deterministic floor, and base64 or hex runs that decode to printable text are caught separately — the standard technique for smuggling an instruction past a keyword filter. Tuned to avoid firing on ordinary hashes, identifiers and binary blobs.
reproducible, no model callSEMANTIC, OPTIONAL
Off unless an operator turns it on
A semantic detector for paraphrased or obfuscated override exists. It is disabled by default, it can only add a deny to the strictest-outcome selection and never soften one, and a model error or timeout inside it resolves to deny.
cannot weaken a verdictCONSEQUENCE, NOT TEXT
The tool call is the control point
An injection only matters if it reaches an action. Policy binds allowed and denied tools per agent, high-consequence calls escalate to a human, and a destination argument pointing somewhere policy does not permit has that field dropped before dispatch.
allowed_tools · require_approval
Honesty note — these controls reduce risk at supported enforcement points; they do not prevent every attack
Injection defence here is deterministic detection plus policy at the action boundary. It does not prevent every encoded, indirect or novel attack, and a technique nobody has written a rule for will pass the detectors. What it changes is the blast radius: the instruction may survive, but the call it asks for still has to clear policy for that agent, on an enforcement point that will fail closed rather than guess.
This is also not network inspection. GovernorAI operates on the body it already receives at an enforcement point. It does not inspect packets, does not analyse raw TCP or TLS, and the egress agent deliberately does not terminate TLS — it records one decision per tunnel open, not one per logical call inside that tunnel. Where you run a network or traffic-level security product, this sits alongside it.
DATA CONTROLS
Three ways to change a payload, and one honest constraint on all of them.
Redact, mask and constrain are the outcomes that rewrite. They are driven by the same classification rule set the data-controls surface shows you — not a forked, parallel rule engine that can quietly disagree with it.
Detectors that drive a data-control outcome, and what each one resolves to
Detector
What it catches
Resolves to
secret
Credential material — API keys, bearer tokens, JWTs and provider-specific key formats.
REDACT — replaced with a non-recoverable token
sensitive_data
Regulated and confidential content, using the existing data-classification rule set.
MASK at high and critical severity — a deterministic mask; otherwise approval
regulated_identifier
Structurally validated identifiers the other two miss — payment-card numbers confirmed with a Luhn check, US social security numbers range-validated.
DENY · signal only, no rewrite
unsafe_destination
A destination argument pointing somewhere policy does not permit.
CONSTRAIN — the offending argument key is dropped, request side only
A rewrite has to prove it worked. A shaping that mutated zero fields is never reported as shaped — it denies. A shaped plain-text body is re-scanned with the same detectors, and if anything still fires the body is not forwarded. On the provider enforcement points the narrowed arguments are compared against the exact payload about to leave, and a mismatch denies rather than sending a half-shaped request.
WHY YOU HAVE TO READ THE MATRIX
Not every enforcement point can rewrite. The product prints the gaps.
Six outcomes across seven registered enforcement points, with the capabilities an enforcement point does not have shown as crosses rather than omitted. This is the table to take into an architecture review: it tells you, per integration point, whether "redact the card number" is a control you actually have there or a control that will resolve to deny.
Honesty note — outcomes are enforcement point-dependent, and the streaming window is bounded
A cross in that matrix is a capability the enforcement point does not have. In-SaaS native event surfaces are out-of-band, so nothing there rewrites a request body — a deny on that enforcement point is a downstream control action such as a kill switch or a session revoke. The out-of-process SDK consult path returns a verdict rather than a rewritten payload, so shaping outcomes are not advertised to it at all.
In-flight redaction of a streaming body keeps a bounded overlap so a token split across chunks is still seen whole. It is not unbounded in-flight redaction: when a flush could emit the prefix of an unbounded secret, or an event exceeds the safe buffer cap, the stream terminates rather than emitting raw bytes.
CONTAINMENT
The stop control is scoped, and it cannot be invisible.
Revoking a credential is a blunt instrument that also stops the work that was fine. A kill switch is activated against a target, and every activation runs through a single service so the record of it is not optional.
agentone governed agent
toolone tool, everywhere
sessionone live session
namespacean environment
Four scopes, which is what KillScope declares. A switch may also be created global by a platform admin, applying across tenants — that is a flag on the switch, not a fifth scope, and not something a tenant sets for its own estate.
ONE ACTIVATION PATH
The switch and the evidence move together
The registry write, the cross-pod propagation, the domain event, the audit-timeline row and the webhook dispatch all happen in one service. There is no code path where an agent is stopped and nobody can prove when, or by whom.
no silent activationALERTS THAT ACT
A threshold can pull the switch
Rules on deny rate, error rate, p95 and p99 latency, request count and queue depth — scoped globally or to a namespace, agent or policy — with actions that include opening an incident, pausing a policy, or engaging a kill switch.
observation feeds enforcementEGRESS
Govern the tunnel, not the payload
A cluster-side agent governs each outbound CONNECT tunnel at host and port level by asking the same gateway for a verdict, then opens raw TCP forwarding on allow. TLS is not terminated; the body stays encrypted end to end.
one decision per tunnel openOUTBOUND SAFETY
Webhooks that cannot be redirected inward
Requests to tenant-supplied URLs are checked at dial time against the actual resolved IP, refusing loopback, private, link-local and cloud-metadata ranges, with every redirect hop re-validated. A hostname cannot pass validation and then re-resolve inward.
DNS rebinding closedRATE LIMITS
A budget per key, endpoint and role
Token-bucket limiting, in-memory for a single node and Redis-backed for a fleet, behind one interface — so the behaviour does not change when the deployment shape does.
same semantics either wayPOSTURE, SELF-REPORTED
The product will not flatter itself
A read-only execution-posture surface derives, from real decision records, what was authenticated, which tenant the action was bound to and what policy decided. It reports the credential mode as scoped_api_key rather than dressing it up, and reports just-in-time authorization and brokered credentials as roadmap — never live.
derived, not asserted
HOW THIS STARTS
The first step is read-only, and it stands on its own.
No security team enters a new control plane by putting it in the request path. Discovery is a consumer of feeds you already produce: your SIEM, your secure-egress and endpoint vendors, your identity provider, your cloud AI control planes. It is not in the path of any call, and it changes nothing about how your agents run.
Honesty note — discovery only sees what your existing tools already record
There is no tap, no proxy and no packet inspection anywhere in discovery: every source is a log, an audit record or a control-plane list call that a system you already run hands over. Its blind spots are therefore ours. An agent calling a model over a path no connected source records is invisible, and connecting no sources discovers nothing. A finding is a worklist item — the discovery path itself never blocks, disables or reconfigures anything.