# Monitor v3 и Opus — отчёт поставки 30.10.2026

## Исходники

- `webrtc-komaroff`: main `dbd6089986e51387f0ff52ff99a83995f03a5ab1` (MR !23, !24, !25).
- Общая разница: **+1417 / −726 строк**, включая документацию, тесты и 224 строки контрольных пакетов WebCodecs.
- `py_faster_whisper`: draft MR !8, `1d06a8750cea82adeb619026ff8bd653ffd952ea`, **+75 / −23 строки**. Не merged, не поставлен.
- `rag-stack`, инфраструктура и корневые CI-файлы не изменялись. Основная пользовательская рабочая копия сохранена.

## Что изменилось

Monitor использует одну последовательность сохранённых передач для журнала и схемы. Транскрипции и команды разделены, ответы направлены обратно, выбранная передача сохраняется в URL. Подробности загружаются по запросу. Удалены заменённые `eventList.ts`, `eventList.css`, `observation.ts`. Отсутствующие наблюдения не заменяются предполагаемыми стадиями; разница часов сервисов не названа сетевой задержкой.

Протокол 4 передаёт Opus, сохраняет исходные принятые пакеты и реальные координаты. Один общий серверный декодер обслуживает распознавание, чтение архива и повтор. Постоянной второй PCM-копии нет. Протокол 3 и старые PCM-архивы сохранены. Silero, значения по умолчанию и существующие соединения остаются прежними. Compare переиспользует закодированный образец между моделями.

## Проверки

Пять обязательных suites реально выполнены: browser NATS #26923 (3), Ruby #26925, Python #26929 (232 PASS, 116 явно skipped, 8 subtests), PG/NATS integration #26940, frontend #26945 (65 файлов, 475 тестов). После первой полной попытки повторялись только исправленные группы. Проверки main #5580 были явно пропущены механизмом impact selection: дерево merge совпадает с проверенным деревом, это не новый прогон suites.

Адресно: 55 Python PASS; 19 PG Monitor PASS после исправления периода; настоящие NATS/PG Opus и legacy archive — 2 PASS. Проверены совпадение сохранённых байтов, live/replay PCM, диапазоны 90 мс и 1 с, пропуски/повторы/повреждение, отмена и начало/хвост. TypeScript и сборка расширения прошли. В локальном браузере проверены обе темы, направление ответа, журнал → выбранная стрелка → журнал, URL и отсутствие данных. `component-dark.jpg`/`component-light.jpg` сохраняют локальную проверку компонентов. `dark.jpg`/`light.jpg` — финальный production Monitor с историческими наблюдениями.

## Короткий замер кодирования

Chrome WebCodecs, один синтетический образец 1,337 с, включая тишину в начале/конце. Opus mono 32 кбит/с VBR, 20 мс. Байты включают аудиопротокол и номер пакета, но не NATS/TLS. Выход декодера во всех случаях — 64 176 отсчётов на 48 кГц, точно ожидаемая длина.

| Частота источника | PCM, байт | Opus с заголовками, байт | Разница | Сокращение | Кодирование |
|---|---:|---:|---:|---:|---:|
| 16000 | 42784 | 6229 | -36555 | 85.4% | 5.2 мс |
| 44100 | 117924 | 6427 | -111497 | 94.5% | 7.1 мс |
| 48000 | 128352 | 6450 | -121902 | 95.0% | 6.4 мс |

Это измерение экономии трафика и кодирования, не ускорение модели, не полноценная оценка качества и не p95.

## GigaAM Large: поставка остановлена

Добавлен небольшой явный вариант `large_ctc`, закреплены ревизия, SHA-256 весов/исходников и MIT-лицензия. Torch/Transformers не обновлялись. Pipeline ASR #5574 собрал 7 образов, но job #26920 остановил публикацию на Trivy: msgpack 1.1.2, setuptools 70.3.0, urllib3 2.7.0, пять HIGH. Проверка не отключалась; обновление общего GPU-окружения не включалось в эту задачу. Draft MR сохранён. Модель не добавлена в рабочие селекторы: загрузка на H100, прогрев, текст и пиковая VRAM не доказаны. Текущий ASR продолжает работать на прежнем образе.

## Поставка

Build #26968 / pipeline #5580 опубликовал Gateway, Audio Ingress и Front. Один production bundle Front, 1,50 с Vite; сборка трёх образов около 55 с. Образы заранее загружены на сервер при открытом приёме. При первой загрузке Front был TLS handshake timeout; повторная подготовка завершилась успешно, до drain.

Точные образы находятся в `images.json`. Финальная проверка runtime и браузера приведена ниже.

## Найдено при браузерной приёмке

- Compare: при быстрой загрузке маленьких Opus-пакетов аудиобайты не учитывали расход на NATS-заголовки. Пачка дополнительно ограничена 16 пакетами, без новых RPC и задержки 1×. MR !24 merged. Новый тест моделирует транспортные заголовки и настоящий лимит 32 КиБ.
- Monitor: прокрутка выбирала подсвеченный заголовок сервиса. Теперь выбирает именно передачу с event ID; заголовки участников закреплены.
- Monitor: период списка сессий не ограничивал карточки событий выбранной сессии. Для новой проекции карточек добавлена нижняя граница периода; прямые ссылки и целая последовательность пересекающего период запроса сохранены. 19 тестов на настоящем PostgreSQL прошли.
- Дополнительный frontend CI выявил использование `.at()` в тесте с ES2020. Исправлено индексированием; локальная типизация PASS.
- Pipeline #5584 был создан как для новой ветки после автоматического удаления ветки при merge. Он ошибочно выбрал полный набор по неизвестной базе; остановлен как избыточный и заменён запуском #5585 с точной базой. Сборок и deployment в #5584 не было. Его отмена не связана с зависанием.

Первый адресный rollout: drain #26985, backend #26997, Front #26998 — PASS. Все три сервиса `running`, updates `completed`; Core/Agent/LLM сохранили прежние digest. Повторный pull приложения во время активации не выполнялся. Старый PCM-архив `73e32723-0168-4c24-a70e-ac269436688f` открыт в production Monitor: первые 4 секунды готовы, полная длительность 29,920 с, дальнейшее чтение по необходимости.

Пакет 2.2.0 установлен в прежний каталог. Key, permissions, host permissions и CSP сверены. Перезагрузка расширения и активация в пользовательской панели не выполнялись и не считаются проверенными.

Финальные исправления: `dbd6089986e51387f0ff52ff99a83995f03a5ab1`. Frontend #27082 PASS; Gateway Python #27073 и PG/NATS integration #27077 PASS. История дополнительных проверок сохранена в `ci-followup.json`.

Build #27105 / pipeline #5589 завершился успешно. Штатная фаза monitor-live также переупаковала Ingress, хотя после первого rollout его исходники не менялись. Дополнительный Ingress-образ не применяется: runtime сохраняет digest первого проверенного выпуска. В Docker выполнена одна сборка production bundle Front для этого исправленного SHA (Vite 1,84 с).

Финальный пакет: `chat-agent-2.2.0-dbd60899.zip`, 7 555 150 байт; SHA-256 `7ae15386f746cb8b715195caa31fc2a135cf5ce886cf89925b430e292af5cb9e`. Он включает исправление подачи готовой записи в диагностике расширения. Резервная копия прежней 2.1.2 сохранена.

После обновления Gateway фильтр транскрипций в интервале 10:14–10:29 показывает ровно три события 10:17–10:18 вместо карточек за всю сессию. Кнопка переподключения после смены Gateway восстановила работу без повторного входа.

## Финальный production smoke

Контрольный звук подан через Web Audio вместо физического микрофона. Это проверяет общий код захвата, Silero, WebCodecs, передачу, Ingress и четыре реальных backend; ручная речь и активированное расширение не проверялись. Одна запись 6,677333 с, 48 кГц: выбранная фраза 2,232–5,248 с. На каждом backend один вызов модели, все четыре прогона завершены, ресурсы диагностики освобождены.

| Backend | Подготовка до передачи | Рабочий прогон: передача → показ | Готовая фраза: граница → показ | Чистая модель | Завершение после показа |
|---|---:|---:|---:|---:|---:|
| Whisper Turbo | 1312.9 мс | 588.4 мс | 331.3 мс | 164.1 мс | 468.3 мс |
| Whisper Russian | 716.5 мс | 684.1 мс | 455.6 мс | 291.1 мс | 597.4 мс |
| GigaAM v3 RNNT | 655.0 мс | 446.8 мс | 211.2 мс | 56.1 мс | 595.2 мс |
| LinTO Whisper | 674.2 мс | 695.0 мс | 458.5 мс | 171.4 мс | 557.4 мс |

Обработка фразы и модель входят в рабочий прогон, их не нужно прибавлять к нему. Подготовка включает первое вычисление VAD и кодирование; остальные модели переиспользуют сегментацию и закодированные пакеты. Это отдельные нажатия и отдельные подключения, без прибавления времени предыдущей модели.

Передано **27 238 байт** Opus с заголовками вместо **641 024 байт исходного PCM**: **−613 786 байт / −95,75%**, 335 пакетов. Заголовки NATS/TLS в этой цифре не учтены. Первичное кодирование 57,5 мс; повторные запуски кодирование не выполняют. Серверное декодирование всего образца 50,6–68,2 мс. Сравнительного замера времени модели до Opus на этом образце нет — ускорение модели не заявляется.

Turbo, Russian и GigaAM получили одинаковый вход 16 кГц, 48 256 отсчётов, SHA-256 `9f05bd68ae8909612f9d1168f269c3484511d4902aa47699fec42a8df78fca62`. У LinTO подтверждены те же отправленные Opus-пакеты, диапазон и длина WAV; его внутренний вход модели не наблюдается. Существующая внутренняя отправка worker: 3 блока, 1 завершающий RPC. Результаты и полные измерения: `model-smoke.json`.

Полученные тексты:
- Whisper Turbo: «Шла Саша по шоссе и сосала чопа-чопс.»
- Whisper Russian: «Шла Саша по шоссе и сосала чупа-чупс.»
- GigaAM v3 RNNT: «Шла Саша по шоссе и сосала чупа-чопс.»
- LinTO Whisper: «Шла Саша по шоссе и сосала чопа-чопс.»

Это короткий smoke, не оценка качества, WER или p95. Отличия в последнем слове сохранены в отчёте.

В production Monitor проверены фильтр транскрипций и период, старый PCM-архив, обе темы, журнал → схема → журнал. Выбранный ответ `60f59136-da03-4997-96a8-29ed1ac8dc79` автоматически виден в центре схемы, классы `is-target-event is-reverse`, подсвечены Core/Gateway, раскрыт настоящий JSON `{ "data": {}, "status": 202 }`. Обратный переход возвращает к той же строке журнала. ID и вид сохранены в URL. Отметки 10:17:45.315 / 10:17:45.319 показаны отдельно и не трактуются как измеренная сетевая задержка.

Финальная адресная поставка: Gateway job [27131](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/27131>) **PASS**, Front job [27136](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/27136>) **PASS**, [build 27105](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/27105>) **PASS**. Оба точных digest были загружены до drain; повторного pull приложения при активации нет. Runtime после поставки: все 12 сервисов Chat Agent `1/1`, три изменённых сервиса `UpdateStatus=completed`.

| Runtime | Source SHA | OCI version | Digest |
|---|---|---|---|
| Front | `dbd6089986e51387f0ff52ff99a83995f03a5ab1` | `5.1.1068` | `sha256:04e2a917f068e0e0bd8b46052b013498c1e542823d277221490575a1f733f16a` |
| Gateway | `dbd6089986e51387f0ff52ff99a83995f03a5ab1` | `5.1.1068` | `sha256:7fbdc76c0f4b7156587a870db1c1016e5ba7ae4659dca1fa90f3d9d6e96de0f0` |
| Audio Ingress | `bb143bc3e4afef4bf0b2614ee20061783d2616ca` | `5.1.1059` | `sha256:4ca9cdba76d4c40ac34a2726bdc34a0d8f27e1bfe241f3518566695c487d8b0b` |

Корпоративная сборка задаёт OCI version; она отличается от исходных версий компонентов (`Front 7.2`, `Gateway 9.1`, `Ingress 5.1`). Текущий ASR остаётся `3.0.287`, прежний digest `d7ef90248622e7b9c4f5e6ac4fb1ee3d8ec68af4cda13831522b030491fda2ce`.

## Что осталось ограничено

- Large не включён: [ASR build 26920](<https://git.giscloud.ru/voice-chat/py_faster_whisper/-/jobs/26920>) завершился ошибкой Trivy, публикация/rollout не выполнялись. [Draft MR !8](<https://git.giscloud.ru/voice-chat/py_faster_whisper/-/merge_requests/8>) сохранён. Время модели и пиковая VRAM Large **не измерены**. Предварительные 11,66 ГиБ свободной памяти не являются подтверждением успешной загрузки.
- Расширение 2.2.0 собрано и установлено по прежнему пути, общий веб-код проверен. Активация в пользовательской панели требует обычной перезагрузки расширения; автоматически не выполнялась из-за ранее подтверждённого запрета инструмента. ID и permissions сохранены.
- Новый Opus-архив проверен на настоящих локальных PostgreSQL/NATS и общем декодере. Production-проверка архива использовала старый PCM; новая физическая запись в пользовательской панели не создавалась.
- Инфраструктура, корневые CI, rag-stack, модель по умолчанию и Silero не менялись. Длинные прогоны и повторная полная локальная регрессия не проводились.
