Skip to main content

vr.dev — Verifiable Rewards for Real-World AI Agent Tasks

v1.0.0 — 30 verifiers · 14 domains · composition engine · Merkle evidence

Evidence-bearing, auditable verification of AI agent completions across filesystem, API, email, calendar, code-quality, e-commerce, git, and telecom domains. Now with async support, a hosted FastAPI service, and evidence persistence.

pip install vrdev            # core
pip install vrdev[llm]       # + OpenAI judge
pip install vrdev[mcp]       # + MCP server
pip install vrdev[all]       # everything
pip install vrdev[dev]       # + pytest, pytest-asyncio & ruff

Quick Start

Python API

from vrdev import get_verifier, VerifierInput

v = get_verifier("vr/filesystem.file_created")
result = v.verify(VerifierInput(
    completions=["I created the file"],
    ground_truth={"expected_path": "/tmp/output.txt"},
))
print(result[0].verdict)   # PASS or FAIL
print(result[0].score)     # 0.0 – 1.0
print(result[0].evidence)  # {"file_exists": True, ...}

Async API

import asyncio
from vrdev import get_verifier, VerifierInput

async def main():
    v = get_verifier("vr/filesystem.file_created")
    result = await v.async_verify(VerifierInput(
        completions=["I created the file"],
        ground_truth={"expected_path": "/tmp/output.txt"},
    ))
    print(result[0].verdict)

asyncio.run(main())

CLI

# Run a verifier
vr verify vr/filesystem.file_created \
  --completion "done" \
  --ground-truth '{"expected_path": "/tmp/out.txt"}'

# List all verifiers
vr registry list

# Search verifiers
vr registry search email

# Run test fixtures
vr test vr/filesystem.file_created

# Show config
vr config show

# Initialize config file
vr config init

MCP Server (Claude Desktop / Cursor)

vr mcp serve

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "vrdev": {
      "command": "vr",
      "args": ["mcp", "serve"]
    }
  }
}

The MCP server exposes 5 tools:

Tool Description
list_verifiers List all registered verifier IDs
run_verifier Run a verifier with input
compose_chain Run composed verifier chain
explain_failure Get human-readable failure explanation
search_verifiers Keyword search across verifiers

Configuration

Config lives at ~/.vrdev/config.toml with VRDEV_* env var overrides.

vr config init   # create default config
vr config show   # display current config
[openai]
api_key = ""
model = "gpt-4o-mini"
temperature = 0.0
max_tokens = 1024

[imap]
host = "localhost"
port = 993
username = ""
password = ""

[http]
timeout = 15.0

Environment variable overrides (highest precedence):

export VRDEV_OPENAI_API_KEY="sk-..."
export VRDEV_OPENAI_MODEL="gpt-4o"
export VRDEV_IMAP_HOST="imap.example.com"
export VRDEV_HTTP_TIMEOUT="30.0"

Verifiers (19)

ID Tier Domain Source
vr/filesystem.file_created HARD Filesystem OSWorld
vr/git.commit_present HARD Git SWE-bench
vr/code.python.lint_ruff HARD Code quality Zeno-bench
vr/code.python.tests_pass HARD Code quality SWE-bench
vr/tau2.retail.order_cancelled HARD Retail API τ²-bench
vr/tau2.retail.refund_processed HARD Retail API τ²-bench
vr/tau2.retail.inventory_updated HARD Retail API τ²-bench
vr/tau2.policy.constraint_not_violated HARD Policy τ²-bench
vr/tau2.airline.rebooking_correct HARD Airline API τ²-bench
vr/tau2.telecom.plan_changed HARD Telecom CRM τ²-bench
vr/web.ecommerce.order_placed HARD E-commerce WebArena
vr/web.browser.element_visible HARD Browser DOM WebArena
vr/web.browser.screenshot_match HARD Browser visual WebArena
vr/aiv.email.sent_folder_confirmed AGENTIC Email/IMAP VAGEN
vr/aiv.calendar.event_created AGENTIC Calendar API VAGEN
vr/aiv.shell.state_probe AGENTIC Shell VAGEN
vr/rubric.email.tone_professional SOFT Email rubric Proofs paper
vr/rubric.code.logic_correct SOFT Code logic Proofs paper
vr/rubric.summary.faithful SOFT NLP Proofs paper

Verification Tiers

  • HARD — Deterministic, state-based checks (API calls, file existence, lint output)
  • SOFT — LLM-judged rubric evaluation (stochastic, requires vrdev[llm])
  • AGENTIC — Latent-state verification via external systems (IMAP, CalDAV)

Architecture

┌─────────────────────────────────────────────────┐
│                   Adapters                       │
│  CLI (click)  │  MCP Server  │  Python API      │
├───────────────┼──────────────┼──────────────────┤
│              Composition Engine                   │
│       compose() · z_score_normalize()            │
├──────────────────────────────────────────────────┤
│              Base Verifier (ABC)                  │
│   verify(VerifierInput) → [VerificationResult]   │
├──────────────────────────────────────────────────┤
│                   Runners                         │
│  Sandbox │ HTTP │ IMAP │ Managed IMAP │ Browser  │
│               LLM Judge (OpenAI)                  │
├──────────────────────────────────────────────────┤
│                Core Types (Pydantic)              │
│  Verdict · Tier · VerificationResult · Scorecard │
└──────────────────────────────────────────────────┘

Composition

Chain multiple verifiers with AND logic and policy control:

from vrdev import get_verifier, compose, VerifierInput
from vrdev.core.types import PolicyMode

chain = compose(
    [get_verifier("vr/filesystem.file_created"),
     get_verifier("vr/tau2.retail.order_cancelled")],
    policy_mode=PolicyMode.FAIL_CLOSED,
)
results = chain.verify(VerifierInput(
    completions=["done"],
    ground_truth={"expected_path": "/tmp/out.txt", "order_id": "ORD-001"},
    context={"api_base_url": "http://localhost:8080"},
))

Registry Validation

Validate VERIFIER.json / SKILL.json specs against schemas:

vr registry validate path/to/VERIFIER.json
from vrdev import load_verifier_spec, validate_verifier_spec

errors = validate_verifier_spec(spec_dict)
if not errors:
    print("Valid!")

Training-Data Export

Export verification results as JSONL for GRPO / DPO pipelines:

# CLI — export to file
vr export vr/filesystem.file_created completions.txt \
  -g ground_truth.json -o train.jsonl

# CLI — pipe to stdout
vr export vr/code.python.lint_ruff code_samples.json
from vrdev import get_verifier, VerifierInput, export_jsonl

v = get_verifier("vr/filesystem.file_created")
inp = VerifierInput(completions=["done"], ground_truth={"expected_path": "/tmp/f"})
results = v.verify(inp)

with open("train.jsonl", "w") as f:
    export_jsonl(results, inp, "vr/filesystem.file_created", f)

Each JSONL line contains: completion, score, verdict, verifier_id, breakdown, provenance, ground_truth, artifact_hash, exported_at.


Hosted API (vr-api)

The packages/vr-api/ directory contains a FastAPI service that wraps the vrdev SDK with authentication, rate limiting, and evidence persistence.

Endpoints

Method Path Auth Description
GET /health No Health check
POST /v1/verify Yes Run a verifier
POST /v1/compose Yes Run composed chain
GET /v1/verifiers Yes List all verifiers
POST /v1/export Yes Verify + export JSONL
POST /v1/batch Yes Batch verify multiple inputs
GET /v1/evidence/{hash} Yes Retrieve stored evidence
GET /v1/evidence Yes List evidence records
GET /v1/usage Yes Usage statistics

Running locally

# With Docker
cp packages/vr-api/.env.example packages/vr-api/.env
docker compose up

# Without Docker
pip install packages/vrdev packages/vr-api
uvicorn vr_api.app:app --reload

Configuration

Env var Default Description
DATABASE_URL sqlite+aiosqlite:///:memory: PostgreSQL / NeonDB connection string
VR_API_KEYS (empty = auth disabled) Comma-separated valid API keys
VR_RATE_LIMIT_PER_MINUTE 60 Per-key rate limit
VR_EVIDENCE_TTL_DAYS 90 Evidence retention period

Development

git clone https://github.com/vr-dev-org/vr-dev.git
cd vr-dev/packages/vrdev
pip install -e ".[dev]"
pytest                  # run all tests
ruff check src/         # lint

Test Suite

tests/
├── test_types.py           # Core type validation
├── test_compose.py         # Composition engine
├── test_normalize.py       # Z-score normalization
├── test_sandbox.py         # Sandbox runner
├── test_artifact.py        # Artifact hashing
├── test_router.py          # Skill router
├── test_filesystem.py      # FileCreatedVerifier
├── test_tau2.py            # τ²-bench verifiers (3)
├── test_telecom.py         # PlanChangedVerifier
├── test_aiv_email.py       # SentFolderConfirmedVerifier
├── test_rubric_email.py    # ToneProfessionalVerifier
├── test_rubric_code.py     # LogicCorrectVerifier
├── test_registry.py        # Verifier registry
├── test_llm.py             # LLM judge protocol
├── test_e2e.py             # End-to-end integration
├── test_config.py          # Config system
├── test_registry_loader.py # Registry validation
├── test_lint_ruff.py       # LintRuffVerifier
├── test_git_commit.py      # CommitPresentVerifier
├── test_webarena.py        # OrderPlacedVerifier
├── test_calendar.py        # EventCreatedVerifier
├── test_mcp.py             # MCP server
├── test_trl.py             # TRL adapter
├── test_verl.py            # veRL adapter
├── test_export.py          # JSONL export
├── test_http_runner.py     # HTTP runner
├── test_imap_runner.py     # IMAP runner
├── test_openclaw.py        # OpenClaw adapter
├── test_async.py           # Async wrappers
├── test_browser_runner.py  # Browser runner stub
├── test_managed_imap.py    # Managed IMAP pool
└── mocks/
    ├── tau2_server.py      # τ²-bench mock API
    ├── webarena_server.py  # WebArena mock API
    ├── calendar_server.py  # Calendar mock API
    ├── telecom_server.py   # Telecom CRM mock API
    └── imap_mock.py        # IMAP mock runner

Verdict Enum

  • PASS — verification succeeded
  • FAIL — verification found a deficiency
  • UNVERIFIABLE — could not determine (ambiguous state)
  • ERROR — infrastructure/config failure (not an agent failure)

License

MIT

Release files for vrdev 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vrdev 1.0.0
File Size Uploaded
vrdev-1.0.0.tar.gz 110.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vrdev 1.0.0
File Interpreter ABI Platform
vrdev-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 210.9 kB

Release files / vrdev-1.0.0.tar.gz

Download URL vrdev-1.0.0.tar.gz
Size 110.6 kB
Tags Source
SHA-256 checksum
How to use checksums
2a2bed08d4775111f9354755e6fbc7a7a24b33afe27a4b1f6ca127520cb9ec61
BLAKE2b-256 checksum
How to use checksums
3541bc2f86d021cd263e61ab679732a974f7298300ab4894ed743ebc9d6fea19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.13

Release files / vrdev-1.0.0-py3-none-any.whl

Download URL vrdev-1.0.0-py3-none-any.whl
Size 100.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c4d478138f142ca62582d6bf88a41b061d48a3ba648d1eabc193c7c492cf9aae
BLAKE2b-256 checksum
How to use checksums
d3d3325cc25d702d4c100f5c59f2a890c0d4c4fbdd6402ffa1523c75ab10b690
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.13

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.9.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page