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

6.0 KiB
Raw Permalink Blame History

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 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