# Доказательства архитектурного снимка

> Исторический snapshot. После разделения chat/voice адреса и deployment ownership изменились: чат — https://chat-agent.gis-master.ru/, file UI/diagnostics — https://voice.gis-master.ru/. Текущая поставка: [DEPLOYMENT](</experiments/voice-ai/archive/w/DOCS/DEPLOYMENT.md>). Старые адреса и service owners ниже описывают дату исследования, а не инструкции для текущего runtime.

Дата: 2026-09-16. Source commit: `772de4a714ae6c5abea91946e85a1953ee919ec3`. `SOURCE` и `LOCAL TEST` не утверждают состояние production. `CALCULATED` — арифметика из параметров кода; `MEASURED SOURCE` — статический подсчёт. Предложения не выданы за реализованные свойства.

| ID | Утверждение | Статус | Первичный источник | Граница / пробел |
|---|---|---|---|---|
| W01 | HTTP входы, WebRTC и общий путь текста | SOURCE | [src_core/main.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_core/main.py>) — setup_routes; handle_transcription.py; handle_track.py | Named live voice smoke не выполнялся |
| W02 | Agent является владельцем runtime и истории | SOURCE | [src_agent/agent.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_agent/agent.py>) — run; _run_with_optimistic_lock; utils/db.py | Не измерялась частота конфликтов |
| W03 | Runtime UPDATE и persist_chat_turn не в общей транзакции | SOURCE | [src_agent/repositories/runtime_state.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_agent/repositories/runtime_state.py>) — save_runtime_state; src_agent/utils/db.py:persist_chat_turn | Последствия частичного отказа — INFERRED |
| W04 | Три workflow, DRS default ruby_node | SOURCE | [stack/webrtc.drs](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/stack/webrtc.drs>) — WORKFLOW_RUNTIME; NATS_WORKFLOW_RUN_SUBJECT | Фактический env работающего stack UNKNOWN |
| W05 | Две Ruby реализации subscribe без queue group | SOURCE | [src_langgraph_rb_node/lib/src_langgraph_rb_node/runtime/service.rb](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/tree/772de4a714ae6c5abea91946e85a1953ee919ec3/src_langgraph_rb_node/lib/src_langgraph_rb_node/runtime/service.rb>) — Service.run; src_langgraph_rb/lib/src_langgraph_rb/runtime/service.rb | Дубли при репликации — вывод из семантики NATS, не live trace |
| W06 | Agent, LLM, API tools имеют queue groups | SOURCE | [src_agent/service.py](</experiments/voice-ai/archive/w/src_agent/service.py>) — subscribe; src_llm/utils/base_service.py; src_api_gateway/main.py | Это не решает идемпотентность и порядок turn |
| W07 | Аэропорты: новый turn 2 LLM calls; route только при intent | SOURCE / TEST | [src_langgraph_rb_node/spec/scenarios/find_nearest_airport_spec.rb](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/tree/772de4a714ae6c5abea91946e85a1953ee919ec3/src_langgraph_rb_node/spec/scenarios/find_nearest_airport_spec.rb>) — routing_decision + tool_params; tool_calls assertions | LLM/tool ответы подменены |
| W08 | Audio producer создаёт task до semaphore | SOURCE | [src_core/processors/whisper_stream_node.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_core/processors/whisper_stream_node.py>) — handle_frame; _publish | Не выполнен overload benchmark |
| W09 | LLM задачи также создаются до semaphore | SOURCE | [src_llm/utils/base_service.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_llm/utils/base_service.py>) — _handle_message; _process_message | duration_ms отсчитывается после ожидания semaphore |
| W10 | Браузер подписан на фиксированный user123 subject | SOURCE | [src_front/src/config/appConfig.ts](</experiments/voice-ai/archive/w/src_front/src/config/appConfig.ts>) — natsEventsSubject; assistantApp.ts:handleServerEvent | Broker ACL и live tenant isolation UNKNOWN |
| W11 | init_map: 2 последовательных HTTP calls и session на запрос | SOURCE | [src_core/handlers/handle_init_map.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_core/handlers/handle_init_map.py>) — init_map_handler | Потребность в согласованном snapshot требует решения API |
| W12 | API: фиксированная позиция и демонстрационные данные | SOURCE | [src_api_gateway/main.py](</experiments/voice-ai/archive/w/src_api_gateway/main.py>) — _current_position; _tool_get_weather; _build_route_data | Нет утверждения о реальных рейсах/дорожном маршруте |
| W13 | GraphRunner результаты внешних шагов держит в RAM | SOURCE | [src_langgraph_rb_node/lib/src_langgraph_rb_node/runtime/graph_runner.rb](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/tree/772de4a714ae6c5abea91946e85a1953ee919ec3/src_langgraph_rb_node/lib/src_langgraph_rb_node/runtime/graph_runner.rb>) — request_results; src_langgraph/engine.py:compile() | Crash resume не доказан |
| W14 | 25 Ruby examples и 7 Python tests проходят | LOCAL TEST | [src_langgraph_rb_node/spec](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/tree/772de4a714ae6c5abea91946e85a1953ee919ec3/src_langgraph_rb_node/spec>) — Docker с read-only mount exact worktree; tests/test_llm_routing.py | 16.09.2026; не E2E |
| W15 | CI tests job закомментирована | SOURCE | [.gitlab-ci.yml](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/.gitlab-ci.yml>) — build push; deploy; #tests | Полный CI test gate не подтверждён |
| W16 | Raw PCM=32000 B/s; 50 frames/s | CALCULATED | [src_core/handlers/handle_track.py](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/blob/772de4a714ae6c5abea91946e85a1953ee919ec3/src_core/handlers/handle_track.py>) — 16000 samples/s × 2 B × mono; frame_duration_ms=20 | Без metadata, NATS, RTP overhead |
| W17 | Physical code lines: 2263 / 4205 / 3913 | MEASURED SOURCE | [src_langgraph](<https://git.giscloud.ru/voice-chat/webrtc-komaroff/-/tree/772de4a714ae6c5abea91946e85a1953ee919ec3/src_langgraph>) — tracked .py/.rb; воспроизводимая команда ниже | Включены tests/comments; не dead code и не cognitive complexity |
| W18 | Документация создана по remote main | SOURCE | [AGENTS.md](</experiments/voice-ai/archive/w/AGENTS.md>) — HEAD 772de4a; detached worktree локальный источник | Основной локальный main f0a6eac сохранён |

## Метод и сохранность

Подсчёт физических строк выполнялся отдельно для `src_langgraph`, `src_langgraph_rb` и `src_langgraph_rb_node`; `<runtime>` ниже заменяется точным именем каталога:

```sh
git ls-files <runtime> | rg '\.(py|rb)$' | xargs wc -l
```

Исследование началось с AGENTS.md и .knowledge. Следующим источником были calls, routes, subscriptions, DTO, schema, tests, Dockerfiles и DRS. Существующие презентации, OpenWiki и ранее написанные архитектурные обзоры не служили доказательствами.

DRS прочитан статически, без исполнения Ruby DSL. Значения credentials не переносятся в документы. Готовые материалы не меняют код приложения и не публикуются в runtime.

CW: `cw sync --pull --company monitorsoft` остановился на dirty shared scope. `cw sync --company monitorsoft` установил текущие рабочие skills; `cw validate` прошёл без ошибок и предупреждений (76 skills, 33 agents во всём проверенном каталоге). Fetch корневого и shared repositories показал 0/0 divergence. Локальные правки shared сохранены.

## Что остаётся неизвестным

Текущие image digests, число реплик, фактические лимиты ресурсов и p50/p95/p99 не измерялись. Тесты с подменёнными модельными ответами подтверждают ветвление, но не качество LLM/ASR. Изменения архитектуры требуют своего baseline и named сценариев приёмки.
