Голосовые системы

Monitor: аудит повторов и схема навигации

26.10.2026. Проверены работающий Monitor и исходники 34566e13e090552fb9df8f361decde8e81159942 (Frontend 5.11). Это результат обследования и предложение следующей переработки; код и runtime в ходе аудита не изменялись.

Пройдено 16 экранов и состояний: сессия, активная сессия, обзор запроса, дорожки, события, аудио фразы, диагностика, сообщения потока, завершённый и активный поток, события потока, исходная запись, голосовые сообщения сессии, служебная операция, каталог и таблица БД. Диагностические прогоны не запускались, микрофоны и подключения пользователя не переключались.

1. Подтверждённые ошибки переходов

Проблема Проверенное поведение Исправление
Разные назначения клика по одной сессии Из аудио запроса клик по уже выбранной сессии слева сохраняет view=audio и request_id. Та же сессия в breadcrumbs открывает общий экран с потоками и запросами. Другая сессия слева тоже открывает общий экран. Любой явный переход по ссылке сессии открывает её общий экран. Восстановление прямой ссылки при загрузке отделить от клика пользователя.
Заголовок не соответствует содержимому В потоке e0937fc7 кнопка «Все сообщения сессии» показывает сообщения двух потоков, но над ними остаются заголовок e0937fc7 и его вкладки. Переход должен обновлять владельца всей основной области. Общие сообщения открываются на уровне сессии.
«Исходная запись» ведёт к разным данным Из потока, открытого через запрос, ссылка переводит в аудио этого запроса. Из списка потоков открывается полная исходная запись. Одинаковая подпись и идентификатор записи всегда ведут в один экран полной записи. Аудио фразы остаётся отдельной областью запроса.
«Backend не сохранён» при сохранённом backend Для завершённого e0937fc7 список показывает Whisper Turbo, заголовок отдельного потока — «Backend не сохранён». Брать исторический backend из загруженной записи, а не только из live-снимка или кэша списка. Новое поле БД не нужно.

Источники:

  • exchanges.ts:183: пользовательский клик и восстановление URL используют один обработчик. exchanges.ts:204: дочерний выбор очищается только при смене session_id.
  • navigation.ts:17: breadcrumb сессии всегда убирает дочерние идентификаторы.
  • audioArchive.ts:57, audioArchive.ts:89: переход обновляет вложенную область, оставляя оболочку потока.
  • audioStreams.ts:80: исторический backend и назначение ссылки на исходную запись.
  • Снимки: сообщения потока, все сообщения под прежним заголовком потока, исходная запись.

2. Что повторяется и что объединить

Сейчас Предлагаемое представление Что обязательно сохранить
Запросы сессии и отдельные «Голосовые сообщения» сессии/потока Один список сообщений и запросов; поток и источник — фильтры. Из потока открывается этот список с фильтром потока. ASR-фразы без полноценного запроса, неподтверждённый показ, несовпадение текста, backend, диапазон, статус записи.
«Дорожки», «События», а внутри дорожек ещё полный список технических наблюдений Один раздел «Выполнение», два представления: «Дорожки / Список событий». Одна карточка подробностей выбранного события. Причинный порядок, раздельные отправка/приём, payload, trace/span, ошибки и неполные цепочки.
Вопрос, ответ, статус и время повторяются между обзором, дорожками и событиями Общая шапка запроса; подробные тайминги в обзоре, выполнение ниже или на соседней вкладке. Полный вопрос/ответ, отличия измеренного времени от вычисленного, ссылки Tempo/Phoenix.
Исходная запись встроена в аудио фразы, экран потока и старый список записей Одна полная запись принадлежит потоку. Из фразы — явная ссылка «Вся запись потока». Записи без речи, пропуски, хеши, манифесты, waveform, PCM/WAV и проверка целостности.
«Данные / Диагностика» повторяют контекст одной фразы Единый раздел «Аудио»: исходный результат и проигрыватель; раскрываемый блок «Повторить распознавание» с результатом рядом. Исходный ASR и повтор имеют разные результаты, вызовы моделей и журналы. Не смешивать их. Повтор запускается только действием пользователя.
Полный UUID и длинный User-Agent повторяются слева и над каждым дочерним экраном Компактная идентификация сессии, копирование ID; User-Agent и остальные свойства в «Сведения о сессии». Breadcrumbs, выбранная сессия и возможность получить полные значения.
«События этого запроса →» дублирует одноимённую вкладку Одна понятная точка входа в события запроса. Прямые ссылки на конкретное событие.
«Служебные операции» повторяются внизу каждого дочернего экрана Один свёрнутый раздел на общем экране сессии и ссылка в навигации выбранной сессии. Все операции, пагинация и переход в события операции.

Особенность списка запросов: сейчас это не две гарантированно равные выборки. monitor_requests.py строит запросы из nats_log; audio_messages.py читает audio_phrases. Поэтому нельзя просто удалить голосовой список. Перед заменой нужно свести источники по доказанной связи session_id/request_id, сохранить строки без пары и проверить пагинацию. Общая таблица UI не требует новой таблицы БД или фонового копирования истории.

Источники:

  • monitor_requests.py:14, audio_messages.py:108.
  • requests.ts:149, sessionSequence.ts:153, sessionSequence.ts:180.
  • audioArchive.ts:120.
  • Снимки: обзор, дорожки, события, аудио, диагностика.

3. Левая колонка, включая последнее замечание

Убрать две широкие строки поиска и общих фильтров над рабочей областью. Перенести существующие элементы и обработчики в левую колонку над списком сессий. Не создавать второй набор фильтров или второе состояние формы.

┌ Левая колонка ──────────────────┐   Основная область
│ ID сообщения, потока, сессии    │   Monitor → Сессия → Запрос → Аудио
│ [UUID…                  ][Найти]│
│ Период  [1500m               ▾] │   Заголовок выбранного объекта
│ ▸ Фильтры обменов · 2           │   Его данные и действия
│ [Применить] [Обновить]          │
├────────────────────────────────┤
│ Сессии 14       [Все|Активные]  │
│ ● 17:32 · выбранная сессия      │
│   Обзор сессии                 │
│   Запросы                      │
│   Активные потоки · 1           │
│     ● 31486d03…  Whisper Turbo │
│   Завершённые потоки           │
│   Служебные операции           │
│ · 17:10 · другая сессия         │
│ … внутренняя прокрутка списка … │
├────────────────────────────────┤
│ 1–14 из 14             [←] [→] │
└────────────────────────────────┘

Числа в схеме иллюстрируют компоновку, а не новый замер.

  • Поиск по ID сохраняет текущую семантику поиска по всей истории, независимо от периода списка.
  • Период остаётся видимым. «Тип обмена / Состояние обмена» располагаются в компактном раскрываемом блоке. При действующем фильтре виден индикатор, а выбранные значения можно раскрыть; фильтр не должен работать незаметно.
  • Поиск и фильтры закреплены сверху, пагинация снизу. Прокручивается середина со списком сессий. При малой высоте окна колонка должна позволять добраться до всех элементов без обрезки.
  • Контекстные ссылки раскрываются только у выбранной сессии. Не превращать всю колонку в дерево всех запросов и событий.
  • «Запросы», «Завершённые потоки» и «Служебные операции» ведут к соответствующей секции общего экрана сессии. Это переходы внутри одного экрана, а не новые дублирующие страницы.
  • Активный поток открывается сразу в «Вживую». Его состояние и backend видны в компактной строке. Считать активность по подключению, а не по наличию речи.
  • Не загружать всю историю ради счётчиков меню. Показывать точное число только при наличии полного агрегата; для неполной выборки обозначать границу.
  • На 390 px поиск и фильтры сворачиваются в панель над содержимым. Все функции доступны с клавиатуры. Тёмная тема остаётся основной, светлая использует ту же компоновку.

4. Единые правила навигации

  1. Ссылка на сессию всегда открывает её общий экран: активные и сохранённые потоки сверху, запросы ниже.
  2. Ссылка на запрос всегда открывает обзор запроса. Ссылка «Аудио» явно открывает его фразу; ссылка на событие — выполнение с выделенным событием.
  3. Один поток имеет один экран. Переходы из сессии и запроса используют его; связь «Вернуться к запросу» видна отдельно. Поток не становится дочерним объектом одного запроса: он может содержать несколько запросов.
  4. В потоке сохраняются «Вживую», «События», «Исходная запись». «Сообщения» ведут в общий список с фильтром потока, пока не потеряв ни одной архивной фразы.
  5. Для запроса достаточно «Обзор / Выполнение / Аудио». В «Выполнение» — переключатель дорожек и списка событий. Связанный поток показан явной ссылкой возле контекста запроса.
  6. URL хранит выбор объекта и представления. Back/Forward и прямые ссылки восстанавливают экран, фильтры и страницу. Явный клик по сессии не равен восстановлению её текущего дочернего экрана.
  7. При смене сессии очищаются чужие request/stream/recording/event ID. Поздний ответ старого экрана не меняет новый.
  8. Старые ссылки переводятся в соответствующие новые представления. Ссылки на аудио без распознанных сообщений сохраняют доступ к записи.
  9. «Все таблицы» остаётся глобальным разделом вне дерева конкретной сессии. В ячейках доказанных связей session_id, request_id, ID записи можно добавить ссылки на те же канонические экраны. Не угадывать тип любого UUID.

5. Что оставить отдельным

  • События запроса, события потока и события replay: разные области данных. Можно переиспользовать компонент просмотра, сохраняя область и источник каждого наблюдения.
  • Исходный ASR и диагностический повтор: разные запуски, не дубли результатов.
  • Наблюдения отправки и получения: нужны для проверки доставки; совпадающее содержимое не означает лишнее событие.
  • Длительность соединения, сохранённого PCM, фразы и выполнения запроса: разные величины. Например, у проверенного потока показано 11.685 с соединения и 10.432 с PCM, у фразы — 1.768 с.
  • «Все таблицы»: это текущие значения БД, а не журнал выполнения. Общая оболочка и связанные ссылки нужны, слияние с рабочим экраном — нет.

6. Порядок реализации

  1. Перенести верхние формы в левую колонку. Проверить плотность, внутреннюю прокрутку, ошибки поиска и фильтров, светлую тему и ширину 390 px.
  2. Исправить канонические переходы сессии, исходной записи и кнопки «Все сообщения»; поправить исторический backend. Использовать существующий роутинг и функции построения URL, без нового навигационного слоя.
  3. Добавить компактные ссылки выбранной сессии. Убрать повтор User-Agent и полных ID из дочерних заголовков. Обеспечить переходы из таблиц БД.
  4. Объединить представления выполнения и убрать повтор технического списка. Сохранить единственный просмотрщик подробностей события.
  5. Свести голосовые сообщения с запросами после проверки полноты объединения. Сохранить неподтверждённые и несопоставленные фразы.
  6. Собрать единое рабочее место аудио с исходной фразой и раскрываемой диагностикой; полную запись показывать у потока.

На каждом шаге проверять те же конкретные переходы, Back/Forward, восстановление прямой ссылки, пустые состояния, активный поток без запросов, запись без речи, отсутствующий backend и неизвестные метрики. Изменение компоновки само по себе не объявлять ускорением: возможное сокращение запросов и DOM нужно измерять отдельно.

Дополнительные снимки: сессия, активная сессия, живой поток, служебная операция, каталог, таблица записей.

Исходник

Скачать Markdown · К материалам исследования