# Общий аудит и упрощение Chat Agent

Исходная задача восстановлена из чата «chat-agent sound simplified», согласованный
план от 28.10: отдельная очистка приложения, расширения, Monitor, БД, тестов,
зависимостей и CI после внедрения `run_js`. Основа этой итерации — `a1bfae91`.
Один writer, изолированный checkout; dirty основная копия сохранена.

## Уже выполнено до этой итерации

В `main` присутствуют единый `run_js`, один реестр DOM, ограниченный `dom.find`,
удаление прежних PageTools/DomCommands и чтения результатов инструментов между
вопросами. Это не новые результаты. Детали: [предыдущий аудит](</experiments/voice-ai/archive/w/DOCS/RUN_JS_AUDIT_2026-10-28.md>).

## Новые изменения

| Участок | Доказанный излишек | Изменение и проверка |
|---|---|---|
| Каталог Monitor | Отдельный `count(*)` на каждую таблицу | Один `UNION ALL`, параметры окна/имён и quoting идентификаторов; сохранены динамические таблицы, NULL дат, OR по датам и счётчики. PostgreSQL regression проверяет имя с кавычкой, view и не-timestamptz поля |
| TrafficStore | Повтор одного `event_id` не пишет строку, но снова уведомляет клиентов | Уведомление только после `INSERT 0 1`; без дополнительного SQL. Дубль не создаёт повторное обновление Monitor, новый event по-прежнему уведомляет |
| Ручной Form Collector | Сначала материализовал все элементы, затем применял `maxFields` | Использует существующий ленивый walker. Сам collector сохраняет владение обходом frames/shadow, метаданные и порядок; тест на 5000 хвостовых элементов, стабильные ссылки, frames и element-root |
| Пагинация `dom.find` | Повторно собирала полные метаданные пропускаемых элементов каждой страницы | Без текстового фильтра метаданные читаются только для возвращаемой страницы. Текстовый фильтр по-прежнему проверяется до пагинации; отдельный тест проверяет оба случая |
| Monitor JSON | Невостребованные `messageText` и его helper | Удалены после поиска импортов/вызовов. `jsonView` сохраняет точные числовые литералы и безопасный показ JSON |
| Front/расширение | Четыре неиспользуемых поля экземпляров, устаревший `embedded`, лишние локальные привязки/параметры | Удалены; побочные действия и вызовы сохранены. TypeScript с `noUnusedLocals/noUnusedParameters` проходит |
| Audio Ingress | Две одинаковые ветки закрытия/повторного выброса исключения | Отдельная ветка `AudioFailure` удалена: её полностью покрывает существующий `BaseException`, включая отмену; действующий browser-media тест |
| BatchCapture | Неиспользуемый импорт `time` | Удалён. Модуль использует Audio Ingress; batch/media тесты сохранены |
| Входная документация | README/quickstart/inventory предлагали удалённые Ruby и WebRTC компоненты | Сокращены и сверены с текущими source/Compose/DRS. Датированные отчёты C1–C4 и Trickle ICE сохранены как история |
| Описание таблиц | Каталог называл пакеты только PCM и обещал старый кэш инструментов | Указаны PCM/Opus и фактическое назначение `widget_cache` |

Расширение получает patch-пакет 2.4.1; ID, разрешения и CSP сохраняются.
Front использует общий код расширения; поставляемые потребители — Gateway,
Audio Ingress и Front. ASR worker, веса, алгоритмы, GPU, внешние сервисы,
инфраструктура и корневой CI не меняются.

## Все таблицы: владельцы и решение

Проверены схемы и SQL-потребители, включая динамический Monitor. Идентификаторы
session/context/client/request/tool_call не объединяются: они задают разные границы владения.

| Таблица | Реальные потребители / зачем сохраняется |
|---|---|
| `audio_recordings` | AudioStore, Monitor, проигрывание и replay: формат, настройки, полнота и владелец |
| `audio_chunks` | AudioStore/AudioReader: PCM либо принятые Opus-пакеты, координаты, байты и хеши |
| `audio_phrases` | AudioStore/Monitor/replay: границы фразы, результат, request ID и подтверждение отображения |
| `audio_recording_events` | AudioStore/проекция Monitor: настройки, клиентские наблюдения и ещё не привязанные receipts |
| `nats_log` | TrafficStore, Monitor и история Agent: передачи, фактические входы/выходы, связи `payload_ref` |
| `widget_cache` | WidgetStore/Agent: каталог страницы по `(session_id,context_id)`; старый `results` текущий Agent не читает |
| `browser_command_receipts` | WidgetStore, AviationStore, ChatNotes: идемпотентность, завершение и неизвестный результат |
| `browser_access` | BrowserApi/bootstrap/auth/maintain: клиент, session, профиль и сроки доступа |
| `browser_connect_tickets` | BrowserApi.redeem/maintain: одноразовые билеты подключения |
| `chat_agent_owner` | Database/Agent recovery: эпоха и fencing единственного владельца |
| `chat_notes` | ChatNotes/UI: текст заметки и optimistic version |
| `aviation_demo` | AviationStore/карта: каталог аэропортов и revision |
| `aviation_positions` | AviationStore/карта: положение и revision по сессии |
| `aviation_plans` | AviationStore/Agent: сохранённые планы и revision |
| `aviation_weather` | AviationStore/weather: последние данные, попытка обновления и ошибка |
| `spatial_ref_sys` | PostGIS: системные определения координат; не мусор приложения |

Новые таблицы, поля, индексы, кэши, фоновые задачи и второй граф не добавлены.
Накопленные данные не удалены. Триггер `chat_agent_touch_times` меняет timestamp
при фактическом изменении; его удаление нарушит фильтры Monitor.
Индексы нельзя объявить бесполезными без production-планов и статистики использования.
Чтение полной истории и архивные проекции не упрощаются временной близостью: это потеряет
достоверную принадлежность фраз и изоляцию запросов.

## Проверенные кандидаты, оставленные в коде

- Repowise: `domain_api`, его `start/stop` и `browser_api.start/stop` вызываются
  через модуль из lifespan. VAD worker создаётся через Worker URL. Weather/archive
  probes вызываются delivery-скриптами. Статический `in_degree=0` не доказывает ненужность.
- Повторная инициализация timestamp-схемы Agent/Gateway: таблицы создаются в разном
  порядке. Простое удаление вызова оставит поздние таблицы без дат/триггеров.
  Изменение требует отдельного решения владельца схемы; новый менеджер миграций не вводится.
- Manifest, хеши и receipts обеспечивают полноту архива, точный replay и защиту от
  повторного действия. PCM-совместимость и исторические streaming-данные используются.
- `FairPool`, budgets, deadlines, cancellation и ограниченные буферы сохраняют
  изоляцию сессий и предельную память; объединять их только ради числа строк нельзя.
- Прямые frontend dependencies имеют потребителей: ONNX/Silero, libsamplerate,
  MCP client/server, NATS, MapLibre, Buffer и MarkdownIt. Python runtime/telemetry
  зависимости используются приложениями и startup; зависимость не удаляется по отсутствию
  текстового совпадения имени package. Зависимости и lock-файлы не меняются.
- Корневой CI и manual release jobs имеют штатных/recovery потребителей.
  CI не упрощается обходом gates; generated OpenWiki не редактируется вручную.

Отдельный кандидат на согласование удаления данных — физический `widget_cache.results`:
прикладное чтение уже удалено, но старые значения доступны в Monitor. Здесь колонка
и значения сохранены. Массовая очистка `nats_log`/архива не является оптимизацией кода.

## Адресные проверки и измерение

- Front: 96 тестов в 7 затронутых файлах; типизация с дополнительным поиском
  неиспользуемых переменных/параметров. Сборки Front и ZIP расширения прошли.
  После исправления ссылки на исходник и оптимизации пагинации — 56 адресных
  тестов DOM/run_js/аудиодиагностики; общий CI выполняется штатным отбором.
- PostgreSQL 16: 12 тестов WidgetStore/catalog и TrafficStore, включая повторную
  доставку, точные счётчики и сохранение старых `results`.
- Python: 20 browser batch/media/Monitor тестов. Ruff F401/F841 по всем шести
  Python-областям проходит без находок. Недостающие зависимости тестового venv
  установлены отдельно от репозитория; runtime pins не менялись.

Каталог: отдельная PostgreSQL, 16 таблиц (15 приложения и недатированная fixture),
10 000 синтетических событий, 3 прогрева и 20 учитываемых пар с чередованием порядка.
Все 23 пары ответов совпали, кроме отдельно исправленных описаний, нормализованных
одинаково перед сравнением. BEGIN/SET/COMMIT одинаковы и в число SQL не включены.

| Показатель | До | После |
|---|---:|---:|
| SQL | 17 | 3 |
| Медиана | 4,136 мс | 2,590 мс |
| p95 nearest rank, n=20 | 5,487 мс | 2,982 мс |
| Ошибки / несовпадения | 0 | 0 |

Это локальная проверка, не production p95 и не ускорение ASR/модели.
Сырые результаты и разовый benchmark сохранены в артефактах текущей задачи вне
поставляемого кода. CI/образы, фактический rollout и активация расширения фиксируются
отдельно в итоговом отчёте; локальная сборка их не доказывает.
