> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hubtalk.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Исходы звонка: `call_status` и `status_reason`

> Ось исходов: корзины, причины внутри них и как они складываются в вердикт.

# Исходы звонка: `call_status` и `status_reason`

**`call_status`** — финальная корзина завершённого звонка (пустая строка до финализации). Одна ось, один источник истины; качество (`call_successful`) и техническая надёжность (`health`) — отдельные оси и в статус не протекают:

| Значение        | Что означает                                                                                                                                                                   |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `completed`     | звонок соединился и завершился (любым образом)                                                                                                                                 |
| `not_connected` | исходящий звонок так и не соединился                                                                                                                                           |
| `error`         | платформа не смогла провести звонок: соединённый звонок оборвался из-за сбоя платформы, агент так и не подключился, либо исход так и не был зафиксирован (детали — в `health`) |

**`status_reason`** — уточнённая причина, всегда принадлежащая ровно одной корзине:

| Корзина         | Значение                                | Что означает                                                                                                                                             |
| --------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `completed`     | `agent_hangup`                          | Разговор дошёл до конца сценария агента.                                                                                                                 |
| `completed`     | `user_hangup`                           | Абонент говорил, но повесил трубку до конца сценария.                                                                                                    |
| `completed`     | `no_speech`                             | Звонок соединился, но распознаваемой речи абонента не было.                                                                                              |
| `completed`     | `too_short`                             | Ниже настроенного у агента минимума реплик или длительности.                                                                                             |
| `completed`     | `voicemail_reached`                     | Определён автоответчик (смотрите `message_left`).                                                                                                        |
| `completed`     | `max_duration_reached`                  | Автозавершение по максимальной длительности звонка у агента.                                                                                             |
| `completed`     | `silence_timeout`                       | Автозавершение после долгого молчания абонента.                                                                                                          |
| `completed`     | `transferred_cold` / `transferred_warm` | Звонок успешно передан; ИИ вышел из разговора.                                                                                                           |
| `completed`     | `observer_incident`                     | Автозавершение реакцией наблюдателя соответствия.                                                                                                        |
| `completed`     | `platform_shutdown`                     | Платформа завершила звонок, останавливаясь на обновление.                                                                                                |
| `not_connected` | `no_answer`                             | Телефон абонента зазвонил, и трубку не взяли за отведённое окно дозвона.                                                                                 |
| `not_connected` | `busy`                                  | Занято.                                                                                                                                                  |
| `not_connected` | `user_declined`                         | Абонент явно отклонил звонок.                                                                                                                            |
| `not_connected` | `invalid_destination`                   | Несуществующий или неверный номер.                                                                                                                       |
| `not_connected` | `trunk_auth_failed`                     | Не прошла аутентификация SIP-транка.                                                                                                                     |
| `not_connected` | `provider_unavailable`                  | Вызов до абонента не дошёл: телефония не ответила в срок или отказала, гудков не было.                                                                   |
| `not_connected` | `sip_routing_error`                     | Сбой маршрутизации SIP.                                                                                                                                  |
| `not_connected` | `spam_blocked`                          | Заблокировано оператором как спам.                                                                                                                       |
| `not_connected` | `dial_failed`                           | Общий сбой набора (более точных деталей нет).                                                                                                            |
| `not_connected` | `cancelled_by_function`                 | Функция агента до набора решила звонок не размещать.                                                                                                     |
| `not_connected` | `cancelled_by_operator`                 | Набор остановлен командой извне до соединения — кнопкой кабинета или `POST /v1/calls/{id}/end`. Попытка контакта и частотный потолок на неё не тратятся. |
| `error`         | `internal_error`                        | Сбой платформы на соединённом звонке — смотрите `health` / `health_reasons`.                                                                             |
| `error`         | `agent_unavailable`                     | Голосовой агент не подключился к звонку.                                                                                                                 |
| `error`         | `not_finalized`                         | Исход так и не был записан; `duration` равен `null`.                                                                                                     |

<Warning>
  **`busy` и `user_declined` — разные причины.** `busy` означает «занято», `user_declined` — реальное отклонение вызова абонентом. Если вы строите отчёты по причинам недозвона, разводите их по этим двум значениям, а не по одному.

  Второе следствие для вашей логики повторов: **постоянна ли причина, зависит от рынка**. `user_declined` закрывает номер окончательно только на профиле США; на других профилях причина временная, и номер возвращается в набор, потратив попытку. Проверка запуска кампании отклоняет правило `expert`, которое повторяет постоянный исход (`rule_permanent_retry`).
</Warning>

**`health_reasons`** — коды, объясняющие вердикт `warning`/`error`. Вердикт звонка — худший из сработавших: любой код уровня «ошибка» делает звонок `error`, иначе `warning`. Словарь открытый, новые коды со временем добавляются — незнакомый код не считайте ошибкой разбора.

Коды приходят из четырёх источников. Разделение важно: **в `health_reasons` попадает результат правила, а не его вход** — значения `status_reason` и внутренние коды событий здесь не встречаются никогда.

**1. События звонка** — что-то пошло не так внутри разговора:

| Код                     | Уровень        | Когда                                                           |
| ----------------------- | -------------- | --------------------------------------------------------------- |
| `llm_execution_failed`  | ошибка         | исполняющая модель не ответила, агент произнёс запасную реплику |
| `llm_role_failed`       | предупреждение | не ответила модель вспомогательной роли                         |
| `llm_retry`             | предупреждение | ответ получен с запасной модели                                 |
| `context_overflow`      | ошибка         | контекст модели переполнен                                      |
| `tts_unspoken`          | ошибка         | синтез не состоялся, реплика не прозвучала                      |
| `tts_error`             | предупреждение | сбой синтеза, от которого удалось оправиться                    |
| `tts_fallback`          | предупреждение | переключение на запасной голос                                  |
| `asr_turn_lost`         | ошибка         | реплика абонента потеряна распознаванием                        |
| `asr_error`             | предупреждение | сбой распознавания без потери реплики                           |
| `realtime_error`        | ошибка         | сбой в realtime-режиме (speech-to-speech)                       |
| `noisy_line`            | предупреждение | линия шумная: звонок шёл, распознавание не работало             |
| `transfer_failed`       | ошибка         | перевод сорвался                                                |
| `transfer_ring_timeout` | предупреждение | назначение не ответило, отработала фолбэк-ветка                 |
| `observer_error`        | предупреждение | сбой наблюдателя соответствия                                   |
| `normalizer_degraded`   | предупреждение | пре-TTS нормализатор не ответил                                 |
| `lang_detect_degraded`  | предупреждение | определение языка не ответило                                   |
| `rag_degraded`          | предупреждение | сбой обращения к базе знаний                                    |
| `token_budget_degraded` | предупреждение | контекст урезан по токенному бюджету                            |
| `tool_failed`           | предупреждение | функция или код-узел вернули ошибку                             |
| `silence_timeout`       | предупреждение | автозавершение по молчанию абонента                             |
| `max_duration`          | предупреждение | автозавершение по максимальной длительности                     |

**2. Ось статуса звонка** — сюда сворачиваются значения `status_reason`:

| Код                 | Уровень        | Из каких `status_reason`                                         |
| ------------------- | -------------- | ---------------------------------------------------------------- |
| `disconnect_error`  | ошибка         | `internal_error`, `not_finalized`, `agent_unavailable`           |
| `dial_infra_failed` | ошибка         | `trunk_auth_failed`, `provider_unavailable`, `sip_routing_error` |
| `dial_failed`       | предупреждение | остальные причины корзины `not_connected`                        |

Причины на стороне абонента (`no_answer`, `busy`, `user_declined`, `invalid_destination`, `spam_blocked`) и отмены по вашему решению до набора (`cancelled_by_function`, `cancelled_by_operator`) в вердикт **не входят**: это не дефекты платформы.

**3. Пост-аналитика** — `analysis_skipped`, `analysis_failed`, `analysis_interrupted`, все уровня «предупреждение», по терминальному состоянию разбора.

**4. Запись и тайминги** — `recording_head_lost` (часть записи не существует) и `slow_turns` (90-й процентиль длительности тёрна выше настроенного порога), оба «предупреждение».
