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

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

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

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

В main присутствуют единый run_js, один реестр DOM, ограниченный dom.find, удаление прежних PageTools/DomCommands и чтения результатов инструментов между вопросами. Это не новые результаты. Детали: предыдущий аудит.

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

Участок Доказанный излишек Изменение и проверка
Каталог 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 и активация расширения фиксируются отдельно в итоговом отчёте; локальная сборка их не доказывает.

Исходник

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