| # Failure-analysis protocol |
|
|
| Turn detection fails in sequences, not just rows. This protocol turns model |
| predictions into reviewable product errors without leaking the official test |
| back into development. |
|
|
| ## Scope and non-negotiable rules |
|
|
| 1. Analyze train/development and the locked local Hinglish development split |
| while iterating. |
| 2. Inspect the official test only once after freeze. Its failure report is for |
| disclosure and future data collection, not same-benchmark tuning. |
| 3. Keep raw confusion counts and denominators beside every rate. |
| 4. Group confidence intervals and sampling by speaker/conversation/leakage group, |
| never by correlated rows alone. |
| 5. Do not listen to or expose audio without appropriate access and consent. |
| 6. Do not put names, phone numbers, addresses, order IDs, transcripts containing |
| PII, or direct speaker identifiers in review exports. |
|
|
| ## Error priorities |
|
|
| | Priority | Error | Product effect | Primary measure | |
| |---:|---|---|---| |
| | P0 | False `END` on `HOLD` | User is interrupted | FP count, FPR, interrupted-turn rate, interruptions/hour | |
| | P1 | Repeated/double `END` | Duplicate agent response | events per true turn in controller replay | |
| | P1 | False `HOLD` on `END` | Response delay or timeout | FN count, FNR, endpoint-delay p50/p90/p95 | |
| | P1 | Forced timeout on true `HOLD` | Policy interruption despite low model score | timeout reason count/rate | |
| | P2 | Poor calibration | Threshold fails after shift | Brier, log loss, ECE, reliability bins | |
| | P2 | Latency/resource regression | Slow or expensive response | end-to-end p50/p95/p99, load time, RSS | |
|
|
| The first promotion gate is a predeclared false-interruption budget. A model with |
| higher aggregate F1 but materially more P0 errors is not an improvement. |
|
|
| ## Failure taxonomy |
|
|
| Assign one primary cause and any secondary tags. Use `unknown` when evidence is |
| insufficient rather than inventing an explanation. |
|
|
| ### Linguistic and conversational |
|
|
| - `filled_pause`: uh/um/haan/matlab/achha, including elongated fillers; |
| - `discourse_marker`: βsoβ, βbutβ, βtohβ, βactuallyβ before continuation; |
| - `syntactic_continuation`: conjunction, subordinate clause, unfinished phrase; |
| - `slot_continuation`: partial address, PIN, phone, order/tracking ID, date/time; |
| - `enumeration`: pause between list items; |
| - `self_repair`: correction, restart, or abandoned phrase; |
| - `backchannel`: short acknowledgement while retaining/yielding the floor; |
| - `code_switch_boundary`: HindiβEnglish switch near the pause; |
| - `prosody_rising`, `prosody_level`, `prosody_falling`: perceived boundary tone; |
| - `complete_but_short`: short legitimate endpoint; |
| - `deliberate_long_hold`: long thinking pause followed by continuation; |
| - `annotation_ambiguous`: reasonable listeners disagree. |
|
|
| ### Acoustic and collection |
|
|
| - `background_speech`, `traffic`, `music`, `impulse_noise`; |
| - `far_field`, `reverberation`, `low_snr`; |
| - `clipping`, `low_gain`, `codec`, `sample_rate_conversion`; |
| - `vad_truncation`: checkpoint cuts speech/filler incorrectly; |
| - `trailing_silence`, `leading_silence`, `non_speech_only`; |
| - `synthetic_prosody`, `source_artifact`, `duplicate_or_template`; |
| - `duration_crop`: relevant context fell outside the audio suffix. |
|
|
| ### System and policy |
|
|
| - `frontend_mismatch`: train/runtime log-mel disagreement; |
| - `mask_or_padding`: padded frames influence score; |
| - `onnx_drift`, `quantization_drift`; |
| - `threshold_shift`: calibration does not transfer to slice/domain; |
| - `minimum_silence`, `relaxation`, `maximum_timeout`, `debounce`; |
| - `latency_budget`: correct decision arrived too late; |
| - `state_reset`: speech after END did not start a clean turn. |
|
|
| ## Required review record |
|
|
| Store review metadata separately from raw audio. One JSONL row per checkpoint: |
|
|
| ```json |
| { |
| "review_id": "random-id", |
| "run_id": "E-010-seed17", |
| "split": "validation", |
| "group_id": "hashed-group", |
| "turn_id": "hashed-turn", |
| "checkpoint_index": 2, |
| "target_endpoint": false, |
| "endpoint_probability": 0.73, |
| "threshold": 0.61, |
| "model_prediction": true, |
| "controller_state": "END", |
| "controller_reason": "model_endpoint", |
| "silence_ms": 420, |
| "inference_ms": 5.8, |
| "language": "hinglish", |
| "dataset": "private_hinglish_v1", |
| "synthetic": false, |
| "midfiller": true, |
| "endfiller": false, |
| "duration_seconds": 3.4, |
| "primary_tag": "filled_pause", |
| "secondary_tags": ["code_switch_boundary"], |
| "reviewer_count": 3, |
| "reviewer_agreement": 0.67, |
| "notes": "no transcript or PII" |
| } |
| ``` |
|
|
| Use random or hashed IDs. Free-text notes must not quote a participant or |
| reconstruct customer data. |
|
|
| ## Sampling plan |
|
|
| For each candidate and baseline, review: |
|
|
| 1. every false interruption when the set is operationally manageable; |
| 2. otherwise, a group-stratified random sample of at least 100 false |
| interruptions, with inclusion probabilities retained; |
| 3. at least 100 false holds, oversampling long endpoint delays; |
| 4. 50 highest-confidence correct predictions of each class to catch label or |
| shortcut errors; |
| 5. 50 near-threshold examples on each side; |
| 6. a balanced sample across language, source, human/synthetic, filler, duration, |
| device/noise, and consented demographic slices; |
| 7. full controller sequences for any repeated END, timeout, or state-reset issue. |
|
|
| When a slice has fewer examples, review all and report the small denominator. |
| Do not silently drop undefined FPR/recall for one-class slices. |
|
|
| ## Analysis workflow |
|
|
| ### 1. Validate the evaluation plumbing |
|
|
| - confirm `1 = END` in labels, predictions, and confusion counts; |
| - recompute `FP/(FP+TN)` and `FN/(FN+TP)` from stored counts; |
| - verify prediction IDs join one-to-one with the frozen manifest; |
| - verify the threshold came from development, not test; |
| - compare frontend metadata and ONNX input/output names with the checkpoint; |
| - test masked-padding invariance and PyTorch/ONNX parity; |
| - verify no leakage group/audio hash/metadata key crosses splits. |
|
|
| ### 2. Quantify before listening |
|
|
| Generate overall and sliced counts, score histograms, reliability bins, and |
| duration/silence deciles. Rank potential shortcut signals: source, synthetic |
| status, audio length, codec, and sample rate. This prevents a few memorable clips |
| from replacing distributional evidence. |
|
|
| ### 3. Conduct blinded review |
|
|
| Reviewers see the checkpoint audio/context and target question, but not model |
| score, prediction, source model, or other reviewers' votes. Randomize baseline |
| and candidate failures. Preserve `uncertain` and collect an optional taxonomy |
| tag. Adjudicate only after independent review. |
|
|
| ### 4. Connect clip errors to controller behavior |
|
|
| Replay chronological pause checkpoints. A clip false positive may be suppressed |
| by minimum silence or debounce; a modest false negative may be harmless if the |
| next checkpoint ends promptly. Conversely, a low aggregate FPR can still produce |
| too many interrupted turns if errors cluster across different conversations. |
|
|
| ### 5. Choose the smallest justified intervention |
|
|
| Examples: |
|
|
| - filler-specific failures β rebalance real filler minimal pairs or adjust |
| auxiliary weighting; |
| - crop failures β compare 2/4/8-second suffixes; |
| - calibration-only slice shift β recalibrate or use a validated controller |
| policy, not a larger network by default; |
| - synthetic-source shortcut β reduce synthetic dominance and validate on real |
| speakers; |
| - VAD truncation β fix checkpoint generation before retraining endpointing; |
| - INT8 score drift β recalibrate INT8 threshold or retain FP32; |
| - maximum-timeout interruptions β product-policy review, not label relabeling. |
|
|
| Every new intervention gets a new registered experiment and an untouched |
| development comparison. Do not manually patch individual test failures. |
|
|
| ## Current findings |
|
|
| The following aggregate development findings are supportable; causal taxonomy |
| labels still require authorized blinded listening: |
|
|
| 1. **Source-holdout confounding is severe.** In the inspected shard, source-held |
| train is 2,614/2,617 synthetic, while validation is 550/648 human-tagged and |
| has only English/Spanish. A delta cannot be assigned to source alone. |
| 2. **The packaged TinyTCN misses most endpoints at the strict threshold.** On |
| 326 IID development clips it produces 10 TP, 3 FP, 163 TN, and 150 FN at |
| threshold 0.7410008. All three false interruptions are synthetic-tagged; two |
| occur in the 134-row `midfiller` slice. These counts do not establish cause. |
| 3. **Simple acoustics remain stronger.** The full |
| partial-shard logistic baseline ranks validation examples at AUROC 0.752, yet |
| recovers only 21/160 END examples when limited to 3/166 HOLD false positives. |
| The TinyTCN recovers 10/160 at the same FP count; its paired recall delta is |
| β0.06875 with 95% CI [β0.13298, β0.01220]. |
| 4. **Trailing silence is a model/controller interface risk.** Appending 800 ms |
| of valid silence flips 26/326 decisions, raises FPR from 0.0181 to 0.0361, |
| and shifts probability by 0.1058 on average in absolute value. The external |
| controller also consumes silence, creating potential double-counting. |
| 5. **No Hinglish failure claim exists.** There are no local participant |
| recordings. The Hindi-tagged slice has only 16 examples and is not verified |
| code-switched speech. |
| 6. **Current grouping cannot establish identity separation.** All 3,265 base IID |
| linkage groups are singletons because the shard lacks usable speaker, |
| conversation, and voice IDs. Zero observed-key crossings are real, but |
| speaker/TTS leakage is unknown and the IID grouped bootstrap is effectively |
| row bootstrap. The source stress split instead clusters by dataset source. |
|
|
| Privacy-safe hashed case IDs identify the 3 false interruptions and 150 missed |
| ends for authorized local review. Public reports contain no audio, transcript, |
| raw record ID, or source path. No claim is made about specific acoustic or |
| linguistic causes because no blinded listening analysis has been performed. |
|
|
| ## Promotion gates |
|
|
| A release candidate must satisfy all of the following: |
|
|
| - no unresolved data, split-leakage, frontend-parity, or ONNX-parity defect; |
| - FPR within the predeclared budget on locked development and official test; |
| - false-interruption and delay targets met in full controller replay; |
| - no material regression on real-human, Hinglish, filler, long-hold, identifier, |
| device/noise, and major source/language slices; |
| - grouped confidence intervals rule out a practically harmful regression against |
| the chosen baseline; |
| - at least two reviewers approve every sampled P0 taxonomy cluster and document |
| residual risks; |
| - final threshold is calibrated for the exact FP32 or INT8 artifact; |
| - model/data cards list all known failures, denominators, and excluded records; |
| - privacy, consent, licensing, and redistribution reviews are complete. |
|
|
| If a gate cannot be measured, mark it unknown. Unknown is not a pass. |
|
|