diff --git a/polygon-docs/opus-architecture-audit-response.md b/polygon-docs/opus-architecture-audit-response.md new file mode 100644 index 0000000..7031752 --- /dev/null +++ b/polygon-docs/opus-architecture-audit-response.md @@ -0,0 +1,63 @@ +# Архитектурный аудит polygon v0.2.5 — ответ Опуса + +Дата: 2026-07-31 + +## Итоговая оценка + +Архитектура здоровая и соразмерная задаче. Blueprint-разбиение, data-driven из STANDS YAML, синхронный run без потоков, единый config/loader — правильные решения. + +Но есть **структурный разрыв**: сервис задеплоен как публичный managed-сервис, при этом спроектирован как эксклюзивный однопользовательский in-memory стенд. + +--- + +## Находки + +### 🔴 1. Публичный деплой + общий global state → изоляция тестов ломается в параллельном CI + +Две параллельные pytest-сессии делят одно состояние. `reset()` одной сессии стирает инстансы другой. + +**Решение:** namespace-изоляция по `X-Test-Session: ` ИЛИ per-session контейнер в CI. + +### 🔴 2. Основной API без аутентификации на публичном домене + +`MOCK_AUTH_TOKEN` защищает только `/_mock/*`. POST /instances, /instanceOperations, run — открыты полностью. + +**Решение:** `before_request` на уровне app (проверка `Authorization: Bearer <любой>`) или сетевое ограничение. + +### 🟡 3. Синхронный sleep блокирует весь сервер + +При `--workers 1`, `time.sleep(DELAY)` в run сериализует ВСЕ запросы. При `delay=5` сервер заморожен на 5 секунд. + +Конфликтует с исходным планом Опуса (решение Q4 — «ленивый dtFinish»). Реализация ушла в синхронный sleep. + +### 🟡 4. _extract_subresource_name — хрупкий выбор имени + +Берётся первое непустое строковое значение в op_params. Порядок параметров не гарантирует что имя пойдёт раньше пароля. + +**Решение:** маппить по коду параметра через cfsParams. + +### 🟡 5. Память не ограничена + нет симуляции ошибок + +- Операции и op_params не чистятся никогда → медленная утечка +- run всегда `isSuccessful=True` → мок не умеет эмулировать падение +- Нет cap на число инстансов + +## Ответы на вопросы + +**Q1. In-memory vs Redis.** Persistence не нужен для CI. Рестарт = чистый стенд, это фича. + +**Q2. Масштабирование.** Безопасно только при эксклюзивном владении. Рекомендация: polygon per-session в CI (снимает находки 1, 2, 3 разом). + +**Q3. Генерация YAML при старте.** Не надо. Оставить offline. Добавить CI-проверку «from_stands.py даёт тот же результат». + +**Q4. Мониторинг.** Prometheus избыточен. Достаточно `/_mock/state` + структурные логи. + +**Q5. Готовность к CI.** К последовательному CI — готов. Блокеры для параллельного: изоляция сессий (1), auth API (2), симуляция ошибок (5). + +## Приоритеты + +1. Решить модель владения — per-session контейнер ИЛИ namespace-изоляция +2. Симуляция ошибок операций — для негативных тестов +3. Auth-гейт основного API +4. Маппинг subresource-имён по коду параметра +5. Косметика версии