# Chat Agent 2.4.3 — проверка после удаления Core

Исправлены **12 отдельных дефектов: 9 серверных и 3 клиентских**. Дефекты воспроизведены адресными тестами либо контрольным запросом. Это не утверждение, что все они одновременно происходили в production.

## Исправления

| № | Где | Дефект и результат |
|---|---|---|
| 1 | Сервер: отправка ASR | Пустой TimeoutError давал пустой код. Теперь `asr_submit_timeout`; другой пустой сбой — `asr_submit_failed`. |
| 2 | Сервер: измерение PCM | Отказ необязательного измерения прерывал отправку фразы. Теперь потеря измерения учитывается, распознавание продолжается. |
| 3 | Сервер: повтор фразы | Диагностический повтор терял исходные метаданные Silero. Сохраняется исходный VAD. |
| 4 | Сервер: результат повтора | Ошибка модели могла завершиться состоянием успеха. Теперь error сохраняется при finish. |
| 5 | Сервер: доставка повтора | Сбой уведомления оставлял уже полученный результат в pending. Результат фиксируется до отправки, доставка ограничена по времени и сообщает отдельную ошибку. |
| 6 | Сервер: запуск аудио | Ожидающий lock START мог запустить уже отменённый поток. После lock повторно проверяется отмена. |
| 7 | Сервер: очередь UI | Переполненная очередь незаметно удаляла другой окончательный результат. Теперь новый результат получает явный отказ. |
| 8 | Клиент: микрофоны | Автоматическое переключение и ручной выбор могли перезаписать друг друга. Сохранение выполняется последовательно. |
| 9 | Клиент: захват | Уже завершённая дорожка переводила UI в «Слушаю». Теперь запуск отклоняется, ресурсы освобождаются. |
| 10 | Клиент: Opus | Ожидание очереди завершалось после любого dequeue. Теперь ожидается реальный порог; отмена снимает обработчик. |
| 11 | Сервер: Monitor SQL | Неудачный план перебирал 962 владельца для 8000 обычных событий: 7 696 000 проверок. Пустой ключ фразы отсеивается до сканирования; большие тела обычных команд не разбираются. Лимиты не увеличены. |
| 12 | Сервер: Agent | После неизвестного результата JS агент повторял вызовы заблокированного документа, затем показывал лимит инструментов. Теперь останавливается на `effect=unknown` или `browser_script_busy`, сохраняя первичную причину. |

Защитная блокировка документа при неизвестном результате JavaScript сохранена. Нельзя считать любое исключение Chrome доказательством отсутствия побочных действий.

## Исходники

База: `b2baf9a34884612f11a4375333359b2647d2f581`.

- [MR !51](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/merge_requests/51>): десять исходных исправлений; merge `68985092028b74bbd3501fa638beb0a384543e2d`.
- [MR !52](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/merge_requests/52>): ограничение чтения Monitor; merge `3075e61a8c138f70c548a4b0715ffb86415a95f6`.
- [MR !53](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/merge_requests/53>): остановка небезопасных повторов; merge `d1069a883fb0a8cddc208331763f20a831971cc9`.

Все три MR в main. Общая разница: **25 файлов, +208 / −33 строки** с тестами и номером пакета. CI, стек, ASR, модели и GPU не менялись. Основная пользовательская копия сохранена; работа выполнена в отдельном checkout одним writer.

## Адресные проверки

- На исходном коде воспроизведены 7 серверных и 3 клиентских сбоя; после правок — 47 Python-тестов и 90 frontend-тестов прошли.
- Типизация, Front build и ZIP расширения прошли. После уточнений повторялись затронутые группы.
- Monitor: 34 PostgreSQL integration-теста прошли; после окончательного уточнения — две проверки длинной сессии/большого тела. Несколько локальных NATS-проверок были пропущены; штатный CI выполняет их с NATS.
- Agent: оба варианта лишнего повтора сначала воспроизведены; после правки 17 тестов прошли.
- `git diff --check` пройден.

## CI

- Main 5734: 567 frontend-тестов, 246 Python-тестов и 10 subtests прошли; 136 integration-тестов были пропущены именно в Python job, для них есть отдельная job. npm audit: 0 vulnerabilities.
- Integration на 5734 дважды выявила SQL statement_timeout длинной сессии. Это устранено MR !52, без увеличения тайм-аута.
- Все пять checks main 5739 и ветки MR !53 (5740) прошли. Все пять checks итогового main 5741 также прошли: integration 29334 один раз не дождалась NATS-пакета за 2 с; единственный повтор 29379 прошёл. Код и лимиты не менялись.
- Измерение 1472 мс относится к одному локальному плохому SQL-плану; это не p95 и не обещание ускорения каждого запроса.

## Расширение и реальная панель

Установлен пакет **2.4.3**, пользователь подтвердил активацию. Путь: `локальный источник; ID `dbcdiabfkimnhbkkhkikgfapnabifmjf`. Key, permissions и CSP сохранены.

ZIP: 25 файлов, 20 609 249 байт, SHA-256 `665506829ad7db1bb7c05a4fc0c690e8c6fee2b39bac09783925a3e844827928`.

Настройки и обновление списка устройств работают. После обновления документа проверен один `run_js`, читающий только `h1`: два вызова модели, один инструмент, ответ **Form Filler: Test Form - All Fields**. Поля формы не читались и не изменялись, микрофон не включался инструментом.

[Подтверждение работы 2.4.3](</experiments/voice-ai/archive/v/11/05/chat-agent-post-core-bugfixes/extension-2.4.3-live-success.png>). Проверки тем и настроек сохранены отдельными скриншотами; старые скриншоты 2.4.2 не выдаются за проверку новой версии.

Первый живой запрос выявил неверный JS модели (`await` в синхронном callback) и лишние повторы Agent. Исправление № 12 предотвращает повторы после неизвестного результата; оно не гарантирует, что модель всегда генерирует корректный код.

## Работающие сервисы

Поставка завершена штатными адресными component jobs. Предыдущие digest сохранены в `images-before.json`; итоговые — в `images-final.json`. Совпадение проверено между CI image verification и свежими строками Insight. Все четыре компонента 1/1 running. Release-проверка дополнительно проверяет завершённый rollout, фактический image ID и Docker health, если он определён.

Проверка нового Gateway/Ingress: одна сохранённая Opus-фраза 3,784 с; текст совпал с исходным, исходный Silero VAD сохранился. Один вызов GigaAM Large: 46,89 мс чистого распознавания; очередь 0,525 мс. Диапазон 16256–76800 при 16 кГц, проверено 363264 байта декодированного PCM исходной частоты. Состояние stopped, final получен, ошибок нет, резерв освобождён. Второй постоянной копии аудио не создавалось.

| Компонент | Версия сборки | Source SHA | Refresh job |
|---|---|---|---|
| src_api_gateway | 1.0.1154 | `3075e61a` | [29322](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/29322>) |
| audio_ws_ingress | 1.0.1150 | `68985092` | [29209](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/29209>) |
| src_front | 1.0.1151 | `68985092` | [29258](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/29258>) |
| src_agent | 1.0.1156 | `d1069a88` | [29378](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/29378>) |

Финальная проверка: Gateway и Ingress `draining=false`, chat_requests=0, uncertain_admissions=0, audio_connections=0, replay_reservations=0. Agent: ok/pg_ready/owner=true, active/waiting/admissions/records/endpoints=0. LLM: ok=true. Ingress: chat_nats/asr_nats=true, один ASR subscription, два существующих diagnostic adapters. Core отсутствует; всего 11 сервисов стека.

Во время поставки панель потеряла канал; штатная кнопка «Повторить» восстановила соединение. Обновления страницы или расширения для этого не потребовалось. После обновления Agent панель получила «проверка»: один вызов модели, ноль инструментов. [Итоговый скриншот](</experiments/voice-ai/archive/v/11/05/chat-agent-post-core-bugfixes/extension-2.4.3-final.png>).

## Границы проверки

Живая речь и отключение физических микрофонов не проводились. Гонки, переполнение очереди, отказ доставки и неизвестный результат проверены адресными тестами; намеренно вызывать эти аварии в пользовательском сеансе после поставки не требовалось. Короткий ASR-повтор подтверждает этот образец, а не качество распознавания в целом. Новые ошибки модели в сгенерированном JS возможны; защита от повторного действия с неизвестным результатом сохранена.
