MAQPNADocs

How MAQPNA compares#

Two comparisons come up first: containers versus sandboxes, and agent frameworks versus a runtime.

Containers versus sandboxes#

Containers were designed for trusted code from CI running as stateless replicas. Agents are the opposite: long-lived, stateful sessions running code an LLM wrote a moment ago, calling tools and other agents on behalf of a person.

Classic container workload Agent session in a MAQPNA sandbox
Code Trusted, built in CI Untrusted, generated at runtime
Kernel boundary Shared host kernel (runc) gVisor user-space kernel, a microVM guest kernel or a confidential VM; never plain runc
Lifecycle Stateless replicas (Deployment) One sandbox per session, owned by the AgentSession, with TTL, suspend, resume and fork
Start time Seconds, cold Warm pools with late binding for fast starts
Egress Usually default-allow Default-deny; only DNS and the gateway
Identity A service account shared by all replicas A short-lived token per session naming the agent, the person it acts for and its scopes; no service-account token in the pod
Credentials Mounted secrets, long-lived None in the sandbox; the gateway injects upstream credentials
Authorisation Kubernetes RBAC on the API server A policy decision on every tool, model and egress call
Logs Mutable, for debugging A tamper-evident ledger, for evidence
flowchart LR
    subgraph C["Plain container"]
      C1["agent code"] --> C2["host kernel"]
      C1 --> C3["any destination<br/>(default-allow egress)"]
      C4["long-lived API keys<br/>in env or volume"] --> C1
    end
    subgraph S["MAQPNA sandbox"]
      S1["agent code"] --> S2["gVisor, microVM or<br/>confidential VM"]
      S1 --> S3["MAQPNA gateway only"]
      S4["15-minute scoped<br/>session token"] --> S1
      S3 --> S5["policy · DLP · approvals<br/>budgets · audit ledger"]
    end

MAQPNA does not reinvent the sandbox: it builds on the upstream kubernetes-sigs/agent-sandbox project, gVisor, Kata Containers with Firecracker and Confidential Containers, and adds trust tiers, delegated identity, policy enforcement and evidence on top.

An agent framework versus a runtime#

An agent framework (LangGraph, CrewAI, the OpenAI Agents SDK, the Claude Agent SDK, the Vercel AI SDK) decides what the agent does: prompts, planning, tool selection, memory. A runtime decides where it runs and what it is allowed to do. MAQPNA is a runtime.

Concern Agent framework MAQPNA
Prompting, planning, tool choice Yes No
Where the code runs and how it is isolated No Sandbox per session, trust tiers
Who the agent acts for Application convention Signed identity with the person in act
Whether a tool call is allowed Optional in-process guardrails the agent could bypass Enforced outside the agent, at the gateway
Human approval Optional, in-process Approvals with four-eyes, separation of duties and user approval (CIBA)
Stopping a misbehaving agent Kill the process Kill switch across the installation; sessions suspended or terminated
Proof afterwards Application logs Hash-chained ledger with signed checkpoints

The two work together. Your agent keeps its framework and points its MCP client at MAQPNA_TOOL_<NAME>_URL and its OpenAI-compatible client at MAQPNA_MODEL_ENDPOINT. The MAQPNA SDKs (Python, TypeScript, Go) add token handling, approvals, result reporting and adapters for LangChain and LangGraph, CrewAI, the OpenAI Agents SDK, the Claude Agent SDK and the Vercel AI SDK. The same code runs under maqpna dev on a laptop and in a cluster.

Because enforcement happens outside the agent process, a prompt-injected agent cannot switch it off: it can only ask the gateway, and the gateway decides.

What you see#

maqpna dev run -- python agent.py runs an unmodified agent under a session identity, with MAQPNA_GATEWAY_URL, MAQPNA_TOKEN and MAQPNA_TOOL_<NAME>_URL set; maqpna dev timeline --last then shows every call it made and the decision on it. See the developer loop and maqpna dev run.