state → move, from evidence. Until now that evidence was the Arena’s
simulated episodes. This page is about the calls your agent really made: turning them into evidence, fitting
every engine on the same calls, and scoring each one on calls it never saw, beside what your agent does today.
1. Build an evidence set
From Data lab → Engines → Benchmark on real calls → Build a set from real calls, or:
What happens to each call:
- Scrubbed first. Only the turns’ text, the outcome and a hash of the call id survive. Phone numbers are removed before a tagger or the file sees a turn; nothing else of the row is kept.
- Tagged. Each agent turn gets one of the eight moves. The state (
stage:trust:objection) is read from what the customer had said before the turn, so a move never leaks into the state it is chosen from. Whatever a model tagger leaves out falls back to the rule reading and is counted in the set’stagger.stats. The rule tagger reads no warmth, so its states all sit in the middle trust bucket. - Priced by the outcome. The platform’s label is folded by the tenant’s outcome map (the importer’s table,
overridden by what you saved on the world’s Outcomes card), so
viewing_bookedis the win. Rewards are 0 per turn and the last kept turn carries the outcome’s terminal value. Calls with no usable outcome are left out. - Propensities estimated. No log records how likely the agent was to make its move, so it is estimated per
state from how often it did:
propensity_source: "empirical". - Split by call. 80% fit, 20% held out, by a hash of the call id and the seed: rebuild with the same seed and every call lands on the same side. Preference pairs are built from the fit calls only.
datasets volume at rl/<tenant>/evidence-<tagger>-<time>.json, in the same shape as
every other evidence document (transitions gain a split field), and listed by GET /api/rl/evidence-sets.
2. Run the benchmark
Pick the set and the engines on the card and press Run the benchmark, or:--remote, and its
table is scored like the built-ins:
3. Read the leaderboard
Every row is scored on the held-out calls three ways, each with a 95% bootstrap interval over calls:- ESS is the effective sample size: how many held-out calls the importance-sampling estimate really rests on. A deterministic table that disagrees with your agent often has a small one.
- vs today and vs random are paired differences: the same resampled calls on both sides.
- A state the engine’s table does not know is left to today’s agent, which is what serving does.
Each row opens into its three estimates, the reasons, and the table it decided, in the world’s own words. An
engine that comes out ahead is a candidate for a canary under Release, with a control group; that is what
proves it.
The API
evidence_set also takes sim:<world> (that world’s simulated episodes) and vol:<path> (an evidence file on
the datasets volume that no record points at).
If the dashboard restarts while a benchmark runs, the job’s output is lost with it and the benchmark has to be
run again. A build keeps going on the platform and its file still lands on the volume, where the list picks it up.

