Ardur

How It Works

The simple idea behind Ardur: declare, enforce, prove.

Ardur does three things. Here’s each one, explained without jargon.


1. You declare what the agent can do

Create a file called ARDUR.md in your project. It looks like this:

# Mission Profile

## Mission
Build and test a REST API for user management

## Allowed Tools
- read_file
- write_file
- search_files

## Forbidden Tools
- delete_file
- execute_shell

## Resource Scope
- ./src/
- ./tests/

## Max Tool Calls
200

That’s it. No JSON, no YAML, no custom language. Ardur compiles this into a signed Mission Passport — a JWT that cryptographically binds the agent to these rules.

2. Ardur enforces the rules at runtime

Every time the agent tries to call a tool, Ardur checks:

  • Is this tool allowed? If it’s not in the allowed list, deny.
  • Is it forbidden? Some tools are never OK, regardless.
  • Is the target in scope? If the agent tries to read outside ./src/, deny.
  • Has the budget been exceeded? Too many calls or too long running? Deny.
  • Do the policy backends agree? Cedar rules, forbid-rules, custom checks.

All of this happens before the tool runs. The agent never touches resources it shouldn’t.

3. You get signed proof of everything

Every decision produces an Execution Receipt — a JWT signed with the issuer’s private key. Each receipt links to the previous one by SHA-256 hash. The chain is tamper-evident: change any receipt and every receipt after it fails verification.

A session receipt chain gives you:

  • A complete timeline — what happened and when
  • The verdict — PERMIT or DENY for each tool call
  • The reason — which rule triggered a denial
  • Cryptographic integrity — proof the chain hasn’t been modified

Where Ardur sits

┌─────────────────────────────────────────┐
│  Your AI agent (Claude Code, LangChain,  │
│  AutoGen, custom, ...)                   │
└──────────────────┬──────────────────────┘
                   │ every tool call
                   ▼
┌─────────────────────────────────────────┐
│            Ardur Governance Proxy         │
│                                          │
│  ┌──────────┐  ┌────────┐  ┌─────────┐ │
│  │ Mission   │  │ Policy  │  │ Receipt  │ │
│  │ Passport  │  │ Engine  │  │ Chain    │ │
│  │ Verify    │  │ Eval    │  │ Sign     │ │
│  └──────────┘  └────────┘  └─────────┘ │
│                                          │
│  Returns: PERMIT with receipt            │
│        or DENY with reason               │
└──────────────────┬──────────────────────┘
                   │ only if PERMIT
                   ▼
┌─────────────────────────────────────────┐
│        Your tools & resources            │
│  (filesystem, terminal, APIs, DBs)      │
└─────────────────────────────────────────┘

The proxy is the enforcement point. No bypass, no direct access, no “oops I forgot to turn it on.”

What Ardur does NOT do

Honesty matters. Ardur is not:

  • A sandbox — it governs at the tool-call boundary, not the kernel level (yet)
  • A model guard — it doesn’t inspect or filter what the model says, only what tools it calls
  • A replacement for OS security — use it with, not instead of, file permissions and access controls

See the coverage map for a precise audit of what’s captured and what’s on the roadmap.