# Workflow runtime: Ruby + AsyncGraph

Production использует один `src_langgraph_rb_node`. Python LangGraph и прежний
Ruby runtime сохранены в исходниках и local profiles, но отсутствуют в работающем
составе C3. [Архитектура](</experiments/voice-ai/archive/w/DOCS/ARCHITECTURE.md>), [поставка](</experiments/voice-ai/archive/w/DOCS/DEPLOYMENT.md>).

## Новый диалог и существующие сценарии

Для нового обычного разговора `dialog_step` делает одну генерацию: модель
возвращает текст или native tool calls. Runtime получает схемы через
`nats.tools.discover`, проверяет весь batch, имя и аргументы до первого исполнения.
Пять разрешённых инструментов исполняются последовательно в порядке модели.
Бюджет — 10 действий и общий deadline 120 секунд, включая очередь и модель.
Неправильные аргументы/неизвестный инструмент не исполняются.

Активные и pending-сценарии продолжаются существующими графами. Новые сочетания
инструментов не требуют отдельного заранее написанного сценария. Уточнение нового
диалога сохраняется обычной репликой; новых постоянных workflow IDs/pending formats нет.
History, entities и artifact memory сохраняются. Генеративный router перед новым
обычным диалогом и `knowledge_retry` удалены из активного пути. Ошибка router
не превращается скрыто в успешный FreeSpeech.

## Очереди и наблюдаемость

Три обработчика и три ожидающих запроса, ограниченные NATS pending buffers.
Сроки/отмена поступают headers/control subjects. Новые действия после отмены
не начинаются. LLM имеет собственную очередь 1/3. Отдельные spans измеряют
ожидание и стадии; session/request/attempt UUID — attributes, не metric labels.
Telemetry tool name ограничен фиксированным каталогом, без аргументов и текста.

NATS API: `nats.workflow.run.ruby.node`, `nats.workflow.health.ruby.node`.
Запуск: `bundle exec ruby ./lib/src_langgraph_rb_node/runtime/service.rb`;
проверки: `bundle exec rspec` из каталога runtime.

- [README](#archive-availability), [CODEMAP](#archive-availability)
- [service](#archive-availability)
- [dialog loop](#archive-availability)
- [engine](#archive-availability)
- [execution](#archive-availability)
- [telemetry](#archive-availability)

Альтернативы для отдельного локального исследования:
[Python](#archive-availability), [старый Ruby](#archive-availability).
Их описания двух проходов/router не являются текущими production-инструкциями.
