Technical deep diveVERIS-BM-002

Veris for Benchmarking

Environments, not datasets: what it takes to trust an agent benchmark, end to end.

DocumentVERIS-BM-002
DateAUG 2026
Requirements7
Published benchmarks4 BEHIND IT

Enterprises still evaluate AI agents the way they evaluated models: a fixed question set, a reference answer sheet, a leaderboard. The question that decides budgets is different: how reliably does an agent complete a job inside live systems, over many turns, at what cost per task? That question cannot be answered with a dataset. This page derives seven requirements any trustworthy agent benchmark has to meet, whether you build it or buy it, and shows how Veris meets each one with published measurements. Several of those come from BankingBench, a benchmark we built this way and published: seven models on a single retail-banking workflow, three independent runs of 100 scenarios each, graded by 41 calibrated checks. Three numbers carry the argument:

85%
One score hides the failure you are buying. The category leader wins four of eight categories, and fails 85% of error-handling checks. The aggregate cannot tell you which half you get.
BankingBench · 7 models · 3 runs × 100 scenarios
90.6 90.2
Sometimes the cheapest model is the best one. A 3B open model matches GPT-5 on identical runs; the category detail shows where routing to it is safe, and where it is not.
BankingBench · SmolLM3-3B · a fraction of the serving cost
431/436
A benchmark is worth what its world is worth. 431 of 436 independent verdicts agree between twin and production. Measured, not asserted, because the environment decides what every number produced on top of it means.
twin fidelity benchmark · scored by an instrument we do not control · full report
1.0

A dataset cannot answer the question that decides budgets

A golden dataset was the right tool for evaluating models. Fix an input, fix a reference output, score by comparison, and anyone can reproduce the number. The method assumes the thing under test is a function: same input, same output, one step.

An agent is not a function. It works over many turns, calls tools, reads and writes state, and reacts to whatever comes back, including errors. Correctness lives in the end state of the systems it touched. Whether a support agent handled a card replacement well is not a string you can compare against a reference; the card has to end up frozen, the replacement ordered exactly once, the address confirmed, and nothing else disturbed. Two agents can take entirely different, equally valid paths to that outcome. A static dataset cannot represent any of this. It cannot:

  • hold state, so nothing the agent does has consequences
  • answer a clarifying question or change its mind the way a user does mid-task
  • fail, decline, or time out the way production systems do
  • tell you what the agent broke along the way

Score an agent against a fixed dataset and you have measured the fraction of it that resembles a chatbot.

static dataset · one stateless stepPrompt setfixed inputsModelone replyString matchvs reference answerNo state. Nothing pushes back.Nothing fails mid-task.veris environment · verdict read from end stateActor: “I lost my card. Freeze it.”actor turnAgent calls freeze_card(card_4417)tool callCard DB: status = frozenstate changeAssertion: card frozen, exactly once ✓checked against state
FIG 1-1 · Left: grade the reply against a reference string. Right: grade the world. The verdict is an assertion checked against end state: the card really is frozen, exactly once, whatever the agent said.

Environment-driven benchmarking replaces the answer sheet with a world.Environment-driven benchmarking replaces the answer sheet with a world: stateful twins of the systems the agent touches, simulated users pursuing goals, data that is consistent across all of it. Scenarios carry success criteria checked against the state of that world; the agent runs many times per scenario; results read as distributions. The rest of this page is what it takes to do that credibly.

anatomy · section a-a through a sealed benchmark environment · every crossing is a numbered portAGENTyoursTHE ONLY PIECE YOU BRINGENTERS UNMODIFIEDA-00AIRLOCKSIMUSERSgoal-drivenAGENTunmodifiedTWINSPAYMENTSCRMLEDGER70+ servicesSHARED STATEevery call reads + writesP-01P-02P-03O-01O-02HARNESS CONTROL · P-01CLOCK CONTROL · TIME SHIFTFRESH CHAMBER PER RUNSEALED CREDENTIAL FEEDR5FAILURE INJECTION · P-02TIMEOUTS · RATE LIMITSRETRIES · PARTIAL WRITESON DEMAND · MID-RUNR7SCENARIO LOAD · P-03GOAL + SUCCESS CRITERIASEEDED WORLD STATEPERSONA ROSTERR2OBSERVATION · O-01 → GRADERSEND-STATE SNAPSHOTSIDE-EFFECT LEDGERFULL TRACE + TRANSCRIPTR4REPORT · O-02PASS-RATE DISTRIBUTIONFAILURE TAXONOMYCOST PER OUTCOMER6THE SEAL ITSELFNO PRODUCTION DATA INSIDENO INTERNET EGRESSRUNS IN YOUR VPC · ON-PREMEVERYTHING INSIDE IS SIMULATED · EVERY CROSSING IS LOGGEDENGINE · CHAMBER REBUILT FRESH PER RUN · SEED-PINNEDR5 · R6GRADED BY SHARED POLICY SETVERIFIED BY ENVIRONMENT ASSERTIONFAILURE · INJECTABLE ON DEMANDRECORDED IN THE RUN TRACEDWG VERIS-BM-002 · FIG 1-2 · NTS
FIG 1-2 · The agent under test is the only piece you bring — it enters through the airlock, unmodified. Everything else has to be built and defended, and every signal crossing the wall does so through a numbered, logged port. The Ⓖ Ⓐ Ⓕ Ⓡ marks state how each signal is verified; the R-tags map to the requirement that examines that piece in §2.
2.0

The checklist: seven demands to make of any benchmark

Each demand names the component doing the work and the evidence that it holds up. The table is the whole section in one screen, and it is meant to leave this page. Take it into every vendor conversation, including the one with us.

The checklist · hold any benchmarking approach to this list, including ours
ReqThe demandComponent under testThe evidence here
R1Fidelity measured, not assertedTwins436 third-party tests · 98.9% behaviour parity · zero fake passes
R2Scenarios you can read, edit, and growScenario composerOne workflow became 100 inspectable scenarios
R3Users that behave like usersActorsVAmoS Bench, plus a fully simulated call you can hear
R4Judges you can auditGraders + assertions3 independent passes · checks under 80% agreement discarded
R5Results that survive a re-runThe engine238 = 238 across two freshly built deployments
R6An exam no model has seenThe sealed environmentContamination-proof by construction; regenerate to verify
R7Failures and cost on the scoreboardTwins · engine · reportingA 66-point error-handling spread inside a 5-point aggregate band

Each row is examined below, keyed to the machine in Fig 1-2; the small plan beside each demand marks the component under inspection.

R1Demand fidelity that is measured, not asserted

component under test · twins

A benchmark inherits the credibility of the environment it runs in.A benchmark inherits the credibility of the environment it runs in. If the simulated Stripe accepts a malformed refund the real Stripe would reject, every score produced on top of it is inflated, and you have no way to know by how much. The environment is not a detail of the benchmark; it decides what the numbers mean.

So a twin has to be more than a mock returning plausible JSON. Veris twins run the business logic, keep state across calls, and reproduce failure modes: declines, timeouts, expired tokens. And fidelity is measured rather than asserted, with an instrument we did not write: 436 third-party open-source integration templates, each proven against the live vendor API first, then pointed at the twin with only the base URL changed. Agreement between the two worlds is the fidelity score.

FIG 2-1 · Fleet averages (dots) with per-service ranges (whiskers) across 436 third-party tests on 9 twinned services: Stripe, Asana, Airtable, QuickBooks, Attio, Google Mail, Google Drive, Google Calendar, and Calendly. Exact status is the raw lens — same HTTP status, nothing set aside; behaviour parity then sets aside the seven units where the two worlds simply hold different data. Across all revisions, zero fake passes. Speed, percentiles, the divergence ledger, and limitations: veris.ai/fidelity.

The direction of the residual is what makes these numbers usable: the twin never invents a success. Every open divergence is a refusal — production’s refusal carried with a different status, or a boundary the twin declares up front. A strict twin can understate an agent’s score, never flatter it.

R2Demand scenarios you can read, edit, and grow

component under test · scenario composer

Two questions come up in every evaluation we support: where do scenarios come from, and how do I know they are enough? Scenarios come from your material. The composer reads whatever describes the job and generates hundreds of concrete situations, each born with one to three assertions: success criteria verifiable against the environment’s state (more under R4).

RubricsPRDsPolicy documentsAgent instructionsProduction logsA plain-language prompt

Scenarios are data, not code. You read them, edit them, delete the unfair ones, and add the ones only your team would think of; the distribution across intents, user types, and failure conditions is inspectable before a single run happens. In BankingBench, one workflow, credit card replacement, became 100 distinct situations:

100 scenarios · one workflowLost cardsStolen walletsDamaged chipsExpired cardsWrong address on fileMulti-card accountsCard already in transitAdversarial variants

Comprehensiveness has a second half: the set grows when reality outruns it. Any failure found later, in testing or production, is pinned as a permanent scenario, so the benchmark ratchets.

R3Demand users that behave like users

component under test · actors

Most published agent evaluations simulate the user as a script: fixed utterances, fixed order, one goal, infinite patience. People do not work like that, and multi-turn behavior is where agents earn or lose their keep. Veris actors are goal-driven simulated humans with knowledge they reveal the way a person would and a temperament that shapes tone and patience. An employee does not open a clean session, pursue one goal, and log off; they touch Outlook hundreds of times a day, juggle three tasks in one thread, and abandon two. That behavior is a configuration, not a special case, and it extends to multilingual text and voice with accents and background noise.

FIG 2-2 · An actor pursues goals, not a script. It interrupts, reprioritizes, and holds back information the way people do; the session only ends when its goals are resolved or abandoned.

The actor layer carries its own public proof: VAmoS Bench ranks commercial voice agents end to end, every one evaluated on the same simulated calls. This is what one sounds like:

Field recording · VAmoS Bench

An adversarial caller claims authority over an account

fully simulated call · both voices synthetic

A VAmoS Bench actor working a voice agent: pressure, interruptions, and a goal it will not drop. More calls, including the failure cases, at veris.ai/leaderboard.

R4Demand judges you can audit

component under test · LLM judges

An LLM judge is a measurement instrument, and instruments get calibrated. Handing a transcript to a model with “rate this conversation 1 to 10” produces a number with no error bars and no defense. Veris separates judging into two layers. Graders measure policy adherence: one shared set across the whole benchmark, generated from your policy documents, regulations, and PRDs, scoring N/A where a check does not apply. Assertions measure per-scenario success: one to three per scenario, generated together with the scenario itself. Because Veris also generates the environment and its data, each assertion is written against exactly what is in the world, so ground truth is fixed before the run.

layer 1 · policy adherence, shared across the benchmarkPolicy docs · regs · PRDsyour materialGradersone shared set · N/A when unfitlayer 2 · per-scenario successScenario + environmentgenerated togetherAssertions1–3 per scenario · state-checkedJudge panel3 independent passesFilter<80% agreement out
FIG 2-3 · Two judging layers, one calibration discipline. In BankingBench the grader layer is 41 checks across 8 categories; every session is judged three times and unreliable checks are discarded, not reported.

Agents narrate actions they never took. Transcripts absorb the fiction; state does not.The split matters because the layers fail differently: an agent can satisfy every assertion while violating policy on the way, or follow policy perfectly and never finish the job. And both layers grade against the environment, not the transcript alone. Agents narrate actions they never took; transcripts absorb the fiction, state does not. Our position on judging: your LLM-as-a-judge is asking the wrong question.

R5Demand results that survive a re-run

component under test · the Veris engine

Agents are stochastic: the same agent on the same scenario can succeed at noon and fail at one, so a single run proves nothing in either direction. Repetition only helps if the environment adds no noise of its own. That is the engine’s job: like a game engine it maintains one consistent world across every twin and actor, one clock, one cast of characters, one state. When a run fails against Veris, the failure is signal about the agent rather than flake to retry away.

3 × 100
Independent runs × scenarios per model in BankingBench, ~300 sessions each
238/238
Identical verdicts across two freshly built deployments
repeat study · fidelity report
Every step
Sandboxes reset, fork, and replay; each agent step and LLM call is captured

Benchmark numbers you cannot replay are numbers you are taking on faith.Six months from now you can replay the exact run that knocked a vendor off your shortlist and check the reasoning against the same world state. Benchmark numbers you cannot replay are numbers you are taking on faith.

R6Demand an exam no model has seen

property under test · privacy of the environment

Public agent benchmarks are published with their tasks, their environments, and usually their solutions. Frontier models train on the open web, so the models you are comparing have seen the exam: a public-benchmark score mixes capability with recall, and no one can tell you the ratio. Procurement makes it circular, because every vendor quotes the same public numbers.

public benchmark · the loop closesPublic benchmarktasks + solutionsOpen webGitHub · papersTraining crawlabsorbed by modelsScorecapability + recallthe closing red segment is the problem: the exam leaks back into the studentsprivate environment · a line, not a loopYour rubricnever publishedFresh scenariosregenerate on demandSealed environmentinside your VPCscore = capability onlyno route back to the open web
FIG 2-4· A public benchmark is a closed ring: its exam leaks into training crawls and returns as recall. A private environment is a straight line into a sealed chamber. An exam that never existed before the run cannot be in anyone’s training data, and regeneration lets you verify a score survives on capability alone.

Environment-driven benchmarks are contamination-proof by construction rather than by policy. Scenarios generate fresh from your rubric inside a private environment and are never published. Because generation is cheap, you can regenerate variants at the same difficulty and check that a score holds: a score earned on capability survives regeneration; one earned on familiarity does not.

R7Demand failures and cost on the scoreboard

cuts across · twins, engine, reporting

An agent that has only ever seen healthy APIs is judged on half the job.Production systems decline payments, time out, lose responses, and expire tokens, and that is where agents do their damage. Judgment about an agent that has only ever seen healthy APIs is judgment about half the job. Twins reproduce failure modes on demand, so the benchmark can ask directly: the payment provider goes down mid-refund, what does the agent do with the ambiguity? BankingBench shows why this cannot stay a footnote.

FIG 2-5· The fall from aggregate to category. Hollow: overall pass rate, seven models inside a 5-point band (88.2–93.5%). Filled: the error-handling category on the same runs. The connector is the drop a single score conceals. Data: BankingBench.
BankingBench · pass rate per category, 7 models, 3 runs × 100 scenarios each
CategoryDeepSeekGPT-4oSmolLM3KimiGPT-5GPT-OSSGrok
Data accuracy96.5%96.1%95.9%95.4%95.2%95.0%92.7%
Delivery confirmation82.9%91.7%87.9%89.7%88.7%75.7%61.7%
Error handling80.6%73.0%76.8%67.2%68.4%66.7%14.7%
Freeze handling90.8%90.2%89.2%88.4%88.2%88.5%95.5%
Information gathering98.3%94.9%94.7%94.9%94.8%92.5%94.4%
Replacement execution94.5%74.4%75.5%75.0%74.2%87.7%95.3%
Scope management96.0%96.9%97.3%96.2%96.6%92.2%97.8%
Status updates87.4%82.5%84.8%83.3%83.7%82.4%92.2%
Overall pass rate93.5%91.1%90.6%90.3%90.2%89.3%88.2%

Green ≥90% · plain 75–90% · amber 50–75% · red <50%. Checks below 80% grader agreement discarded. The model leading four of eight categories, Grok-3-fast, fails 85% of error-handling checks: best and worst simultaneously, invisible to any aggregate score.

Cost belongs on the same scoreboard, measured the same way. Run identical tasks across candidate models in identical environments and you get a cost-quality frontier for your workload, not the vendor’s. In the same benchmark a 3-billion-parameter open model, SmolLM3-3B, matched GPT-5 on overall pass rate, 90.6% against 90.2%, at a fraction of the serving cost. The category detail tells you when the cheap model is safe to route to and when it is not, which turns model routing from a hunch into a table.

We ran exactly that comparison on a production telecom customer assistant: six models, three scenario sets (account tasks, guardrails, knowledge grounding), 25 scenarios each, identical environment and judges throughout. Three different models won the three sets, and the cheapest model in the pool won knowledge grounding outright at 96% while costing 24x less per scenario than the premium model it beat. Full results: the right model for the right task.

3.0

One cycle end to end: what you bring, what you get

“Solution completeness” has a plain meaning for a buyer: if we adopt this, what do we still have to build ourselves? The honest answer is one benchmarking cycle walked end to end. You bring two things, a rubric and access to the agent under test. Here is the rest.

01Rubricwhat you bring02Scenarioscomposed + edited03Environmenttwins + data04Runsat scale, isolated05Reportquality + cost06Auditreplayable07Re-teston every changefailures pin back into the scenario set: the benchmark ratchets
FIG 3-1 · One cycle, end to end. You bring the rubric and the agent under test; each node below names what happens there.

Assembling the environment

Do the twins exist?for the systems your agent touchesyes · most cases~15 minassemble and seed the worldno · new connector~48 hnew twin, built from its API specinternal systems includedCatalogue · 70+ twinsbuilt once · reused by every future evaluation
FIG 3-2 · If the twins exist you assemble in minutes; if not, one is built in about two working days. Every twin built joins the catalogue, so the 48-hour path is paid once per system.
FineractDXC HoganOpenSanctionsLexisNexisGmailGoogle CalendarGoogle DriveSalesforceTwilioZendeskIntercomDocuSignPagerDutySlackPayPalNotionOktaGitHubDatadogSAPStripeJiraAuth0AsanaPostgreSQL+ dozens more, from banking cores to ERPs

The harder question, the one every large enterprise asks us, is whether this survives a genuinely complex estate: thousands of applications, non-standard interfaces, systems wired into each other. Fidelity there is a property of the engine, not of any single twin. Because all twins share one world, cross-system consistency is maintained for you: the customer in the CRM is the sender of the email thread, the meeting on the calendar, and the owner of the open ticket. The scale question deserves a concrete answer rather than a claim, which is what a scoped pilot on your own systems is for.

Loading data, connecting the agent

Realistic questions against toy data still produce toy verdicts, so data enters the world three ways: seed it with a partial anonymized sample from production and Veris expands it into a complete, consistent world; have Veris synthesize it outright to your schemas; or import open datasets where they fit. However it arrives, the actors’ knowledge stays synchronized with what is loaded, so a simulated customer asks about the order that actually sits in the simulated database, and nothing in this path requires production data to leave your control.

Channelthe transport it connects overHTTP APIWebSocketMCPPhone · PSTNWebRTC
Modalitywhat travels over itTextAudioFiles · PDF, JSON
Datahow the world fillsSeed · anonymized sample, expandedSynthesize · to your schemasImport · open datasets
ANY COMBINATION THE AGENT USES IN PRODUCTION — THE SAME WEBSOCKET CAN CARRY A CHAT, RAW AUDIO FRAMES, OR AN UPLOADED DOCUMENT; A PHONE CALL IS AUDIO OVER PSTN.

Channels and modalities are separate axes: the transport, and what travels over it. The agent under test connects over whatever combination it uses in production, unmodified; its outbound calls resolve into the sandbox.

Drawing the test boundary

Conversational agent

Actors play the humans, twins play the dependencies.

Workflow agent

The upstream trigger is simulated, payload and all.

Multi-agent system

Isolate one agent and simulate its counterparts, or put the ensemble under test and simulate only the shared world.

Agent-to-agent

When one side is under test, Veris plays the other; when both are real, Veris supplies the environment they meet in, such as the calendars both are trying to book against.

Green fill = simulated by Veris · ink outline = real, yours. The state slab is always part of the simulated world.

Running, reading, re-testing

Runs execute in isolated sandboxes, thousands concurrently when the benchmark calls for it, each resettable, forkable, and replayable; the agent does not know it is in a simulation. Results come back side by side, model against model or version against version, quality and cost per task in the same table, and every number drills down to per-step traces. The category matrix above is exactly this report shape. Runs are retained as replayable artifacts and benchmarks are versioned, so a decision made in March is auditable in September. The benchmark does not retire at launch either: it becomes the pre-release gate for every prompt change, tool change, and model swap, plus a drift check when vendors silently update the models underneath you.

4.0

After the score: every failure becomes a fix

A benchmark that ends at a score wastes most of what it learned. Every failed session in Veris is already a diagnosed failure: root-cause analysis traces it to the specific instruction, tool definition, or orchestration step that broke, and proposes a concrete fix. The failing scenario is pinned to the benchmark permanently, so the bug that got fixed stays fixed on every future run. Patch, re-run the same scenarios, compare. The model stays untouched through all of it; this loop improves the harness around the model, which is where most production failures live anyway.

Simulatesame scenariosEvaluategraders + assertionsRoot-causeinstruction or toolPatchconcrete fixRe-runpinned scenariosMODEL UNCHANGEDthe loop spins around it, every pass on the same pinned scenariosmost production failures live in the harness — this is where they get fixed
FIG 4-1 · The model sits still at the center while the harness improves around it. Every failed session is a diagnosed failure; every diagnosed failure is a pinned regression test. Write-up: the loop is the easy part.

One loop iteration on an analytics assistant we work with:

7.7M → 2.8M
Token consumption per benchmark run, a 64% drop
584 → 7
Failed tool calls
2 leaks
Confidentiality leaks blocked before deployment

A separate note on training your own models. Improving the harness and training a model are different levers, and this page is about the first. But the same environments serve the second when you get there: scenario runs produce exactly the data reinforcement fine-tuning needs, and the benchmark tells you when training is worth it. If a small model already clears your bar on the categories that matter, route to it and bank the savings; if no model clears the bar, training is the remaining lever. Savi Security took that path on Veris infrastructure and fine-tuned a 4B model to 94.4% scam-detection accuracy, ahead of the frontier models it was benchmarked against, at 2 to 13 times lower latency. More: environments, not examples.

5.0

Check our work

Everything cited above is published:

The fastest way to pressure-test any of it is a pilot on one of your own workflows: rubric in, environment assembled, first side-by-side numbers out, typically inside two weeks.

Questions, or a claim you want to see measured: hello@veris.ai