From f470b79ca1fa6be513921860e7493d679aeafc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 31 Jul 2026 23:09:34 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=20=D0=9E?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=B0=20=E2=80=94=20=D0=B0=D1=80=D1=85=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=82=D1=83=D1=80=D0=BD=D1=8B=D0=B9=20=D0=B0?= =?UTF-8?q?=D1=83=D0=B4=D0=B8=D1=82=20polygon=20v0.2.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opus-architecture-audit-response.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 polygon-docs/opus-architecture-audit-response.md 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. Косметика версии