From a4dc1f5458ed4121679a842bf1b3fa789f28304c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 26 Jul 2026 14:41:03 +0400 Subject: [PATCH] =?UTF-8?q?Docs:=20Sonnet=20review=20Q&A=20=E2=80=94=20dec?= =?UTF-8?q?isions=20and=20adjusted=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/sonnet-review-answers.md | 111 ++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 DOCS/sonnet-review-answers.md diff --git a/DOCS/sonnet-review-answers.md b/DOCS/sonnet-review-answers.md new file mode 100644 index 0000000..028e3af --- /dev/null +++ b/DOCS/sonnet-review-answers.md @@ -0,0 +1,111 @@ +# Ревью Соннета: история тестов — ответы и решения + +> Дата: 2026-07-26 +> Рецензируемый файл: `DOCS/test-results-history-plan.md` + +## Вопрос 1: SQLite в `/tmp/` — надёжно? + +**Ответ:** ✅ Да, для тестового инструмента достаточно. + +`/tmp/` теряется только при рестарте пода (OOMKill, node restart, редеплой с новым контейнером). PostgreSQL добавил бы зависимость от отдельного сервиса, provisioning и точки отказа — несоразмерно задаче. + +**Решение:** SQLite, `/tmp/autotest_results.db`. + +--- + +## Вопрос 2: Схема БД — нормально? + +**Ответ:** В целом да, но: + +- Добавить `UNIQUE` индекс на `op_uid` — это внешний идентификатор облака, должен быть уникальным +- `test_params` **убрать из MVP** (Фаза 1). Добавить в Фазе 2 когда понадобится «повторный запуск с теми же параметрами» + +**Решение:** Фаза 1 — только `test_runs` + `test_stages`. Параметры позже. + +--- + +## Вопрос 3: Хранить `stageMsg`? + +**Ответ:** ✅ Да, обязательно. + +100 запусков × 5 стадий × 5 КБ = 2.5 МБ. SQLite справляется без проблем. `stageMsg` — самое ценное для диагностики «почему упало». + +**Решение:** Хранить. Поле `TEXT`, ограничений нет. + +--- + +## Вопрос 4: API эндпоинты — достаточный набор? + +**Ответ:** Да, плюс один: + +- `DELETE /api/results` (без ``) — очистка всей истории или старше N дней (`?older_than_days=30`). Нужно чтобы `/tmp/` не раздувался. + +**Решение:** Добавить `DELETE /api/results` с опциональным `?older_than_days=N`. + +--- + +## Вопрос 5: UI — серверный рендеринг или SPA? + +**Ответ:** Оставить текущий подход (Jinja2 + vanilla JS). + +Фильтры-кнопки + раскрытие строк — 30 строк JS. SPA для одной страницы — избыточно. + +**Решение:** Серверный рендеринг, фильтры на JS. + +--- + +## Вопрос 6: Экспорт — поток или файл? + +**Ответ:** Файл. + +```python +return jsonify(data), 200, { + "Content-Disposition": "attachment; filename=results.json" +} +``` + +На 1000 записей — мгновенно, стриминг не нужен. + +**Решение:** `GET /api/results/export` → JSON-файл. + +--- + +## Вопрос 7: Что упущено? + +**Ответ:** `_finish_op()` сейчас не получает `op_name` и `svc_op_id` — а они нужны для `save_result()`. + +Сейчас сигнатура: +```python +def _finish_op(client, op_uid, instance_uid, svc_id, display_name, is_create, is_delete=False) +``` + +Нужно: +```python +def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, is_create, is_delete=False) +``` + +И передавать `op_name` и `svc_op_id` из `api_test()` при вызове `threading.Thread(...)`. + +**Решение:** Исправить сигнатуру до реализации `results_db.py`. + +--- + +## Итоговый план (скорректированный) + +### Фаза 1 (MVP) +1. Исправить `_finish_op()` — добавить `op_name`, `svc_op_id` +2. `site/operations/results_db.py` — SQLite (только `test_runs` + `test_stages`) +3. `_finish_op()` → `save_result()` +4. `GET /api/results`, `DELETE /api/results` +5. UI — простая таблица без фильтров + +### Фаза 2 +1. `GET /api/results/` — детали +2. `GET /api/results/stats` — статистика +3. `test_params` таблица +4. UI — фильтры, раскрытие + +### Фаза 3 +1. Экспорт JSON +2. Повторный запуск +3. Таймлайн