doc: промпт code review #2 — polygon v0.2.2 после decouple

This commit is contained in:
2026-07-31 22:24:14 +04:00
parent b0f051344d
commit a42f5b335f
+101
View File
@@ -0,0 +1,101 @@
# 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/<id>
│ ├── instances_routes.py # GET/POST /api/v1/svc/instances, GET /instances/<uid>
│ ├── operations_routes.py # /instanceOperations/* (5 эндпоинтов: default, create, status, params, validate)
│ ├── run.py # POST /instanceOperations/<uid>/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/<int>` перед `<uid>` сохранён в 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'ами?
## Формат ответа
Сгруппируй находки:
- 🔴 Критические (сломает работу)
- 🟡 Средние (потенциальная проблема)
- 🔵 Минорные (стиль, имена)
Для каждой: файл, проблема, предлагаемое исправление.
Если по какой-то категории всё ок — напиши «проблем не найдено».