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. Единые правила навигации
- Ссылка на сессию всегда открывает её общий экран: активные и сохранённые потоки сверху, запросы ниже.
- Ссылка на запрос всегда открывает обзор запроса. Ссылка «Аудио» явно открывает его фразу; ссылка на событие — выполнение с выделенным событием.
- Один поток имеет один экран. Переходы из сессии и запроса используют его; связь «Вернуться к запросу» видна отдельно. Поток не становится дочерним объектом одного запроса: он может содержать несколько запросов.
- В потоке сохраняются «Вживую», «События», «Исходная запись». «Сообщения» ведут в общий список с фильтром потока, пока не потеряв ни одной архивной фразы.
- Для запроса достаточно «Обзор / Выполнение / Аудио». В «Выполнение» — переключатель дорожек и списка событий. Связанный поток показан явной ссылкой возле контекста запроса.
- URL хранит выбор объекта и представления. Back/Forward и прямые ссылки восстанавливают экран, фильтры и страницу. Явный клик по сессии не равен восстановлению её текущего дочернего экрана.
- При смене сессии очищаются чужие request/stream/recording/event ID. Поздний ответ старого экрана не меняет новый.
- Старые ссылки переводятся в соответствующие новые представления. Ссылки на аудио без распознанных сообщений сохраняют доступ к записи.
- «Все таблицы» остаётся глобальным разделом вне дерева конкретной сессии. В ячейках доказанных связей
session_id,request_id, ID записи можно добавить ссылки на те же канонические экраны. Не угадывать тип любого UUID.
5. Что оставить отдельным
- События запроса, события потока и события replay: разные области данных. Можно переиспользовать компонент просмотра, сохраняя область и источник каждого наблюдения.
- Исходный ASR и диагностический повтор: разные запуски, не дубли результатов.
- Наблюдения отправки и получения: нужны для проверки доставки; совпадающее содержимое не означает лишнее событие.
- Длительность соединения, сохранённого PCM, фразы и выполнения запроса: разные величины. Например, у проверенного потока показано 11.685 с соединения и 10.432 с PCM, у фразы — 1.768 с.
- «Все таблицы»: это текущие значения БД, а не журнал выполнения. Общая оболочка и связанные ссылки нужны, слияние с рабочим экраном — нет.
6. Порядок реализации
- Перенести верхние формы в левую колонку. Проверить плотность, внутреннюю прокрутку, ошибки поиска и фильтров, светлую тему и ширину 390 px.
- Исправить канонические переходы сессии, исходной записи и кнопки «Все сообщения»; поправить исторический backend. Использовать существующий роутинг и функции построения URL, без нового навигационного слоя.
- Добавить компактные ссылки выбранной сессии. Убрать повтор User-Agent и полных ID из дочерних заголовков. Обеспечить переходы из таблиц БД.
- Объединить представления выполнения и убрать повтор технического списка. Сохранить единственный просмотрщик подробностей события.
- Свести голосовые сообщения с запросами после проверки полноты объединения. Сохранить неподтверждённые и несопоставленные фразы.
- Собрать единое рабочее место аудио с исходной фразой и раскрываемой диагностикой; полную запись показывать у потока.
На каждом шаге проверять те же конкретные переходы, Back/Forward, восстановление прямой ссылки, пустые состояния, активный поток без запросов, запись без речи, отсутствующий backend и неизвестные метрики. Изменение компоновки само по себе не объявлять ускорением: возможное сокращение запросов и DOM нужно измерять отдельно.
Дополнительные снимки: сессия, активная сессия, живой поток, служебная операция, каталог, таблица записей.