diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 9cef41c..345d15d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,5 +1,11 @@ # ⛔ ПРАВИЛА ПРОЕКТА AUTOTEST +## ⛔ ЗАПРЕТ НА sed .... ПОЛНЫЙ ЗАПРЕТ НА SED +Только `replace_string_in_file` или `create_file`. sed не использовать НИКОГДА. +НИКОГДА НЕ ИСПОЛЬЗОВАТЬ SED !!!!! + + + ## ⛔⛔⛔ «ГОВОРИ» — ТОЛЬКО ПОНЯТЬ И ЖДАТЬ Если пользователь пишет **«говори»** — это значит: 1. Уяснить что он имел в виду @@ -51,8 +57,6 @@ Все пути в описаниях, планах, чате — от корня ФС. ❌ `STANDS/dev/...` → ✅ `/home/naeel/nubes/autotest/STANDS/dev/...` -## ⛔ ЗАПРЕТ НА sed -Только `replace_string_in_file` или `create_file`. sed не использовать НИКОГДА. ## ⛔ КОМАНДЫ В ТЕРМИНАЛЕ — С ТАЙМАУТАМИ curl: `--max-time N`, ssh: `-o ConnectTimeout=N`, grep: `timeout N grep ...` diff --git a/HISTORY/2026-07-29-session.md b/HISTORY/2026-07-29-session.md new file mode 100644 index 0000000..f81c176 --- /dev/null +++ b/HISTORY/2026-07-29-session.md @@ -0,0 +1,96 @@ +# 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 +Осиротевший `\`;` после sed в app.js → JS syntax error → весь фронтенд сломан. + +### v1.1.6 — fix orphan in refreshInstances +Ещё один осиротевший `\`;` в 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