# Контрольная база до переработки chat-agent

Серия проведена 06.10.2026 после поставки инструментирования C0. Функциональная
переработка в эту базу не входит. Конфигурация: `522aa7a6e3b7a3357736bbfe2df6d48382b3158c`,
[CI 4910](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/pipelines/4910>),
[deploy 9755](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/jobs/9755>).

Реальные revisions выборочно собранных приложений различаются: Core/Agent `3bea617f`,
Frontend `69ef2ec6`, LLM `d35c9e30`, Ruby AsyncGraph `522aa7a6`. Конфигурация сетей и
Collector применена к ним всем. Остальные сервисы не пересобирались.

## Условия и результат

Всего 33 запроса по [cases.json](</experiments/voice-ai/archive/w/tests/benchmark/cases.json>): 12 обычных текстовых,
3 инструментальных, 6 реплик с уточнениями и 12 голосовых в раундах 1/2/3/1/2/3.
32 запроса получили ответ, один завершился явной ошибкой передачи аудио. Ошибка
сохранена отдельно и не входит в распределение времени успешных ответов.

Модель `qwen3:30b`, ASR streaming, один Agent и активный Ruby AsyncGraph runtime.
Наблюдаемые загрузки модели прогретые; холодная серия отсутствует. Модель не выгружалась.
Fixture: PCM16LE mono 48 kHz, 3,025 с,
SHA256 `bbdc8147226297b2a56f177b2b70a750dcfc44bbf57498e7ef2befe9c921a42a`.
После WAV источник продолжал silent PCM до штатного отключения микрофона.

| Показатель | Успешных образцов | p50 | p95 |
|---|---:|---:|---:|
| Полный обычный текстовый ответ | 12 | 14,969 с | 20,951 с |
| Инструментальный ход | 3 | 11,366 с | 12,995 с |
| Реплика с уточнением | 6 | 19,902 с | 24,072 с |
| Готовое SDP →connected | 12 | 1,394 с | 1,559 с |
| Начало WAV →ASR final | 11 | 3,803 с | 3,993 с |
| ASR final →полный ответ, смешанная нагрузка 1/2/3 | 11 | 46,007 с | 89,399 с |

Квантили вычисляются линейной интерполяцией R7. Небольшая серия служит контрольным
сравнением, а не оценкой production SLO. Последняя строка объединяет нагрузки;
для сравнения отдельного уровня используются исходные раунды.

Обычные 12 ответов потребовали **26 реальных генераций**: десять ходов по две и
два по три. Инструментальные/уточняющие девять — 14; успешные голосовые 11 — 22.
Итого **62 генерации на 32 ответа**. Детерминированные routing guards без вызова
провайдера не считаются генерациями. Прогревочный контрольный запрос исключён.

## Что показала телеметрия

Во время первого раунда из трёх потоков ожидание Agent составило 0,003 / 34,791 /
65,904 с. Во втором — 0,004 / 24,757 / 56,813 с. Очередь Ruby после входа занимала
миллисекунды. Независимые чаты последовательно ждали callback Agent.

У первого одиночного потока Core делал около 50 flush/с, у трёх потоков максимум
150 flush/с на общем соединении. В раунде 4 зарегистрирован `audio_transport_failed`:
лог Core содержит `InvalidStateError` при завершении PONG и затем `FlushTimeoutError`.
Следующие раунды прошли без перезапуска. Причина подтверждается также кодом
закреплённого nats-py 2.11.0: таймаут flush отменяет Future, поздний PONG вызывает
`set_result` у отменённого Future. Исправление должно проверять этот порядок событий.

Все 12 WebRTC-подключений достигли DTLS connected; выбран путь local srflx →remote
TURN relay, росли RTP counters. Core spans подтверждают декодирование первого PCM.
Peer-reflexive путь этой серией не подтверждён и проверяется отдельно.

Интерфейс отображал ответы соседних контрольных сессий. Fixture отбирал только свою
session_id, а история текстовых сессий проверена отдельно. Фильтрация fixture
не является исправлением приложения.

## Ресурсы и ограничения измерения

VictoriaMetrics: окно 1791245870–1791248060 UTC epoch, шаг 15 с, rate CPU — 60 с.
Сохранены все 13 контейнеров. Окно включает паузы; сравнивать нагрузку следует по
одинаковым отдельным раундам, а не только по общей средней.

| Голосовые потоки, успешный раунд | Максимум Core RSS | Средний Core CPU | Максимум Agent pending |
|---|---:|---:|---:|
| 1 | 120 012 800 байт | 0,138 ядра | 0 |
| 2, первый | 121 585 664 байт | 0,124 ядра | 1 |
| 3, первый | 129 044 480 байт | 0,312 ядра | 2 |
| 2, второй | 130 871 296 байт | 0,197 ядра | 1 |
| 3, второй | 134 008 832 байт | 0,423 ядра | 2 |

RSS приложения и container working set — разные показатели. Раунд с ошибкой завершился
до следующего 15-секундного scrape; его ресурсы отмечены как отсутствующие, а не нулевые.
Внутренние ресурсы GPU/Whisper не измерялись. Длительность synthetic ASR не доказывает
точность распознавания живой речи: произношение fixture давало разные транскрипции.
Время разрешения реального микрофона этой серией не измеряется.

## Исходные числа

- [Обычные запросы, spans и простой](</experiments/voice-ai/archive/w/DOCS/evidence/chat-agent-c0-ordinary.json>).
- [Инструменты и уточнения](</experiments/voice-ai/archive/w/DOCS/evidence/chat-agent-c0-cases.json>).
- [Аудио, ошибки и очереди](</experiments/voice-ai/archive/w/DOCS/evidence/chat-agent-c0-audio.json>).
- [CPU/RAM всех 13 сервисов и голосовые раунды](</experiments/voice-ai/archive/w/DOCS/evidence/chat-agent-c0-resources.json>).

Сохранены только собственные контрольные UUID, числовые измерения и коды ошибок.
Аудио, текст разговоров, SDP, токены и credentials в эти файлы не входят.
Для серии после переработки сохраняются те же fixtures, prompts, модель и режим ASR.
