Fault codes
The fourteen faults VoiceLens detects, what triggers each one, its severity, the evidence attached, and which ones you can switch off per rubric.
A fault is a specific, evidenced problem on a call. Each fault carries a code, a severity, the time it happened and the transcript turns that prove it. Faults are the main input to the health score: danger faults cost 15 points, warnings 5, info nothing.
Faults describe speech roles, not agent types. The same detectors run whether the agent turn came from an AI voice agent or a person; agentType is metadata for filtering and comparison.
Conversation faults
These describe how the agent handled the conversation.
| Code | Trigger | Severity |
|---|---|---|
REPETITION | The agent asks a question whose fingerprint already appeared in an earlier agent turn. | Warning; danger at three or more repeats |
SELF_REPEAT | Inside one turn the agent says the same run of six or more words twice: it finishes a sentence and starts it again, as a voice agent does when a false barge-in makes it regenerate a reply. Number read-backs are exempt. | Warning; danger at three or more copies |
CONTEXT_LOSS | After at least 30 seconds and substantive customer speech, the agent re-introduces itself or restarts the script as if the call had just begun. | Warning; danger if it happens twice |
MISSED_CORRECTION | The customer corrects a detail ("no, it's seven, not eleven") and the agent's next turn does not acknowledge it. | Warning |
MISSED_PIVOT | The customer raises a second topic or entity (for example two property types) and the agent never re-confirms which one they are working on. | Warning |
CUSTOMER_PROMPT | The customer has to check whether anyone is there ("hello?", "are you still there?"). | Warning |
SENTIMENT_DROP | The customer's smoothed sentiment crosses into negative territory after being neutral or better. | Warning if it never recovers; info if it recovers by the end of the call |
Timing faults
Both are measured on the gap between the end of a customer turn and the start of the next agent turn. Thresholds live on the rubric.
| Code | Trigger | Default thresholds | Severity |
|---|---|---|---|
AGENT_LATENCY | The agent takes longer than the latency threshold to respond, but less than the dead-air threshold. Not raised when the pause was announced. | 8 s | Warning |
DEAD_AIR | Silence longer than the dead-air threshold, whoever was expected to speak. | 12 s warning, 25 s danger | Warning; danger above the danger threshold; info when the pause was announced |
Announced holds. A silence is not a stall if the other side was told to expect it. When the turn that ends at a gap announces a pause ("one moment", "let me check", "please hold", or on the customer's side "hold on, let me find my card"), AGENT_LATENCY is not raised and DEAD_AIR is reported as an informational announced hold that does not touch the health score. The built-in phrase lists cover every supported language; a rubric can add its agents' own scripted lines under Detection → Extra hold phrases. An announced hold that runs to the rubric's announced hold limit (60 s by default) or longer is scored as ordinary dead air anyway: a warning does not make a minute of silence acceptable.
See Latency for how gaps are measured and summarised.
Compliance faults
Both are governed by the rubric's phrase lists and are always danger-level. They cannot be disabled; remove the phrase from the rubric instead.
| Code | Trigger | Severity |
|---|---|---|
COMPLIANCE_MISS | A phrase the rubric marks as required (a recording disclosure, a no-guarantee statement, an identity check) was never said. Evaluated at call level. | Danger |
FORBIDDEN_PHRASE | A phrase the rubric marks as forbidden was said. Evidence points at every matching turn. | Danger |
Required and forbidden phrases can differ per case branch, so a rubric for an insurance line can require different disclosures for a quote than for a claim.
Reliability faults
These describe the recording and the transcript rather than the agent. They are info level and never change the health score, but they tell you how much to trust the rest of the scorecard.
| Code | Trigger | Default threshold |
|---|---|---|
ASR_LOW_CONF | Words with low transcription confidence. Evidence lists up to five words and the share of the call affected. | Word confidence below 0.5 |
DIARIZATION_UNCERTAIN | The transcript was diarized (mono audio) and speaker attribution confidence is low, so "who said what" is uncertain. | Speaker confidence below 0.15 |
LINE_QUALITY | The acoustic pass found noise, mains hum, hiss, clipping or dropouts. One fault per problem, with the time ranges. | SNR below 15 dB, hum at or above -10 dB, hiss flatness at or above 0.4, clipping ratio at or above 0.0005 |
Evidence
Every fault except COMPLIANCE_MISS (which is call-level) carries evidence: one or more transcript turn indices, start and end times in seconds, and the text excerpt that triggered the detector. In the dashboard, clicking a fault scrolls the transcript to that turn; in the API, the faults[].evidence[] array carries the same data, and faults[].turnIndices lists every turn involved.
Verdicts
Reviewers can mark any fault as confirmed or false positive. False positives are excluded from the health score and from danger and warning counts, and each code's false-positive rate is reported on the fault precision dashboard. If a detector misfires often on your call type, that is the signal to adjust the rubric or disable the code.
Disabling detectors
Any code except COMPLIANCE_MISS and FORBIDDEN_PHRASE can be disabled per rubric under the template's Detection settings. Disabled codes are neither reported nor scored. The greeting phrases used by CONTEXT_LOSS and the reset window (30 seconds by default), and the hold phrases and announced-hold limit used by DEAD_AIR and AGENT_LATENCY (60 seconds by default), are configurable in the same place.
Languages
Lexical detectors (MISSED_CORRECTION, CUSTOMER_PROMPT, CONTEXT_LOSS greetings, the hold announcements that exempt DEAD_AIR and AGENT_LATENCY, phrase matching) use per-language word lists for English, German, Spanish, Italian, Arabic and Turkish. Set the call language on the channel, on the individual upload, or leave it on automatic detection. SELF_REPEAT compares words, not phrases, so it works the same in every language.
A call in a language with no word list is transcribed in its own language but graded with the English detectors, and the language badge on the scorecard says so. Everything that is not word-based — talk time, latency, silence, interruptions, line quality — is unaffected. Sentiment scoring is currently available for English calls only.