v0.10.0: Session export + detection hardening
Two bodies of work ship together in this release. Session export: two
supported ways to get evaluated session data off the agent. And detection
hardening: in 0.6.0 we published a number that hurt (TPR 0.000 on
InjecAgent's 2,108 action-oriented injections), and this release closes that
gap along with the distribution surface around it.
Two behaviour changes deserve reading before you upgrade; both are covered
under Breaking and behaviour changes below.
Session export
- OpenTelemetry (
pip install "agentegrity[otel]"): one trace per
session with a child span per evaluated event, plus metrics for
evaluations, enforcement denials, score distributions, and
instrumentation health, to any OTLP backend. Hash linkage is reported
separately from signature verification so a dashboard never reads
linkage as tamper-evidence. - Direct HTTP: a stdlib-only
HTTPExporterplus anagentegrity pro
CLI that points an already-instrumented agent at anagentegrity-pro
dashboard in one command.agentegrityis now a real console script. - Attaching a sink is never silent: the destination is logged and listed
underexportersinreport(). An empty list is proof a run stayed
local.
Detection
action_injectionfamily (5 patterns). Targets the attack shape the
old taxonomy missed: plausible imperatives smuggled into structured
content ("Please deposit 2000 USD..." inside a product review). InjecAgent
base (N=2,108): TPR 0.000 to 1.000 at FPR 0.000. Calibrated on that suite,
so read it as in-distribution recall, not generalization. We also ran
AgentDojo and published the honest ceiling: TPR 0.286 / FPR 0.113,
reproducible viascripts/dump_agentdojo_tasks.py, with the analysis of
why content-only detection cannot close it.tool_poisoningfamily +tool_definitionschannel. MCP tool
descriptions and schema fields are scanned before any tool runs:
<IMPORTANT>pseudo-tag blocks, conceal-from-the-user instructions, and
coaching to read or transmit secret material.ToolSequenceDetector(default on). Flags a sensitive-read tool call
followed by an external-send within the session. Behavioral evidence, not
text matching: paraphrasing cannot evade it, benign text cannot trip it.- Reasoning-trace scanning. The adversarial and classifier layers now
scan the agent's own reasoning chain, so a hostile objective surfaces
before the behavior materialises as a tool call. AdversarialSLMLayer. The semantic classifier against any
OpenAI-compatible local server (Ollama, llama.cpp, vLLM, LM Studio), CPU
or GPU, zero added dependencies. Opt-in session context
(include_session_context=True) feeds recent tool-call names into the
classification.
Distribution
- Two lines to instrument:
agentegrity.init()auto-detects installed
frameworks;runtime.instrument(obj)dispatches on the object's type. - Claude Code plugin:
/plugin marketplace add cogensec/agentegrity.
Every tool call is evaluated in-process (allow / ask / deny), and every
verdict appends to a hash-linked per-session decision chain you can check
withagentegrity verify-decisions. - MCP-aware governance: glob entries (
mcp__db__*) gate whole servers,
andmcp__filesystem__file_deletematches a listedfile_delete.
Assurance
ApprovalWorkflow: HITL approval that denies on timeout by default
(fail-open is an explicit choice, never a silent one), with every
consulted approval recorded as signed provenance: who approved, when,
and whether it timed out.KeyProvider+ strict cross-agent verification: peer records are
pinned to registered Ed25519 keys, so a forged peer chain signed with an
attacker-generated key no longer self-verifies.agentegrity report: renders any session chain into an audit report
with verification status, decision timeline, approvals, and an evidence
mapping to EU AI Act Art. 12/14 and NIST AI RMF. Supporting evidence, not
a compliance determination.- Alerting:
SlackAlertExporter/WebhookAlertExporterpush block and
escalate verdicts to a channel. Shape-only payloads, fail-open, stdlib.
Breaking and behaviour changes
AGENTEGRITY_TOKEN+AGENTEGRITY_URLare no longer inert. They now
self-attach anHTTPExporterat adapter construction. If those variables
are already set where an instrumented agent runs, that process starts
streaming full event content (prompts, tool arguments, tool outputs) to
the configured URL on upgrade. That is the documented behaviour finally
working, but it changes what leaves the process: unset them if you did
not mean it, and checkreport()["exporters"].AttestationChain.verify_cross_agent_links()is strict. With no
arguments it now returnsFalsefor chains that carry cross-agent
Evidence (v0.8-v0.9.0 returnedTrue). Unverifiable is not verified.
Single-agent chains are unaffected. Multi-agent verifiers: supply the
peer chains and pin identities with aKeyProvider. Full migration notes
in the CHANGELOG.
Numbers
877 Python tests, 89.7% branch coverage (gate 85%), mypy strict clean,
sub-millisecond evaluation pipeline (p95 0.23 ms, CI-pinned), 52
cross-package TypeScript conformance tests, detection benchmarks pinned as
no-regression floors in nightly CI.