IT-RAT the stack/platform Live demo Guides Console
the contract · under everything

The contract. The boring layer that makes a dozen services one system.

Under the services sits a three-repo platform. agent-passport is the spec: one agent:// identifier, one Passport document, one event envelope. agent-stack-go is the Go binding, with the agent-conform checker. terraform-provider-taipan turns budgets, passports and policies into PR-reviewed code. No shared runtime, no shared database; adopting it is a naming agreement plus a few optional fields.

passport schemav0.1 + v1.0 · stable
event envelopev0.1 to v1.0 · NDJSON
Go bindingagent-stack-go · latest
conformanceagent-conform · files and a chain watcher
as codetaipan_budget · taipan_unit_budget · taipan_agent_passport · taipan_wardryx_policy
licenceApache-2.0
sixty seconds, one grammar

One envelope, end to end.

This is a simulation, labeled as one: a replay of the envelope's normal day. A passport is issued, the planes emit their own event types into one NDJSON stream, two schema versions ride side by side, and agent-conform validates the whole stream at the end. Exit 0.

under the hood

Everything meets at the envelope.

Fourteen registered sources write one shape onto one NDJSON bus: five required fields, six optional ones. Five consumers read it back: the agent-conform CLI validates against embedded copies of the canonical JSON Schemas and, on the box, re-checks every stream's hash chain and writes what it finds to a stream of its own, which is how it is also the fourteenth source; Idryx folds events into the identity graph, TokenFuse Cloud files them into evidence packs, Heraldyx mails the operator about the few worth interrupting them for, and Trailryx seals the stream into a hash-chained record. On the right, the part your platform team owns: budgets, passports and policies as Terraform resources.

tokenfuse engram idryx qryx wardryx verdryx mockryx console heraldyx vouchryx scopyx costcrew typryx agent-event bus · NDJSON · one JSON object per line the agent-event envelope required optional schema ts source type agent_id severity run_id on_behalf_of data prev_hash delegation_proof prev_hash: sha256 chain · unknown fields ignored agent-conform Idryx graph TokenFuse Cloud Heraldyx mail Trailryx records schemas · chains logged as identity edges evidence packs an alert with a link sealed, hash-chained governance as code terraform-provider-taipan write HCL terraform plan · diff terraform apply taipan_budget taipan_unit_budget taipan_agent_passport taipan_wardryx_policy live in version control, PR-reviewed out-of-band edits surface in the next plan
what it pins down

Boring on purpose. Load-bearing anyway.

The passport

One agent, one URI: agent://trust-domain/path, at most 255 bytes, aligned with SPIFFE without requiring it. The document behind the ID names an owner, a runtime and one of six attestation methods. The delegation chain is ordered root first, acyclic, and capped at 32 entries.

The envelope

Five required fields: schema, ts, source, type, agent_id. Four versions stay live by design: v0.1 with a closed source enum, v0.2 with an open string, v0.3 adding a self-declared, claimed agent_id, and v1.0, which is v0.3's shape under the 1.0 compatibility promise. The passport document has two, v0.1 and v1.0. Event types live in a per-source registry, so tokenfuse can add a type without asking engram.

The Go binding

agent-stack-go ships passport.Parse, an append-only event.Writer and chain.Validate. passport and chain need only the standard library; event adds one dependency, gowebpki/jcs, for the RFC 8785 canonical JSON its hash chain is computed over. It is the same validation Idryx runs on ingest: a passport that parses in your pipeline parses in the graph.

agent-conform

A standalone conformance CLI with the canonical JSON Schemas embedded. Files are classified by their own schema field, and unrecognized content is a FAIL, never silently skipped. Exit 0 or exit 1; it has already caught a real 63-versus-64 hex character prev_hash defect. Since agent-stack-go v1.1.0 it also runs on the box as watch-dir: it re-checks every stream's hash chain and writes chain_broken (high) or chain_unchained (low) to its own stream, exiting 2 on a usage or I/O error. It ships as a signed, distroless image, ghcr.io/taipanbox/agent-conform, and runs by default every five minutes on the single box and every fifteen on a cluster.

Governance as code

Four Terraform resources: taipan_budget, taipan_unit_budget, taipan_agent_passport, taipan_wardryx_policy. Run budgets, business-unit budgets, passports and policies get PRs, plans and diffs like everything else, and edits made out of band surface on the next plan. Where the API has no delete, the provider says so instead of pretending.

Honest scope

The provider is published on the Terraform Registry as TAIPANBOX/taipan: a normal required_providers block and terraform init pull it, GPG-verified, no build-from-source needed. The passport is metadata, not a token, and the spec is not an authentication protocol. Small claims, kept.

try the whole thing

Run the live stack locally.

Two ways in, and they are for different machines. On your own laptop the sandbox builds from source and binds loopback only. On a Linux box you own, one line pulls the published images and the whole governed stack is up in under two minutes.

on a box you own · fastest
curl -fsSL https://raw.githubusercontent.com/TAIPANBOX/stack-single/main/install.sh | bash

Nothing is compiled: every plane is pulled from the public registry at a pinned version. Measured on 2026-09-13 on a fresh 2-vCPU cloud machine, from that line to a console answering on loopback: 109 seconds, with every one of the installer's own checks green; on 2026-09-17, on a mini PC that already had Docker, 61 seconds for the first run (exit 1: 22 checks ok, and one that fails by construction, since it probed loopback whatever the bind address was; fixed by stack-single #59) and 36 seconds for the second, with the same 22 checks ok. It needs root on Debian or Ubuntu, and docker and git; it comes back after a reboot (measured once, on 2026-09-17, on a box whose gateway sat on a tailnet address: the first reboot lost the gateway until the installer learned to order Docker after the tunnel, the second brought it back on its own); and it is reachable by agents running anywhere else, which the same day proved from two clouds at once.

on your laptop · no Docker
git clone https://github.com/TAIPANBOX/stack-up
cd stack-up && ./up.sh

The sandbox, and it builds from source on purpose: nothing but your own compilers touches it. That is the cost as well as the point, so it wants Rust, Go, Node and Python already installed. Measured on 2026-09-01 from an empty build cache: 221 seconds to a working dashboard. A cold run with both optional planes took 325 seconds on 2026-09-13. Binds 127.0.0.1 only, stops on Ctrl-C, keeps nothing.

What the first run does

Open the link it prints and you are looking at your own local money plane, live, with a short demo dataset already in it. Point an agent's OpenAI base URL at the gateway to feed it your own.

It builds and starts the stack's long-running services from source. Those are TokenFuse's gateway, cloud and dashboard, plus Wardryx, Idryx and Scopyx: six ports on loopback, as the stack-up README's port table lists them. Heraldyx is pinned to file mode there, writing what it would have mailed rather than mailing it. Trailryx is built and wired as a sealing routine rather than a port. Engram, Qryx, Verdryx and Mockryx are deliberately not servers: they are libraries and one-shot CLIs, installed into your home directory and started when you want them, each with its own try-it on its page. The delegation plane and the FinOps console stay behind a flag, --with-delegation and --with-finops, because one needs an issuer to trust and the other is a different product.

Press Ctrl-C and it stops clean, with no orphaned processes.

stack-single on GitHub · Apache-2.0 stack-up on GitHub · Apache-2.0
what comes up
gateway:4100 · budgets
cloud + dashboard:8080 · :3000
wardryx:8090 · policy
idryx:8081 · identity
every bind127.0.0.1 only

git, Rust, Node and Python; Go adds the policy and identity planes. macOS or Linux. A sandbox to try the stack, not a production deployment.

on your own infrastructure

The stack is a control plane. Your agents can be anywhere.

Nothing here has to sit next to the agents it governs. An agent points its model endpoint at the gateway and asks the policy plane before it acts, so it can run in EKS, in GKE, in a CI job or on a laptop while the stack runs once, on infrastructure you own. That is the whole deployment question: where the control plane lives, not where the work does.

one box

The shape the stack is actually built for: the planes share a filesystem, which is how they talk. One script puts all of it on a box you own, and it comes up closed.

installone script
gatewayhost loopback, published only on purpose
every other planeno host port at all
the consoleover WireGuard the box issues
imagesthe same as the cluster path
Commands and what it verifies
git clone https://github.com/TAIPANBOX/stack-single
cd stack-single && ./install.sh
GATEWAY_BIND=0.0.0.0 ./install.sh
ANTHROPIC_BASE_URL=http://<your box>:4100

It comes up closed: the gateway lands on the host's loopback and everything else has no host port at all, so a box that just ran an install script is not serving an enforcement plane to the internet because nobody typed anything. One variable publishes the gateway when you mean to. Same images and same service names as the cluster deployment, because Docker resolves http://wardryx:8090 exactly the way a Kubernetes Service did.

The sandbox above is this shape already, with one deliberate difference: it binds loopback only, so nothing on it is reachable by an agent on another machine. That is correct for trying it and wrong for serving a fleet.

It also brings up a WireGuard server for the people who run the box, so the console is reached over a tunnel it issues rather than an SSH forward you keep alive by hand. That is the one port here published on purpose: WireGuard answers nothing at all without a valid key, unlike an HTTP plane.

It ends by verifying itself, and three of its checks have to FAIL to pass: the money plane and the policy plane must not answer on the host, and a gateway bound to one address must not answer on loopback. Three more test the credential rather than the port, because a plane with a malformed key spec starts cleanly, stays reachable, and authenticates nobody. One more reads back the rule Docker actually wrote for port 4100 instead of trusting the variable meant to set it, because a default that says loopback while the port says otherwise is worse than no default at all.

stack-single on GitHub · Apache-2.0
or a Kubernetes cluster

For teams whose answer to everything is a cluster. One script brings up k3s across your nodes with the CNI, storage and hardening the stack actually needs, then the workload applies from plain manifests.

installone script
proven onHetzner, AWS and GCP
what it buyshigh availability
what it costsa ReadWriteMany volume
traps132 documented, with whose fault each was
Commands and the trade
git clone https://github.com/TAIPANBOX/stack-k8s
cd stack-k8s && ./deploy.sh --servers ... --hcloud-token ...

Both paths are one command, and both ask what they need before the long part rather than failing on it afterwards. So the trade is not convenience. Kubernetes buys high availability and costs you the one thing a single box gets for free: the planes couple through a shared event log, so a cluster needs a ReadWriteMany volume for it.

That trade, and every other thing that bites, are documented in the repositories rather than discovered by you. The same manifests came up on six clusters across Hetzner, AWS and GCP, and exactly one line of Kubernetes configuration differs between the three: Calico has to encapsulate unconditionally on GCP, because a GCE VPC routes every packet by destination and a pod address matches no route. Every trap we hit is written down and already fixed in the files.

stack-k8s on GitHub · Apache-2.0
the contract

One contract, shared by every service.

Every event carries one agent_id and an explicit schema field. The canonical JSON Schemas ship with agent-conform, which checks a file against them. Anyone can implement the contract; it is Apache-2.0.

in the stack

The layer every other page stands on.

Every other page on this site is a producer or a consumer of this contract. TokenFuse pushes its incident taxonomy through the envelope verbatim, zero renaming. Wardryx answers policy_deny in schema v0.2. Engram writes memory_written and reflection_run into the same stream, and Idryx reads everything back into one identity graph, checking passports with the same passport.Parse this platform ships. Different rooms, one grammar.

What the contract is for, in practice: AI agent governance and the controls it lets independent tools share.

try it now
go get github.com/TAIPANBOX/agent-stack-go@v1.3.0
go install github.com/TAIPANBOX/agent-stack-go/cmd/agent-conform@latest
agent-conform passport.json events.ndjson

This installs nothing of the stack: it is the contract itself, for an agent of your own. Exit 0 means every file and every NDJSON line conforms; exit 1 means at least one did not. That is the whole interface.

Download, any platform

Every one of those addresses always serves the newest release, so a link saved today still works after the next one. The asset names carry no version, which is what makes that true; the version lives inside the binary, where agent-conform -version reads it back.

common questions

The contract every service agrees on

What is an Agent Passport?

One identifier and one document per agent: an agent:// URI of at most 255 bytes, aligned with SPIFFE without requiring it, and a document naming an owner, a runtime and one of six attestation methods. The delegation chain behind it is ordered root first, acyclic, and capped at 32 entries.

Do I have to adopt the whole stack to use the contract?

No. There is no shared runtime and no shared database. Adopting it is a naming agreement plus a few optional fields on events you already emit, which is why a service can add an event type without asking any other service for permission.

Can budgets and policies live in version control?

Yes. Four Terraform resources cover run budgets, business-unit budgets, agent passports and policies, published on the public Terraform Registry, so governance gets pull requests, plans and diffs like the rest of your infrastructure. Where the API has no delete, the provider says so instead of pretending.

How do I check that my events actually conform?

Run agent-conform. It carries the canonical JSON Schemas, classifies each file by its own schema field, treats unrecognised content as a failure rather than skipping it quietly, and exits 0 or 1. It has already caught a real 63-versus-64 character hash defect.

On a box, agent-conform watch-dir re-checks every stream's hash chain and writes a chain_broken event to its own stream when one breaks; it exits 2 on a usage or I/O error. stack-single runs it every five minutes and stack-k8s runs it as a CronJob every fifteen minutes. stack-up runs it once a day, at 06:52, as a routine.