All work

Sales coachingR&DEngineering

An adversarial roleplay loop with normalised scoring

Building a voice agent whose job is to be difficult — interrupting, objecting, pressing on price — then converting the session into structured turns and scoring it against a weighted rubric so the number means the same thing across every rep.

Challenge
An adversarial agent has to interrupt, which is a timing decision made against an incomplete utterance — and raw rubric scores drift between personas and lengths, so a hard persona looks like a worse rep.
Solution
A streaming roleplay loop with an objection policy operating on partial utterances, structured event capture at the time of speaking, and a rubric kept separate from the model so a model change cannot move the scale.
Impact
Sessions became queryable structured data rather than recordings, with scores comparable across reps, personas and months.
Status
A Bigcircle R&D build on the same runtime as our insurance and real-estate agents. No client, no deployment.
20–40m → 2–3m
Manager review time

Full call-length listening replaced by a per-session guided summary. Internal result from our own R&D build.

One rubric
Scoring every session identically

Schema-driven weighted dimensions with normalisation, so feedback does not depend on which manager happened to listen.

One runtime
Across three domains

The same voice stack behind our insurance and real-estate agents. Demonstrable reuse rather than a measured outcome.

Stack

Real-time voice roleplayRubric-based scoringStructured session captureShared voice runtime

Most voice agents are built to be agreeable — to understand, comply and resolve. This one is built to resist, which changes the real-time problem: the agent has to decide when to interrupt, and interrupting well is a timing decision made against an incomplete utterance.

This is the engineering half of the case study. The business read — and the fact that this is our own R&D showcase rather than a client engagement — is a separate document.

The problem

An adversarial agent has to interrupt, and interruption is a real-time judgement. A cooperative agent waits for a turn to end. This one has to decide mid-utterance whether the rep has said something worth pushing on, and cut in — early enough to feel like a real objection, late enough not to be nonsense. There is no end-of-turn signal to wait for, because the whole behaviour happens before the turn ends.

Scoring needs structure that audio does not have. A recording cannot be scored consistently, compared across reps, or tracked over time. It has to become turns, speakers, timestamps and events at capture time — reconstructing that later from audio is both lossy and too slow to be part of a practice loop.

Rubric scores are not comparable by default. Raw model scores drift between sessions, between conversation lengths and between personas. A hard persona producing lower scores than an easy one is correct; a hard persona producing lower scores for the same performance is a broken measurement, and the two look identical without normalisation.

And the feedback loop has to close fast enough to be practice. Feedback the next day is feedback about a call the rep has stopped thinking about.

  • Barge-in decided mid-utterance, not after a turn boundary

  • Structured capture at the time of speaking, not transcription afterwards

  • Normalised scores, comparable across personas, lengths and reps

  • Multi-tenant concurrency, because a sales floor practises at the same time of day

Architecture

Three pieces on a shared runtime — and the runtime is the same one behind our insurance and real-estate agents, which is why a third domain cost a tool layer and a rubric rather than a build.

The agentic voice runtime is a streaming roleplay loop with turn segmentation and role tagging. What is specific to this product is the objection policy: the logic deciding when to push, what to push on, and how hard, given the persona and deal stage. That policy operates against partial utterances, which is what makes it a different real-time problem from a cooperative agent.

The conversation capture layer emits structured events as the conversation happens — timestamped turns, speakers, session metadata — into a unified output schema. Capture is a first-class concern rather than a byproduct, because everything downstream is a function of it.

The scoring engine is schema-driven: weighted dimensions, behavioural markers and normalisation logic, applied identically to every session. Communication, persuasion, product knowledge and closing, plus strengths and missed opportunities. Language models produce the qualitative read — summary, gaps, objection detection — and the rubric produces the number, deliberately kept separate so a model change cannot silently move a score's meaning.

A multi-tenant data plane with normalised schemas and API access feeds dashboards and BI directly.

Design decision: the qualitative analysis and the score come from different mechanisms. If the model both writes the feedback and sets the number, a model upgrade shifts every historical comparison and nobody can tell whether reps improved or the scale moved.

The business read: why consistency is what makes coaching measurable

How it works

Configure the pressure

Persona, objection profile and deal stage set what the agent will push on, so practice targets a specific weakness rather than being generic.

Run the adversarial loop

Streaming roleplay with turn segmentation and role tagging. The objection policy evaluates the in-flight utterance and decides whether to interrupt, which is the behaviour that makes the practice worth anything.

Capture as structured events

Turns, speakers, timestamps and metadata are written as the conversation happens, into one schema — so the session is queryable the moment it ends.

Analyse qualitatively

Models produce the session summary, strengths and gaps, objection detection and coaching feedback from the structured transcript.

Score against the rubric

Weighted dimensions and behavioural markers, then normalisation — so the number is comparable to the rep's last session and to their colleague's.

Serve it

Rep- and team-level metrics through APIs and dashboards, multi-tenant, with many roleplays running concurrently.

Control planes

Governance

The rubric is the authority on scoring, not the model. Weights, behavioural markers and normalisation are defined and versioned, so a score means one thing across reps and across months. Keeping the model out of the scoring path is the control that matters: it means a model change alters the quality of the written feedback without moving the scale underneath the historical data.

Orchestration

Per turn: segment, tag the role, evaluate the objection policy, decide barge-in, respond. Per session: capture events, analyse, score, normalise, publish. Multi-tenant throughout, since a sales floor practises in the same hour.

Observability

Every session resolves to its turns; every score resolves to the behavioural markers that produced it. That second path is what makes the system usable rather than merely correct — a rep who disagrees with a score can see what drove it, and a coaching tool that cannot show its reasoning gets argued with instead of acted on.

Score distributions per persona are the calibration signal. If a persona's distribution drifts, the persona has changed difficulty, and the normalisation needs revisiting before the scores are read as a trend.

When it fails

Barge-in timing is the failure the user feels. Too eager and the agent talks over a rep mid-sentence for no reason, which teaches the wrong lesson and breaks the simulation. Too slow and it is not an objection any more, it is a comment. The policy has to be tuned per persona, because an aggressive buyer and a sceptical one interrupt at genuinely different moments.

Capture gaps are the failure that is silent. A dropped event produces a session that scores fine and is missing the exchange that mattered — which is why capture writes as the conversation happens rather than being assembled from audio afterwards.

And normalisation drift is the slow one. A persona whose difficulty shifts, or a rubric edited without versioning, makes historical comparison quietly meaningless while every individual score still looks reasonable.

Results

Measured on our own R&D build.

  • Manager review from 20–40 minutes to 2–3, with a guided per-session summary replacing full-call listening

  • Scoring variance across evaluators sharply reduced, because the rubric replaces the reviewer as the authority

  • Sessions queryable as structured data, not recordings, so trends across reps and time are computable

  • The voice runtime reused across a third domain, needing new tools and a new rubric rather than a new build

Evidence

Directly demonstrable: the real-time adversarial roleplay loop with turn segmentation and role tagging, structured session capture into a unified schema, the weighted rubric with normalisation, model-generated qualitative analysis, and the multi-tenant data plane behind dashboards and APIs.

Internal results, ours alone: the review-time reduction and the variance improvement. This is a Bigcircle R&D build with no client and no deployment, so nothing here is a customer-confirmed result.

If you are building evaluation on top of a model, the separation worth copying is between the thing that writes the feedback and the thing that sets the number. Merge them and your scores stop being comparable the first time you change models, which you will, and you will not find out until someone asks whether the team actually improved last quarter.

How we classify these numbers, and why they are all ours

Want the version of this built for you?

We can walk you through Bigcircle R&D Built an AI Sales Roleplay Coaching Platform live — the architecture, the failure modes, and what we would change for your constraints. Tell us what you are building and we will come back with a concrete plan.

Reply within 2h