Invariant

Stop the wrong AI action before it executes. Prove the right one did.

Invariant is an independent kernel between AI agents and the systems they act on. It checks every action against your rules before it runs, and signs a record of every decision that anyone can verify.

InvariantVAC 0.1

Verified Action Certificate

Example record, demo key

Refund €5,000.00

POST api.stripe.com/v1/refunds

Blocked

No allow rule matched, so the default rule applied. The call was never made.

Rule fired
default-block
Policy
2026-10-12.1
Agent
agent_billing
Log index
1042
Time
2026-10-18 14:26:03.512 UTC
Action hash
sha256:90b16d572f14…80b5f4bd
Signature
ed25519:meOke7xFvo…NhDw==

Signature validKey demo-f3c9b559vac_01a14f67-c678…

Fig. 1Verified Action Certificate, example record

Agents now act on real systems. Nothing in the usual stack checks an action before it executes.

  • Models are probabilistic.

    An agent can misread an instruction, follow text injected into its context, or call the right tool with the wrong amount.

  • Most controls watch rather than stop.

    Observability tools record what an agent did after it happened. Guardrail tools mostly filter what a model says, not what it does.

  • Checks inside the agent share its fate.

    A buggy or compromised agent can skip its own checks.

  • Nobody can prove what happened.

    When something goes wrong, it is unclear who is responsible: the model provider, the company that deployed the agent, or the system that executed the action.

A customer asks for a €50 refund. The agent issues €5,000.

Today

The refund goes through. The log explains it afterwards.

With Invariant

A rule capping refunds stops the call before it reaches the payment provider. A signed record shows which rule stopped it.

Intercept, validate, certify. Three steps, in this order, for every action an agent attempts.

  1. Intercept

    Capture the action and translate it into one standard record, whatever service or protocol it was meant for.

  2. Validate

    Check it against your rules. If it breaks one, the call is never made, so nothing happens in the world.

  3. Certify

    Record the decision and sign it, so anyone can later check what was attempted, what was checked, and what happened.

Fig. 2Refund demo

Scripted simulation in your browser. No real agents, services or customers.

Refund amount in the agent's call

The customer asked for €50.

Mode

Blocks anything no rule allows.

Path of the call

  1. Agent

    agent_billing calls POST /stripe/v1/refunds with amount=500000

  2. Intercept

    Waiting for the call

  3. Validate

    Rules not evaluated yet

    api.stripe.com

    Reachable only through Invariant

  4. Certify

    No decision to sign yet

  5. Agent receives

    Nothing yet

Kernel log

enforce

# Pick an amount and a mode, or press Run action.

# The default is the €5,000 mistake in enforce mode.

A certificate appears here once the action is decided.

Decision log

Example rows from this demo

  1. 14:26:03 create_refund stripe €5,000.00 enforce Blocked default-block 14:26:03€5,000.00enforcedefault-block
  2. 14:25:58 create_refund stripe €50.00 enforce Allowed allow-small-refunds 14:25:58€50.00enforceallow-small-refunds
  3. 14:25:41 send_message slack – enforce Allowed allow-slack-posts 14:25:41enforceallow-slack-posts
Policy in forceDraft format
mode: enforce
default: block  # when no rule allowsrules:
  - name: allow-small-refunds
    when:
      route: stripe
      intent: create_refund
      amount_lte: 10000
    then: allow  - name: allow-slack-posts
    when:
      route: slack
      intent: send_message
    then: allow

Amounts are in minor units, so 10000 is €100.00. The policy format is still being finalized.

  • Gradual adoption

    Start in observe mode, which only records. Shadow mode evaluates the rules and records what would have been blocked. Enforcement starts when you choose.

  • Fail safe

    In enforce mode, an action that no rule allows is blocked by default.

  • Explainable

    Every decision names the rule that caused it and the policy version in force. Rules decide. Any risk score is informational, because a rule can be audited and a weighted score is hard to defend.

  • Kill switch

    An operator can halt one agent's traffic, or all traffic, on command.

  • Personal data detection

    Parameters bound for external services can be scanned for personal data, using self-hosted open-source detection.

Connecting an agent is one setting.

Change the base URL the agent's SDK uses for a service to Invariant's route for that service, and add a key that identifies the agent. The agent's own credentials for the service pass through unchanged.

This works with most agent frameworks, because most SDKs let you set a base URL. It needs no forged certificates, and no changes to the agent's code beyond configuration.

Fig. 3The agent's refund call, pointed at Invariant

POST http://invariant:8080/stripe/v1/refunds

Invariant-Agent-Key
<per-agent key issued by the operator>
Authorization
Bearer <the agent's own Stripe key, relayed unchanged>
Content-Type
application/x-www-form-urlencoded

charge=ch_123&amount=500000

Header names are illustrative.

The path of one action.

The order is the core of the design: capture, decide, forward. Until the forwarding call is made, nothing has happened in the world. Blocking an action simply means never making that call. A check that runs after forwarding can only report damage.

On the allow path, the agent receives exactly what the service sent: same status, same headers, same body. If the service cannot be reached, Invariant reports an honest error and never fakes a success.

  1. 1ArriveThe kernel accepts the request.
  2. 2RouteThe route name selects an upstream from configuration.
  3. 3IdentifyThe agent key resolves which agent is calling.
  4. 4FingerprintThe exact bytes received are hashed before anything is parsed.
  5. 5NormalizeThe request becomes one validated Action Object.
  6. 6RecordThe Action Object is written to the log.
  7. 7DecideAllow or block against your rules.
  8. 8ForwardOnly if allowed: the real call goes to the real service.
  9. 9ReturnThe response comes back unchanged and the outcome is recorded.

One record for every action.

Every action, whatever protocol it arrived on, becomes one standard Action Object before anything else happens. That is what lets you write a rule once and have it apply across every service your agents use.

Each field has a known source, and the record keeps them apart. Inferred fields are marked, because they can be wrong. If no mapping exists, the intent is recorded as unknown rather than guessed. Anything the agent claims about itself is recorded as a claim, never as fact.

Hashes are SHA-256 over the exact bytes received, and over the RFC 8785 canonical JSON form for structured fields, so anyone can reproduce them. MCP tool calls over the network take the same path: the tool name becomes the intent and the tool arguments become the parameters.

Fig. 4Action Object for the €5,000 refund

Read from the request, computed by Invariant, or inferred from configuration.

{"schema_version": "0.1","action_id": "act_01a14f67-c678-7888-8193-17055400bb91","agent_id": "agent_billing","timestamp": "2026-10-18T14:26:03.512Z","action_type": "api_call","intent": "create_refund","category": "financial","target": {"route": "stripe","service": "api.stripe.com","endpoint": "/v1/refunds","method": "POST"},"content_type": "application/x-www-form-urlencoded","params": {"charge": "ch_123","amount": "500000"},"params_hash": "sha256:e1dfd0a08f0e45d56bf3046e9328c18d47f1b38937072b16f4ccdc757f5e80d8","protocol": "http","raw_hash": "sha256:02c9ddb862cdf2629d056797d69832d4556bd059bff54933515e2433098ef5f4","raw_size_bytes": 27}
The hashes are real SHA-256 values of this example. Abridged, as in the draft schema.

A signed record of every decision. Allowed and blocked alike, checkable without trusting whoever issued it.

The Verified Action Certificate (VAC) is meant to work for AI actions the way a certificate works for a website. A recorded block matters to an auditor as much as a recorded approval, because it is the evidence that a control worked.

Each certificate is designed to prove four things:

  • This exact action, identified by its hash, was seen at this time.
  • It was judged by this policy version, with this result and these rules.
  • The record has not been altered, and no record has been removed or reordered since.
  • Who signed it.

Records are kept in an append-only log structured as a hash tree, in the style Certificate Transparency uses for web certificates (RFC 9162). That allows two proofs: that a given record is in the log, and that the log's history was never rewritten between two points in time. Signatures cover the whole record, so no field can be edited without detection.

We plan to publish the VAC format as an open, versioned specification with test vectors, so any tool can produce or check records.

Fig. 5Check a certificate

Demo. Real SHA-256 and Ed25519, computed in your browser with a demo key.

Checking the example record from Fig. 1.

Verifier

idle

# The verifier runs when this figure is on screen.

Not checked yet

Check the Fig. 1 example with your own tools: the certificate, the Action Object and the demo public key. The action hash is SHA-256 over the RFC 8785 canonical form of the Action Object. The signature is Ed25519 over the canonical form of the certificate without its signature field.

A standalone verifier, separate from the kernel, takes a record, a public key and a signed snapshot of the log, and answers valid or invalid. It is what an auditor runs.

Who holds the signing key decides what a certificate proves to an outsider. It is the most important trust decision in the product, and we will settle it, and document it, before certification ships.

Built to be a credible witness. These hold in every phase of the product.

Capture, decide, forward
Nothing reaches the destination before a decision.
Independence
Invariant runs as its own process, outside the agent. The agent can send it requests; it cannot modify it. That is what makes it a credible witness.
Fidelity
On the allow path, requests and responses pass through unchanged.
One story per action
Every record about an action carries the same ID.
Fail loudly
Bad input is rejected or flagged visibly, never filled in with a guess.
Fail safe once enforcing
Unknown actions are blocked by default.
Self-hostable in the EU
No third-party hosted service in the product's data path. Dependencies are open source and self-hostable.
Honest numbers
Performance figures are published only once measured, with the method and hardware stated.

Its own weaknesses are product defects.

Every agent's credentials for upstream services pass through Invariant, which makes the kernel a valuable target in its own right. Fixed in the design:

  • Credentials are never logged. Redaction runs in one central place.
  • No open proxy. Destinations come only from the operator's configuration, never from agent input, which also closes off requests to internal or cloud metadata addresses.
  • Agent identity comes from a key issued by the operator, not from anything the agent can freely claim.
  • Upstream TLS certificates are always verified.
  • Administrative endpoints never share the port agents use.
  • No automatic retries, ever. A retried payment request can execute twice.

Before any pilot relies on its records.

Agent Invariant Service

Direct route from agent to service: closed by network egress rules

Fig. 6The only way out is through the kernel
Bypass resistance
An agent that calls a service directly is never checked. Network egress rules must leave Invariant as the agent's only way out.
Signing key custody
Who holds the signing key decides what a certificate proves to an outsider. It will be settled, and documented, before certification ships.

A full threat model will be published as a standalone document before the first pilot.

What Invariant does not do.

  • Train or sell models. It works with whatever model you use.
  • Filter chatbot text or moderate content. It works at the action boundary.
  • Depend on third-party hosted services in the data path, or run servers outside the EU.
  • Claim to detect hallucinations in general. It checks actions against rules; anything broader needs a defined ground truth first.
  • Publish performance numbers it has not measured.
  • Make decisions nobody can explain. Every block names the rule that caused it.
  • Cover local stdio MCP servers or inspect responses.

Runs on infrastructure you control. One container image. No part of it depends on a service outside your environment.

TopologyWhere it runsFitsNotes
Local gateway On the agent's machine Development and demos Same image
Central gateway One service per environment or private network Most customers, including banks Same image
Sidecar Beside each agent in its Kubernetes pod Kubernetes teams Planned
Embedded SDK Inside the agent's process Not offered: the agent could disable it Excluded by design

Agent records can contain personal data taken from action parameters. Retention will be configurable per customer. Payloads are stored apart from the hashes the log chains together, so a payload can be deleted on request without breaking verification of the log.

Why now. Three shifts are landing at once.

Agents went from answering to acting.

In 2023 an AI mistake was usually a wrong sentence. Now it can be a wrong transfer. Standard tool protocols such as the Model Context Protocol make it cheap to give an agent many tools at once, so the number of actions each agent can take keeps growing.

Regulation has fixed dates.

The EU AI Act's Digital Omnibus delayed the obligations for high-risk AI systems. It did not shrink the requirements. They include automatic logging of events (Article 12) and a duty on deployers to keep automatically generated logs for at least six months (Article 26).

  1. Digital Omnibus enters into force
  2. Obligations apply to stand-alone high-risk AI, such as credit scoring, hiring and access to essential services
  3. Obligations apply to high-risk AI built into regulated products

We are mapping which obligations Invariant's records support, and make no compliance claims until legal counsel has reviewed that mapping. Sources: Orrick, Freshfields.

Insurers need a unit of evidence.

Without a verifiable record of what an agent did and what was checked, an insurer has little to price agent risk on. A signed record per action is a candidate basis for that. It is a hypothesis we intend to test with insurers, not a result.

For teams putting agents into production. Organizations that deploy agents onto systems they care about, not the companies that train models.

Agent builders

Who
B2B companies selling agents for customer operations, HR or finance
Who buys
CTO or lead architect
What they need
A credible answer when their own enterprise customers ask what stops the agent
How it runs
Close to their stack, with fast setup

Regulated enterprises

Who
Banks, insurers and large companies running agents internally
Who buys
Platform, security and compliance leads together
What they need
An independent control they can show to auditors and regulators
How it runs
Self-hosted inside their network

The person who feels the pain is the same in both: the engineer who has to approve letting an agent touch production. Today that person either blocks the project or accepts a risk they cannot measure.

Talk to us.

We are looking for design partners for the first pilots: teams putting agents onto systems they care about, who need a control they can show to their customers, auditors or regulators.

Certificate from the demo