Active RPC
Capability-based, promise-pipelined RPC for Active Infinity and multi-agent systems. gRPC is a transport; Active RPC is a security and execution model with a transport attached.
cap ──► call ──► promise ──► pipelined call ──► result
│ │
└── attenuation ─────┴── lanes / channels / tools
Why it exists
An agent that calls tools and other agents needs four things that a request/response RPC does not give it:
- No ambient authority. A capability is an unforgeable id minted by the receiving kernel; holding it is the whole permission, attenuation can only narrow it, and revocation is immediate and transitive.
- Pipelining. A pending result can be an argument to the next call, so a
chain costs one provider round-trip instead of one per step. Measured, not
asserted: see
tests/unit_tests.rs::pipelining_costs_one_round_trip…. - Concurrency primitives. Many lanes with independent budgets, many named channels, capability transfer over channels, and many tool handles in flight.
- Domain operations.
evaluate,why,impact,subgraphandpatchrun on Active Infinity modules under the capability's budget, not on JSON.
Quick start
use CapAttrs;
use ModuleProvider;
use ;
use ;
#
Pipelining:
# use ;
# use ;
# use ModuleProvider;
#
Architecture
| Module | Responsibility |
|---|---|
kernel |
capability table, promise graph, lane/channel registry, dispatch loop, events |
cap |
ids, attributes, attenuation rules, handles with drop notification |
promise |
promise states and single-settlement rules |
lane / channel |
execution contexts and named streams with capability transfer |
domain |
evaluate/why/impact/subgraph/patch over Infinity modules |
tool |
MCP, HTTP/OpenAPI and sandboxed local-process adapters |
wire |
the ARP1 envelope and capability table |
transport |
in-process, TCP, shared memory, QUIC, gRPC/Connect bridge |
security |
redaction and value mapping |
The kernel is a deterministic state machine: providers are plain objects, the
clock is a counter, and Agent::run() drives dispatch. That is why pipelining,
attenuation, budget exhaustion and drop notification are testable without timing
flakes — and why a transport is a thin adapter (ADR-0002).
Feature flags
| Feature | Default | Meaning |
|---|---|---|
quic |
on | real QUIC transport (quinn + rustls, self-signed, loopback) |
--no-default-features builds every transport except QUIC (in-process, TCP,
shared memory, Connect bridge).
Testing
The suite proves, among other things: a forged capability is refused; attenuation cannot widen; a dropped handle notifies the provider; a pipelined chain costs one round-trip where a sequential chain costs two; each transport moves a real Infinity payload plus a capability table and rejects a malformed frame; two agents do not cross-talk over TCP; and secret material never appears in any value, envelope, annotation or provenance path.
Specifications
docs/spec/wire.md— normative envelope, capability table, error codesdocs/spec/security.md— threat modeldocs/spec/performance.md— baselinesdocs/adr/— architecture decisions
License
MIT OR Apache-2.0.