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

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 не менять», а не основание менять его сейчас.

Переключение владельца

  1. Подготовить совместимые Gateway/Ingress и адресные тесты, не включая второго владельца.
  2. Закрыть входной допуск и дождаться нуля активного live/replay, Agent/LLM и неопределённых admission. Чужие потоки самостоятельно не завершать.
  3. Выключить старый authoritative listener Core, затем включить нового владельца Ingress. Два активных result listener, выполняющих бизнес-доставку, недопустимы.
  4. Переключить Gateway на прямой Agent и новые lifecycle probes, убрать service Core из желаемого стека.
  5. Проверить отсутствие 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; это направление нужно завершить.

План:

  1. Сохранить существующий Recorder, таблицу nats_log и общий SessionSequence. Нового event bus, графа, таблиц или подписок для истории не вводить.
  2. Для новой операции producer записывает точные source/target, тип, ID связи, purpose и время своих часов. UI выводит эти значения. Он не угадывает сервис по subject, русскому заголовку или наличию ok.
  3. Отправка и приём объединяются по явному transfer/parent ID. Подтверждение приёма, терминальный результат, повторная доставка и неизвестное завершение остаются разными состояниями.
  4. Старые contract-based разборы держать только в совместимости исторического чтения. Не переносить их в новый универсальный справочник бизнес-процесса.
  5. Journal и diagram получают одинаковый готовый список передач. Сохраняются нумерация, отступы по причинным связям, выбор стрелки, фильтры и боковые подробности. Временная близость не доказывает параллельность.
  6. PCM/Opus-пакеты показывать сводкой со ссылкой на существующие packet metadata архива. Аудио и полные manifests вторично не журналировать.
  7. Назначение локального этапа показывать внутри компонента. Если неизвестны отправка/получение/родитель — показывать пробел наблюдений, без дорисованного запроса.
  8. Потери диагностики и лимиты остаются явными. Сам регистратор ограничен памятью и не блокирует 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. Очерёдность будущей реализации

  1. Waveform + устройства. Проверить disappearing device, empty/permission/error states, capture isolation и нижнюю область в двух темах.
  2. Независимые удаления S01–S07; обновить только затронутые tests/requirements/build. Ожидаемая экономия исходников и образа фиксируется после diff/build, не заранее.
  3. Согласованно удалить Core: Gateway command path + admission deadlines, Ingress state/listener/replay/adapters, lifecycle/delivery/DRS/CI. Затем удалить весь старый каталог и обёртки.
  4. Упростить новые журнал/diagram/console по сохранённым фактам, оставив минимальный исторический reader.
  5. Только после коротких сопоставимых измерений выполнять 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 остаются без изменений.

Исходник

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