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

run_js: отдельный аудит упрощения

Снимок аудита: 28–29.10.2026. Обновлённая основа — 7032f4aa. Поставленные другим чатом Silero/batch и расширение 2.0.0 сохранены; их удаления не входят в наши результаты. Изменения выполняются в codex/chat-agent-run-js, отдельно от параллельной аудиоработы. Это промежуточный отчёт по исходникам и локальным проверкам, а не подтверждение поставки run_js.

Метод и границы

Проверены исходники приложения, расширения, Monitor, SQL-схема, регистрации команд, тесты, зависимости и ссылки из CI/Compose. 29.10 построен отдельный структурный индекс Repowise 0.55.0 этого checkout (без LLM, editor setup и hooks); использованы overview, context, risk и dead_code через MCP данного каталога. Выводы сверены с исходниками. Отсутствие статического вызова само по себе не использовалось как основание для удаления.

В рабочем Monitor 28.10.2026 в 14:20–14:21 UTC прочитан каталог из 16 таблиц и заголовки 127 столбцов. Имена и типы полей 15 прикладных таблиц совпали с локально созданной схемой. Шестнадцатая таблица — системная spatial_ref_sys PostGIS; она не является мусором приложения. Пользовательские строки в отчёт и fixtures не копировались.

Индексы и триггеры перечислены по исходникам и проверены на отдельной PostgreSQL 16. Их фактический состав и статистика использования в production через интерфейс Monitor не доступны; отсутствие production-обращений к индексу здесь не утверждается. Накопленные данные, таблицы, поля, индексы и триггеры не удаляются.

Перечень кандидатов и решений

Кандидат Назначение и потребители Стоимость / риск Решение и проверка
Метаданные столбцов каталога Monitor src_api_gateway/monitor.py, действие catalog; UI «Все таблицы» Один полный запрос метаданных на каждую таблицу, хотя нужны только два временных столбца Реализовано: один общий запрос нужных имён. Состав таблиц, даты, описания и счётчики сохранены; парный benchmark и PostgreSQL regression test
Database.fetchrow, fetch, transaction Обёртка Agent src_agent/utils/db.py; реальные владельцы используют _pool, execute, fetchval и fencing Три невостребованных метода поверх asyncpg Удалено: поиском проверены класс, импорты и его потребители; owner recovery integration прошёл
docker/cpp/Dockerfile, docker/whisper/Dockerfile Ссылались на уже отсутствующие src_whisper_c и src_whisper.main Два неиспользуемых рецепта сборки Удалено: CI, build labels и оба Compose не используют эти Dockerfile; действующие ASR Dockerfile сохранены
Девять неиспользуемых имён import Восемь файлов Agent/Core/Gateway/LLM/shared Мёртвые локальные имена; удаление публичных re-export было бы регрессией Удалены только локальные имена: реэкспорты контрактов сохранены; Python suite и проверки frontend-ссылок на исходники
NatsPublisher в LLM Нет импортов или динамической регистрации; действующий NatsLogger использует to_json_safe напрямую Неиспользуемая обёртка отправки, 17 строк Удалён файл, общий to_json_safe сохранён
audioTrackFields, readAsrBackend, aviation.distance Нет локальных/межмодульных вызовов; настройки микрофона, выбор модели и geodesy имеют действующих владельцев Три невостребованные функции Удалены; алгоритмы ASR и геодезии сохранены
voiceLabels, FORMS_ORIGIN Используются внутри своих модулей, не импортируются снаружи Лишние export Сделаны локальными, значения и проверки origin сохранены
Кандидаты Repowise с непрямыми входами Gateway domain_api/browser_api, VAD worker, release probes Статический граф пропускает module import, Worker URL и передачу файла в контейнер Сохранены: startup/shutdown main.py; BrowserVad Worker; chat_nats_release.rb:448; preflight.sh:24
Два реестра DOM-целей form-collector.js и domCommands.ts Повторные ссылки/обходы; разные условия жизненного цикла Реализовано: один реестр collector, максимум 1000 ссылок; прежние ref не переназначаются другим узлам
Полный обход collector Формы, ручной сбор, input_list Полный список до ограничения ответа Реализовано: ленивый поиск останавливается после порции + одного совпадения; ручной сбор ограничен общим реестром и сообщает о неполном результате
Два пути выполнения инструментов content.ts напрямую вызывает PageTools, отдельные команды используют LocalMcp Дублирование ошибок, trace и жизненного цикла Реализовано: один LocalMcp/run_js; удалены PageTools, DomCommands и их отдельный реестр
Результаты между вопросами widget_cache.results, WidgetStore.cache_result, Agent instructions Чтение и запись результатов старых read-tools Реализовано в исходниках: удалены cache_result, PageCachePart, обновление кэша в истории и его пересылка Core. Запрос читает только каталог. Физический столбец и старые данные сохранены
Повторная инициализация timestamp-схемы WidgetStore.initialize из Gateway и Agent; monitor_schema.initialize Повторные DDL, lock, проверка таблиц, пересоздание триггеров Отложено: порядок создания таблиц различается; простое удаление одного вызова оставит часть новых таблиц без временных полей. Нужна отдельная проверка владельца миграции
chat_agent_touch_times 11 прикладных таблиц, фильтр «Изменения» в Monitor JSON-сравнение строк при UPDATE Сохранён: отличает фактическое изменение от повторной записи, не выдумывает даты старых строк
monitor_*_updated_idx Интервал created_at OR updated_at, в том числе динамический Monitor Дополнительные записи в индекс Не удалять без plan/statistics: малый размер fixture не доказывает ненужность индекса на production
audio_recordings.id / stream_id Текущее хранение и внешний аудиопротокол Исторический кандидат на дублирование Уже упрощено до нашей работы: физического stream_id в таблице нет; повторно это улучшение не засчитывается
manifest / pending_receipt Независимая проверка браузерных блоков и позднее подтверждение фразы Промежуточные строки Уже очищаются текущим AudioStore: после применения и при инициализации. Защиту независимых хешей не удалять
История и события перед пагинацией TrafficStore.history, monitor_requests, monitor_details SQL агрегации большой сессии; полная предзагрузка в браузер не нужна Сохранено: page/limit применяется в SQL. Рекурсивная привязка события к запросу нужна для причинной цепочки; нельзя заменять её совпадением времени
Очереди, timeout, owner и квитанции execution, Agent owner, browser receipts, аудиодопуск Ограничивают RAM и повторное исполнение Сохранены: это работающие защиты, а не лишние состояния
Frontend-зависимости MCP, NATS, markdown, MapLibre, buffer, ONNX и resampler имеют реальные импорты Удаление ломает чат, карту либо новый аудиопуть Сохранены: аудиозависимости принадлежат параллельной работе
Python-зависимости HTTP/NATS, Pydantic AI, telemetry, токенизация и архив Возможны транзитивные потребители, в том числе корпоративный otel Не удалены по одному grep: отсутствие прямого импорта не доказывает отсутствие runtime-зависимости
Старые ручные release/retirement jobs Штатные delivery scripts, проверки и runbooks Потенциально устаревшие сценарии Сохранены: текущая параллельная поставка использует release-контур. Удалять без проверки всех процедур восстановления нельзя

Проверка схемы и владельцев

Идентификаторы ниже принадлежат разным границам: session_id — общая история, context_id — конкретная страница, client_id — подключение, request_id — вопрос, tool_call_id — инструмент. Их объединение потеряет изоляцию вкладок или защиту повторной доставки.

Таблица Запись / чтение и причина сохранения
audio_recordings AudioStore, архив/список потоков/replay; параметры и состояние полной записи
audio_chunks AudioStore, порционное чтение PCM/waveform/экспорт; неизменяемые блоки и проверка manifest/hash
audio_phrases AudioStore, запросы/диагностика/receipt; границы и сопоставление запроса с исходной фразой
audio_recording_events AudioStore, журнал записи; параметры, события и неприменённые подтверждения
nats_log TrafficStore, Monitor, read-only проекция общей истории; payload_ref предотвращает дублирование тела
widget_cache WidgetStore, регистрация каталога; старый results больше не читается приложением; ключ (session_id, context_id) необходим
browser_command_receipts WidgetStore/AviationStore/ChatNotes; идемпотентность, результат и статус запроса
browser_access BrowserApi/bootstrap/auth/maintain; сроки транспорта и lease решают разные задачи
browser_connect_tickets BrowserApi.redeem/maintain; одноразовые билеты, просроченные очищаются
chat_agent_owner Database/Agent и owner recovery; эпоха единственного владельца
chat_notes ChatNotes и пользовательская заметка; текст и version защищают от потери обновления
aviation_demo AviationStore, карта/справочник; общий каталог с revision
aviation_positions AviationStore, карта/действия; положение и revision по сессии
aviation_plans AviationStore, план по (session_id,name); optimistic revision
aviation_weather AviationStore, карта/погода; успешные данные, последняя попытка и её ошибка различаются
spatial_ref_sys Системная таблица PostGIS; отдельный владелец схемы

Все поля доступны также через динамический Monitor. Это дополнительный потребитель, но не самостоятельное доказательство полезности любого поля: для удаления нужен разбор прикладного назначения и накопленных данных. Такого доказанного удаления на этом этапе нет.

Измерение каталога Monitor

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

Метрика Было Стало Разница Изменение
SQL на каталог 32 17 −15 −46,88%
Медиана 9,8115 мс 5,063 мс −4,7485 мс −48,40%
p95, nearest rank, n=20 11,261 мс 5,630 мс −5,631 мс −50,00%
Ошибки 0 0 0 —

Это локальное измерение. Время открытия страницы production, CPU, память, ASR, LLM-токены и размер production-БД этим экспериментом не измерялись. Данные не удалены, будущая запись аудио не изменена. Удаление строк кода не объявляется ускорением.

Воспроизводимый скрипт, исходный модуль до изменения и сырые 20 результатов находятся в локальном evidence-каталоге run-js-p0-20261028 рядом с изолированной страницей P0.

Проверки и граница поставки

  • Native P0 PASS в основном Chat Agent 2.1.0: Chrome USER_SCRIPT, Promise, строгий JSON и точный документ при CSP тестовой страницы без unsafe-eval.
  • Коммит совместимости 0b8ed121: пять обязательных checks pipeline 5500 PASS; backend job 26343 PASS, проверены revisions/digests пяти адресных сервисов.
  • Удаление временной совместимости проверено локально: 28 Python/PG tests + 2 subtests; 43 frontend tests истории, панели и source links; 10 DOM runtime tests, включая общий предел реестра. Исторические результаты в PostgreSQL не изменяются.
  • Полный модельный сценарий и поставка окончательного SHA фиксируются отдельным итоговым отчётом после обновления основного пакета в Chrome.
  • По просьбе владельца от 29.10 ручные проверки сокращены до необходимого пути run_js; микрофон не проверяется. Соседняя Silero/audio работа сохранена.

Новые сервисы, NATS-соединения, таблицы, зависимости и отдельные хранилища не добавлены. Старые результаты остаются доступны динамическому Monitor. Физическое удаление столбца results и накопленных значений требует отдельного согласования.

Исходник

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