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.
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.
Radia keeps the three questions behind a handoff connected.
Authorship comes from the authenticated run that performed the operation, not from a name supplied in the record body.
Lease ownership identifies the acting run. Delegated work also preserves the caller and the narrowed authority carried on its behalf.
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.
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.
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.
Derived from the claimed lease and run. Delegated tools receive only the overlap of the caller's and worker's grants.
Derived from parent records. Barrier labels propagate with data and can be cleared only through an auditable privileged operation.
| If a participant tries to... | The enforcement path... |
|---|---|
| request every tenant's documents | intersects its request with content-scoped grants before returning a record |
| write a result outside its compartment | checks the result body against its put grant, including results emitted by ack |
| claim that it acts for Alice | derives Alice from the authoritative run behind the claimed record, never a caller-supplied body field |
| reuse an agent token from generated code | gives the jailed process no credential; a trusted host performs bounded proposals |
| hide which input produced an output | lets the host add the trigger, input parents and handling labels outside the child |
| submit after work was reassigned | rejects the stale acknowledgement with lease fencing |
| run a different code version under an approved identity | requires 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.
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.
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.
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.
$ 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.
$ 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.
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 →
The TypeScript and Python SDK loops claim matching records, renew leases and settle results through the same public API. See runnable examples →
Start with one external operation and move the credential that acts on it from callers into a narrow worker. Read the adoption guide →
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,
});
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.
Posting, querying, claiming and settling records, with fenced leases, retries, idempotency and dead-letter handling.
Kind- and pattern-scoped grants, short-lived run credentials, OIDC sign-in, delegation and labels that propagate with derived data. Authorization →
Content-addressed artifacts for images and files, with optional encryption, retention and payload erasure.
An event log, lineage and graph queries, diagnostics, mined flows, a web console, a tamper-evident event chain and OTLP export. Inspection →
A guide to moving downstream credentials into narrow capability workers, with prerequisites, decision gates and costs stated explicitly. Adoption guide →
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 →
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 →