# 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](#archive-availability): пользовательский клик и восстановление URL используют один обработчик. [exchanges.ts:204](#archive-availability): дочерний выбор очищается только при смене `session_id`.
- [navigation.ts:17](#archive-availability): breadcrumb сессии всегда убирает дочерние идентификаторы.
- [audioArchive.ts:57](#archive-availability), [audioArchive.ts:89](#archive-availability): переход обновляет вложенную область, оставляя оболочку потока.
- [audioStreams.ts:80](#archive-availability): исторический backend и назначение ссылки на исходную запись.
- Снимки: [сообщения потока](#archive-availability), [все сообщения под прежним заголовком потока](#archive-availability), [исходная запись](#archive-availability).

## 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](#archive-availability), [audio_messages.py:108](#archive-availability).
- [requests.ts:149](#archive-availability), [sessionSequence.ts:153](#archive-availability), [sessionSequence.ts:180](#archive-availability).
- [audioArchive.ts:120](#archive-availability).
- Снимки: [обзор](#archive-availability), [дорожки](#archive-availability), [события](#archive-availability), [аудио](#archive-availability), [диагностика](#archive-availability).

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

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

```text
┌ Левая колонка ──────────────────┐   Основная область
│ 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 нужно измерять отдельно.

Дополнительные снимки: [сессия](#archive-availability), [активная сессия](#archive-availability), [живой поток](#archive-availability), [служебная операция](#archive-availability), [каталог](#archive-availability), [таблица записей](#archive-availability).
