Files
autotest/HISTORY/2026-07-29-session.md
T

97 lines
6.0 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.
# 2026-07-29 — Полная сессия (v1.1.5 → v1.1.28)
## Контекст
За день: 23 версии, 3 code review (Sonnet 4.6 ×2, Opus 4.8 ×1), полная переработка логики CREATE под Terraform.
## Хронология
### v1.1.5 — fix sed garbage
Осиротевший `</div>\`;` после sed в app.js → JS syntax error → весь фронтенд сломан.
### v1.1.6 — fix orphan </div> in refreshInstances
Ещё один осиротевший `</div>\`;` в refreshInstances() — пропустили в v1.1.5.
### v1.1.7 — перенос create-btn после params
Кнопка «Создать» была внутри карточки инстансов → перенесена после params-area, перед history-card.
### v1.1.8 — колонка типа инстанса
displayName | svc | status — три колонки в списке инстансов.
### v1.1.9 — dataDescriptor раскрытие
Вместо одного JSON-поля для map-fixed → отдельные поля для каждого sub-параметра.
### v1.1.10 — реальный svc вместо currentSvcName
Использовать `i.svc` из каждого инстанса, а не `currentSvcName` (выбранный сервис). Заголовок «Создание: Redis». Красный required для вложенных полей.
### v1.1.11 — normalize valueList CSV→array
Nubes API отдаёт valueList как CSV-строку, а фронтенд ждал массив. `_normalize_value_list()` конвертирует.
### v1.1.12 — Sonnet: NameError fix
Пропущен импорт `get_params_with_current_values, _normalize_value_list` в api_test.py. JS: `.catch()` + `Array.isArray()` проверка.
### v1.1.13 — подсветка сервиса, динамический текст кнопки, defaultValue в dataDescriptor
`.svc-item.active` → `#dbeafe`. Кнопка: «+ Создать новый инстанс Redis». `defaultValue` прокидывается из API в dataDescriptor.
### v1.1.14 — serviceId фильтр + svcShort displayName + descr + удаление дубликата эндпоинта
Фильтр инстансов по serviceId (убран в v1.1.16). displayName: `autotest-redis-x7k`. descr: "created by autotest v...". Удалён мёртвый /api/operations из api_test.py.
### v1.1.15 — динамический stages-box
Этапы вставляются под инстансом, для которого идёт операция (не в params-area).
### v1.1.16 — убран serviceId фильтр, сортировка + скролл
Фильтр заменён на сортировку: svc A→Я, дата новые сверху. inst-list с max-height скроллом.
### v1.1.17 — fix sort TypeError
`-строка` → TypeError. Заменено на два корректных sort().
### v1.1.18 — stages для CREATE после create-btn
Для новых инстансов stages-box вставляется после кнопки «Создать», а не в inst-list.
### v1.1.19 — Terraform step 6: required+default params
Досылка required-параметров с defaultValue (шаг 6 Terraform) + validate-cfs.
### v1.1.20 — fix _client() → get_client()
Старый баг: `_client()` не существовал → NameError в поллинге статуса.
### v1.1.21 — 6 fixes по код-ревью Sonnet + Opus
`_finish_op` args (False для is_delete), api_history try/finally, pool.py _initialized после init_db, XSS _esc(), cookie secure=True, let currentSvcShort.
### v1.1.22 — currentSvcShort scope
`let` внутри selectService делал переменную локальной → вынесена на уровень модуля.
### v1.1.23 — None defaultValue для map-fixed
Когда defaultValue=None → собираем JSON из sub-param defaults. Добавлен `import json`.
### v1.1.24 — шаг 6 из РЕАЛЬНОЙ операции
`GET /instanceOperations/{opUid}?fields=cfsParams` вместо шаблона. `paramValue or defaultValue`.
### v1.1.25 — полная Terraform parity
`_normalize_value()` (normalizeUniversalValueV6), `_resolve_ref_svc()` (resolveRefSvcParamValues), `_send_params_terraform()` — шаги 3-7 для CREATE и non-CREATE. Таймаут 300→1800. svc в fields.
### v1.1.26 — handle empty validate-cfs
JSONDecodeError при пустом ответе validate-cfs → handled.
### v1.1.27 — busy lock
Запрет параллельных операций. `let busy=false` → true в executeOp → false в setFinishedState. runOp/startCreate игнорируются при busy. toggleInstance показывает «⏳ операция выполняется...».
### v1.1.28 — HttpClient.get() resilient to empty body
`r.json()` → JSONDecodeError на пустом теле. Возвращаем `{}` если тело пустое. Универсально для всех GET.
## Agent consultations
- Sonnet 4.6: 3 раунда (code review, Terraform diff, full review)
- Opus 4.8: 1 раунд (full review, нашёл detect_endpoint overhead и multi-worker проблему)
- Итог: ~15 багов найдено и исправлено
## Ключевые архитектурные изменения
1. CREATE flow полностью скопирован с Terraform (9 шагов)
2. normalizeUniversalValueV6 — нормализация пустых значений по типу
3. resolveRefSvcParamValues — резолв refSvcId в UUID
4. Non-CREATE тоже получил шаги 3-7
5. busy lock на фронтенде
6. HttpClient.get() устойчив к пустым ответам
## Осталось
- detect_endpoint оптимизация (3 вызова вместо 1)
- _op_results race condition (мьютекс)
- Мёртвый код: runner.py, api.py LEGACY