arf.io / ARF / Audit Trails / ARF · Autonomous Request Filter · Agent Router & Filter
ARF · Attestation & Record Foundation

Proof, not logs.
Tamper-evident.
Cryptographically signed.

Git shows you what changed. ARF shows what the agent decided, why, under what policy, at what cost, with what approval, in what order, and makes the record impossible to deny or alter. The Attestation & Record Foundation is not a log file. It's a proof bundle.

Why Git Isn't Enough

Git shows diffs.
ARF shows decisions.

What Git Gives You
  • ✓ What files changed
  • ✓ Who committed
  • ✓ When the commit happened
  • ✗ What the agent was asked to do
  • ✗ What the agent decided, and why
  • ✗ Which policy rules applied
  • ✗ Who approved tool calls
  • ✗ What the model's full reasoning was
  • ✗ Token cost breakdown
  • ✗ Cryptographic proof of sequence
What ARF Gives You
  • ✓ Everything git gives you, via notes integration
  • + Every prompt, every completion full text
  • + The policy rules evaluated for each message
  • + Approval events with identity and timestamp
  • + Circuit breaker state at each decision point
  • + Token usage and cost per request
  • + Ed25519 signature on every record
  • + SHA-256 hash chain (tamper-evident)
  • + Merkle DAG for concurrent agent branches
  • + Compliance export bundles (JSON, PDF)
"Every agent decision is a choice made on your behalf. You have the right to know exactly what that choice was, what information the agent had when it made it, and what constraints it was operating under. ARF makes that possible after the fact, for any session, forever."
The Chain

SHA-256 hash-chained.
Ed25519-signed.

Every event in an ARF session (request, response, policy decision, approval, circuit breaker state change) is serialized to a canonical JSON record and signed with the ARF instance's Ed25519 signing key.

Each record includes the SHA-256 hash of the previous record. This creates a hash chain. To forge or alter any record, you'd need to recompute every subsequent hash, then forge the Ed25519 signature. With sane key management, that is computationally infeasible.

The chain is stored in a local append-only log. On session seal, ARF produces a proof bundle: a self-contained archive with the full chain, the signing public key, and a verification manifest. Give the bundle to an auditor and they can verify every record without the ARF instance.

RECORD #1 SESSION START
prev: 0000000000000000
ulid: 01HX4QVPZ…AB12
type: session.start
sig: e7f3a9c…[Ed25519]
hash: a3f72c1…
↓ prev = a3f72c1…
RECORD #2 REQUEST
prev: a3f72c1…
ulid: 01HX4QVPZ…CD34
type: message.request
policy: standard ✓
hash: 9b12e4a…
↓ prev = 9b12e4a…
RECORD #3 APPROVAL EVENT
prev: 9b12e4a…
approver: [email protected]
tool: write_file
decision: APPROVED
hash: d4e8f01…
↓ prev = d4e8f01… · chain continues…
Merkle DAG

Concurrent branches.
Convergent proofs.

When multiple agents work in parallel (say, three agents on three different feature branches), a linear hash chain breaks down. You need a structure that can represent concurrent, branching work and converge it into a single proof.

ARF uses a Merkle DAG for concurrent sessions. Each branch keeps its own hash chain. Merge events become DAG nodes with multiple parent hashes. The root of the merged DAG is a single hash that commits to the entire history of all branches, provably, in one value.

This is how ARF handles orchestration: parallel agents, independent chains, Merkle convergence at the merge point. The compliance bundle for a merged session includes the full DAG, every branch chain, and the convergence proof.

Merkle DAG Concurrent Sessions
  ROOT d4e8f01…
       │
       ├─ MERGE 9b12e4a…
       │      ├─ Branch-A a3f72c1…
       │      │     ├── req #1 e7f3a9c…
       │      │     ├── req #2 c1b2d3e…
       │      │     └── req #3 f4a5b6c…
       │      │
       │      ├─ Branch-B 7d8e9f0…
       │      │     ├── req #1 1a2b3c4…
       │      │     └── req #2 5d6e7f8…
       │      │
       │      └─ Branch-C 0a1b2c3…
       │            └── req #1 9e0f1a2…
       │
       └─ session.seal b3c4d5e…

  Verify:  arf verify ./proof-bundle.tar.zst
   All 3 branches valid
   Merkle root matches
   Ed25519 signatures valid
Session Attribution & Compliance

Every session is
precisely attributable.

ULID Session Tracking

Every ARF session gets a ULID (Universally Unique Lexicographically Sortable Identifier). ULIDs are time-ordered, so session timeline reconstruction is trivial. Each request inside a session also gets its own ULID for sub-session attribution.

Git Notes Integration

ARF writes session metadata into git notes on each commit made during a governed session. Pull up any commit with git notes show and see the ARF session ID, policy profile, token cost, and proof bundle hash.

Telemetry Capture

Request latency, token throughput, tool call frequency, policy evaluation time, and cost per request are all captured in structured telemetry. Export to Prometheus, Datadog, or ARF's built-in session analytics.

Compliance Export Bundles

Run arf provenance export --session [id] --compliance to produce a self-contained compliance bundle: full proof chain, metadata, policy state, and a human-readable PDF summary. Ready for SOC 2 auditors, legal review, or incident investigation.

Agent Call Signs

Each agent session gets a human-readable call sign (e.g., IRON-WOLF-7, COPPER-ANVIL-3) for quick identification in the TUI, in git notes, and in exported bundles. Easier to scan than raw ULIDs.

Proof Bundle Verification

Any ARF instance, including a cold install with no session history, can verify a proof bundle. The public key is embedded in the bundle. Verification is a single command with a deterministic pass/fail result.

Provenance Record Structure

What a record
actually looks like.

Every event in an ARF session produces a JSON record. The records are canonical (keys sorted, no whitespace variation) before signing and hashing. This is what a tool-call approval event looks like:

{ "ulid": "01HX4QVPZAB1234567890ABCD", "prev_hash": "9b12e4a7c3d8f01a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5", "session_id": "01HX4QVPZ00000000000AB12", "event_type": "governance.approval", "timestamp": "2026-05-31T14:23:11.340Z", "payload": { "tool": "Write", "path": "src/auth/session.ts", "rule": "approve-file-writes", "decision": "approved", "approver": "[email protected]", "latency_ms": 2226 }, "hash": "d4e8f01a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9", "signature": "e7f3a9c2b1d4f8a...Ed25519 base64...", "pub_key": "MCowBQYDK2VwAyEA...base64..." }

The prev_hash field binds this record to the previous one. The hash field is the SHA-256 of the canonical JSON of the entire record (including signature). The signature signs the SHA-256 of the record body (all fields except signature and hash).

Working with Provenance

Verify. Export. Comply.
From the CLI.

# Verify the current session's proof chain arf provenance verify # ✓ Session 01HX4Q… 142 records Ed25519 valid chain intact # Verify a proof bundle from a file (cold verification) arf provenance verify ./proof-bundle.tar.zst # Works on any machine with arf installed. No session state needed. # Export the current session's proof bundle arf provenance export --out ./my-session.tar.zst # Export a compliance-ready bundle (includes PDF summary) arf provenance export --compliance --session 01HX4Q…AB12 \ --out ./compliance-bundle.tar.zst # Show the last N records in the chain arf audit --last 20 # Show records for a specific session arf audit --session 01HX4Q…AB12 # Show only governance events (approvals, denials, circuit trips) arf audit --filter governance --session 01HX4Q…AB12
Binary Provenance

Track binary files.
Not just code.

Binary files (images, Blender files, PDFs, compiled artifacts, STL/STEP for CAD) can't be diff'd meaningfully. ARF's binary provenance system tracks size, SHA-256 content hash, and git commit for each binary file across the session.

Each change to a binary file produces a provenance record with the before and after hashes. The records are chained to the session. If a binary file's hash changes unexpectedly between commits, ARF detects it and flags the deviation.

Python plugins for Blender and Fusion 360 integrate directly with ARF's provenance system. Each save operation records a hash event. The plugin's begin / modify / commit protocol tracks 3D asset changes with the same cryptographic guarantees as code changes.

# Binary file provenance record { "event_type": "binary.modified", "path": "assets/hero-model.blend", "before": { "size_bytes": 4823012, "sha256": "a3f72c1..." }, "after": { "size_bytes": 5102840, "sha256": "9b12e4a..." }, "commit": "e7f3a9c", "session_id": "01HX4Q..." } # View binary history for a file arf binary-history assets/hero-model.blend # Commit Size SHA-256 Delta # e7f3a9c 4.8 MB a3f72c1… +base # 9b12e4a 5.1 MB 9b12e4a… +279 KB
SDK Example

Read provenance
programmatically.

The Rust SDK (ArfClient) provides methods for reading and verifying the provenance chain. See the SDK page for the full reference.

// Rust SDK: read provenance for a session use arf_sdk::{ArfClient, ProvenanceFilter}; let client = ArfClient::connect("http://localhost:4554").await?; // Fetch all governance events from a session let events = client .provenance() .session("01HX4Q…AB12") .filter(ProvenanceFilter::Governance) .fetch() .await?; for event in &events { println!("{}: {} → {}", event.timestamp, event.payload["tool"], event.payload["decision"] ); } // Verify chain integrity let result = client.provenance().verify_session("01HX4Q…AB12").await?; assert!(result.is_valid); println!("Chain valid: {} records, {} signatures", result.count, result.signatures);
Audit in the TUI

The full chain.
Live, in your terminal.

The Audit screen shows every event in the current session as it happens. Navigate the Merkle DAG with arrow keys. Press Enter to expand a record and see the full JSON payload, signature, and parent hash.

Filter by event type with f. Search with /. Export a compliance bundle with e.

ARF TUI Audit screen showing provenance chain