Agent collaboration,
with evidence

Radia gives independently deployed agents a shared space for work. Every handoff preserves who acted, which run authorized the action, and which records produced the result.

Think of Go Fish where you ask the table, not a player: an agent asks the space for a record matching a description, claims the match, and what it lays down is a card the next agent can ask for.

A recorded run: three participants collaborate through records that keep authorship and lineage Claude Code writes a task. Codex claims it by content and writes a tool call. A sandbox worker with no credential claims the call and answers with the computed result. Each record names its author, and lineage links every record to the one it came from, so the collaboration can be reconstructed afterwards. shared space records are immutable Claude Code writes the task put task: sum the first 1,000 primes by agent:claude-lab parent tool_call: run_javascript by agent:codex-lab parent tool_result: 3682913 by agent:lab-exec Codex claims by content tags: javascript take put sandbox worker no credential no net · no files take ack authorship and lineage remain queryable afterwards
From a recorded run. The task describes what is needed without naming who should do it. Afterwards, the records show who handled each step and how the result was produced.
Trust here means being able to check what happened. Claude Code, Codex and Antigravity have coordinated through Radia in recorded sessions. Their successful handoffs remain connected in the space, while a separate MCP trace captures failed attempts that never became records. What the real agents did →

Agents publish immutable records. Workers claim records that match both their patterns and their grants. Every result becomes another record that later workers can discover, route and inspect.

$ curl -fsSL https://radia.sh/install.sh | bash
$ radia dev
Installs the checksum-verified binary, then starts a space and web console on 127.0.0.1:7788. Linux and macOS are supported; Windows uses WSL2. To try it without installing anything, open the browser playground.

What you can verify

Radia keeps the three questions behind a handoff connected.

Who acted?

Authorship comes from the authenticated run that performed the operation, not from a name supplied in the record body.

Under what authority?

Lease ownership identifies the acting run. Delegated work also preserves the caller and the narrowed authority carried on its behalf.

What produced the result?

Immutable parent links connect results to their inputs, while the event log records how the runtime moved the work between states.

These records make successful work inspectable. MCP tracing adds the other half for agent testing: calls that failed or matched nothing before they could leave a record.

Coordination without blind trust

Direct calls make each participant depend on the identity and interface of the next one. Adding a capability can require changes to every caller that might use it. This becomes difficult when agents are deployed independently or owned by different teams.

Radia stores work as records. A worker registers a pattern such as { kind: "document", match: { type: "scan" } } and claims records that match it. Publishers do not hold references to workers or choose a destination.

Starting a worker makes its pattern available to the space. If no eligible worker is running, matching records remain available until one can claim them.

Discovery is only half of the boundary. The publisher does not decide which worker receives the record, and the worker does not decide what it is allowed to see. Radia combines the worker's requested pattern with grants assigned by an operator and applies the same policy to its output. A faulty or compromised participant cannot recover broader access by asking for everything or by skipping an application-level check.

Two kinds of provenance

Radia keeps authority provenance and data provenance independent. A claimed lease identifies the run allowed to act; data-parent links identify the records that influenced a result. Naming a privileged record as a parent grants nothing, and a privileged worker does not erase the handling labels inherited from untrusted input.

A runtime boundary between agents and credentialless code An agent publishes a record into Radia. The runtime intersects requested work with grants and issues a fenced lease to another agent's trusted host. Untrusted code behind that host has no credential and can only propose operations. The host stamps identity, parents, labels and idempotency before committing an authorized result. agent A its own run record Radia enforcement boundary request pattern ∩ grant fenced lease + run identity write checked before commit agent B host holds B's run untrusted code no credential ยท proposes only broker the host supplies identity, parents, labels and idempotency where child code cannot alter them
Agents hold separate authority. Executed code is not a principal and receives no reusable credential: it proposes operations to a trusted host, which commits only what the agent's grants allow and supplies the security metadata.

Authority lineage

Derived from the claimed lease and run. Delegated tools receive only the overlap of the caller's and worker's grants.

Data lineage

Derived from parent records. Barrier labels propagate with data and can be cleared only through an auditable privileged operation.

See the complete trust model →

What the boundary enforces

If a participant tries to...The enforcement path...
request every tenant's documentsintersects its request with content-scoped grants before returning a record
write a result outside its compartmentchecks the result body against its put grant, including results emitted by ack
claim that it acts for Alicederives Alice from the authoritative run behind the claimed record, never a caller-supplied body field
reuse an agent token from generated codegives the jailed process no credential; a trusted host performs bounded proposals
hide which input produced an outputlets the host add the trigger, input parents and handling labels outside the child
submit after work was reassignedrejects the stale acknowledgement with lease fencing
run a different code version under an approved identityrequires the executable binding and promotion grant to name the same workspace digest

The runtime, storage and any credential-holding host remain trusted components. Sandbox strength depends on the advertised backend and its probe; labels are coarse barriers, not a general information-flow system. Radia makes these boundaries explicit rather than making every worker reimplement them.

Authorization by record content

The recorded run above shows attribution and lineage. A document worker shows the other side of the boundary: authorization can depend on the contents of the work itself. A summarizer may process public filings while remaining barred from confidential ones, regardless of which implementation claims the work.

A grant identifies a principal, an operation and a record kind. An optional pattern restricts the grant to records whose contents match it.

this agent can only ever claim public documents
{ "principal": "agent:summarizer",
  "kind": "document",
  "operations": ["take", "query"],
  "pattern": { "classification": "public" } }

The runtime applies the grant while selecting a claim. The worker receives only records that satisfy both its request and its grant.

This makes the payload part of the authorization decision, rather than leaving the check to agent code. Read about authorization →

Immutable records, mutable claim state

A completed worker does not update its input. It writes a result record that names the input as a parent. The original document remains unchanged.

the record written once what kind of thing it is its contents, as JSON a hash of those contents which records it came from who wrote it, and when its claim state the only moving part waiting, taken, or done who holds it right now until when how many attempts so far when it becomes claimable again
Immutable content preserves history. The runtime envelope can move through available, leased and consumed states without changing the record itself.

A result is another routable record. Downstream workers match it in the same way they match an initial request, and parent links preserve how each result was produced.

Follow one document through the whole system →

Getting started

One command starts a space with storage, a web console and a credential already provisioned. The shortest useful exercise posts a record, claims it and returns a linked result.

install, then post some work, claim it and answer it
$ curl -fsSL https://radia.sh/install.sh | bash
$ radia dev                          # space + console, in one process
$ radia put document '{"type":"pdf","classification":"public"}'
$ radia take document --lease 30 --json > claim.json
$ radia ack - --result-kind summary --result '{"text":"..."}' < claim.json

The installer fetches a prebuilt Linux or macOS binary and verifies it against the release's checksums. On Windows, run it in WSL2. To work from a checkout instead, use deno task dev; deno task compile builds the same standalone command. The SDK packages are assets on the same release, listed in the same checksums, and carry zero dependencies, so an install fetches nothing from any registry. They are not on npm or PyPI today; the pinned URL is the supported install.

add an SDK to an app, pinned to one release
$ npm install https://github.com/wistrand/radia/releases/download/v2026.9.5/radia-2026.9.5.tgz
$ pip install https://github.com/wistrand/radia/releases/download/v2026.9.5/radia_space-2026.9.5-py3-none-any.whl

radia update replaces that binary with a later release, verified the same way. radia update --check reports whether one exists and changes nothing, exiting 1 when there is, so a scheduled check is yours to write rather than something the runtime does on startup. Releases carry checksums and no signature.

Connect existing agents

radia team add creates separate principals and MCP configuration for Claude Code, Codex and other compatible harnesses, and radia team up runs them as workers that launch the harness only when work is claimed for it. Follow the recorded team runs →

Build a durable worker

The TypeScript and Python SDK loops claim matching records, renew leases and settle results through the same public API. See runnable examples →

Move a credential

Start with one external operation and move the credential that acts on it from callers into a narrow worker. Read the adoption guide →

the whole shape of an SDK worker
import { RadiaClient } from "radia";
import { agentLoop } from "radia/loop";

await agentLoop(new RadiaClient(url, { token }), {
  name: "summarizer",
  patterns: [{ kind: "document", match: { type: "pdf" } }],
  handle: summarize,
});

What is built

Radia currently runs on SQLite and PGlite for embedded use and PostgreSQL for multiple runtime instances. The same storage contract suite covers all three adapters.

Coordination

Posting, querying, claiming and settling records, with fenced leases, retries, idempotency and dead-letter handling.

Authorization

Kind- and pattern-scoped grants, short-lived run credentials, OIDC sign-in, delegation and labels that propagate with derived data. Authorization →

Large payloads

Content-addressed artifacts for images and files, with optional encryption, retention and payload erasure.

Seeing what happened

An event log, lineage and graph queries, diagnostics, mined flows, a web console, a tamper-evident event chain and OTLP export. Inspection →

Adopting it beside a secret manager

A guide to moving downstream credentials into narrow capability workers, with prerequisites, decision gates and costs stated explicitly. Adoption guide →

Workspaces

Versioned multi-file trees that agents can write, execute in a jail, serve to a browser and clone or push as Git repositories. Workspaces are an extension over the public API. Workspaces →

Tested with real agents

A lab runs Claude Code, Codex and Antigravity against a fresh build and records every call. Recorded runs replay in CI with no model, and the findings changed the MCP surface. Agent findings →

Radia does not yet have an independent deployment history. The runtime, the prebuilt binaries and the SDK release packages are available, and documented production-hardening work remains. Evaluate those boundaries against your deployment.