Files
autotest/polygon-docs/sonnet-code-review-2-prompt.md
T

102 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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'ами?
## Формат ответа
Сгруппируй находки:
- 🔴 Критические (сломает работу)
- 🟡 Средние (потенциальная проблема)
- 🔵 Минорные (стиль, имена)
Для каждой: файл, проблема, предлагаемое исправление.
Если по какой-то категории всё ок — напиши «проблем не найдено».