Chat Agent: план упрощения и полного удаления Core
Дата: 04.11.2026. Состояние: исследование и предложение, без изменения приложения.
Проверен remote main webrtc-komaroff: e6a8ee03ab3bc254124b45cd2566bfa471afa874. Для соседнего ASR проверены необходимые потребители: main b3e93c8b4b8250f626b42cd35fb8a92927ed559d. Рабочий источник — изолированный checkout asr-compare-timing. Основная пользовательская копия сохранена.
Цель — меньше кода, процессов, сетевых пересылок и вычислений при сохранении поведения. Изменение кода, CI, установленных пакетов и runtime сейчас не выполняется. Микрофон не запускался, запросов к моделям не было.
Вывод
Core можно полностью удалить как приложение и сервис. Его обязанности распределяются между уже существующими Gateway, Audio Ingress и Agent. Новый сервис вместо Core не нужен. Простое перемещение каталога или копирование его контроллера с сохранением всех RPC не решит задачу.
Одновременно есть независимо удаляемые остатки: старый waveform веб-чата, зависимость аудиоклиента от отсутствующего DOM, локальный токенизатор прежней модели и его загрузка при сборке. Для них подтверждены действующие вызывающие компоненты или отсутствие рабочего вызова.
Для остальных частей предпочтительны адресные упрощения. Удалять обработку отмены, ownership, повторов, Opus-границ и старых архивов ради числа строк нельзя.
Что именно проверено
Статическая инвентаризация охватывает 206 production-файлов, 21 855 физических строк и 2474 функций/методов/callbacks. В число функций входят вложенные функции и стрелочные callbacks; это не 2474 независимых возможностей продукта. CSS включён в число файлов и строк. Тесты, декларации типов и опубликованные презентации исключены из production-инвентаризации.
Python разобран через AST, TypeScript/JavaScript — парсером установленного TypeScript. Для каждой функции сохранены файл, строка, размер, вызовы и структурные ветвления. Это сплошная структурная проверка, не доказательство смысловой корректности каждой функции. Подробно по исходникам проверены аудиозахват, устройства, transport/batch, Core, replay, регистратор, Monitor, Agent/LLM и их потребители. Карта модулей явно отличает такой просмотр от одной структурной инвентаризации.
| Область | Файлы | Строки | Функции и callbacks |
|---|---|---|---|
| Расширение | 30 | 3427 | 639 |
| Front и общий UI | 75 | 7152 | 1264 |
| Gateway | 14 | 2898 | 114 |
| Audio Ingress | 6 | 837 | 48 |
| Core | 19 Python | 1496 | 75 |
| Agent | 9 | 902 | 44 |
| LLM gateway | 13 | 866 | 48 |
| Shared | 40 | 4277 | 242 |
Кроме 19 Python-файлов Core содержит requirements.txt, env.example, .dockerignore и .version: всего 23 tracked-файла в каталоге. 1496 строк — размер удаляемого Python-каталога до переноса необходимых обязанностей, а не обещанная чистая экономия.
Результат структурного анализа:
- Файлы и решения по модулям.
- Все функции и решения.
- Полный инвентарь с вызовами.
- Итоговые числа.
- Связи между компонентами.
Новых проверок поведения на production не выполнялось. Старые результаты CI и runtime не объявляются проверкой предложенной архитектуры. Замеров ускорения нет.
1. Waveform внизу панели
Подтверждено. Canvas находится в chat-area под историей, а log имеет непрозрачный фон. Форма ввода и footer находятся вне этой области. Поэтому перенос только цвета проблему не решает.
Источники: content.ts, panel.css, PanelWaveform.
Предлагаемый вид:
┌───────────────────────────────────────────┐
│ История чата │
├───────────────────────────────────────────┤
│ Введите сообщение… ➤ │
│ ▂▃▅▂▁▃▆▃▂ фон нижней области │
│ [🎙] Слушаю │
└───────────────────────────────────────────┘
- Переместить существующий canvas под нижнюю область ввода/голоса; элементы управления остаются сверху и доступны мыши/клавиатуре. Никаких дополнительных захватов или AudioContext.
- Waveform виден только при фактическом capturing и connected. При ожидании разрешения, выключении, ошибке, закрытии, сворачивании и скрытой вкладке — скрыт и очищен.
- Сохранить существующую проверку captureId/streamId: старый кадр не может появиться в новом захвате.
- Использовать токен темы, ограничить визуальную высоту примерно 48–64 px, не сдвигать историю и форму при включении. Учитывать reduced motion.
- Canvas уже перерисовывается по поступлению кадров. Дополнительный постоянный animation-loop не нужен. Сейчас backing buffer пересоздаётся при каждом draw; менять его размер только при изменении размеров/DPR.
2. Список микрофонов
Подтверждено. MicrophoneDevices.refresh обнаруживает missing, но оставляет выбранный ID. Panel.setDevices специально добавляет отсутствующий микрофон обратно пунктом «недоступен». deviceControls не учитывает пустой список. При devicechange каждый владелец панели отдельно вызывает enumerateDevices.
Источники: MicrophoneDevices, offscreen, панель.
Предлагаемое поведение:
| Состояние | Выбор и интерфейс |
|---|---|
| Выбранное устройство существует | Оставить выбор |
| Устройство исчезло, есть другое | Удалить отсутствующее, автоматически выбрать доступное и сохранить новый выбор |
| Устройств достоверно нет | Показать «Нет микрофонов», заблокировать selector и запуск захвата |
| Разрешение ещё не выдано | Показать действие выдачи разрешения; не называть это отсутствием оборудования |
| Разрешение запрещено | Показать причину и штатное действие настройки доступа |
| enumerateDevices завершился ошибкой | Явно показать ошибку обновления; не выдавать старый список за свежий и не записывать случайный default |
Автоматический выбор не включает ранее выключенный микрофон. Если исчез работающий источник, сначала завершить его захват. При восстановлении действующего намерения слушать новый физический источник получает новый capture/stream, явный статус и фактические настройки; нельзя незаметно сшивать два устройства в старую запись. Без доступного источника нет циклических попыток запуска.
Обновление списка можно выполнить один раз в offscreen и передать снимок владельцам. Выбор, блокировки и захват остаются раздельными для каждой панели. Ошибку NotReadable нельзя считать доказательством физического исчезновения: устройство может быть занято. NotFound/неподдерживаемый deviceId и свежий перечень обрабатываются отдельно.
Сохранить capture iframe. Он намеренно изолирует APM разных владельцев — NS/EC/AGC. Это не лишний транспортный слой: microphoneInput.ts.
3. Полное удаление Core
Текущие пути
Команда: клиент → Gateway → Core → Agent → LLM gateway → провайдер. Результат Agent возвращается через Gateway клиенту.
Аудио устроено иначе: Opus-пакеты идут через chat_nats непосредственно в Audio Ingress, без обработки каждого пакета Gateway. Gateway пересылает start/phrase/end/abort. Ingress обращается к Core за допуском и учётом ожидаемых фраз; Core получает результат ASR и публикует его Gateway.
ASR bridge и GPU worker остаются в соседнем проекте. Два NATS-брокера не объединяем.
Предлагаемые пути
Команда:
клиент → Gateway → Agent → LLM gateway → провайдер
клиент ← Gateway ← Agent
Речь:
клиент ── Opus ──> Audio Ingress ── готовая фраза ──> ASR bridge → GPU worker
клиент <── Gateway <── Audio Ingress <── результат ── ASR bridge ← GPU worker
Запись:
Audio Ingress → Gateway → существующий PostgreSQL
Это целевая схема, ещё не работающая поставка.
Владение обязанностями
| Сейчас в Core | Новый владелец и действие |
|---|---|
| browser_api: пересылка message/tool_result/cancel | Gateway напрямую вызывает существующий Agent endpoint; сохраняет профиль, владельца, каталоги и deadline |
| chat_draining, счётчик admission, неопределённый результат допуска | Gateway держит входной gate и его in-flight/uncertain state; Agent сохраняет собственный admission и durable receipts |
| 3 live + 1 replay, владение session/context/client | Audio Ingress, где уже живут реальные NatsAudio-владельцы; резервировать слот атомарно до await |
| Core lease token/epoch, heartbeat RPC | Удалить межпроцессную аренду после объединения владельца; проверки браузерного доступа, последовательностей и тайм-аутов сохранить |
| pending-фразы, queued/job_error/ending/ended | Локальный учёт Audio Ingress; окончание ждёт терминальные результаты/ошибку с прежним пределом |
| Единственный рабочий ASR-result listener | Перенести на существующее соединение Audio Ingress с ASR; не создавать дополнительный broker connection |
| asr_results / защита от повтора | Audio Ingress: claim до await, ограниченный ledger, проверенные session/stream/phrase и тот же request_id |
| Пересылка результата в панель | Audio Ingress публикует существующий asr_result; Gateway доставляет конкретному клиенту |
| Запись результата/наблюдений worker в архив и журнал | Из того же приёма результата в Ingress; бинарный звук в журнал не добавляется |
| ReplayAdmission, арбитраж единственного replay | Единственная replay-reservation в Ingress; Gateway остаётся владельцем чтения архива и подготовки replay |
| diagnostic_links | Gateway проверяет сохранённый receipt через имеющийся WidgetStore, затем ограниченно читает Phoenix |
| client_timings | Gateway принимает те же три разрешённых числовых измерения с прежними bounds/rate limit |
| Диагностический adapter между брокерами | Перенести два существующих ограниченных маршрута в Ingress, переиспользуя его соединения |
| lifecycle / readiness / drain probe | Gateway и Ingress сообщают своё реальное состояние; delivery проверяет также Agent/LLM, не ищет контейнер Core |
| EventBus / NatsLogger / NatsClient / startup boilerplate | Удалить Core-обёртки; использовать действующие публикацию, bounded queue и bootstrap новых владельцев |
Важные подробности:
- Допуск в Agent имеет отдельный 5-секундный deadline. После удаления Core его продолжает формировать Gateway. При тайм-ауте возвращается неопределённость, а не автоматический повтор действия.
- ASR-недоступность не должна останавливать текстовый чат. Readiness аудио проверяет фактическое соединение/подписку; текстовая готовность от них не зависит.
- Отдельный диагностический replay из архива сейчас подаётся Gateway прямо в batch ASR. Не перенаправлять его через лишнее PCM-кодирование/живой микрофон.
- Два adapter subjects реально нужны текущему ASR UI: chat.agent.health.agent и nats.llm.user123. Проверены вызывающие функции _check_agent_readiness и _check_llm_smoke в ASR diagnostics. Сохранить whitelist, deadline, no-tools для smoke, ограничения размера и независимость от рабочего ASR callback. Новый универсальный proxy не нужен.
- Live Monitor и подключаемая аудиодиагностика сейчас сами подписываются на ASR output. После переноса listener можно раздавать уже принятые сообщения этим локальным потребителям, убрав их повторные NATS-подписки. Диагностические audio_diagnostic сообщения отличать от бизнес-результата и проверять diagnostic_id.
- Старые Core-события и неизвестные отправители не переименовываются в Ingress. История должна оставаться правдивой.
Основные источники: AudioAdmission, Core browser API, BatchCapture, ReplayManager, Agent admission.
Что должно исчезнуть из проекта
- Каталог src_core целиком, docker/core/Dockerfile и его самостоятельные requirements/env.
- Service src_core в DRS, build context и depends_on в Compose/debug, конфигурация attach Core.
- chat.browser.core и chat.internal.core.lifecycle как действующие endpoint; Gateway больше не отправляет туда сообщения.
- chat.agent.audio.control как межпроцессный RPC; queued/heartbeat/ending заменены вызовами своего владельца.
- Core-позиции в build filters, readiness/preflight/release и текущих инструкциях.
- Импорты OTelBootstrap из приватного helpers SDK, если после переноса не останется иных потребителей в изменённом образе.
- Core-only тесты заменить проверками новых владельцев; не выбрасывать проверяемые ими инварианты.
Исторические имена в журнале, fixtures и явно исторических документах остаются. Внешние закрытые /core URL сейчас отвечают 410: сохранить этот небольшой tombstone, чтобы старый адрес не превратился в SPA fallback.
CI — отдельное необходимое изменение плана
Полное удаление не совместимо с буквальным сохранением всех текущих Core-строк корневого CI. Сейчас там явно указаны compileall src_core, tests.integration.test_core_bus_startup, build Core refresh и chat NATS refresh Core.
При реализации нужно согласованно удалить/перенаправить эти Core-задания, обновив вспомогательные build/release scripts. Не оставлять пустой Core, symlink или тест-пустышку ради зелёного pipeline. Это необходимая корректировка прежнего ограничения «корневой CI не менять», а не основание менять его сейчас.
Переключение владельца
- Подготовить совместимые Gateway/Ingress и адресные тесты, не включая второго владельца.
- Закрыть входной допуск и дождаться нуля активного live/replay, Agent/LLM и неопределённых admission. Чужие потоки самостоятельно не завершать.
- Выключить старый authoritative listener Core, затем включить нового владельца Ingress. Два активных result listener, выполняющих бизнес-доставку, недопустимы.
- Переключить Gateway на прямой Agent и новые lifecycle probes, убрать service Core из желаемого стека.
- Проверить отсутствие Core task/контейнера, маршрутов, образа в сборке и зависимостей. Одного удаления каталога недостаточно.
ASR_OUT_PREFIX и публикация UI-событий должны быть явно настроены у нового владельца. Корректно переживать замену/обрыв его ASR connection: новый listener привязывается к текущему broker, старый не остаётся активным. Опциональный диагностический consumer не становится вторым владельцем результата.
До будущего cutover сохранить прежние digest и конфигурацию. При откате держать gate закрытым, остановить нового владельца и восстановить согласованный комплект Gateway/Ingress/Core; нельзя просто включить Core рядом с новым listener. Старые registry-образы для отката не удалять.
Это изменение DRS-состава и shared runtime, поэтому при будущей реализации нужна отдельная доказательная поставка. Сейчас она не выполнялась.
4. Логирование, журнал и схема
Подтверждено: смысл и тип передачи вычисляются в src_shared/traffic.py, затем частично заново в monitor/exchangeModel.ts и extension/consoleLog.ts. Часть нового кода уже сохраняет purpose у producer; это направление нужно завершить.
План:
- Сохранить существующий Recorder, таблицу nats_log и общий SessionSequence. Нового event bus, графа, таблиц или подписок для истории не вводить.
- Для новой операции producer записывает точные source/target, тип, ID связи, purpose и время своих часов. UI выводит эти значения. Он не угадывает сервис по subject, русскому заголовку или наличию ok.
- Отправка и приём объединяются по явному transfer/parent ID. Подтверждение приёма, терминальный результат, повторная доставка и неизвестное завершение остаются разными состояниями.
- Старые contract-based разборы держать только в совместимости исторического чтения. Не переносить их в новый универсальный справочник бизнес-процесса.
- Journal и diagram получают одинаковый готовый список передач. Сохраняются нумерация, отступы по причинным связям, выбор стрелки, фильтры и боковые подробности. Временная близость не доказывает параллельность.
- PCM/Opus-пакеты показывать сводкой со ссылкой на существующие packet metadata архива. Аудио и полные manifests вторично не журналировать.
- Назначение локального этапа показывать внутри компонента. Если неизвестны отправка/получение/родитель — показывать пробел наблюдений, без дорисованного запроса.
- Потери диагностики и лимиты остаются явными. Сам регистратор ограничен памятью и не блокирует ASR/Agent.
Отдельный дефект описания: текущий tooltip Core говорит, что он владеет сессией; авторизация и browser grants уже принадлежат Gateway. При переносе обновить описание текущих компонентов, не менять автора старых наблюдений.
Подробные тела model_input/provider_output/model_output в плагине сохраняются: это согласованная функция 2.4, а не лишний лог. Они имеют отдельные лимиты памяти и область доступа.
Источники: Recorder и NATS observation, проекция передач, единый UI последовательности, console routes.
5. Другие конкретные сокращения
| ID | Факт по коду | Предложение | Что обязательно сохранить |
|---|---|---|---|
| S01 | Старый ui/waves.ts ожидает отсутствующие canvas в offscreen; реальный waveform уже PcmWaveform → PanelWaveform | Удалить старый renderer и параметры AssistantElements/AppConfig из захвата | PCM, VAD, Opus и фактические настройки микрофона |
| S02 | TokenBudget не создаётся рабочим кодом; provider делает POST /tokenize. Docker всё равно скачивает tokenizer Qwen3-30B-A3B-Thinking-2507 | Перенести только INPUT_TOKENS в действующие settings; удалить TokenBudget, tokenizer_assets, Docker download и прямые tokenizers/Jinja2 зависимости LLM | Точный provider count, предел 32768, исключение только optional cache; не отключать проверку контекста |
| S03 | В StreamingTranscript draftKey нигде не получает ненулевого значения; partial уже не отображается, callback final задан единственным caller | Убрать мёртвую draft/flash-ветку и неиспользуемые ChatUI методы после адресной проверки всех callers | Фильтрацию чужого/старого потока, терминальный dedup и вывод ASR ошибок; историческое streaming-чтение Monitor |
| S04 | natsSession и streamOwner создают экспортируемые singleton-экземпляры, тогда как production offscreen использует фабрики на владельца | Удалить неиспользуемый глобальный compatibility export и fallback отправки timings после проверки callers | Раздельные owner/session/capture и ending-stream retention |
| S05 | LLM NatsLogger имеет единственный вызов status_llm при старте; методы info/error и универсальный to_json_safe не используются другими модулями | Убрать универсальную обёртку; сохранить простой startup status, если требуется потребителю, или использовать штатный технический лог | Health RPC и отсутствие содержимого чата в технических логах |
| S06 | Core diagnostic_links создаёт пустой cache при каждом вызове; к нему есть проверка previous, но записей в cache нет | При переносе удалить фиктивный cache и второй RPC в WidgetStore; читать существующий store в Gateway | Ownership/tombstone, разрешённые trace/span, bounds ответа и timeout Phoenix |
| S07 | ArchiveTap.fingerprint читает три исходных файла при каждом начале записи | Вычислить fingerprint один раз для неизменного процесса/образа | Актуальную revision после новой поставки; хеши аудиопакетов не трогать |
| S08 | ReplayManager при каждом следующем диапазоне Opus начинает decoded_opus с первого пакета | Для монотонного повтора всего потока использовать один последовательный decoder iterator на replay job | Тот же decoder, pre-skip/хвост, исходные байты, отмену и память максимум одного ограниченного диапазона; новых cache/index нет |
| S09 | SessionSequence заново создаёт все строки/стрелки при выборе и обновлении; focus восстанавливается вручную | Обновлять только изменённые строки по event_id и selected state | Фильтры, нумерацию, URL, раскрытие, scroll/focus; не добавлять UI-framework или второй store |
| S10 | Source refs привязаны к числам строк текущего main; небольшое удаление требует ручных исправлений | При уборке Core обновить единственный набор refs. Ссылку без подтверждённого anchor вести на файл с названием символа; отдельный генератор/реестр ради этого не нужен | Рабочие ссылки и честное указание версии; не приписывать старому событию современный код |
| S11 | Большие UI-модули содержат и модель данных, и renderer, и modal/events | Удалять дублирующие обработчики и мёртвые ветки прежде разделения файлов; оставить одного владельца diagnostics | Функцию модели/инструментов, лимиты 2/8 MiB, duplicate/out-of-order, клавиатуру и Escape |
| S12 | Tooltip использует inline фиксированные светлые цвета | Перевести на существующие theme tokens и единый tooltip | Контраст, focus, Escape, aria-describedby, отсутствие второго title |
| S13 | DOCS/NATS содержит активноподобные списки удалённых Ruby/workflow subjects и ссылку на отсутствующий contracts/subjects.py | Переписать текущую карту по producer/consumer; старые материалы явно отделить как историю | Реальные subjects, адреса, протоколы и совместимость; не стирать историю незаметно |
S01–S07 и S12–S13 подтверждают конкретное лишнее поведение/код или противоречие. S08 подтверждён как повторная работа; его вклад во время нужно измерить. S09–S11 — предложения по реализации, а не доказанные текущими замерами bottleneck.
Источники S02: provider.count/fit, старый budget, Docker.
Что не считать лишним
- Agent PostgreSQL fencing, receipts, request/tool IDs и неизвестный результат — защита от повторного внешнего действия.
- FairPool, дедлайны, отмена и ограниченные очереди — рабочий контроль нагрузки.
- Один VAD Worker и AudioWorklet — выполнение тяжёлого/реального времени вне UI; не объединять их ради числа файлов.
- Opus header/pre-skip, точные координаты, manifest/hashes и PCM compatibility — целостность и повтор того же звука.
- Read-only Monitor, audio diagnostics, ASR Compare и widget diagnostics — разные пользовательские возможности. Общие измерения/decoder можно переиспользовать; удалять экран или данные нельзя.
- Map/Forms/notes/weather в Workspace имеют действующие entrypoint и RPC. Их удаление изменит продукт, даже если чат в расширении ими не пользуется.
- Два NATS и отдельный LLM gateway имеют реальные границы: аудио/inference отдельно от chat, provider budget/queue отдельно от Agent. Слияние требует самостоятельного измерения и решения.
- Domain API, VAD worker и runtime probes не являются dead code из-за отсутствия обычного импортера. Это динамические/инфраструктурные entrypoints.
- Не удалять all-purpose обработку исторических архивов только потому, что новый захват уже batch Opus.
Требует измерений, не обещаний
Нужно отдельно измерить: время /tokenize и повторных fit при большом optional cache; lag event loop при подготовке 30-секундного PCM; SQL планы Monitor при длинной сессии; объём DOM rebuild при обновлениях; размер/время сборки LLM до/после удаления старого tokenizer.
Рекомендую сначала убрать доказанные лишние работы. Не добавлять индексы/кэши/threads только по длине функции или предупреждению анализатора. Monitor сохраняет 3-секундный read deadline, 2-секундный statement timeout и ограниченную конкуренцию; увеличение тайм-аута не является оптимизацией.
6. Очерёдность будущей реализации
- Waveform + устройства. Проверить disappearing device, empty/permission/error states, capture isolation и нижнюю область в двух темах.
- Независимые удаления S01–S07; обновить только затронутые tests/requirements/build. Ожидаемая экономия исходников и образа фиксируется после diff/build, не заранее.
- Согласованно удалить Core: Gateway command path + admission deadlines, Ingress state/listener/replay/adapters, lifecycle/delivery/DRS/CI. Затем удалить весь старый каталог и обёртки.
- Упростить новые журнал/diagram/console по сохранённым фактам, оставив минимальный исторический reader.
- Только после коротких сопоставимых измерений выполнять S08–S11 и другие найденные performance-кандидаты.
Обзор всего функционала:
| Возможность | Решение по упрощению |
|---|---|
| Панель, история, ответы, время и diagnostics 2.4 | Сохранить один ChatUI/InteractionDiagnostics owner; убирать старые draft/flash и дубли handlers |
| Микрофон и обработка NS/EC/AGC | Новый выбор устройств, тот же изолированный capture; настройки не смешиваются между панелями |
| Silero и Opus | Сохранить Worker/Worklet/codec и точные границы; вывод waveform берётся из существующих PCM amplitudes |
| Admission и распознавание | Один Ingress owner вместо split Core/Ingress; тот же backend и один вызов модели |
| Agent и инструменты | Прямой Gateway → Agent; сохранить budget, очередь, receipts, fencing и неизвестный результат |
| DOM и WebMCP страницы | Сохранить один run_js и fixed bridge; убрать Core relay, не обходить documentId/origin и отмену |
| LLM provider | Удалить старый локальный tokenizer; сохранить provider /tokenize и HTTP/SSE, отдельно измерять диагностику |
| Архив и воспроизведение | Один принятый Opus-архив и общий decoder; старый PCM читается, hashes и manifests не удаляются |
| ASR Compare и диагностический повтор | Сохранить раздельные connect/work/diagnostic времена; full replay может использовать один decoder iterator |
| Monitor | Те же журнал и схема из одной проекции; назначения от producer, детали ленивые, обновления по ID |
| Карта, Forms, заметка и погода | Это действующие функции Workspace, не неиспользуемый остаток чата; удаления не предлагаются |
| PostgreSQL | Не выявлено доказанного права удалить таблицы/исторические данные; pools и read bounds сохраняются |
| Технические логи/трассы и приватные подробности модели | Сохранить разные области данных; убрать дубли envelopes и фиктивные cache, не смешивать содержимое модели с техническим OTLP |
| Build/debug/delivery | Удалить Core во всех активных списках и probes; сохранить штатную адресную поставку и проверяемый откат |
Минимальные проверки после будущих изменений:
| Часть | Адресная проверка |
|---|---|
| UI waveform | Только capturing; mute/error/hidden/close очищает; обе темы, resize/DPR, отсутствие перекрытия ввода |
| Устройства | Удаление выбранного; 0/1/2 устройства; permission denied/prompt; ошибка enumerate; одновременные панели и запись выбранного ID |
| Core removal / команды | Прямой Agent, тот же request_id, duplicate, cancel, uncertain admission и deadline; одна безопасная read-only команда |
| Core removal / речь | Одна готовая запись и две соседние фразы; 3 live + 1 replay; final/rejected/error; late/duplicate; ASR disconnect/reconnect и drain |
| Replay/архив | Старый PCM и Opus; совпадение decoded PCM и границ; cancel; поздний диапазон и последовательный full replay |
| Журнал/схема | Одинаковый список и счётчики; send/receive pairing; gap; clock mismatch; неизвестный участник; журнал → стрелка → журнал |
| Tokenizer cleanup | /tokenize, limit boundary и optional cache; LLM build без старой загрузки; provider output не меняется |
| Delivery | Список компонентов без Core; gates не пропущены молча; реальные revisions/digests/health после будущей поставки |
Длительные soak и микрофон пользователя для принятия этих изменений не требуются. Штатные CI-gates выполняются один раз для затронутых частей; повтор — после исправлений. Перезагрузка установленного расширения остаётся отдельным подтверждением, ZIP не заменяет фактическую активацию.
7. Ограничения исследования и самопроверка
- Независимое ревью другим агентом не проводилось: пользователь запретил делегацию без отдельного запроса. Выполнена самопроверка по producer/consumer и исходным контрактам.
- Не объявляется полный динамический тест всех 2474 функций. Для структурно просмотренных модулей нет доказанного разрешения на удаление; точные адресные решения перечислены выше.
- На этом этапе не измерены новые времена, CPU/RAM, размер нового образа, регрессии ASR/LLM. Удаление лишней пересылки не означает ускорение GPU-модели.
- Не выполнены изменения схемы БД, retention или секретов. Предыдущие исключения по их хранению сохранены.
- Ревью всего дерева не отменяет прежнее ограничение на правки кода других авторов: перед будущими изменениями проверить blame/переносы для komaroff и trizna; сторонние реализации не переписывать.
- Для полного удаления Core нужен этап изменения состава DRS и Core-зависимого CI. Это открытое изменение границ будущей реализации, сейчас никакие файлы приложения не редактировались.
- Перед реализацией повторно сверить main и индекс. В read-only исследовании Repowise не обновлялся: существующий index commit совпадает с e6a8ee03.
Создан только этот отчёт и его инвентаризация вне репозиториев. Код и runtime остаются без изменений.