Federation Model
See how two operators who share no key admit each other's agents, each kernel under its own policy.
On this page
Agents from two organizations can work in one project while each organization keeps its own kernel, keys, and policy. Federation is that standing relationship: each operator pins the other's kernel from its partner card, the two sign a treaty, and the kernel that serves an action admits it under its own rules.
The running example is the Quickstart's partner, did:chio:z6MkpA7…c2T, connected with Computer.connect("partner") after you add its card. Neither operator holds the other's keys at any point.
Adding the card pins their kernel key
chio partner add partner-card.json --name partner reads the card the partner sent: its org DID, did:chio:z6MkpA7…c2T, its trust-control URL, its authority key history, its receipt-signer keys, and its status resolve URL. Adding it pins the partner's kernel key, 9b07…d31c, in your trust store. Each operator adds the other's card, so each kernel keeps its own pin. Peer pins.
chio partner add reads it: the five fields it carries and the kernel key adding it pins. The DID and key are the Quickstart's illustrative values. Treaty terms, transport, and the conformance evidence the handshake carries are left out.Peer pinsEach operator pins the other's kernel in its own trust store
Each operator runs its own trust domain with chio trust serve, on its own hosts, under its own key custody. The partner's card is the first contact: chio partner add partner-card.json --name partner reads the partner's org DID, trust-control URL, authority key history, receipt-signer keys, and status resolve URL, and pins the partner's kernel key, 9b07…d31c in the Quickstart. The partner adds your card the same way, so each kernel holds its own pin.
chio partner add partner-card.json --name partnerpartner did:chio:z6MkpA7…c2T, named partner kernel 9b07…d31c, pinned from its card control https://kernel.halden.example, authority key history and status resolve URL from the card transport https, mutual TLS handshake verified both ways, tier silver, rotation deadline in 12 h
The two kernels then run the peer handshake. Each signs a challenge that binds both kernel ids, a fresh nonce, and the time; the receiver verifies the response against its pin, negotiates protocol capabilities, and checks the declared conformance tier against local policy. The verified peer record keeps the key, its rotation deadline, and any manifest references on the receiver's side.
MissingTrustAnchor refuses a peer whose card was never added, and UnexpectedPeerKey refuses a declared key that differs from the pin, before any peer state is written. A new key reaches the trust store only through a new card or the partner's authority key history, so exchange cards over a channel you already authenticate. Rejecting a replayed handshake belongs to the transport or the receiving host; the exchange binds a nonce and keeps no seen-nonce store of its own.
Read more in Peer Handshake, which runs the exchange and lists every refusal.
A treaty names what crosses, and the serving kernel admits each action
A treaty lists the actions two operators cooperate on. Both kernels sign it.
import { Computer } from "@chio-protocol/sdk";
const project = await Computer.open("quickstart");
const partner = await Computer.connect("partner");
const treaty = await project.treaty({
partner: partner,
actions: ["workspace.read", "workspace.write", "model.invoke", "merge"],
expiresIn: "7d",
});
console.log(treaty.describe());treaty trt-01aa…4c19, signed by both kernels participants you · partner (did:chio:z6MkpA7…c2T) action you them admitted as workspace.read allow allow either kernel admits under its own policy workspace.write allow allow either kernel admits under its own policy model.invoke allow allow charged at your door merge co-sign co-sign both kernels sign expires in 7 days
from chio import Computer
project = Computer.open("quickstart")
partner = Computer.connect("partner")
treaty = project.treaty(
partner=partner,
actions=["workspace.read", "workspace.write", "model.invoke", "merge"],
expires_in="7d",
)
print(treaty.describe())treaty trt-01aa…4c19, signed by both kernels participants you · partner (did:chio:z6MkpA7…c2T) action you them admitted as workspace.read allow allow either kernel admits under its own policy workspace.write allow allow either kernel admits under its own policy model.invoke allow allow charged at your door merge co-sign co-sign both kernels sign expires in 7 days
use chio::{Computer, Treaty};
let project = Computer::open("quickstart").await?;
let partner = Computer::connect("partner").await?;
let treaty = project
.treaty(
Treaty::with(&partner)
.actions(["workspace.read", "workspace.write", "model.invoke", "merge"])
.expires_in("7d"),
)
.await?;
println!("{}", treaty.describe());treaty trt-01aa…4c19, signed by both kernels participants you · partner (did:chio:z6MkpA7…c2T) action you them admitted as workspace.read allow allow either kernel admits under its own policy workspace.write allow allow either kernel admits under its own policy model.invoke allow allow charged at your door merge co-sign co-sign both kernels sign expires in 7 days
Each kernel computes the intersection of both operators' governance ladders for every action, so the stricter requirement wins on both sides. A co-sign action such as merge needs both kernels' signatures. Every other action is admitted by the kernel that serves it, under that kernel's own policy, and a resource is charged at its owner's door.
A grant issued under the treaty travels to the partner's agents, and those agents present a DPoP proof of possession with it at your door. A copied grant without the holder's proof carries no authority.
Source
The handshake verifier lives in crates/trust/chio-federation/src/trust_establishment.rs and treaty intersection in crates/trust/chio-federation/src/treaty.rs, in the Chio repository.
Read more in Treaties and Proof of possession.
Federated work and shared evidence travel on two paths
The cross-kernel federation profile moves signed trust, quorum, admission, reputation, and qualification contracts between two kernels and gates the receipts they co-sign. Bilateral evidence sharing hands a scoped, signed slice of one operator's receipt log to a named partner. Both fail closed: federation data lets an operator see further, and it becomes runtime trust only after the receiver's explicit local activation and review.
Both paths cross over HTTPS by default, authenticated by mutual TLS or a signature over each body. Operators who want a direct connection add the optional iroh lane, authenticated QUIC through self-hosted relays, which carries the signals, revocation, and co-sign lanes. The compliance mappings for NIST AI RMF, the EU AI Act, and ISO/IEC 42001 build on the evidence path.
Read more in Trust Activation Exchange and Share Evidence with a Partner.
Every contract that crosses is a signed document with a registered schema
Three families of signed documents carry every contract. The federation profile, docs/standards/CHIO_FEDERATION_PROFILE.md, defines five root contracts: chio.federation-activation-exchange.v1, chio.federation-quorum-report.v1, chio.federation-open-admission-policy.v1, chio.federation-reputation-clearing.v1, and chio.federation-qualification-matrix.v1. Section 10.2 of the protocol specification adds five more: chio.evidence_export_manifest.v1, chio.evidence_export_disclosure_notice.v1, chio.federation-policy.v1, chio.federated-evidence-share.v1, and chio.federated-delegation-policy.v1. The wire schemas in the schema registry are the third family.
The pages that own the contracts group them by what they settle between the two operators:
- Who the peer is. Operator identity, the peer handshake, peer pins, and the two-org worked example.
- What the relationship permits. Treaties, the trust activation exchange, open admission and stake, and quorum and anti-eclipse.
- What carries a signature across. Federation authority, cross-operator delegation, the revocation oracle, and revocation checkpoints.
- What flows back. Evidence sharing, receipt lineage and buyer packets, and reputation clearing.
- How bytes move. Iroh transport, the transport directory, transport lanes, and limits and backpressure.
- Who stands behind a bearer token. Enterprise identity and the provider registry and SCIM.
- Running and assuring it. Operations, refusal codes, assurance, and the evidence exchange walkthrough.
Wire schemas under spec/schemas/chio-federation/v1
Read from the schema registry at the documentation pin.
| Schema id | Kind | File |
|---|---|---|
chio.capability-lease.v1 | chio_federation_capability_lease | spec/schemas/chio-federation/v1/capability-lease.schema.json |
chio.federation.authority-profile.v1 | chio_federation_authority_profile | spec/schemas/chio-federation/v1/authority-profile.schema.json |
chio.federation.bilateral-invocation.v1 | chio_federation_bilateral_invocation | spec/schemas/chio-federation/v1/bilateral-invocation.schema.json |
chio.federation.cross-boundary-admission-report.v1 | chio_federation_cross_boundary_admission_report | spec/schemas/chio-federation/v1/cross-boundary-admission-report.schema.json |
chio.federation.cross-kernel-continuation.v1 | chio_federation_cross_kernel_continuation | spec/schemas/chio-federation/v1/cross-kernel-continuation.schema.json |
chio.federation.governance-ladder-manifest.v1 | chio_federation_governance_ladder_manifest | spec/schemas/chio-federation/v1/governance-ladder-manifest.schema.json |
chio.federation.issuance-bundle.v1 | chio_federation_issuance_bundle | spec/schemas/chio-federation/v1/issuance-bundle.schema.json |
chio.federation.issuance-request.v1 | chio_federation_issuance_request | spec/schemas/chio-federation/v1/issuance-request.schema.json |
chio.federation.ladder-intersection.v1 | chio_federation_ladder_intersection | spec/schemas/chio-federation/v1/ladder-intersection.schema.json |
chio.federation.lease-scope-binding.v1 | chio_federation_lease_scope_binding | spec/schemas/chio-federation/v1/lease-scope-binding.schema.json |
chio.federation.local-signing-keys.v1 | chio_federation_local_signing_keys | spec/schemas/chio-federation/v1/local-signing-keys.schema.json |
chio.federation.peer-pins.v1 | chio_federation_peer_pins | spec/schemas/chio-federation/v1/peer-pins.schema.json |
chio.federation.receipt-lineage-bundle.v1 | chio_federation_receipt_lineage_bundle | spec/schemas/chio-federation/v1/receipt-lineage-bundle.schema.json |
chio.federation.receipt-lineage-statement.v1 | chio_federation_receipt_lineage_statement | spec/schemas/chio-federation/v1/receipt-lineage-statement.schema.json |
chio.federation.revocation-checkpoint.v1 | chio_federation_revocation_checkpoint | spec/schemas/chio-federation/v1/revocation-checkpoint.schema.json |
chio.federation.revocation-publication-request.v1 | chio_federation_revocation_publication_request | spec/schemas/chio-federation/v1/revocation-publication-request.schema.json |
chio.federation.treaty-negative-fixture-corpus.v1 | chio_federation_treaty_negative_fixture_corpus | spec/schemas/chio-federation/v1/treaty-negative-fixture-corpus.schema.json |
chio.federation.treaty-runtime-negative-fixture-corpus.v1 | chio_federation_treaty_runtime_negative_fixture_corpus | spec/schemas/chio-federation/v1/treaty-runtime-negative-fixture-corpus.schema.json |
chio.federation.treaty-scope.v1 | chio_federation_treaty_scope | spec/schemas/chio-federation/v1/treaty-scope.schema.json |
chio.federation.verification-context.v1 | chio_federation_verification_context | spec/schemas/chio-federation/v1/verification-context.schema.json |
chio.federation.verifier-trust-bundle.v1 | chio_federation_verifier_trust_bundle | spec/schemas/chio-federation/v1/verifier-trust-bundle.schema.json |
chio.governance-receipt.v1 | chio_federation_governance_receipt | spec/schemas/chio-federation/v1/governance-receipt.schema.json |
Revocation and status reach a partner as signed state it checks locally
A receiver enforces revocation from the verified state it holds. Once an update arrives and is installed, every later check refuses the affected capability and its descendants. Signed revocation feeds and catch-up move that state between operators, so propagation takes the time a feed takes to arrive.
A deployment with a revocation view also refuses snapshots outside the view's configured freshness bound; without one, validation reads the local revocation store. Each kernel pulls its partner's issuer-signed lifecycle status from the status resolve URL and keeps it for its TTL, and a status past its TTL fails closed until a fresh one arrives. Revoking a treaty ends every grant issued under it, delegated grants included.
Key rotation is not a revocation. The partner's new authority key extends the history its card carries, so the pin follows the rotation without an outage, and a receipt signed under a previous key still verifies offline.
Read more in Bilateral Receipts, which covers feed publication, subscription, and freshness.
Two operators declare every relationship, one peer at a time
Federation connects operators who chose each other. Four consequences shape what a deployment can expect from it:
- Declared, pinned relationships. Each relationship is declared by its operators and pinned peer by peer; Chio runs no permissionless global identity network.
- Local reputation. Imported reputation is attenuated, tagged with its provenance, and kept apart from the receiver's native local record. No universal score exists.
- Discovery without admission. A discovered public identity document supports interoperability. Authority widens only through a card, a treaty, and the receiver's own admission.
- Defined credential transport. Credentials travel in the Chio projected-passport family and the narrow OID4VP verifier profile, in place of DIDComm or generic wallet messaging.