Welcome to Interbolt
Provenance-gated tool calls for AI agents.
Interbolt documentation
A defense that judges whether a piece of text is an attack only has to be beaten once: an attacker who can see how the defense works can study it and write around it. The Attacker Moves Second (Nasr et al., 2025) measured the size of this gap, bypassing twelve published defenses, several of which had reported near-zero attack success against static payloads, at rates above 90% once the attacker was allowed to adapt.
The attacker controls what their text says, but not where it came from. Interbolt enforces on that second property. It marks data as untrusted at the point it enters your agent, propagates that mark through your code, and gates each guarded tool call on the provenance of its arguments rather than on their content. A tool call can be blocked, or routed through approval, without Interbolt ever having to recognize an attack, which makes security a property of the system around the model rather than of the model's ability to resist being talked into something. The Threat model page carries the full argument, including the class of injections that read as ordinary work and give a classifier nothing to flag, and links the research this is based on.
Concretely, taint() marks untrusted data (a web search result, an email, a
tool's output) at ingress, and a YAML+CEL policy is evaluated at each
guarded tool call. The resulting decision to allow, block, or require
approval is deterministic and computed in-process, with no model and no
network call involved.
Interbolt is not a prompt-injection classifier, a content filter, or a sandbox. The Threat model page lists explicitly what it does and does not cover, and is worth reading before you adopt it.
Start here
- Quickstart: install, write a policy, taint a value, guard a tool, define agents and tools across modules, track a model call as a new source, and get the decision (and why) at the sink.
- Writing a policy: the sequence from
taint()at ingress to the decision at the sink, then a policy built step by step for a real agent, with the rule patterns and the pitfalls.
Concepts
- Threat model: the lethal-trifecta attack pattern Interbolt targets, and an explicit list of what it does not do.
- Taint propagation: what
taint()marks, what survives a transformation, and howderived_frommakes a model call or agent handoff a trust-aware new source rather than a fresh, unrelated ingress point. - Policies: the policy DSL (YAML structure, CEL
conditions, and the rule fields), the CEL context a
whenexpression can reference, and the evaluation semantics behind every decision. - Identity: the
agent_id/run_id/session_idtriple, whyrun_idbinding is what keepsrun.taintedworking, and the thread-pool and custom-dispatch cases that break it.
Guides
- Writing a policy: the end-to-end walkthrough, from naming sources to validating and rolling out.
- Testing: how to assert on policy decisions with
InMemoryReporterand a fake approval resolver. - Auditing: finding the places a transformation
laundered a taint label that should have been re-tainted, and
endorse()as the sanctioned alternative. - CI: checking a policy file with
interbolt validatein CI or pre-commit. - Explain: answering "what can this agent do" with
interbolt explain --agent/--group/--toolinstead of reading every rule by hand. - OpenTelemetry: mapping Interbolt's setup,
factory, and decorator patterns onto Phoenix/OpenTelemetry vocabulary,
and wiring
OTelReporternext to an already-instrumented app. - Troubleshooting: fixes for the most common
surprises, such as an unexpected block, every call requiring approval, and
run.taintedstaying false.
Reference
- API reference: every name re-exported from
interbolt, plus the command line. - Reporters: the
Reporterprotocol and the six shipped implementations. - Events: the stable, versioned JSON shape of
Event/Finding/Endorsement, the OpenTelemetry attribute mapping, and theEVENT_SCHEMA_VERSIONhistory. - Performance: the published
check()and propagation-path benchmark numbers, and what they do not cover. - Taint propagation internals: the exact CPython mechanism behind every propagates/launders case.
- Policy evaluation internals: the CEL
rewrite mechanism, the full trifecta derivation, and what
interbolt validatedoes and does not catch. - Glossary: one-line definitions for the vocabulary used throughout these docs.
Design
- Design lineage: the proven patterns (Casbin,
OpenTelemetry, CEL, Django
SafeString, Resin) the architecture assembles, and how Interbolt diverges from each.