AGENT·EVAL

Contract-driven · plugin-scored

Grade agent runs against the contract.
Not against a vibe.

A deterministic evaluation system for LLM-driven agent workflows. It checks a trace against a YAML-defined contract through six independent plugins — skills, context, tools, output, trace health, usage — and produces pass/fail evidence instead of an LLM judge's opinion.

$uv run run-verify --contract contracts/binding/binding_with_widget.yaml --trace-id c4739a28...
View source ↗
Scope — one trace in, one pass/fail verdict out

Before

An LLM judge isn't a benchmark.

Someone still has to read the trace, decide whether the agent actually satisfied the task, and repeat that judgment call for every model, every run, every regression — subjective, expensive, and rarely the same answer twice.

After

It reads the trace — and checks the contract.

A Langfuse trace is normalized into a structured snapshot, then run through six plugins that check exactly what the contract declared: skills loaded, resources read, tools called, files changed — and nothing it didn't.

CONTRACT-DRIVEN

Expected skills, tools, resources, and outputs declared once, in YAML — versioned like code, not tribal knowledge.

EVIDENCE, NOT OPINION

Every check resolves against a specific tool call or file diff in the trace, never a model's say-so.

SIX INDEPENDENT PLUGINS

Skills, input context, tool calls, output, trace health, and resource usage — each with its own pass/fail breakdown.

BINARY SCORING

SWE-bench style: every declared check must pass. No partial credit to soften a violation.

Pipeline

One trace. Four stages. One verdict.

run-verify --contract <yaml> --trace-id <id> runs all four and prints the breakdown.

01

contract

A workflow contract defines expected skills, tools, resources, and outputs in YAML.

02

ingest

The trace is fetched from Langfuse and normalized into a structured snapshot.

03

evaluate

Six plugins check the snapshot against the contract, each with its own evidence.

04

report

Plugin outputs aggregate into one score and a verification report.

Where it fits

From a live trace to a cross-model report.

Each command is independently useful — chain them for a full benchmark run, or drop in wherever you already are.

generate-contract fetch-trace run-verify compare-traces merge-html-reports
PluginChecks
skills_loadedRequired skill(s) loaded and succeeded; no extra skills beyond required/optional.
input_contextEach declared resource was actually read, with its terms present in some tool call.
tool_callsEvery required tool appears in the trace; no forbidden tool does.
outputEach declared output was created/updated/deleted as specified; no unrelated file changes.
trace_healthNo error state, no error spans, build validation passes when a Java service is in scope.
resource_usageDuration, tokens, and cost reported for observability — never scored or failed.

Worth knowing

What it doesn't do.

Quick start

Four steps from a trace to a verdict.

01

Install and configure Langfuse credentials

cd wm_agents_validator
uv sync --extra dev
cp .env.example .env   # fill LANGFUSE_* values

02

Run a contract against a trace

uv run run-verify \
  --contract contracts/binding/binding_with_widget.yaml \
  --trace-id c4739a2868e2b7aca6430aeae2f7ea0a

03

Compare traces across models

uv run compare-traces \
  --contract contracts/binding/binding_with_widget.yaml \
  --trace-ids <trace-gpt4>,<trace-claude>,<trace-gemini> \
  --out comparison.html

One self-contained HTML file — sortable table, per-plugin heatmap, no server required.

04

Bootstrap a new contract from a trace

uv run generate-contract \
  --trace-id c4739a2868e2b7aca6430aeae2f7ea0a \
  --workflow screenshot_to_code \
  --out contracts/new_workflow.yaml