# Chat Agent 2.6.0 · проверка устойчивости

Продуктовая ревизия Chat Agent `178546a4` проверена в изолированном checkout. Финальная ревизия MR `a619fa19` дополнительно удерживает образ до публикации и сверяет digest без отдельной загрузки артефакта. Ревизия композиции H100 `ac9da70`. [MR Chat Agent !74](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/merge_requests/74>), [MR rag-stack !7](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/merge_requests/7>).

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

| Область | Дефект или лишняя работа | Изменение |
|---|---|---|
| Fish | Закреплённый голос приводил к ошибке проверки многозначного тензора | Передаются списки текста и тензоров. Пустой transcript и неверная длина кодов отклоняются до запуска |
| Gateway | При запоздалой публикации ошибки старая озвучка могла остановить новую | Старое задание снимается до сетевого ожидания, подтверждённое завершение worker не порождает cancel |
| Gateway | Новый `request_id` становился ожидаемым только после остановки предыдущего | Выбор нового запроса делается до первого сетевого ожидания |
| Gateway | Флаги отправки, окончания синтеза и фаза могли расходиться | Одна фаза синтеза. Успешное проигрывание по-прежнему подтверждается отдельно |
| Gateway | При ошибке подтверждения подписка на worker оставалась зарегистрированной | Подписка удаляется при неудачном handshake |
| Gateway | Неполный или повторный ответ мог портить порядок и состояние | Отрицательные номера и тела в служебных сообщениях отклоняются, повторы не двигают фазу назад |
| Offscreen | Подписка прежнего владельца могла пережить его переподключение | У каждой регистрации есть удаление именно своей подписки |
| Offscreen | Запоздалая ошибка позиции могла остановить следующее задание | Ошибка применяется только к своему ещё активному потоку |
| Offscreen | Блокировка autoplay оставляла подписку готовой и запускала бесполезный синтез для новых ответов | Снимается готовность панели до повторного включения пользователем |
| Плеер | Неподвижный плеер посылал четыре одинаковых запроса в секунду | При неизменной позиции один heartbeat в две секунды. После `end` запросы позиции прекращаются |
| Плеер | Повтор мог снова открыть закрытое задание. Пустой медиапоток мог зависнуть | Повторы завершённого задания игнорируются, закрытие MediaSource и отсутствие декодируемого звука дают ошибку |
| NATS | Служебные события первого PCM и первого блока шли и в журнал, и в плеер | Плеер получает только нужные состояния и данные, Monitor сохраняет измерения |
| NATS | Команды позиции создавали диагностические пакеты и меняли родительский ID запроса | Диагностика управления звуком записывается в Gateway только на значимых переходах, при пересылке WebM переиспользуется заголовок |
| Worker | Неизменная позиция будила кодировщик без нового кредита | Heartbeat продлевает аренду, передача просыпается при продвижении позиции |
| Worker | Отмена могла оставить непрочитанный stdout FFmpeg, отказ запуска кодировщика выглядел как сбой модели | При отмене канал дочитывается и процесс завершается. Ошибка запуска кодировщика имеет свой код |
| Микрофон | Отказ одной операции mute мог вернуть управление до завершения остальных | Проигрывание начинается после окончания всех операций mute. Невалидный запрос на микрофон не останавливает звук |
| CPU | PCM создавал лишнюю копию при ограничении амплитуды. Ошибка аргументов пилота выявлялась после загрузки модели | Амплитуда ограничивается в существующем буфере, проверка аргументов выполняется до загрузки |
| Образ | Registry обрывал загрузку крупных слоёв весов | Девять слоёв весов примерно по 1 ГиБ. Tensor bytes сохраняются, индекс переписывается при сборке. Код копируется после весов для переиспользования слоёв |
| CI | После завершения Trivy локального тега больше не было | Docker-контейнер без сети удерживает точный ID образа до push. Локально проверены сканирование по ID и восстановление тега |
| CI | После успешной публикации job падала на загрузке дублирующего текстового артефакта из-за DNS | Digest сверяется по ответу registry и RepoDigests прямо в журнале job |

## Проверки

- Python 254 прошло, 4 пропущено, 12 подтестов прошло. PostgreSQL и NATS в отдельных локальных контейнерах — 129 прошло, 3 пропущено, 10 подтестов прошло.
- Frontend 617 прошло. Проверены типизация, runtime-настройки, сборка Front и ZIP 2.6.0. Панель проверена в обеих темах в Chromium.
- Сквозной локальный прогон в Chromium через NATS WebSocket проверил порядок от `widget_stage done` до WebM/Opus. Получен один текст, выполнен один синтез, воспроизведение началось до завершения синтеза, `ended` дошёл до Gateway. Вместо Fish в этом прогоне использовался тестовый звук. Микрофонные callbacks проверены синтетически.
- Отдельно проверены ранняя выдача WebM настоящим FFmpeg, адресность, повтор финального события, пропуск блока, отмена и задержка освобождения CPU-слота.
- Тест неподвижного плеера подтвердил 4 запроса позиции за 8 секунд против 32 при прежнем интервале. Это измерение числа запросов, задержку речи оно не измеряет.
- На закреплённом Fish с Torch 2.10 CPU воспроизведён сбой старого `prompt_tokens`. Новый вход проходит проверку и доходит до подготовки модели. Заголовки закреплённых весов проверены, переразбиение проверено на тензорах через Safetensors.

## Поставка

- Все пять штатных проверок, сборка CPU-образа, Trivy и публикация успешно завершены для `a619fa19`. Registry и Docker подтвердили `sha256:7d18a14777dde91cfd7acfb8fed937b074308c6b8d9678c4b23741b9b1c7ebb8`. [Pipeline 5908](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5908>).
- Chat Agent main `d7b849f6`. rag-stack main `fc8b307a`. Оба MR объединены после проверок и подтверждения digest.
- Две штатные попытки скачать образ на H100 остановились на HEAD манифеста с `proxyconnect tcp 72.56.73.217:1195: i/o timeout`. До скачивания слоёв и запуска CPU-пилота дело не дошло. Пик RAM, качество BF16/FP32 и задержка Fish на H100 не измерены. [Первая попытка](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31186>), [повтор](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31238>).
- Пакет 2.6.0 собран локально, SHA-256 `ab82c90e21bed32a38b5c8fb39100380d132884199aeeb4e3dcdc0a8d9b5af9f`. ZIP и локальная панель проверены. Пользовательский Chrome ещё не обновлён.

## Повторная загрузка Fish через GitLab

- Ещё один штатный pull на H100 завершился тем же тайм-аутом прокси. Применена схема резервной загрузки, использованная для ASR. Runner скачал OCI-слои из registry и передал образ на H100 по существующему SSH. [Повтор pull](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31239>), [MR !8](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/merge_requests/8>).
- `rag-stack` main `1a11c704`. Preload завершился успешно. Docker на H100 подтвердил `sha256:7d18a14777dde91cfd7acfb8fed937b074308c6b8d9678c4b23741b9b1c7ebb8`, ревизию `a619fa19d2a4db3dfed473758c32d44f3811997c` и `linux/amd64`. [Job 31241](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31241>).
- Эталонный WAV сгенерирован на CPU. SHA-256 его манифеста `7fccfdddc1933d211b4198cc24d7ef20fd39f87d44fa6a0922d7992fcfa55587`. Загрузка WAV как GitLab-артефакта упала на DNS для `gitlab`, поэтому запись не прослушана. [Job 31242](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31242>).
- В первых четырёх BF16-прогонах первый PCM получен через 11,815, 16,146, 18,221 и 32,614 с после начала синтеза. RTF составил 5,92, 5,70, 6,13 и 6,38. Уже первые фразы превышают целевые пределы 2,5 с и 0,8. Это время CPU-синтеза, без браузерного буфера. На момент фиксации полный BF16-прогон продолжается, FP32 и production-путь не проверены. [Job 31243](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/jobs/31243>).
