# Monitor и расширение 1.8.0 — проверка и поставка

Итоговый отчёт, 26 октября 2026. Изменения поставлены; расширение 1.8.0 обновлено пользователем. Три живых потока и физическая речь одновременно с диагностикой проверены в Chrome. Внешние ограничения: LinTO возвращает ошибку backend; runner собирает ZIP, но не может загрузить артефакт в GitLab из-за DNS. Инфраструктура оставлена без изменений.

## Исходники

| Репозиторий | До | После |
|---|---|---|
| chat-agent | `7db269144e1d166e65d9d8cdffbb0b5d4afb69b5` | `e19084f20b3724f6c40603c3927f965a1358790b` |
| py_faster_whisper | `1bd3e6ba1f76197e25f05fe95ecae812975a3f2d` | `e356c50be82862cb6a2dceda605e49d6ebd65ff3` |

Изолированные checkout; пользовательские изменения основных копий сохранены. Один writer. Инфраструктура, DNS, SSH и PostgreSQL не перенастраивались.

## Что реализовано

- Monitor: общая цепочка переходов, растянутый список сессий, переключатель «Активные / Все», индикаторы активного подключения, ошибки соединения с действием переподключения. Основной экран больше не загружает каталог изменений таблиц. Служебные операции расположены снизу и загружаются при раскрытии.
- В запросе добавлена вкладка «Поток», использующая существующий экран потока. Текстовый запрос не получает чужую запись. Старые ссылки на исходную запись сохранены. Обновлены выделение запросов и узкая компоновка.
- Диагностика: результат выше технических сведений, нет префикса `final` в основном тексте, ограниченный 500 строками консольный журнал. Автопрокрутка не мешает чтению старых строк.
- Проигрыватель: однократная остановка по правой границе, ожидание метаданных, отбрасывание запоздалых загрузок, сохранение редактируемого поля времени, точная длительность короткого участка, освобождение обработчиков. Сохранены чтение порциями и существующий audio element.
- Расширение: общий session_id сайта, независимый context_id вкладки, общая история с обозначением страницы. Чужие сообщения отображаются без исполнения инструментов и отправки подтверждений. В кэше инструмента ключ `(session_id, context_id)`.
- Core: учёт соединений по stream_id, отдельные лимиты трёх живых потоков и одного replay. Отключение вкладки и ошибочный пакет не завершают соседний поток общей сессии.
- ASR: приоритет живого задания в существующей ограниченной очереди; выполняющееся декодирование не вытесняется. Дополнительная копия модели, сервис или очередь не создавались.
- Health probe Voice Status использует идентифицируемый ошибочный пакет, чтобы проверка соответствовала новой изоляции потоков.

## Проверки исходников

| Проверка | Результат |
|---|---|
| Python chat-agent без внешних integration fixtures | PASS: 246 passed, 82 skipped, 13 subtests |
| PostgreSQL/NATS/audio integration в отдельных тестовых контейнерах | PASS: 94 passed, 4 skipped, 1 subtest |
| Frontend финальной ревизии | PASS: 409 tests в CI #22748; TypeScript, Vite, сборка расширения |
| Проигрыватель после последней правки | PASS: 9 tests |
| ASR streaming | PASS: 109 tests, 6 subtests |
| ASR streaming main и diagnostics | PASS: 79 tests, 18 subtests; частично пересекаются с предыдущим набором |
| Ruby chat release/build phase | PASS: 29 tests, 213 assertions |
| Ruby voice status/live bridge release | PASS: 6 tests/20 assertions и 6 tests/16 assertions |
| Runtime settings frontend | PASS на чистой production-сборке |
| Расширение | ZIP CRC PASS, версия 1.8.0; прежние key, permissions, host_permissions, incognito |

Пропущенные проверки не считаются успешными. CI и runtime отражаются отдельно ниже.

## Chrome: локальный исправленный проигрыватель

| Сценарий | Результат |
|---|---|
| Выделение 90 мс | PASS: остановка; 2 timeupdate, 1 seeking |
| Выделение 1 с | PASS: остановка; 6 timeupdate, 2 seeking |
| Выделение 3 с | PASS: остановка; 14 timeupdate, 2 seeking |
| Переход через границу порций 3,75–4,25 с | PASS: конец 4,25 с; 6 timeupdate, 2 seeking |
| Запоздалая загрузка 120 с после выбора 240 с | PASS: осталась последняя позиция 240 с |
| Перемотка остановленного плеера за пределы выделения | PASS после дополнительной правки `4ef818c6` |

Синтетическое аудио используется только для локальной проверки. Пользовательское аудио в fixtures не добавлено. Эти результаты не заменяют повтор на production после rollout.

## Исходные измерения production

- Исходная запись длительностью 38,027 с; выделение 24,432–24,522 с. За 1 809 мс: 4 695 `timeupdate`, 4 698 `seeking`, 4 694 `seeked`, одно событие паузы. Плеер уже остановлен, но повторное присвоение currentTime продолжает цикл. См. `production-playback-before.json`.
- Холодное открытие главного экрана: 2 команды Monitor по NATS — sessions и catalog; захват без потери событий. См. `monitor-root-before.json`.
- Кнопка «Обновить» с открытым тем же аудиозапросом: 17 NATS-запросов, включая 1 запрос каталога таблиц. Это измерение обновления экрана, а не холодного открытия страницы. См. `monitor-requests-before.json`.
- Whisper Turbo, 5 прогонов без живых подключений, 5,472 с PCM: медиана общего времени 9,38 с; p95 по ближайшему рангу 9,65 с. 20 измеренных вызовов модели: медиана очереди 0,2 мс, Decoder 152,3 мс; p95 Decoder 154,4 мс. Маленькая серия описывает эти прогоны и не заменяет нагрузочный тест.

- Длинная запись: 1 075,083 с (17 мин 55 с), в памяти проигрывателя загружена порция 32 с. При переходе 0–32 → 512–544 с JS heap used: 4 476 236 → 4 897 360 байт, backing storage: 611 376 → 620 632 байт. Сборка мусора не контролировалась; это снимки heap, а не RSS и не доказательство оптимизации памяти. Сравнение после поставки проводится на тех же позициях. См. `long-memory-before.json`.

## Код и сущности

| Область | Добавлено строк | Удалено строк | Чистое изменение |
|---|---:|---:|---:|
| Приложение и поставка, оба репозитория | 422 | 222 | +200 |
| Тесты | 368 | 119 | +249 |
| Документация | 41 | 14 | +27 |
| Всего | 831 | 355 | +476 |

Изменено 64 файла, полностью удалённых файлов — 0. Vendor, generated-файлы, локальные QA fixtures и сборочные артефакты не учитываются.

Удалены дублирующий RAM-индекс `asr_streams`, ветки отмены replay при подключении живого потока и предварительная загрузка каталога таблиц на основном экране. Общий navigation helper заменяет повторяемую навигацию. В `widget_cache` добавлен context_id и изменён существующий первичный ключ; новых таблиц, сервисов, постоянных журналов, зависимостей и аудиоконтекстов нет. Старые записи кэша без контекста очищаются миграцией; история сообщений и аудиозаписи сохраняются.

Рост строк включает требуемое поведение и регрессионные тесты. Удаление кода само по себе не объявляется ускорением. Уменьшение объёма накопленного кэша не приравнивается к уменьшению будущего расхода хранения.

## Chrome: фактический результат после поставки

- Три панели A / B / дубликат A: одна сессия `71518ba2-884f-459e-8c4d-6e88eb89211f`, три различных context_id. Общая история и обозначение страницы видны во всех панелях. A сохранила два поля, B — три; после работы B запрос A из сохранённых данных снова вернул два поля без повторного чтения страницы. См. `shared-session-contexts.json`, `widget-settings.png`, `tab-b-shared-history.png`.
- Текстовый запрос не предлагает Аудио / Поток; прежняя запись другого запроса не остаётся выбранной.
- Production при ширине 390 px: scrollWidth 375 px, горизонтального переполнения документа нет. См. `mobile-production.png`.
- Старые ссылки на исходную запись продолжают работать. Запись 1 075,083 с открывается порциями по 32 с; проверены позиции 0–32 и 512–544 с.

| Измерение на одинаковом сценарии | Было | Стало | Разница |
|---|---:|---:|---:|
| timeupdate за ~1,8 с для выделения 90 мс | 4 695 | 3 | −4 692 (−99,94%) |
| seeking в том же сценарии | 4 698 | 2 | −4 696 (−99,96%) |
| NATS-команды при обновлении открытого аудиозапроса | 17 | 15 | −2 (−11,76%) |
| Turbo, 5,472 с PCM, медиана 5 прогонов без live | 9,38 с | 9,39 с | +0,01 с (+0,11%) |
| Turbo, p95 тех же прогонов | 9,65 с | 9,56 с | −0,09 с (−0,93%) |

У исправленного проигрывателя 90 мс / 1 с / 3 с: остановка на точной правой границе, соответственно 3 / 6 / 14 timeupdate. Цикл событий после остановки отсутствует. См. `production-playback-after.json`.

Холодное открытие главного экрана: было 2 команды (sessions/catalog), стало 2 (sessions/requests при автоматически выбранной сессии). Каталог больше не загружается, но общего сокращения числа команд в этом наблюдении нет; выборки данных различаются.

Очередь модели Turbo: медиана 0,2 → 0,1 мс, p95 0,2 → 0,2 мс; Decoder: медиана 152,3 → 152,55 мс, p95 154,4 → 154,8 мс. Серия мала; ускорение ASR не заявляется.

Whisper Russian завершил повтор за 9,44 с, GigaAM — за 9,51 с. LinTO по-прежнему возвращает `linto_stream_error`; теперь интерфейс правильно показывает ошибку backend вместо успешного завершения. Это не блокирует остальные модели.

Сравнение heap не позволяет заявить экономию: до поставки 4,48–4,90 MB, после длительной серии проверок в новой сессии Chrome 22,22–23,60 MB. Состояние вкладки и сборка мусора не выровнены; это не сопоставимый замер RSS или доказательство регрессии. Подтверждена только загрузка 32-секундных порций, а не всей записи. См. `long-memory-before.json` / `long-memory-after.json`.

## Поставка

- Основной chat pipeline [5391](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5391>), SHA `1c3eef2f`: пять checks, сборка образов, drain #22659, backend #22643 и Frontend/resume #22644 — PASS. Приём открыт. Повторная read-only preflight #22682 — PASS.
- Расширение 1.8.0 установлено в `локальный источник, пользователь подтвердил перезагрузку. 16 файлов совпадают с проверенной сборкой; прежние ID/permissions сохранены. Резервная копия 1.7.0 сохранена отдельно.
- Voice pipeline [5387](<https://git.giscloud.ru/voice-chat/py_faster_whisper/-/pipelines/5387>), SHA `e356c50b`: checks и образы PASS. Bridge refresh #22481 и Voice Status refresh #22484 завершились ошибкой финального guard из-за изменения task соседнего n8n. Причина изменения не установлена; команды этой задачи n8n не меняли. Отдельные read-only verify #22482 и #22485 — PASS: требуемые targets уже обновлены, здоровье и digest подтверждены.
- ASR pipeline [5388](<https://git.giscloud.ru/ai-assistant/deployments/rag-stack/-/pipelines/5388>): worker #22489 и read-only verify #22490 — PASS. Три модели загружены и прогреты; одна копия каждой. Длинный повторный pull увеличил паузу: между завершениями drain #22659 и resume-job #22644 прошло около 27 мин 33 с. Это дольше запланированной короткой паузы; точная продолжительность закрытого admission отдельно не измерялась.
- Коррекция `58557aa1`, pipeline [5392](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5392>): в штатный ingress DRS добавлен `MONITOR_AUDIO_LIVE_ENABLED=1`. Generic rollout ранее сбрасывал настройку, выставленную специализированной поставкой. Все пять checks PASS; frontend check потребовал один повтор после TLS ECONNRESET в npm audit. Сборка Monitor live #22704 и preflight #22710 PASS. Адресное обновление Gateway / ingress / Frontend завершено: drain #22722, backend #22742 и Frontend/resume #22743 PASS; admission открыт. Живые графики снова получают данные.
- Публикация ZIP в CI — BLOCKED: финальные повторы #22871 и #22872 успешно собрали расширение, но загрузка артефакта завершилась DNS-ошибкой имени gitlab на resolver 172.17.0.1. Локально установленный пакет работает и не зависит от публикации ZIP.

Критическая проверка трёх живых потоков вместе с replay после коррекции e19084f2 — PASS. Подробности ниже; неотмеченные сценарии не считаются PASS.

## Корректирующая проверка ошибки устройства

При выборе отсутствующего микрофона подключение корректно освобождалось, но переход в idle скрывал сообщение об ошибке. Исправление `744e8329` сохраняет эту ошибку до новой попытки соединения. Регрессионный тест сначала воспроизвёл дефект (FAIL), затем прошёл; адресный набор — 51 тест PASS. Все пять checks pipeline [5393](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5393>) PASS (#22746–22750). Изменён только пакет расширения; повторная поставка серверов не требуется.

Локальный пакет 1.8.0 обновлён, ZIP CRC и совпадение 16 файлов проверены; пользователь подтвердил повторную перезагрузку расширения и открытие новых панелей после обновления пакета. Предыдущая CI job #22690 успешно собрала ZIP, но загрузка артефакта завершилась ошибкой DNS `gitlab` на resolver 172.17.0.1; повтор #22753 остановлен по ранее данному разрешению пользователя после 24 минут без продвижения на npm ci, чтобы освободить runner для исправления ingress. Публикация ZIP остаётся незавершённой; инфраструктура не менялась.

## Реальные потоки и корректировка допуска ingress

- PASS: две вкладки 127.0.0.1 имеют одну сессию и разные потоки. Остановка A завершает только её поток; B продолжает получать PCM.
- PASS: localhost получает отдельную сессию. Перезагрузка A сохраняет общую сессию и контекст страницы; штатное дублирование создаёт новый контекст.
- PASS: очистка только ключей тестовой сессии через кнопку тестовой страницы создаёт новую сессию d46de968-2756-4000-97b7-d0d11fbc7d70 и завершает старые панели/потоки того же origin. Поток другого origin 9941f786-d955-4a51-a73a-04e1b288f909 продолжает получать PCM.
- PASS: replay при двух живых потоках завершён за 9,39 с. Конкурирующий replay получает «Уже выполняется диагностика», первый продолжается. Отмена освобождает слот, следующий запуск завершён за 9,39 с. Подключение живого микрофона во время replay не отменяет его (9,38 с).
- PASS: произнесённая пользователем фраза распознана и получила ответ: request a3f60255-ee98-54c5-b1d9-b701c261bf90, 30 событий, 3,028 с выполнения запроса. Это время обработки запроса, а не задержка ASR от начала речи.
- Уточнение измерений: серия 9,99 / 9,32 / 9,39 / 9,46 / 9,40 с выполнялась с одним живым потоком. Восстановление локального Vite-сервера перезагрузило A/B и закрыло их панели. Метки сценариев в live-runs.json исправлены; эти значения не считаются проверкой трёх потоков.
- FAIL до исправления: после повторного открытия и проверки трёх реально активных потоков replay трижды получил audio_capacity (2,92 / 2,95 / 2,84 с). Core уже разрешал 3 live + 1 replay, но дополнительная проверка ingress всё ещё ограничивала общий список тремя элементами.
- Исправление e19084f2: ingress учитывает три живых подключения и резерв диагностического replay. Core сохраняет раздельный admission и проверку владельцев. Регрессионный NATS-тест воспроизвёл дефект до правки, затем прошёл; 32 адресных теста и 2 subtests PASS. Проверены оба порядка подключения и сохранение трёх live после завершения replay. Пять обязательных checks #22809–22813 PASS. Сборка только ingress #22815, preflight #22836 и адресная поставка #22834 PASS. Повтор Chrome PASS.
- Проблема положения панели localhost была следствием оставшегося тестового viewport override. Override удалён, штатный размер восстановлен; панель и кнопка голоса полностью видны. Это исправление тестового окружения, не изменение пользовательского масштаба или инфраструктуры.

Read-only preflight #22808 подтвердил фактические ревизии Core/Agent 1c3eef2f и Gateway/ingress/Frontend 58557aa1, включая image digest. Снимок сохранён в chat-runtime-preflight-22808.txt.

## Подтверждённые runtime identities

Core/Agent/Gateway/Frontend проверены read-only job #22808, окончательный ingress — scoped rollout #22834. Между ними менялся только ingress. Значения digest ниже — идентичность образа, а не обещание неизменяемости тега main:latest.

| Сервис | Source revision | Фактический image digest |
|---|---|---|
| Core | 1c3eef2f | sha256:47c164be5269055e115f02cd0694d0b789c13eeb82579f065631262a9d072141 |
| Agent | 1c3eef2f | sha256:2a4546cc20f2a9dd9100704d285cea8357b5f2ad77ba679bcee7c7b58a01a971 |
| API Gateway | 58557aa1 | sha256:9b19b518b40d46194de5768371c6be05ec1797f3fec57d9b96be9539ddb511ce |
| Audio ingress | e19084f2 | sha256:d829fd62ee334254311b3697146698e71722baef5936b92080eff13003c61abe |
| Frontend | 58557aa1 | sha256:8f3eb889d9ea3e6cd3b1483423c9f3a5d64e54b733a91b9afacdd7e50aabe6e7 |
| ASR worker | e356c50b | sha256:781e2c6e258d10fe032f0c765b7643baaa6eaa4df06de84b37f5b2193d50a9a3 |
| Voice bridge | e356c50b | sha256:278e5d267382c2529b744a28d73a0ea236269799b32445195f3356482a957c5c |
| Voice Status | e356c50b | sha256:49dd30e7c2aed912b0d0441ee53d4654e1ba03906f79b80ef2c708c07cfccc64 |

Для Voice использованы результаты verify #22482/#22485, для worker #22490; #22808 относится к chat-agent. Несвязанные сервисы не обновлялись.

## Границы измерений

- Размеры таблиц/индексов и число удалённых строк кэша до миграции не зафиксированы: численное сокращение БД не заявляется.
- Снимки CPU/памяти runtime есть в preflight, но это разные моменты нагрузки; сопоставимого замера CPU/RSS до/после нет.
- Малая серия из пяти прогонов даёт описательную медиану и p95 по ближайшему рангу, а не статистическую гарантию задержки.
- Неизменённые параметры PCM и ограничение порции 32 с сохранены. Новое сокращение сетевого аудио или расхода хранения в этом этапе не заявляется.
- Новые правила admission и маршрутизация протестированы на реальном NATS в disposable окружении; аппаратный Chrome-сценарий трёх микрофонов и replay до финальной коррекции завершился FAIL; после поставки e19084f2 повторён успешно.

- После завершения тестового потока 9941f786-d955-4a51-a73a-04e1b288f909 Monitor показывает «Нет активного потока», длительность 979,996 с, 290 событий, запись «Полная». Предыдущий capturing относился к зафиксированному временному срезу; после «Обновить» отображается итог.

## Финальная коррекция e19084f2: поставка и Chrome

Пять обязательных checks pipeline [5394](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5394>) PASS. Python: 246 passed, 88 skipped, 13 subtests (integration пропуски выполняются отдельно). Frontend: 409 tests, TypeScript/Vite/runtime settings/npm audit PASS; установка зависимостей заняла 17 минут, тесты прошли без изменения CI.

Сборка #22815 выполнена штатным режимом audio-quality-ingress. Preflight #22836 PASS. Адресная поставка #22834 PASS за 81,918 с; обновлён только audio_ws_ingress, приём открыт. Скрипт проверил running/health, Image ID и неизменность других сервисов. Фактический ingress: revision e19084f20b3724f6c40603c3927f965a1358790b, digest sha256:d829fd62ee334254311b3697146698e71722baef5936b92080eff13003c61abe. Длительность job не равна точному времени закрытого admission. См. ingress-final-rollout-22834.txt.

Серверный реестр одновременно подтвердил три потока в receiving: два потока общей сессии d46de968-2756-4000-97b7-d0d11fbc7d70 и третий сессии localhost 7724f3ec-6cab-4dea-ab03-c6839bcde3f4. Первый replay завершён за 10,08 с; следующие пять: 10,01 / 9,61 / 9,48 / 9,38 / 9,54 с. Все завершены, audio_capacity отсутствует.

| Одинаковый фрагмент 5,472 с, Turbo | Без live после поставки | С тремя live | Разница |
|---|---:|---:|---:|
| Медиана, 5 запусков | 9,39 с | 9,54 с | +0,15 с (+1,60%) |
| p95, ближайший ранг | 9,56 с | 10,01 с | +0,45 с (+4,71%) |
| Медиана очереди модели | 0,1 мс | 0,1 мс | 0 |
| p95 очереди модели | 0,2 мс | 0,2 мс | 0 |
| Медиана Decoder | 152,55 мс | 151,4 мс | −1,15 мс (−0,75%) |
| p95 Decoder | 154,8 мс | 153,8 мс | −1,0 мс (−0,65%) |

Модельные метрики взяты из диагностических вызовов, а не из полного пути живой речи. Запуски были последовательными при неизменном PCM; интенсивность физической речи не стандартизована. Ускорение ASR не заявляется.

Whisper Russian с тремя live: PASS, 9,49 с. GigaAM: PASS, 9,99 с. LinTO: linto_stream_error, 9,58 с; эта ошибка относится к отдельному backend. Проверка всех четырёх маршрутов выполнена, доступность LinTO остаётся FAIL.

96 наблюдавшихся кадров реестра после серии содержат три receiving потока. Буфер CDP был усечён в начале (truncated=true), поэтому этот файл не используется как доказательство непрерывности каждого пакета всей серии. Идентичность трёх потоков подтверждена отдельно до запуска и после.

Публикация расширения: #22871 снова собрала ZIP, но загрузка артефакта завершилась DNS-ошибкой gitlab/172.17.0.1. Последний штатный повтор [#22872](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/22872>) также собрал ZIP, затем завершился FAIL при загрузке артефакта с той же DNS-ошибкой; npm ci занял 17 минут. См. extension-artifact-dns-22872.txt. Локальный ZIP: SHA256 43de08bfb4aa3c13f6cbaa80e8b6d152f4b940481e380939c0d11ac5334213c0, CRC PASS, версия 1.8.0; пользователь подтвердил обновление панелей.

## Дополнительные реальные сценарии

- PASS: при двух live запущен replay, затем подключён третий микрофон A. Replay завершился за 9,57 с. Серверный реестр показал переход 2 → 3 receiving; потоки B и localhost сохранили прежние stream_id. Захват этого сценария без усечения CDP. См. connect-third-during-replay.json.
- Полный режим: переданы все 38,027 с PCM; выбранная фраза показана до окончания передачи (final на 28,55 с), соединение закрыто и слот освобождён на 41,14 с. Соседняя фраза в этой записи получила rejected/low_confidence на 18,55 с, поэтому итоговый статус содержит ошибку low_confidence. Транспорт и освобождение ресурсов — PASS; успешное распознавание всех фраз не заявляется. Модель и VAD не менялись.
- Физическая речь при трёх подключениях: «Ответь одним словом. Проверка.» получена 09:58:38 UTC в общей сессии (90f631cf-5310-51fb-99cc-28500ab95e54) и 09:58:39 UTC в localhost (7e3503dc-709d-589d-ba3f-14cc956dd40b). Оба запроса завершены, по 30 событий, обработка запроса 3,147 / 3,481 с. Это произошло после окончания предыдущего replay; одновременность этой конкретной речи и диагностики не заявляется. Отдельный повтор с подтверждённым пересечением приведён ниже.

## Физическая речь одновременно с replay — PASS по доставке

Повтор выполнялся 10:01:53.301–10:02:35.310 UTC. Во время него три потока независимо создали голосовые запросы:

| Источник | Время UTC | Request ID | Распознанный текст | Обработка запроса |
|---|---|---|---|---:|
| A, 127.0.0.1 | 10:01:56 | d1006e7c-ff99-532f-9bc5-90a8a3537c37 | Словом проверка | 3,077 с |
| B, 127.0.0.1 | 10:01:55 | 44cd2822-587d-5be2-b1dc-ce5fb6b21d1e | ответить одним словом проверка | 2,856 с |
| A, localhost | 10:01:55 | 2c380d63-8118-5de3-99d6-6b4961958e74 | ответить им словом проверка | 3,213 с |

Все три запроса завершены; в панелях ответ «Проверка». A/B используют общую историю, localhost — отдельную сессию. Текст между микрофонами отличается: точность распознавания всей исходной фразы не объявляется PASS. Изменение качества VAD/моделей не входило в эту поставку. Эти времена — обработка запроса после ASR, не сквозная задержка от начала речи.

Диагностический поток передал 38,027 с PCM, показал целевую final-фразу и освободил слот за 42,01 с. В полном диапазоне сохранился отдельный rejected/low_confidence соседней фразы. Отключения или блокировки живых потоков не было. После проверки серверный снимок без усечения подтвердил все три прежних stream_id в receiving. См. physical-three-live-concurrent.json, physical-replay-windows.json и physical-response-panel.png.

## Завершение и ограничения

- Три тестовых микрофона выключены; серверный реестр подтвердил ноль активных аудиоподключений. Тестовые страницы закрыты, локальный сервер и два собственных disposable контейнера остановлены/удалены. Три локальных HTML fixture перенесены в папку test-fixtures этого отчёта и удалены из checkout. Пользовательские изменения и остальные untracked-файлы сохранены.
- Пять обязательных checks финального chat SHA e19084f2 — PASS. Адресная поставка и здоровье изменённых сервисов — PASS. Общая сессия, независимые потоки, проигрыватель, навигация и параллельный replay проверены.
- LinTO — FAIL внешнего backend (linto_stream_error). Whisper Turbo, Whisper Russian и GigaAM работают. Это не отсутствие поставки интерфейса.
- Публикация ZIP в GitLab — BLOCKED DNS runner. Последняя job #22872: сборка PASS, upload FAIL. Пакет 1.8.0 установлен по прежнему пути и проверен после ручного обновления Chrome. Повторная настройка DNS/SSH/runner не выполнялась.
- Полного сравнения CPU/RSS, размеров БД и распределения сквозных задержек физической речи нет; эти показатели не выданы за измеренные улучшения. Воспроизводимые количественные результаты — события проигрывателя, команды Monitor и серии диагностического replay.
