mandatum

module
v0.1.0-rc.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 12, 2026 License: Apache-2.0

README

Mandatum

ci security licenses OpenSSF Scorecard Go Reference License

English | 日本語

Verifiable delegation for AI agents. An agent's authority to act becomes a signed chain rooted in a named human — attenuating at every hop, revocable at any link, evaluated across whole action sequences, and recorded in a tamper-evident log.

Status: early. The format, the verifier, the signing layer and the issuer work end to end and are tested against real signatures. Sequence evaluation, the audit log and the AuthZEN binding are not built yet, and nothing here has had a third-party security review. See ROADMAP.md and the threat model for what that means in practice.

The specification is the thing to read and argue with: docs/spec/delegation-assertion.md.


The problem

An AI agent acting for a person almost always does so by inheriting a credential — a service account, an API key, a shared token, the human's own session. Three failures follow from that, and they are measured, not predicted.

You cannot say who is responsible. Only 28% of organizations can trace an agent's actions back to a human sponsor across all environments, and 68% cannot reliably tell agent activity from human activity (1).

You cannot revoke one agent. Agents share the credential they inherited, so cutting off a misbehaving agent cuts off everything else using it. Nobody pulls that lever, so the agent keeps its access.

You cannot constrain a sequence. Authorization is decided one call at a time. An agent reads untrusted external content, then writes to an internal system. Both calls are legitimately authorized. The pair is an exfiltration, and no per-call check can see it.

The Model Context Protocol says where its own authorization stops: it is defined at the transport level, and per-tool authorization, agent identity, delegation, and consent are out of scope. The Enterprise-Managed Authorization extension, stable since June 2026, is explicit that it governs the connection and not the individual tool call.

That gap is what Mandatum fills. Nothing else.

The shape of it

  human sponsor  ──── authenticated, named, at the root of everything
       │
       ├─ MDA₀   grants: search.query on {public, docs}, 1h, max_depth 3
       │
       └─ agent A
            │
            ├─ MDA₁   grants: search.query on {public}, 40m, max_depth 2
            │         ↑ narrower than its parent. It cannot be wider.
            │
            └─ agent B
                 │
                 └─ MCP tool call ──▶ [ PEP ]
                                        │  1. verify the chain, offline
                                        │  2. check the sequence so far
                                        │  3. ask an AuthZEN PDP
                                        │  4. append to the audit log
                                        ▼
                                    allow / deny + a reason you can act on

Revoke MDA₁ and agent B loses its authority immediately, along with anything B delegated onward — because every descendant commits to its parent by hash. Agent A and every sibling chain are untouched.

What this is not

The failure mode for a project in this space is drifting into categories that are already occupied. Mandatum stays out of them by design:

  • Not an authorization engine. Mandatum never decides. It establishes facts and hands them to a Policy Decision Point that already exists — OPA, Cedar, OpenFGA, SpiceDB, Cerbos, or anything conformant with the OpenID AuthZEN Authorization API. Engines are not the gap.
  • Not a new protocol. JOSE for the assertions, RFC 8693 for issuance, SPIFFE for workload identity, AuthZEN for decisions, RFC 6962 for the log. Where a standard fits, Mandatum uses it unchanged.
  • Not a gateway, registry, sandbox, or agent runtime. Those categories are crowded. Mandatum is a library and middleware meant to run inside agentgateway, ToolHive, or an MCP server.
  • Not a blockchain. The audit log is a Merkle tree. No consensus, no network, no token.

Prior art, honestly

Attenuated capabilities with offline verification are the contribution of macaroons and, in modern form, Biscuit. SPIFFE established workload identity. RFC 8693 established delegation semantics for token exchange. Mandatum builds on all of it and claims none of it.

What is new here is narrow: a chain rooted in an authenticated human that survives arbitrary sub-delegation, constraints evaluated over a sequence of actions rather than one call, and a binding to AuthZEN so the chain is input to any conformant engine instead of one vendor's.

If something already does those three things, that is worth knowing before more gets built. Please open an issue — see docs/alternatives.md.

Documentation

Document What it covers
Delegation Assertion specification Format, attenuation rules, verification, AuthZEN binding, sequence evaluation, threat model
docs/alternatives.md What else exists and why it does not close this gap
ROADMAP.md Both tracks, with gates
GOVERNANCE.md Roles, voting, organizational balance
VERSIONING.md Semantic versioning, wire-format versioning, deprecation
CHANGELOG.md What changed, and the known limitations of each release
CONTRIBUTING.md How to get a change merged
SECURITY.md Reporting a vulnerability
Threat model What is defended, from whom, what is assumed, and what is not yet covered
Supply chain How to verify a release, what CI enforces, and the known gaps

Trying it

The whole flow — a human sponsors an agent, that agent sub-delegates something narrower, a resource server verifies what arrives, and an attempt to widen is refused — is a runnable example:

go test -run Example ./pkg/issue/ -v

The source is pkg/issue/example_test.go, and it is the shortest honest description of what the library does.

Contributing

The most useful contribution right now is not code. It is disagreement with the design from someone who has run agent systems in production, or a concrete scenario that the specification cannot express. The specification has an open-questions section that is genuinely open.

See CONTRIBUTING.md.

License

Apache License 2.0.


References

  1. Cloud Security Alliance, State of NHI and AI Security, January 2026.

Directories

Path Synopsis
pkg
issue
Package issue builds and signs delegation chains.
Package issue builds and signs delegation chains.
jose
Package jose implements the minimum of JWS needed to sign and verify Mandatum Delegation Assertions.
Package jose implements the minimum of JWS needed to sign and verify Mandatum Delegation Assertions.
mda
Package mda defines the Mandatum Delegation Assertion wire format.
Package mda defines the Mandatum Delegation Assertion wire format.
verify
Package verify implements chain verification for Mandatum Delegation Assertions, rules V1 through V9 of docs/spec/delegation-assertion.md.
Package verify implements chain verification for Mandatum Delegation Assertions, rules V1 through V9 of docs/spec/delegation-assertion.md.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL