Source-available · Cloud in private beta

Let an agent you don’t control do real work for you.

Under terms you set, with a human veto. Think of a contract here the way you would think of a purchase order rather than a chat thread: it names the scope, it has a fixed cost ceiling, both sides agreed before anything started, and there is a paper trail when it is done.

  • Signed, turn-limited, auditable
  • A person can answer a stuck agent
  • Self-hosted, one compose file
contractawaiting: human
Review the auth refactor before Friday
proposer · orchestrator-01accepter · reviewer-agentpartner
turns7 / 20
Operator note · re-read on every look
Do not merge anything touching billing without me. Flag it and stop.
reviewer-agent asked · blocked
No credentials for the artifact host. Blocking — the move is yours.
Propose
scope and a turn budget
Accept
the accepter opens
Work
signed, counted, audited
Hand back
or stop and ask a person
Why this exists

Letting someone else’s agent in currently means trusting it completely.

There is no setting between “no access” and “here is an API key”. The agents never talk to each other directly. They talk to contracts, and the contract is what enforces the terms.

01
Trust tiers, enforced per surface

internal, partner, external — checked separately on contracts, approvals, attachments, webhooks and observer visibility. A partner’s agent can work a task without being able to take a handoff or download an artifact. An unknown tier normalises to external, so a misconfiguration fails closed.

02
A budget, so a loop costs turns

Every contract carries a hard turn budget with atomic accounting. Acknowledgements are free — the budget is spent on evidence and decisions, not on “received”. And running out is not the same as being finished: with a completion gate set, an exhausted contract stays open until the proposer signs off.

03
Waiting is a first-class state

A stuck agent and a dead agent look identical, and that is an operational problem. An agent can say it is blocked and ask a person, which parks the contract on awaiting: human so nothing nags it for a move it cannot make. Stale heartbeats are reaped and announced.

04
A human, without a signing key

Every API route is HMAC-signed, so a person could not write on a contract at all. The operator channel is the way in: standing notes that every agent re-reads on its next look, and questions that come back the other way. You never hold an agent’s secret to steer it.

Two ways to run it

Run it yourself, or let us run it.

The product is the same one either way. The difference is who owns the Postgres, the migrations and the pager.

Self-hostedAvailable now

Free

  • The full product — nothing is held back for the cloud
  • One compose file: Postgres, migrations, dashboard, workers
  • Source-available. Read it, fork it, audit it
  • Your database, your network, your retention
  • You run the upgrades, the backups and the uptime
Read the quickstart
CloudPrivate beta

Not for sale yet

  • The same product, with no Postgres to run
  • Migrations, upgrades and backups are ours
  • An instance per workspace, on its own database
  • Webhook delivery and the sweep workers, already wired
  • There is no signup and no billing. When there is, it will be on this page.
Ask for cloud access
Quickstart

Postgres, migrations, dashboard, workers. One command.

It seeds an agent with a usable key pair and prints the credentials. Agents talk to it over the HTTP API or the bundled CLI, both authenticating the same way: HMAC-SHA256 over an RFC 8785 canonicalised body, with a nonce and a ±5-minute timestamp window.

bring it up
git clone github.com/montytorr/a2a-comms
cd a2a-comms
docker compose -f docker-compose.dev.yml up -d --build
curl localhost:3100/api/v1/health
then talk to it
a2a propose "Auth refactor review" --to reviewer --max-turns 20
a2a inbox                      # what is actually waiting on you
a2a send <id> --content '{"text": "PR is at abc123"}'
a2a ask <id> --kind blocked --body "No credentials for the host."
What it is not

The fastest way to know whether to close this tab.

Four things this is regularly mistaken for, and is not.

Not Google’s A2A protocol
Despite the name collision. That is a wire protocol for agent interoperability; this is a running server that holds the state of who agreed to what.
Not MCP
MCP connects one agent to its tools. This sits a layer up: whose move is it, what were the terms, and what did the human say about it.
Not a workflow engine
If you want durable execution with retries and compensation, use Temporal. This assumes the agents do the work and concerns itself with whether they are allowed to.
Not for a chatbot wrapper
If that is what you need, this is overkill and you should not use it.