Chio/Docs
LOGIN · JOIN
  • OwnerYou keep the consequential actions and delegate the rest.
  • AnalysisEach agent holds only the scope its task needs.
  • TestsGrants stand alone. Revoke one and the others keep working.

Vision

03Autonomy with AuthorityAutonomy with Authority

Give agents responsibility
and room to act.

Let agents choose how to pursue their assignments while the kernel enforces the authority you delegate.

Read the essayBuild a team with bounded authority

Essay chio@5f63e6e

Next · 04Cooperation Across Companies
Contents
Each worker receives its own grant.Interactive illustration
A sage owner at a desk directs two smaller workstations through separate connections: a lavender analysis worker and an amber test worker. Completed contributions and the publication control stay with the owner.
OwnerKeeps publication
AnalysisRead scope only
TestsOwn grant · still active
Chio workshops Interactive illustration
Chio workshops

The complete workshop. Zoom to explore its details.

A sage owner at a desk directs two smaller workstations through separate connections: a lavender analysis worker and an amber test worker. Completed contributions and the publication control stay with the owner.
Workers contribute under separate grants.
Both workers have contributed. Revoke the analysis grant: its next read will be refused, while the test worker can continue and both contributions remain.
Inspect the candidate, scopes, and retained evidence

The illustration starts after two contributions to an authored retry repair. The browser computes the test assertions. No live credential is issued or revoked.

Supplied candidate · retry.ts
--- retry.ts (supplied baseline)
+++ retry.ts (supplied candidate)
- return 1000 * 2 ** attempt;
+ return Math.min(1000 * 2 ** attempt, 8000);

Requirement: no individual delay above 8,000 ms. An authored fixture; both workers inspect the same candidate.

The baseline reaches 32,000 ms at attempt 5. The supplied candidate caps each delay at 8,000 ms. Check the cap boundary; this patch does not limit the total number of retries.

CheckExpectedActual
retryDelay(3)8,0008,000 ✓
retryDelay(5)8,0008,000 ✓
retryDelay(10)8,0008,000 ✓
  1. The operator supplied a candidate patch. Neither worker has contributed yet.
  2. Analysis contribution retained. The cap boundary needs an edge test before the candidate is ready for review.
  3. Edge assertions computed over the supplied candidate and retained. Publication still requires its owner’s decision.
Download authority review

Give the agent room to be useful.

Autonomy lets an operator assign a responsibility without prescribing every action needed to fulfill it. An agent can investigate, choose an approach, and request help within a defined mandate. Chio separates those planning choices from the authority to act, so an application can give agents useful responsibilities while keeping resource decisions enforceable outside their reasoning.

The grant bounds which choices may become effects. It names the subject, the tools and operations, the lifetime, and the supported constraints. The receiving system evaluates each request against that authority and its configured controls. A task tells an agent what to pursue. A grant establishes what it may do. The agent chooses its approach within that grant.

The retry-patch example requires two contributions: a risk review and passing checks at the delay cap. The analysis worker can read the candidate; the test worker can run its tests. Neither grant includes publication, so the owner can accept useful work from both without handing either worker the right to release it.

A smaller task deserves a smaller grant.

Delegation lets work branch without copying every privilege of the parent. A coordinator can remove tools, reduce allowed invocations, shorten expiry, and tighten supported constraints. Each child carries the scope its own contribution needs.

The child also carries its lineage. Each link in a delegated grant’s chain records the ancestor’s capability id, the delegating and receiving keys, how the scope narrowed at that step, and when, and the delegator signs it. Before it admits a delegated grant, the kernel also requires a stored snapshot of every ancestor and refuses a chain whose ancestors it cannot find or whose recorded depth or parent disagrees. That lineage is what later lets a branch of the team be ended as a unit.

The receiving evaluator must establish the narrowing under the selected delegation model. The complete delegated-worker application uses one-hop child credentials, records an attempted scope expansion, and shows a worker refused another worker’s tool. Recursive teams need a fuller account: Chio’s swarm authority model checks a signed graph with the required scope witnesses, routes, budgets, and revocation evidence. The one-hop illustration does not implement that recursive verifier.

Keep the consequential decision with its owner.

An engineering team can assemble a tested candidate while publication remains a separate decision. In the local specimen, the candidate becomes ready for owner review only when the analysis and the passing edge assertions are both present. The test computes the supplied function over explicit inputs; it does not execute a repository or deploy a patch. A reviewer should see the actual target and parameters being authorized. If the action changes, the application needs authorization for the changed action.

That leaves an agent three useful responses: proceed within the mandate, present a specific decision to its owner, or choose another permitted approach. A refusal can improve the plan. Retrying the same request does not create permission.

Autonomy is useful when an agent can act on a clear mandate and recognize when it needs a different one.

Resource use belongs in that mandate too. A per-call ceiling limits a request; it does not reserve shared money across sibling workers. A team that consumes a common allowance also needs its selected budget authority and accounting state.

Revocation preserves earlier records.

A system can change its team while retaining the work each member contributed. Revoking the analysis grant refuses its next read. The test worker continues under its own grant, and both earlier contributions stay visible. A worker’s current authority and the work it already did are separate records, and revocation changes only the first.

The kernel draws the same line. Revoking a grant writes one id to the revocation store; nothing is sent to the grant’s descendants and nothing about them is edited. The branch closes at admission. The kernel checks the presented grant’s own id, then walks its delegation chain and asks the store about each ancestor. The revoked grant is refused with CapabilityRevoked; a descendant is refused with DelegationChainRevoked, naming the ancestor where the walk stopped. Its parent and siblings carry no revoked id and keep working.

Revoking the coordinator stops new calls from the whole team. Revoking the reader stops only that branch. Calls admitted before revocation remain in the record.

Revoking one grant in a delegation tree: its subtree is refused from then on; its parent, its siblings, and every earlier call are unchangedselect a grant to revoke itallowedrefusedcalls before revocation standt
trev\htmlClass{role-deny}{t_{\mathrm{rev}}}
ccoordinatorCapabilityRevokedaanalysisDelegationChainRevoked(a)rreaderstests
deny(x)  ⟺  revoked(x)⏟CapabilityRevoked  ∨  ∃ ℓ∈chain(x):revoked(ℓ)⏟DelegationChainRevoked(ℓ)\mathrm{deny}(\htmlClass{role-call}{x}) \iff \underbrace{\htmlClass{role-deny}{\mathrm{revoked}}(\htmlClass{role-call}{x})}_{\texttt{CapabilityRevoked}} \;\lor\; \underbrace{\exists\, \htmlClass{cor-parent}{\ell} \in \mathrm{chain}(\htmlClass{role-call}{x}) : \htmlClass{role-deny}{\mathrm{revoked}}(\htmlClass{cor-parent}{\ell})}_{\texttt{DelegationChainRevoked}(\htmlClass{cor-parent}{\ell})}
closed(a)={ x:x=a  ∨  a∈chain(x) }={a,r}\mathrm{closed}(\htmlClass{role-deny}{a}) = \{\, \htmlClass{role-call}{x} : \htmlClass{role-call}{x} = \htmlClass{role-deny}{a} \;\lor\; \htmlClass{role-deny}{a} \in \mathrm{chain}(\htmlClass{role-call}{x}) \,\} = \{ \htmlClass{role-deny}{a}, \htmlClass{role-deny}{r} \}
Revoking one grant in a delegation tree: its subtree is refused from then on; its parent, its siblings, and every earlier call are unchangedselect a grant to revoke itallowedrefusedearlier calls standt
trev\htmlClass{role-deny}{t_{\mathrm{rev}}}
ccoordinatorCapabilityRevokedaanalysisDelegationChainRevoked(a)rreaderstests
closed(a)={a,r}\mathrm{closed}(\htmlClass{role-deny}{a}) = \{ \htmlClass{role-deny}{a}, \htmlClass{role-deny}{r} \}

Grant a (analysis) is revoked at t_rev. Its subtree, a, r, is closed: a's later calls are refused with CapabilityRevoked and its descendants' with DelegationChainRevoked(a). c and s keep their grants. Every call before t_rev stands.

deny(x)  ⟺  revoked(x)∨  ∃ ℓ∈chain(x):revoked(ℓ)closed(v)={ x:x=v  ∨  v∈chain(x) }\small \begin{aligned} & \mathrm{deny}(\htmlClass{role-call}{x}) \iff \\ & \quad \htmlClass{role-deny}{\mathrm{revoked}}(\htmlClass{role-call}{x}) \\ & \quad \lor\; \exists\, \htmlClass{cor-parent}{\ell} \in \mathrm{chain}(\htmlClass{role-call}{x}) : \htmlClass{role-deny}{\mathrm{revoked}}(\htmlClass{cor-parent}{\ell}) \\[8pt] & \mathrm{closed}(v) = \{\, \htmlClass{role-call}{x} : \\ & \quad \htmlClass{role-call}{x} = v \;\lor\; v \in \mathrm{chain}(\htmlClass{role-call}{x}) \,\} \end{aligned}
In Rust · validation.rs:71813 lines
pub(crate) fn check_revocation(&self, cap: &CapabilityToken) -> Result<(), KernelError> {
    if self.with_revocation_store(|store| Ok(store.is_revoked(&cap.id)?))? {
        return Err(KernelError::CapabilityRevoked(cap.id.clone()));
    }
    for link in &cap.delegation_chain {
        if self.with_revocation_store(|store| Ok(store.is_revoked(&link.capability_id)?))? {
            return Err(KernelError::DelegationChainRevoked(
                link.capability_id.clone(),
            ));
        }
    }
    Ok(())
}
An example team with its calls in order: the kernel refuses a grant when its own id or any ancestor id in its delegation chain is revoked. Calls admitted before the revocation stand, and the refusal holds at each verifier that has observed it.Revocation cascade

Revocation takes effect when the verifier observes it.

Revocation does not undo an earlier effect. A published report stays published until a separate authorized action changes it. The store has no operation that reverses a revocation either, so a closed branch resumes only through a new grant from a live ancestor. Keep the earlier records, reconcile unfinished work, and issue the replacement with its own scope. The replacement is a new decision with a new history.

A revocation takes effect at each verifier that has observed it; it is not a message that reaches every disconnected recipient at once. A verifier’s revocation state is therefore part of its authority, and it needs the trust and freshness the deployment requires. In the captured federation run, a kernel with no trusted snapshot denies the call, a fresh verified snapshot that does not list the capability admits it, an incomplete subject list is refused before installation, and a rollback or stale root is refused. Expiry, missing evidence, and unavailable revocation state each need an explicit admission response of the same kind.

Make it yours

Build a team with bounded authority
What to build

Give each worker the grant
its assignment requires.

Use the downloaded authority review to choose a child’s tool scope. In the delegated-worker guide, attempt the sibling’s excluded tool and retain the refusal beside the permitted invocation and signed lineage.