# run_js и упрощение chat-agent — 29 октября 2026

Рабочая основа: `7032f4aa`. Итоговый исходный код: `f87b428d1c1036db5051d420e97041cc1f85e3da`.
Работа выполнена одним writer в `codex/chat-agent-run-js`. Независимые изменения Silero/batch и основной пользовательский checkout сохранены.
Версия основного расширения — **2.1.0**: после согласования исходного плана соседняя работа уже выпустила 2.0.0, поэтому номер 1.10.0 не использован.

## Что реализовано

- Один публичный инструмент страницы `run_js({code})`; локальные `message/cancel` сохранены. Существующая доставка Agent → LocalMcp → Background → USER_SCRIPT, без нового сервиса или NATS-соединения.
- `dom.find/get/set/act` используют один collector и один ограниченный реестр. Сохранены формы, native setters, constraints, SEO, фон, текст, click/scroll, ручной сбор, доступные iframe и open/closed Shadow DOM.
- Исполнение привязано к точному документу и владельцу. Сохранены дедупликация, отмена и бюджеты; неизвестный исход блокирует следующий запуск до перезагрузки документа.
- Строгий JSON проверяется до сериализации Chrome. Код/результат раскрываются в панели; история и Monitor не исполняют сохранённый код.
- Удалены прежние PageTools, DomCommands, отдельный реестр, серверные read-tool cache ветки. Между независимыми вопросами результаты инструментов не пересылаются и не обновляются в кэше.
- Отдельный аудит охватил приложение, расширение, Monitor, SQL, тесты, зависимости и CI. Выполнены доказанные небольшие удаления и пакетное чтение метаданных каталога.

Полный перечень кандидатов, потребителей и причин сохранения находится в [аудите](#archive-availability). Авторитетные файлы исходников: `DOCS/RUN_JS.md` и `DOCS/RUN_JS_AUDIT_2026-10-28.md` итогового SHA.

## Проверки

| Этап / сценарий | Результат и граница доказательства |
|---|---|
| P0: основной Chrome, USER_SCRIPT, Promise, точный документ, CSP | PASS; разрешение включено пользователем, основной пакет, не вспомогательный P0 |
| P1: реальная модель меняет h1 и читает результат | PASS; запрос `f30a0703-0dd1-42cc-b47e-a459898479a7`, три run_js: find → set → get. «Исходный заголовок» → «run_js работает», document.title и поля не изменены |
| P2: обычный DOM, open/closed Shadow DOM, доступный iframe | PASS в основном Chrome; запрос `33497771-95b0-4674-af79-e96dd63e1aea`, найдены и прочитаны все четыре пустых поля; записи не было |
| P2: строгий JSON, дубликаты, контекст, timeout/cancel, restart marker | PASS автоматических тестов исполнителя; это не отдельные ручные прогоны каждого отказа Chrome |
| P2: native setters, constraints, предварительная проверка пакета, частичный результат, ленивый поиск, реестр | PASS автоматических тестов DOM runtime и сохранённых collector tests |
| P3: новый каталог, причинные связи событий, запись истории, без старого results в Core-конверте | PASS: 21 адресный интеграционный тест на отдельных NATS и PostgreSQL 16 |
| Пять обязательных CI checks итогового SHA | PASS — pipeline 5504; Python 229 passed + 8 subtests / 107 skipped в этой job; отдельно прошёл интеграционный контур. Frontend: 467 tests / 64 files; browser NATS, Ruby, dialog integration — PASS |
| Итоговая адресная поставка | PASS; backend job 26547, Frontend job 26551, все шесть сервисов на `f87b428d` |
| Живой запрос после окончательной поставки | PASS; `f5b3f130-d1b6-4a1a-b45c-a7d8776420f1`: один run_js объединяет find и несколько get, возвращает JSON-объект с верными h1/title |
| Monitor после поставки | PASS; открывает новый запрос и сохранённую цепочку прежнего изменения h1: все 97 наблюдений, model call → run_js → result → final |

Цепочки фактических вызовов и ID: [native-checks.json](</experiments/voice-ai/archive/v/10/29/run-js-main/native-checks.json>).
По последней просьбе владельца живые проверки ограничены необходимыми сценариями run_js. Микрофон и физическая речь не проверялись. Полный набор T01–T70 не объявляется прошедшим вручную.

## Измерения

Одинаковые синтетические данные: PostgreSQL 16, 16 таблиц, 10 000 событий; один процесс/pool, 3 прогрева и 20 чередующихся учитываемых повторов. Старый модуль benchmark побайтно совпадает с `7032f4aa:src_api_gateway/monitor.py`. Ответы совпали во всех 23 парах.

| Метрика каталога Monitor | Было → стало | Абсолютная разница | Изменение |
|---|---:|---:|---:|
| 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 Monitor или модели. Производственные CPU/RAM, сетевой объём, размер БД, LLM-токены, задержки ASR и физическая речь повторно не измерялись. Для изменения произвольного h1 старый специализированный каталог не предоставлял аналогичной команды. Ускорение LLM-цикла не заявляется: в проверке h1 модель выбрала три вызова, хотя API допускает их объединение в одном скрипте.

Сокращение интерфейса: модельные инструменты **5 → 1** (−4, −80%); локальные команды **10 → 3** (−7, −70%); реестры DOM-ссылок **2 → 1** (−1, −50%). Это структурные показатели, не замеры скорости.

## Код и сущности

Подсчёт `git diff --numstat 7032f4aa HEAD`, без vendor/generated/build артефактов; [машинный отчёт](</experiments/voice-ai/archive/v/10/29/run-js-main/code-delta.json>).

| Область | Добавлено | Удалено | Чистое изменение |
|---|---:|---:|---:|
| Реализация | 684 | 607 | +77 |
| Тесты | 447 | 531 | −84 |
| Документация | 234 | 8 | +226 |

Удалены семь файлов: три заменённых слоя DOM (`domCommands.ts`, `fieldProjection.ts`, `pageTools.ts`), прежние тесты PageTools, неиспользуемый `NatsPublisher` и два Dockerfile для отсутствующих старых компонентов.

Дополнительно удалены три неиспользуемых метода Database, три невостребованные функции, лишние локальные импорты; два экспорта сделаны локальными. Старый серверный путь cache_result/PageCachePart и его передача между вопросами удалены. Существующие динамические входы, реэкспорты, очереди, owner/receipt-защиты и ASR сохранены после проверки потребителей.

Таблицы, поля, индексы, триггеры, зависимости и накопленные данные **не удалялись**. `widget_cache.results` физически сохранён. Повторная подготовка timestamp-схемы отложена до отдельного решения о владельце миграции. Новых таблиц, сервисов, библиотек и постоянных журналов нет.

## Поставка

Итоговый pipeline: [5504](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/5504>).

Пять обязательных jobs: Python [26501](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26501>), browser NATS [26502](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26502>), frontend [26503](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26503>), Ruby [26504](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26504>), dialog integration [26505](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26505>). Все PASS; машинный снимок — [ci-checks.json](</experiments/voice-ai/archive/v/10/29/run-js-main/ci-checks.json>).

Сборка шести адресных приложений [26521](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26521>) и preflight [26524](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26524>) — PASS. PostgreSQL, DNS, SSH и stack-файлы не менялись.

Локальный [пакет Chat Agent 2.1.0](#archive-availability) проверен: все 25 файлов архива побайтно совпадают с установленным каталогом `локальный источник ID `dbcdiabfkimnhbkkhkikgfapnabifmjf`, Chrome 138+, согласованное разрешение userScripts. SHA-256 ZIP: `1a176f1ca4fe22e6ad538e634d60a63f5f21a2d4b421362a95a39c1e9da5997d`. [Проверка пакета](</experiments/voice-ai/archive/v/10/29/run-js-main/package-verification.json>).

**BLOCKED — публикация ZIP:** штатная [job 26507](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26507>) успешно собрала пакет, но загрузка артефакта в GitLab завершилась ошибкой `lookup gitlab on 172.17.0.1:53: server misbehaving`. Точный штатный [повтор 26552](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26552>) дал ту же ошибку после успешной сборки. Инфраструктура не перенастраивалась. В GitLab ZIP не опубликован; доступен локальный проверенный пакет выше. GitLab показывает общий статус pipeline `manual`; пять обязательных checks и адресные deployment jobs прошли, а публикация ZIP осталась неуспешной.

**PASS — runtime:** [backend 26547](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26547>) завершён 28.10.2026 23:07:47 UTC; [Frontend 26551](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/26551>) — 23:09:17 UTC. Это адресное обновление приложений, без полного stack deploy. Штатный release проверяет точный OCI revision, фактический Image контейнера, одну реплику, завершённый UpdateStatus, Running/healthy и сохранность остальных service specs; приём Core восстановлен. Полные имена образов, SHA и времена jobs: [runtime-evidence.json](</experiments/voice-ai/archive/v/10/29/run-js-main/runtime-evidence.json>).

Все строки ниже относятся к `f87b428d1c1036db5051d420e97041cc1f85e3da`; версия приложения взята из `.version` этого проверенного исходного SHA.

| Сервис | Версия | Проверенный digest | Runtime |
|---|---:|---|---|
| API Gateway | 9.0 | `sha256:35364f17bfc99e602640d523477dd7b0412e79a51ce20ccd74ed3a91ced4b110` | PASS |
| LLM | 5.0 | `sha256:bb2a73c351d3b388c8f90c84b24dae8cd767d906e1a4f0cf5be77fb5cf314d9a` | PASS |
| Audio WS ingress | 5.0 | `sha256:b60814c421d835434b09576e5691202effa34c837f6c83aad50cafb046663fdb` | PASS |
| Agent | 9.0 | `sha256:3e5b420557e658e062237e2bf6e932842fa958d1f836b4ca568666e415b1217b` | PASS |
| Core | 10.0 | `sha256:9fb4a3ca4f86b59ff804fdf184db96e2466cc51744ebd4109b8d67b8734f6427` | PASS |
| Frontend | 7.1 | `sha256:bdce54497566701710c2b2cdc91f2208f8037ac536669b5a91992f8c1fad196f` | PASS |

После обновления открытая панель получила ожидаемый timeout выдачи доступа во время паузы приёма. Кнопка «Повторить» восстановила соединение. Новый запрос через окончательный backend завершился успешно: Monitor показывает 3,54 с серверного времени, 3,11 с удалённых вызовов модели и 3,69 с до показа в панели. Это одиночное контрольное наблюдение, не сравнение производительности с предыдущим запросом.

Временные локальные NATS/PostgreSQL с вымышленными fixtures остановлены. Основной пакет перезагружен пользователем и проверен; новых файлов для повторной перезагрузки после этой проверки не добавлялось.

## Ограничения

- Кросс-доменные iframe остаются отдельной задачей; доступные iframe проверены.
- Тайм-аут/отмена прекращают ожидание и следующие шаги Agent; уже выполняющийся произвольный JS и сделанные изменения не откатываются автоматически.
- Обновление Chrome и новые разрешения выполнил пользователь. Основной ID и путь установки сохранены.
- Автоматические и живые проверки указаны раздельно; запуск каждой из 70 проверок в реальном Chrome не заявляется.
