The call-quality evaluation lifecycle
Quality management has two halves. The first is the scorecard pipeline — evaluation forms, reviewer scorecards, acknowledge/appeal, AI auto-scoring, and the leaderboard — covered in QA evaluations and the performance leaderboard. The second half, covered here, is the operations layer around those scorecards: routing review work to humans, keeping reviewers consistent with each other, turning QA output into coaching, verifying that auto-scoring is actually covering your traffic, and rolling per-call scores up into org-wide summary, trends, drivers, and custom supervisor composites. The ownership boundary in one line: this page owns routing and calibration; the sibling page owns the scorecards themselves. Forms, weighted criteria, the author-acknowledge-appeal-resolve lifecycle, and leaderboard points are all documented there. Once a score exists, everything below — who was asked to produce it, how reviewers stay honest, how the operation is measured — lives here. A call finishes, a recording and transcript land in the library, and then one of two things happens: the AI auto-scores it, or a supervisor assigns it to a human evaluator as a scoring task. Everything below is what happens to that scoring task — from assignment through calibration to the rollups supervisors watch.The cast of entities
- Evaluation assignment — a routing envelope for a scoring task, not a score. Assigning picks a call and names a reviewer; the row later carries the reviewer’s scorecard. An assignment stays open until the assigned reviewer scores the call, so open-assignment count is the workload measure. Supervisors rebalance open work between reviewers, every reviewer holds a quota of open assignments (the API rejects over-quota assigns with
409 QUOTA_EXCEEDED), and a call that already has an open assignment cannot be double-assigned (409 ALREADY_ASSIGNED). Due dates are derived from your tenant’s assignment window (created_at + due_days), not stamped on the row — change the window in settings and the workload view recomputes. - Calibration session — a scheduled inter-rater agreement pass that pins one call and one form and invites a roster of reviewers. Every invited reviewer scores the call blind: they cannot read another reviewer’s score — or the AI auto-score — until they submit their own, and that rule is enforced server-side, not just hidden in the UI. Once at least two reviewers submit, the session report shows per-criterion variance, overall agreement, and each reviewer’s delta from group consensus — including the AI’s drift from that consensus. Calibration scores are practice rows: they never enter official averages, the leaderboard, or the agent’s acknowledge/appeal flow.
- Coaching cards — per-agent readouts folded from official reviewer-authored evaluations: average QA score, flagged share, weakest criteria, plus short badge chips. Supervisors read them as a “who needs drilling” view; agents read their own card scoped to themselves.
- Autoscore coverage — the one-glance answer to “how much of my traffic is the automated AI scorecard actually scoring?” It counts completed calls in the trailing window against calls carrying an AI-scored evaluation, across both the voice scorecard lane and the conversation-judge lane, and averages the automated scores.
- Auto-QA readiness — the operational health snapshot for the automation: is the auto-scoring toggle on, does an active evaluation form exist, are eligible calls landing in the window, and what share of those candidates actually came back with an AI scorecard. Coverage tells you how much; readiness tells you why not when the number is wrong — a disabled toggle, no active form, or calls without transcripts.
Why the quota and blind rules are designed this way
Two design decisions shape everything downstream, and both exist to protect the score that comes out at the end. Open-assignment quotas keep scoring honest. A reviewer with an unbounded queue of open work does one of two things: they rush to drain it and scores get thinner, or it ages and the operation stops meaning anything. A per-reviewer cap (rejected at the API with409 QUOTA_EXCEEDED) forces backlog to stay visible as a supervisor problem — rebalance, reassign, or adjust the sample rate — instead of being silently absorbed into someone’s queue. And the queue only counts open work: a scored assignment drops out of the workload immediately, so the number a supervisor sees is the work actually left, not the work ever handed out.
The blind rule keeps calibration signal-clean. Calibration measures whether two reviewers — or a reviewer and the AI — grade the same call the same way. That measurement is only valid if each score is formed independently. If reviewer B could read reviewer A’s submitted score before writing their own, agreement would inflate: B grades toward A, the report shows consensus, and the drift you needed to find has been laundered out. The API therefore gates the report reads — the detailed scores table and pairwise deltas return 403 until every invited reviewer who has not yet submitted their own score is asking for someone else’s. Submit yours first; then the report opens. That is why the blind rule lives server-side: a UI-hidden table would still be one network call away from an inflated agreement pass.
The five-step lifecycle
The operation below is one loop a supervisor runs continuously. Each step names the supervisor action that advances it, and the read endpoint that observes it.- Open. A supervisor opens an assignment — hands a specific call to a specific reviewer — or samples work automatically: a form with a
sample_rate_pctabove zero queues a share of each agent’s calls for human review, and with auto-scoring enabled every completed call is AI-scored in the background. Assignments respect per-reviewer quotas, and an open assignment can be reassigned when workloads shift. Advancing action:POST /api/v1/quality/evaluations/assign(or a reassign). Observed by:GET /api/v1/quality/evaluations/workload— per-reviewer open counts against their quota. - Calibrate. Calibration sessions sit alongside production scoring as a consistency pass — reviewers score the same call blind, and the session report exposes drift per reviewer, per criterion, and for the AI against group consensus. A team whose reviewers disagree on the calibration call will disagree on live ones; fix the rubric or the coaching, then re-run. Advancing action:
POST /api/v1/quality/calibrationsthenPOST /api/v1/quality/calibrations/{id}/scoresper reviewer. Observed by:GET /api/v1/quality/calibrations/{id}/report, once each reviewer has submitted. - Score and react. The assigned reviewer scores the call; the agent acknowledges or appeals; a supervisor resolves. Low scores auto-generate coaching assignments, and coaching cards accumulate the per-agent picture. Advancing action:
POST /api/v1/quality/evaluations(orclaim-scoreon an auto-queued sample), then the acknowledge/appeal/resolve endpoints — the full sequence is documented in QA evaluations and the performance leaderboard. Observed by:GET /api/v1/quality/coaching-cardsandGET /api/v1/quality/compliance-flags. - Roll up. The supervisor-level summary folds both scoring pipelines — reviewer-authored call scorecards and the AI-judged conversation scores on digital channels — into one org-wide view: pass rate, average confidence, breakdowns by channel and rubric, plus a recent-failures triage list. Trends give the per-day weighted-score average per agent and per form. Drivers rank the criteria. The gamification leaderboard ranks agents on the tuned points mix. Supervisors who want one number build a composite scorecard over the same facts. Advancing action: none — this step is pure read over graded facts. Observed by:
GET /api/v1/quality/summary,GET /api/v1/quality/trends,GET /api/v1/quality/drivers, plusPOST /api/v1/quality/scorecards/compositefor the one-number view. - Verify coverage. Autoscore coverage and auto-QA readiness close the loop on automation itself: what share of traffic the AI scored, what it averaged, and — when coverage sags — which generation gate is off. Advancing action: none — these are health reads on the automation. Observed by:
GET /api/v1/quality/autoscore-coverageandGET /api/v1/quality/auto-qa-readiness.
data.data envelope is what createResponse wraps, and the error envelope is what a rejected call returns. The full field-by-field contract for all twelve endpoints stays in the Quality API reference; these samples show how the calls chain together, not a second schema source.
Sampling via API
Run the sampling loop end-to-end: raise the form’s sampling share, assign one call from the sampled queue, hit the quota, and resolve it. Sampling itself is a form property — setsample_rate_pct above 0 on the form and the auto-sampler queues that share of each agent’s completed calls for human review. When you want a specific call scored directly, assign it by hand and observe the result on the workload read.
- Node.js
- Python
- Go
due_at is computed from created_at + due_days in your tenant settings, never stamped:
curl
409 ALREADY_ASSIGNED instead — one open row per call, regardless of who holds it. The resolution for quota pressure is POST /api/v1/quality/evaluations/{id}/reassign (shown in the samples above) or a raise of max_open_per_evaluator in the tenant’s assignment settings. The workload read reflects the change on the next call:
Calibration pass walkthrough
One session, blind submissions, then the agreement report. Create the session pinned to one call and one form — the creator is always on the roster, and if the call already has an AI auto-score, that score lands in the session read-only asai_seeded: true (the drift baseline the report measures humans against):
- Node.js
- Python
- Go
curl
POST /scores per reviewer carrying a raw score map — criterion id to raw 0–100 value. The server re-derives the weighted total against the form definition, so the client never supplies (and cannot override) total_score. Send your score before reading anyone else’s — that is the blind rule:
curl
409 ALREADY_SUBMITTED when you score the same session twice, and 403 FORBIDDEN when you were never invited. Once the roster has submitted, the report opens — with the blind gate still covering stragglers:
consensus_total is the human mean, mean_pairwise_delta the average pairwise gap, per_criterion the variance per rubric line, reviewer_deltas each grader’s signed distance from consensus, and ai_delta the AI score’s drift from the human consensus (null when no auto-score was seeded):
ready stays false until at least two human submissions are in — before that the numeric fields still render but the report is not yet meaningful. Close the session with POST /calibrations/{id}/close once the pass is complete; a second close returns 409 INVALID_STATE.
Status readback
Two health reads close the loop on automation — coverage answers “how much of my traffic got an AI score”, readiness answers “why not” when that share sags. Both are GETs, both reviewer-scoped, both read-weighted by design.- Node.js
- Python
- Go
curl
pending_review_rows counts the auto-scored rows still flagged for human review — it drains as reviewers override flagged cards. When coverage_pct sags, the readiness snapshot names the gate: a disabled toggle, no active form, or calls without transcripts.
curl
coverage_pct is null when zero eligible calls exist, and flagged_share_pct is null when zero AI cards exist — an empty state, not a 0% claim. Readiness is the check-in runbook for the automation: if generation_gate.enabled is false the sweep stays idle, if has_active_form is false there is no rubric to score against, and if eligible calls land without transcripts the window narrows before the scorer ever sees them.
Scorecard vocabulary
Three views read the same official-score contract — graded, reviewer-authored evaluations only (an agent scoring their own call, an un-scored queued placeholder, and rows under appeal never enter an official average):- The individual call scorecard — one weighted evaluation of one call against one form. Authored by a human reviewer or by the AI auto-scorer, correctable by override, and acknowledged or appealed by the agent. This is the unit everything else aggregates.
- The supervisor scorecard — a per-agent 0–100 composite you define on the fly: custom KPIs (QA average, average handle time, calls handled, CSAT, queue SLA, first-contact resolution) with your own weights and targets, weighted across voice and QA into one number. The definition comes in per request — nothing is stored; the composite is a read-time rollup over the same tables.
- QM drivers — the per-criterion rollup: every scorecard line (“Greeting”, “Policy disclosure”, “Resolution”) normalised to a 0–100 average and sorted worst-first, so “which lines move the score” is a read, not a spreadsheet.
Where reads sit, where writes are gated
Every surface above is mounted under/api/v1/quality. The split:
- Writes (reviewer scope — owner, admin, or supervisor): assignment and reassignment, calibration sessions and blind scores, composite-scorecard definitions, leaderboard computation, and the scorecard lifecycle itself (author, override, resolve).
- Reads: workload, session reports, coaching cards, compliance flags, coverage, readiness, summary, trends, and drivers are all GETs any reviewer can run; agents read only their own card and flags through self-scoped guards.
- Blind-gated reads: a calibration report returns
403to an invited reviewer who has not submitted their own score yet — the blind rule applies to reading agreement, too.
The recording library is the worklist all of this draws from: every recording in the tenant, full-text-searchable over finalised diarised transcripts, joined to the linked QA evaluation score and the recording QC verdict — so “recordings where the customer said X, scored below Y, QC-failed” is one query, reviewer-scoped because it surfaces transcript content across all agents.
The full request/response shapes are in the Quality API reference; the per-call scorecard pipeline itself is documented in QA evaluations and the performance leaderboard.