# Sol — ответы по редактору сценариев Дата: 2026-07-30 ## 1. Структура `steps` - JSONB массив, отдельная таблица не нужна - Обязательно поле `resource` — идентификатор инстанса внутри сценария (для связи create→modify→delete) - `scenario_definitions`: + `version INTEGER`, `updated_by`, `is_active`/`deleted_at`, уникальность имени case-insensitive - `scenario_runs`: + `definition_id`, `definition_version`, `steps_snapshot` - Runner работает со snapshot, не перечитывает определение ## 2. Параметры в редакторе - Из Nubes API: сервис→операции→`/instanceOperations/default/{opId}`→коды - Выпадающий список с типом, обязательностью, default - Map/array — JSON-строка с валидацией - Кеш: браузерный на время сессии редактора ИЛИ серверный (stand+opId, TTL 5 мин) - Свободный ввод кода не нужен ## 3. Seed из config.yaml - Не импортировать при каждом пустом старте - Схема: marker импорта → `INSERT ON CONFLICT DO NOTHING` → marker `scenario_seed_v1=completed` - YAML вынести в `scenario_seed.yaml`, после rollout удалить - Остальной config.yaml не трогать ## 4. UI редактор - Модальное окно или боковая панель (не inline) - Имя, список шагов, сервис, операция, параметры - Кнопки добавить/удалить/вверх/вниз - Drag-and-drop не нужен - Мягкое удаление: `is_active=false` ## 5. Валидация - При сохранении: структура, существование сервиса, доступность операции, коды параметров, типы, уникальность resource, порядок (create→modify→delete, после delete ничего) - При запуске: повторить по актуальному API - Невалидный сценарий не запускать частично ## 6. Критически упущенное 1. `POST /api/scenario/run` не возвращает run ID — гонка при двух запусках. Создавать запись ДО thread, вернуть HTTP 202 + run_id 2. Нужен `GET /api/scenario/runs/` — поллинг конкретного запуска 3. `save_run()` не пишет `scenario_run_id` и `step_number` — шаги не связаны со сценарием 4. TIMEOUT: `op_data` может быть неинициализирована 5. Шаг нужно создавать в `runs` со статусом RUNNING ДО обращения к API, потом обновлять 6. Блокировка параллельных запусков: HTTP 409 для одного client_id+stand 7. CRUD: проверять `client_id+stand` при всех операциях 8. `version` в definitions: PUT с текущей version, 409 при конфликте 9. Runner использует персональный токен — нужен сервисный токен/клиент по stand 10. Имя не идентификатор: API запуска принимает `definition_id`, имя — редактируемое поле