From a42f5b335f28369c605ca15ac3630edfe8bc5c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 31 Jul 2026 22:24:14 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BF=D1=82=20c?= =?UTF-8?q?ode=20review=20#2=20=E2=80=94=20polygon=20v0.2.2=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20decouple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- polygon-docs/sonnet-code-review-2-prompt.md | 101 ++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 polygon-docs/sonnet-code-review-2-prompt.md diff --git a/polygon-docs/sonnet-code-review-2-prompt.md b/polygon-docs/sonnet-code-review-2-prompt.md new file mode 100644 index 0000000..f877a37 --- /dev/null +++ b/polygon-docs/sonnet-code-review-2-prompt.md @@ -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/ +│ ├── 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'ами? + +## Формат ответа + +Сгруппируй находки: +- 🔴 Критические (сломает работу) +- 🟡 Средние (потенциальная проблема) +- 🔵 Минорные (стиль, имена) + +Для каждой: файл, проблема, предлагаемое исправление. + +Если по какой-то категории всё ок — напиши «проблем не найдено».