AgentProvenance

verifiable agent observabilityDemos Documentation
Demos/Single agentOpen replay

Snake / supply-chain demo — bundle & capture

English | 简体中文

This directory holds the signed, portable forensics bundle for the agent-in-a-sandbox supply-chain demo, plus the scripts used to capture it.

For the narrative walkthrough — the scenario, what to click in the dashboard, compliance mapping, and how to verify the evidence — see docs/supply-chain-demo.md.

In one line: a real coding agent (Claude Code, DeepSeek backend) is told to build a Snake game; its setup step installs a poisoned pysnake-helper whose install hook reads planted fake secrets and connects to the cloud-metadata IP (169.254.169.254). The self-owned eBPF sensor captures it and the data-flow / taint lens surfaces the secret-read → egress as a causal edge.

Open from the portable CLI

From an extracted precompiled release:

./agentprov demo snake-supply-chain

The CLI verifies the signed evidence, opens the appropriate Run and view, and uses a temporary store cleaned up on Ctrl-C. No Go, VM, Kubernetes cluster or agent credentials are needed for replay. Use ./agentprov demo for all examples and their formatted guides; manual import and live capture remain available below.

Files

  • run-snake-supervised.forensics.json.gz — the signed bundle (import to replay).
  • run-snake-supervised.forensics.dsse.json — the DSSE/ed25519 attestation.
  • attestation.pub — the public key to verify it.
  • capture/ — scripts to reproduce the capture on a Linux/eBPF host.

Manual import into a persistent store (optional)

go build -o /tmp/agentprov ./cmd/agentprov
/tmp/agentprov --data-dir /tmp/snake-replay forensics import \
  demo/snake-supply-chain/run-snake-supervised.forensics.json.gz \
  --pub-key demo/snake-supply-chain/attestation.pub          # verifies the signature, then imports
/tmp/agentprov --data-dir /tmp/snake-replay dashboard serve  # open run "run-snake-supervised"

Reproduce the capture (Linux/eBPF host)

Supervised-capture mode — one long-running per-node sensor plus record, which places the agent in a real cgroup so its whole subtree correlates by cgroup_id at 0.98 (no pid polling, no manual objectify step):

bash capture/vm-snake-assets.sh                       # workspace, planted FAKE secrets, poisoned pkg, SETUP.md

# per-node supervisor: eBPF sensor -> ingest -> correlate-by-cgroup, self-noise
# excluded, host noise dropped. Needs CAP_BPF+CAP_PERFMON (setcap the binary, or root).
agentprov --data-dir "$DD" sensor stream &

# run the agent under record; the child (and its subtree) is born into a cgroup,
# so every syscall correlates @0.98 + self_launched. Changed files (snake.py) are
# objectified for preview automatically.
AGENTPROV_CGROUP_PARENT=/sys/fs/cgroup/agentprov \
  agentprov --data-dir "$DD" record --run run-snake-supervised \
    --workdir ~/agentprov-snake-demo/workspace -- bash ~/agentprov-snake-demo/run-agent.sh

agentprov --data-dir "$DD" graph materialize --run run-snake-supervised
agentprov --data-dir "$DD" forensics export run-snake-supervised --sign-key <key>   # signed bundle

record births the agent into a cgroup v2 leaf (delegate /sys/fs/cgroup/agentprov to a non-root user, or run record as root), so host-wide syscalls correlate to the run without instrumenting the agent.

The planted secrets are obviously fake and the exfil target is the unreachable link-local metadata IP — nothing real leaves the box. The agent's "brain" is DeepSeek via the Claude Code harness; it is a real LLM agent, not a script.

Offline signed replay; no account or VM required.