Skip to main content
The decision engines learn a table, 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.
Offline scores on logged calls rank candidates; they do not prove a lift. The moves and states are a tagger’s reading of the transcript, today’s propensities are estimated from the log, and no log can show how a customer would have answered a move nobody made. Only a canary against a control group proves a lift. Every report says this, and so does every verdict.

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’s tagger.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_booked is 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.
The set is written to the 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:
It runs as a CPU job in your workspace, never inside the dashboard. Each engine that learns from a log (transitions or preference pairs) is fitted on the fit calls with its default knobs and scored on the held-out calls. REINFORCE, PPO, the online learners, model-based learning and R-max are listed as simulator only: they learn by acting, and a log cannot say what would have happened after a move nobody made. Their measurement is each engine’s Run against a world’s simulator. Your own engine joins the same leaderboard. It is fitted on the set’s fit calls, here or with --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.
The verdict reads: 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.