# Code Review #2: polygon v0.2.2 (после decouple) > Адресат: Claude Sonnet 4.6 (новый чат) > Дата: 2026-07-31 > Предыдущее ревью: v0.2.0 (12 находок, 2 крит. исправлены) > ⛔ ОТВЕТ — ТОЛЬКО В ЧАТ. Не редактировать файлы. --- ## Контекст После первого ревью (v0.2.0) были исправлены 2 критических бага и проведён decouple-рефакторинг: монолитный `app.py` (418 строк) разнесён на blueprint'ы по шаблону app-autotest. CSS и HTML вынесены из Python-строк в отдельные файлы. Актуальная версия: **v0.2.2**, задеплоена на `polygon.pythonk8s.dev.nubes.ru`. 23/23 curl-тестов PASS, 19/19 pytest PASS. ## Новая структура ``` polygon/site/ ├── app.py # 57 строк: Flask(), 6 blueprint'ов, app.run() ├── routes/ │ ├── root.py # /health, / (Jinja2 render_template) │ ├── services_routes.py # GET /api/v1/svc/services, /services/ │ ├── instances_routes.py # GET/POST /api/v1/svc/instances, GET /instances/ │ ├── operations_routes.py # /instanceOperations/* (5 эндпоинтов: default, create, status, params, validate) │ ├── run.py # POST /instanceOperations//run │ └── mock_routes.py # /_mock/* (reset, state, services, delay) ├── state/ │ ├── mock_state.py # MockState (in-memory, UUID v4, пагинация) │ └── state_machine.py # apply_effect() + _merge_params() ├── config/ │ └── loader.py # load_services() + модульные переменные SERVICES/OPS_INDEX/DELAY ├── utils/ │ ├── now.py # now() — UTC ISO с 'Z' │ └── pluralize.py # pluralize() — одна функция ├── converter/ │ └── from_stands.py # конвертер STANDS YAML → polygon config ├── static/ │ └── style.css # тёмная тема (из f-строки) ├── templates/ │ └── index.html # Jinja2-шаблон (из f-строки) └── services/ └── 37 YAML-конфигов ``` ## Что изменилось с прошлого ревью | v0.2.0 | v0.2.2 | |--------|--------| | `app.py` 418 строк, всё в одном | `app.py` 57 строк, только скелет | | 17 `@app.route(...)` в одном файле | 7 blueprint-файлов в `routes/` | | CSS в f-строке `index()` | `static/style.css` | | HTML в f-строке `index()` | `templates/index.html` (Jinja2) | | `_now()` в app.py + mock_state.py | `utils/now.py` | | `_pluralize()` в state_machine + from_stands | `utils/pluralize.py` | | `config_loader.py` | `config/loader.py` (модульные переменные) | | `--workers 2` в docstring | `--workers 1` + `WEB_CONCURRENCY=1` | | `cfs_params[pid]` → KeyError | `cfs_params.get(pid)` → безопасно | ## Что проверять ### 1. Корректность blueprint-регистрации - Все 17+ маршрутов на месте? - Порядок `default/` перед `` сохранён в operations_routes.py? - Нет коллизий имён blueprint'ов? - `url_prefix` не дублируется с путями в `@bp.route()`? ### 2. Импорты и зависимости - Нет циклических импортов между модулями? - `config/loader.py` — модульные переменные инициализируются ровно один раз? - `routes/run.py` и `routes/mock_routes.py` правильно работают с `config.loader.DELAY` через `_cfg.DELAY = seconds`? - Старый `config_loader.py` удалён — нигде не осталось импортов? ### 3. Порядок вызова функций - При дроблении не нарушен ли порядок: validate → set_param → run → apply_effect? - `apply_effect` вызывается с правильными аргументами (mock_state.state, SERVICES)? - `_merge_params` не сломан после переноса в отдельный модуль? ### 4. CSS/HTML разделение - `render_template("index.html", ...)` передаёт все нужные переменные? - CSS не потерян при переносе? - `url_for('static', filename='style.css')` корректный? ### 5. Качество кода новых файлов - Комментарии к каждой функции на месте? - Имена переменных понятные? - Нет дублирования логики между blueprint'ами? ## Формат ответа Сгруппируй находки: - 🔴 Критические (сломает работу) - 🟡 Средние (потенциальная проблема) - 🔵 Минорные (стиль, имена) Для каждой: файл, проблема, предлагаемое исправление. Если по какой-то категории всё ок — напиши «проблем не найдено».