# Markdown и диагностика нераспознанных фраз — результат поставки

27 октября 2026. Код: [`e2185e482bdcf130604a7988d3d66e4d7a6fa2d7`](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/commit/e2185e482bdcf130604a7988d3d66e4d7a6fa2d7>). Изменения отправлены в canonical `main` из изолированного checkout. Основная рабочая копия пользователя не изменялась.

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

- Один renderer Markdown в существующем ChatUI для новых ответов, обновлений и восстановленной истории. Закреплён `markdown-it 15.0.3`. HTML выключен; ссылки только HTTP/HTTPS, `noopener noreferrer`; изображения представлены ссылками. Таблицы и код прокручиваются внутри сообщения. Текст пользователя и технические JSON остаются обычным текстом.
- Отказы ASR показываются отдельной карточкой существующего запроса: причина, «Копировать ID», «Диагностика в Monitor», «Команда не отправлена». Живое событие, восстановление и межвкладочное представление используют одну функцию. Повторная доставка обновляет карточку. Отказ не запускает модель чата или инструменты.
- Существующая проекция `widget_history` дополнена необязательным `include_asr_outcomes`, выключенным по умолчанию. Расширение 1.8.2 включает его. Хронология и дедупликация по request_id сохранены. Между панелями используется прежний `history_view`.
- Monitor показывает «Речь не распознана» и причину вместо пустого заголовка/ошибочного сообщения об отсутствии итога. Подтверждение показа распознанного текста применяется к успешным фразам.
- Подтверждённые координаты теперь вычисляются для завершённых `final/rejected/error` в любом порядке доставки окон и результата. Проверки окон и PCM сохранены. Отказ распознавания не запрещает диагностику пригодного аудио.
- Выполнено ограниченное восстановление отсутствовавших исторических границ: **проверено 25, восстановлено 25, недостаточных данных 0**. Менялись только отсутствовавшие координаты; исходные результаты, записи и receipt не переписывались. Добавлена ручная CI-операция восстановления, привязанная к точной версии работающего Gateway.

Новых сервисов, таблиц, хранилищ истории, соединений или подписок NATS нет. ASR worker и порог уверенности не менялись. Инфраструктура, DNS, SSH и PostgreSQL не перенастраивались.

## Фактическая поставка

| Компонент | Версия | Проверенное состояние |
|---|---|---|
| Chrome extension | 1.8.1 → **1.8.2** | Установлено по прежнему пути; пользователь подтвердил перезагрузку. Новая карточка и Markdown проверены в его Chrome. Все поля manifest, кроме версии, сохранены. |
| Gateway | 6.10 → **6.11** | [Rollout 23980](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23980>) SUCCESS; точный образ e2185e48, Running/health, завершённое обновление и сохранность соседних сервисов проверены существующим release guard. |
| Front | 5.13 → **5.14** | [Rollout 23994](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23994>) SUCCESS с той же проверкой runtime; новые данные видны в Monitor. |
| Восстановление границ | Однократная операция | [Job 23981](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23981>) SUCCESS; 25/25. |

Build label обоих серверных образов: `1.0.0.1005`. Ревизия: `e2185e482bdcf130604a7988d3d66e4d7a6fa2d7`.

- Gateway digest: `sha256:4af93e689306001414a989dee2a73ca55e2b9771932909f891d59a692922053b`.
- Front digest: `sha256:a6a807418edc7ea91ffebffad0918eabc72443d4863249f3ff159f2a898dd82e`.
- Путь расширения: `локальный источник
- Сохранён резервный пакет 1.8.1: `локальный источник

## Проверка указанного запроса

`b263a032-6639-5ab8-b768-afe9cab2ed42`, сессия `9a64b321-91d8-437b-af68-3a404da9e40b`.

| Проверка | Результат |
|---|---|
| История установленного расширения | Одна карточка между `25ee6c04…` и `5134a9b5…`; правильный request_id, причина и «Команда не отправлена». |
| Копирование | Панель показывает «ID скопирован». Точный аргумент clipboard.writeText проверен unit-тестом; чтение системного буфера через browser tool не подтвердилось и не используется как доказательство его содержимого. |
| Переход из карточки | Реальный клик открыл Monitor с правильными session_id/request_id и `section=phrase`. |
| Границы | Отсутствовали → **0,152–2,496 с**, длительность **2,344 с**. |
| Прослушивание | Chrome: readyState=4; воспроизведение дошло до 2,344 с, ended=true, paused=true. |
| Диагностика | «Фраза + контекст»: **0,000–3,496 с**; передано **3,496 / 3,496 с PCM**. |
| Завершение | **7,15 с**, соединение закрыто, слот освобождён. |
| Итог модели | Whisper Turbo снова вернул `rejected / low_confidence`. Это результат распознавания; прежняя блокировка доступа к аудио устранена. |

Время этого прогона: подготовка 0,87 с; предзагрузка и подключение 1,28 с; подача PCM 1× 3,49 с; завершение ASR 1,32 с. Это один функциональный прогон, не медиана и не p95. Очередь модели 0,1–0,2 мс, отдельные Decoder-вызовы 145,1–150,8 мс. Эти измерения не смешиваются со временем интерфейса.

В установленном расширении восстановились 26 ответов с Markdown и 7 таблиц. После обновления серверов панель сначала показала ошибку выдачи доступа; штатная кнопка «Повторить» восстановила подключение и историю. Повторный вход/перезагрузка расширения не понадобились. В новой вкладке Monitor после перехода из карточки ошибок console не зарегистрировано.

![Восстановленная карточка в установленном расширении](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/extension-restored.png>)

![Фактический replay восстановленной фразы](#archive-availability)

## Проверки

[Pipeline 5413](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5413>), все пять обязательных проверок **PASS**:

| Проверка | Job |
|---|---|
| Python | [23932](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23932>) |
| Browser NATS | [23933](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23933>) |
| Frontend | [23934](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23934>) |
| Ruby | [23935](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23935>) |
| Dialog integration | [23936](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23936>) |

Локально:

- Frontend: 438 тестов / 61 файл, TypeScript и Vite PASS; npm audit — 0 уязвимостей.
- Python: 247 passed, 1 skipped, 13 subtests. Реальные PostgreSQL/NATS integration: 41 passed, 2 subtests.
- Дополнительная адресная проверка контрактов/Monitor: 63 passed, 2 subtests; этот набор пересекается с остальными, числа не суммируются.
- Ruby release: 30 runs, 229 assertions. CI lint и git diff --check PASS.
- Проверены совместимость старого widget_history, порядок/дедупликация отказов, изоляция отображения в соседней вкладке без инструментов, поздние окна, повторная доставка, отсутствие координат, повреждённый PCM, повтор активной фразы, ограниченность и идемпотентность исторического восстановления. Эти межвкладочные и граничные случаи подтверждены автоматическими тестами, а не новым физическим голосовым прогоном в нескольких вкладках.
- Реальный renderer проверен в браузере: восстановление и повторная доставка, незавершённая разметка, HTML/опасные ссылки, отсутствие img-загрузок, внутренний scroll таблиц/кода. Светлая и тёмная поверхности, ширина 390 px — без горизонтального переполнения страницы. Продукционная проверка: светлая панель расширения и тёмный Monitor. Временные viewport overrides сняты.

## ZIP и отдельный сбой CI

Job [build Chrome extension 23939](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/23939>) собрал расширение, но завершился ошибкой при загрузке artifact: DNS runner не разрешил `gitlab` (`server misbehaving`). Поэтому **весь pipeline не объявляется зелёным**, несмотря на PASS пяти обязательных checks и успешные серверные rollout.

ZIP 1.8.2 отдельно опубликован в [GitLab Package Registry](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/packages/2>). Скачанный пакет побайтно совпал с проверенным локальным ZIP.

- Размер: **946 115 байт**.
- SHA-256: `ff3dac5e42b8c23929b4f2d462a25169cb876f97ebc5b13536255445d255684f`.
- [Локальный ZIP](#archive-availability).

## Объём изменений и доказательства

**43 файла, +578 / −103 строки; итог +475.** Новых сервисов и таблиц: 0. Новая библиотека renderer: 1. Новая ручная операция CI для ограниченного восстановления: 1.

- [Локальные проверки](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/local-verification.json>).
- [Браузерные результаты](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/browser-verification.json>).
- [Gateway rollout](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/runtime-gateway.log>), [Front rollout](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/runtime-front.log>), [восстановление границ](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/bounds-repair.log>).
- [Renderer на 390 px, обе поверхности](</experiments/voice-ai/archive/v/10/27/markdown-asr-outcomes/markdown-390-clean.png>).
