Execution provenance for LLM-agent security research

Observed. Derived. Inferred.

AgentPROV converts live and released LLM-agent security runs into W3C PROV. Every derived statement names its evidence class, the rule that produced it and the record field that justifies it.

Version 0.1.1MIT licencemacOS, Windows and Linux

The AgentPROV desktop app: three executions open in tabs; the current one shows its PROV graph beside the PROV-JSON tree, with one statement selected in both. The AgentPROV desktop app in dark mode: three executions open in tabs; the current one shows its PROV graph beside the PROV-JSON tree, with one statement selected in both.
The desktop app with three executions open in tabs, each graph beside its PROV-JSON.
How it works

From raw bytes to W3C PROV, in five versioned stages.

Each stage is a versioned function of the one before it, and sha256 chains every output to its input. So you can check a corpus end to end, and recompute its provenance without running a model again.

  1. sha256 · pinned origins

    Raw store

    The source files, byte for byte. Nothing edits them, and archives are read as streams, never extracted to disk.

  2. aer/0.2

    AER

    The AgentPROV Execution Record: 13 typed record kinds, explicit unknowns and locators back into the raw bytes.

  3. sem/0.1

    SEM

    Standoff annotations from versioned profiles: integrity, roles, injection markers and outcome meaning.

  4. agentprov-prov/0.1

    PROV

    PROV-JSON in three bundles: core (observed and derived), inference, and assessment for policy claims.

  5. validate · verify · seal

    Corpus

    Validation tiers gate every write. A sealed corpus has a manifest, a register and a root digest.

Temporal order is never causality.

Order is recorded as order. It never becomes a PROV dependency.

Context is not derivation.

A model invocation uses the messages in its request. A tool execution uses only its request and the environment state it read.

Missing evidence is declared.

No placeholder timestamps and no reconstructed trajectories. Unknowns carry a reason from a closed list.

Policy claims stay out of the facts.

Integrity labels, taint and injection markers live in a separately attributed assessment bundle.

Evidence classes

Three kinds of evidence, drawn three ways.

Every AER record and field says how it is known. Core PROV statements carry observed or derived evidence. Anything inferred goes into its own inference bundle, and the app shows the difference in the line itself.

  • OObserved: read directly from the source.
  • DDerived: computed by a declared, deterministic rule.
  • IInferred: produced by a named inference method, kept apart from the core.
A small PROV graph with observed, derived and inferred elements A run activity and two message entities are observed, drawn with solid borders. A model invocation activity and the agent are derived, drawn dashed, as are the generated-by and associated-with relations. The model invocation's use of a message part is inferred, drawn dotted in the inference colour. wasAssociatedWith wasAssociatedWith wasGeneratedBy usedinference x:runapv:Run · O x:mc0apv:ModelInvocation · D x:agentapv:AgentSystem · D x:m2-0apv:MessagePart · O x:m4apv:Message · O
A sketch after the app's graph view: five elements of one AgentDojo test execution, with their identifiers and evidence classes as the app shows them.
The desktop app

Open a corpus. See how every fact is known.

It's a viewer and a job runner for AgentPROV corpora. Opening a corpus never writes to it. Content stays hidden until you ask for it, and anything you do in the app has a command you could type instead. Pick a step, then a numbered point to look closer.

The Viewer: the corpora list, the not-sealed banner, filters, the agentprov stats line, the executions table and the graph of one execution. The Viewer in dark mode: the corpora list, the not-sealed banner, filters, the agentprov stats line, the executions table and the graph of one execution.

Browse every corpus on your machine.

The Viewer scans your corpus roots and opens a corpus by reading its files, nothing more. It writes no file and takes no lock.

Same thing in a terminalagentprov stats --corpus DIR --select …

Step 1 of 8

Screenshots of version 0.1.0 on synthetic test corpora, taken with the project's screenshot script. Run Live shows stub answers; nothing ran. The desktop app chapter covers every page.

Sources

Live runs and released logs, one record.

A run you capture yourself and a log another research project released end up as the same AgentPROV Execution Record. One engine derives the provenance of both.

Released logs

Import what other studies published.

Import adapters treat a released log as untrusted bytes. Parsing runs within fixed limits, archives are streamed rather than extracted, and the original bytes stay beside the record, hash-pinned.

  • AgentDojo family
  • AgentDyn
  • ROPE
  • Inspect
  • OpenHands
  • Gemini CLI
  • Qwen Code
  • AutoGen
  • AgentOps
  • DTap
  • MCPHunt
  • CredLeak
  • Wire logs

Coverage, as the registry states itadapter-based core; demonstrated on 48 sources in 13 formats (single-agent, tool-calling traces)

Live runs

Capture new runs as they happen.

Four live backends: AgentDojo, AutoDojo and AgentDyn record runs as capture/0.1, and an Inspect harness runs AgentHarm and keeps Inspect's own log of the run.

  • A real model starts only with your consent, cost caps and a containment choice.
  • Keys come from the OS keychain; the app never shows one.
  • A scripted transport tests the whole path with no network, keys or cost.

A tested capability. Live capture works and is tested in v0.1. No live results are claimed, and live corpora cannot be sealed until v0.2. Live runs need macOS or Linux.

Corpora

Corpora you can check for yourself.

The corpora built with this release are on Zenodo, in one collection. Each comes with its datasheet, its licence class and a root digest.

  1. Raw bytessha256 of each source artefact
  2. AERexecution digest and seal
  3. SEMannotation digest
  4. PROVbundle digests, then the root digest
On Zenodo

One collection, one DOI per record.

Download a corpus, then check its chain from the raw bytes to the root digest. Provenance is derivation-reproducible: recompute it from the stored record without running any model.

Collection DOI: 10.5281/zenodo.23814758

The corpora chapterWhat a corpus holds

Check a corpus
# the chain from raw bytes to the root digest
$ agentprov verify --corpus CORPUS --level chain

# run the validation tiers again
$ agentprov validate --corpus CORPUS

# recompute provenance from the record and compare
$ agentprov recompute --corpus CORPUS --dry-run
Download

Get the desktop app.

Free and open source under the MIT licence. On its own the app is a viewer. To run jobs, point it at an AgentPROV checkout in Settings › General.

AgentPROV 0.1.1

Choose your platform below.

Install the command-line tool.

The agentprov CLI and library are on PyPI. They need Python 3.14.8 or later. Install with pip into an environment, or with uv as a tool on its own interpreter.

pip
$ pip install agentprov
$ agentprov info
uv
$ uv tool install agentprov
$ agentprov info
Cite

Cite AgentPROV.

If AgentPROV or its corpora help your work, please cite the software. The repository's CITATION.cff has the same record, and GitHub offers it under “Cite this repository”.

AgentPROV: Converting Live and Released LLM-Agent Security Runs to W3C PROV, with Systematically Sourced Corpora Nicholas Jones · paper in preparation; the link follows on publication
BibTeX
@software{jones_agentprov_2026,
  author  = {Jones, Nicholas},
  title   = {AgentPROV: execution provenance for
             LLM-agent security research},
  version = {0.1.1},
  year    = {2026},
  license = {MIT},
  url     = {https://github.com/nickjones39/AgentPROV},
  doi     = {10.5281/zenodo.23848609}
}