Commit Graph
582 Commits
Author SHA1 Message Date
Repinoid 9c1acabb4e docs(HISTORY): разбор сбоев создания PG в TEST CRUD — только проверенные факты
Зафиксировано по журналу операции 181D3B1D (GET /instanceOperations/<uid>?fields=stages):
падение на шаге «1. Валидация» → «Проверка ёмкости рес платформы»:
«Невозможно развернуть приложение в данной ресурсной платформе».
errorLog «Invalid JSON String» сути не отражает.

Отдельно отмечено, что не доказано (snake_case в postgres_conf, причины операций
4D60A0B6 и 5AAF1E39 — их stages недоступны, API отдаёт 404) и что моё утверждение
в коммите e3182c3 было предположением, выданным за факт.
2026-10-01 12:36:28 +03:00
Repinoid e3182c3f98 stand(TEST/CRUD): postgres_conf — ключи camelCase и значение ''
Провайдер отправляет postgres_conf на платформу как есть (resources_core.FormatString
возвращает строку без перевода имён), поэтому ключи обязаны совпадать со спекой:
postgresConf.paramName / postgresConf.paramValue. С snake_case (param_name/param_value)
платформа падала с "Invalid JSON String" (операция 5AAF1E39-8812-4994-AD14-78D51ED2077D).

Значение paramValue взято '' — как в HAR/pgmodify.har и в TEST_STAND/PG/resources.tf.
План проходит: 6 to add, exit 0.
2026-10-01 12:28:52 +03:00
Repinoid 7f0931d035 stand: снять sensitive с realm и s3_uid — это не секреты
Из-за sensitive = true в plan вместо значений печаталось "(sensitive value)".
Убрано в: DEV_STAND/CRUD, DEV_STAND/POSTGRES, TEST_STAND/POSTGRES, TEST_STAND/PGwNewRegistry.
api_token остаётся sensitive везде — он действительно секрет.
2026-10-01 12:22:32 +03:00
Repinoid 4b31eca807 stand(TEST/CRUD): var.realm больше не sensitive
realm — не секрет, но из-за sensitive = true в plan вместо имени печаталось
"(sensitive value)". Теперь видно resource_realm = "k8s-3-sandbox-nubes-ru".
Плана это не меняло: plan по-прежнему 6 to add, exit 0.

Прочие sensitive оставлены как есть: api_token (секрет), vault_secrets (платформа).
2026-10-01 12:20:23 +03:00
Repinoid 5e0df46dc8 stand(DEV/CRUD): привести к варианту TEST — adopt_existing_on_create, без git_revision
- lucee/flask/nodejs: добавлен adopt_existing_on_create = true (усыновлять существующий
  инстанс вместо падения с «ресурс с таким именем уже существует»)
- удалены git_revision и одноимённые locals (в TEST их нет)
- git_path: Nail -> terraform (проверено по HTTP: /Nail/<repo> отдаёт 301 на /terraform/<repo>)
- terraform.tfvars.example: комментарий s3_user_uid = UUID S3-пользователя

Имена ресурсов и домены оставлены dev-своими (уникальными). realm dev = k8s-3-sandbox-nubes-ru.

Проверка API dev-стенда (/instances?isDeleted=false): 9 инстансов, ни одного под сервисы
89 flask / 94 lucee / 95 nodejs и PostgreSQL; поиск crud|pg4|lucee|flask|nodejs -> 0. Коллизий нет.

НЕ исправлено (не моя правка, есть и в HEAD): terraform validate падает на nubes_nodejs.json_env —
в спеке dev-стенда у сервиса 95 объявлен обязательный sub_param DB_PASS, поэтому схема требует
объект { db_pass }, а конфигурация передаёт строку jsonencode().
2026-10-01 10:45:15 +03:00
Repinoid 5faf33c43d chore(test-stand): закомментировать vm.tf — vApp (26) и ВМ (28) исключены из стенда
vm.tf целиком обёрнут в блочный комментарий /* … */ со пояснением причины:
в test инстанс vApp не прошёл валидацию схемы (нужен reconcile). Вернуть —
удалить обрамляющие строки.

Проверено: terraform fmt -check OK, validate Success,
plan = 1 to add (только Штурвал); инстансов vApp/ВМ стенда в тенанте нет (все deleted).
2026-10-01 09:52:13 +03:00
Repinoid 4c3039146f fix(test-stand): поднять квоту внешних IP 10 -> 12 + документация провалов apply
Первый apply в test: vdc/edge/org_ip/snat создались; упали:
- Штурвал: 'свободных Ip в тенанте WZ03709-iaas: 1, необходимо 2' — на NaeelOrg
  было count=10, часть адресов держит кластер iot-naeel. Поднято до 12.
- vApp: 'не удалось валидировать схему инстанса' -> not created (вероятно плавающая,
  при повторе — reconcile).

После destroy (владелец): fullpipe-vdc = suspended (suspend_on_destroy),
fullpipe-edge = running (keep_on_destroy), локальный state пуст.

Порядок: apply -target=nubes_vc_org_ip_allocation.org_ip -> полный apply.
HISTORY/2026-10-01_test_stand_fpipegmail.md дополнен разделом с ошибками и решением.
2026-10-01 08:45:50 +03:00
Repinoid f7d6eb4688 feat(test-stand): TEST_STAND/FPipeGmail — копия dev-примера под test-стенд
Создана папка (без .terraform/state/lock — это состояние dev). Изменены параметры:
- versions.tf: nubes-dev/nubes 2.0.1 -> nubes-test/nubes 3.0.0;
- variables.tf: api_endpoint -> lk-api-gateway-test.ngcloud.ru;
- terraform.tfvars: organization=NaeelOrg (найдена через API, svc 19), ip_count=10
  (в test на орге уже выделено 10 IP), storage SSD (в test vDC строят на SSD);
- shturval.tf: shturval-test1 / shturval-test-01 / workers-shturval-test.

Коллизии проверены: в test заняты naeel-vdc, 'VDC для кластера iot-naeel',
naeel_vc_nsxt, 'Edge для кластера IOT naeel', 'Кластер Kubernetes [iot-naeel]' —
наши имена (fullpipe-vdc/-edge/-vapp-02, web02, shturval-test1) свободны.

Проверено: terraform init (3.0.0), fmt -check OK, validate Success,
plan = 7 to add / 0 change / 0 destroy. apply НЕ запускался.

Документация: HISTORY/2026-10-01_test_stand_fpipegmail.md
2026-10-01 08:21:08 +03:00
Repinoid 8eae7f383d release: пересобраны и перезалиты X.0.0 по всем стендам (prod 1.0.0, dev 2.0.0, test 3.0.0)
Полный цикл 03 (01 YAML -> 02 Go/доки -> сборка 3 платформ -> GPG -> S3) по каждому стенду
начиная с YAML. Профиль dev: VERSION 2.0.1 -> 2.0.0 (db9d93e).

Проверено: sha256 залитого linux-бинарника == локальной сборке на всех трёх
(prod 9c20e0a7, test 9cdfa8b8, dev 86c667f7); по 5 объектов на версию; YAML 36/36/40.

Отличие от заливки 30.09: теперь в сборки вошли 8 коммитов правок ядра/генераторов
(core, resources_core, resource-generator, check_schema_names + вызов в 03).
Документация: HISTORY/2026-10-01_release_x_0_0_all_stands.md, VERSIONS.md.
2026-10-01 08:12:13 +03:00
Repinoid bf1b083775 docs(history): полное зеркалирование ~/TF на сервер 213
rsync -a --delete локально → vps:~/TF/: передано 4 430 файлов (341.7 МБ),
создано 3 987, удалено 139 объектов, 4.9 МБ/с, ~1 мин.
Было на 213: HEAD 33672e05 (19.09), 19 незакоммиченных файлов, 3 stash.
Стало: HEAD db9d93e (= локальный), 6 веток, 2 stash, 8 808 файлов = 8 808,
diff списков файлов с LC_ALL=C — 0 строк.
Слепок не делался — по указанию владельца; удалённые черновики 20.09 и stash перечислены.
2026-10-01 08:11:01 +03:00
Repinoid db9d93e1d0 chore(dev): VERSION 2.0.1 -> 2.0.0 перед перезаливкой X.0.0 2026-10-01 07:37:22 +03:00
Repinoid 058d0a6991 docs(history): ошибка операции Edge — сбой DNS платформы при init OpenTofu backend
jlib.tofu не смог зарезолвить provider vmware/vcd через terraform-mirror.yandexcloud.net:
'internal DNS 169.254.25.10:53: server misbehaving' -> 'Edge не удалось найти в Cloud Director'
(операция не выполнилась). Проверено извне: зеркало доступно (DNS резолвится, index.json HTTP 200,
0.88s) => проблема во внутреннем DNS/сети платформы, не в зеркале.
2026-09-30 22:12:46 +03:00
Repinoid 6d8383dbca docs(history): ALB на Edge не отключается из-за оставшихся NSX-T LB Pools
Ошибка модификации Edge nsx_WZ03709-saas-tbxiw8kt: FORBIDDEN 'Cannot disable load
balancer ... since there are Pools'. Пулы остались от неудалённых CAPvcd/Штурвала;
пока они есть — ALB не отключить и Edge не удалить. Клиентских путей нет,
нужна платформа (заявка расширена: CAPvcd + LB Pools + затем Edge).
2026-09-30 22:06:54 +03:00
Repinoid 0a6b39ad45 docs(history): повторный delete Штурвала shturval-dev1 падает с NPE бэкенда
Владельцу не удаётся удалить Edge: платформа блокирует из-за инстансов CAPvcd
(shturval-dev-01), хотя кластер удалён из ЛК 25.09.

Установлено (API dev): shturval-dev1 (svc 150, uid 05ae1dbc-…) — deleted, операций нет;
тенанта WZ03709-saas в dev нет (единственная организация — kontra).

Попытка доудаления (по указанию владельца):
POST /instanceOperations (svcOperationId=109, delete) -> 201, run -> 201,
результат: isSuccessful=false, errorLog="Cannot invoke \"String.length()\" because
\"text\" is null" — NPE бэкенда. Остатки CAPvcd не вычищены.

Вывод: только техподдержка (MAN vc_org прямо это предписывает).
2026-09-30 22:02:05 +03:00
Repinoid 56ebab38f7 feat(tools): страж имён атрибутов схемы + вызов в 03 (fail-fast до заливки)
Инцидент 2026-09-30 показал: невалидное имя атрибута (s3-inst) проходило генерацию,
сборку и заливку, а ломалось только у пользователя (Terraform отвергает схему целиком).

- TOOLS/scripts/check_schema_names.sh: проверяет все tfsdk:"..." в сгенерированном Go
  на [a-z0-9_]; exit 1 при нарушении, с подсказкой про helpers.ToSnake.
- 03_build_and_upload_provider.sh: вызов стража после 02 (до сборки и заливки).
- ARCHITECTURE.md: страж добавлен в список enforced-скриптов.
- HISTORY: пункт 'не закрыто' заменён на 'закрыто' с проверками.

Проверено: dev/test/prod -> OK; искусственный пример (tfsdk:"s3-inst") -> exit 1.
2026-09-30 21:55:07 +03:00
Repinoid fbc20eea61 fix(generator): нормализация имён атрибутов (fail-safe для кодов с дефисами)
Инцидент: в 1_dummy (API dev) появились коды s3-inst / s3-ref-root. ToSnake не убирал
дефисы -> в схему уходило tfsdk:"s3-inst" -> Terraform отвергает такие имена и НЕ
загружает схему провайдера целиком (plan/apply падали).

- helpers.go: ToSnake завершается sanitizeAttrName ([a-z0-9_] допустимы, остальное -> _).
  Код для API не меняется: json:"s3-inst" в генерате сохранён.
- Проверено: в generated/dev/go нет tfsdk-имён с недопустимыми символами;
  go build OK; go test ./internal/... -short PASS.
- DEV_STAND/FPipeGmail: провайдер 2.0.23 -> 2.0.1; после сброса lock/кэша
  terraform validate -> Success.
- HISTORY: описан инцидент, причина (данные API изменились после утра), фикс и
  особенность: перезапись артефакта под тем же номером требует сброса lock
  (init -upgrade хеш не пересчитывает).

dev 2.0.1 перезалит (sha256 linux d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f515bc725e407).
2026-09-30 21:42:37 +03:00
Repinoid daece181d7 chore(dev-stand): FPipeGmail — переименован vm.tf1 -> vm.tf, новые имена vApp/ВМ
Файл ВМ включён в конфигурацию (был .tf1 — Terraform его не читал).
Дефолты переименованы, т.к. инстансы со старыми именами есть в облаке,
сломаны и не удаляются:
- vapp_resource_name: fullpipe-vapp      -> fullpipe-vapp-02
- vapp_name:          fullpipe-vapp-01   -> fullpipe-vapp-02
- vm_resource_name:   fullpipe-vm-01     -> fullpipe-vm-02
- vm_name:            web01              -> web02

Проверено: terraform validate -> Success (в DEV_STAND/FPipeGmail).
2026-09-30 21:32:11 +03:00
Repinoid 00b59d138a release(dev): 2.0.1 — правки ядра залиты в dev-реестр
Цикл 03 (01+02 -> сборка linux/windows/darwin -> SHA256SUMS -> GPG -> S3) по dev.
Версия 2.0.1 (ранее удалена при чистке, создана заново).

Проверено:
- sha256 локальной сборки == SHA256SUMS (linux/amd64, 13 172 824 B);
- GET /v1/providers/nubes-dev/nubes/versions -> содержит 2.0.1;
- download linux/amd64 2.0.1 -> HTTP 200;
- в S3 5 объектов (3 zip + SHA256SUMS + .sig), 37.92 MiB.

test и prod не перезаливались (правки ядра туда не включены).
Документация: VERSIONS.md, HISTORY/2026-09-30_dev_release_2_0_1.md.
2026-09-30 21:25:06 +03:00
Repinoid 99f963484b fix(core): idempotency pre-check без схемы — единый источник (live)
Код-ревью (раунд 5), п.1/6: pre-check брал схему из GET /instanceOperations/default/{opId},
а payload строился по живой схеме ?fields=cfsParams — два источника. default может
расходиться с живой => риск ложного пропуска modify.

Решение: pre-check вообще не запрашивает схему.
- modifierDesiredEqualsLive(ctx, uid, desired): сравнение по live-кодам
  (live[lower(code)]), единственный источник — state.params.
- Значения: похожи на JSON ({/[) — смысловое сравнение; иначе скалярное с
  нормализацией (null/"" -> ""; true/false без учёта регистра) — закрывает и
  регистр bool.
- Fail-safe сохранён: пусто/нет кода/ошибка live => modify выполняется.
- Удалены: fetchOperationSchemaByID, modifierValuesEqual, lookupLiveParam больше
  не участвует в pre-check (остаётся для досылки).
- Тесты переписаны (RawValuesEqual_Scalars/JSON, DesiredEqualsLive: 4 кейса).

Документация: TOOLS/ARCHITECTURE.md -> новый раздел «Modifier Idempotency»
(5 правил контракта); HISTORY — журнал раунда 5.

Проверено: go build ./... OK; go test ./internal/... -short PASS.
2026-09-30 21:07:49 +03:00
Repinoid 4197a76aba 1 2026-09-30 21:01:05 +03:00
Repinoid 575f1e29a4 docs(prompt): промпт Opus — код-ревью правок (раунд 5), ответ <= 10 строк 2026-09-30 20:55:05 +03:00
Repinoid b3cce5bb70 docs(history): раунд 4 — решения Q1-Q5 и их статус 2026-09-30 20:53:41 +03:00
Repinoid 7a6f6650c6 docs(architecture): зафиксированы решения Q1/Q2/Q4
- Q1: POST не ретраится (не идемпотентен; Idempotency-Key у API нет) — решение.
- Q2: при ошибке после POST /instanceOperations и до run операция остаётся черновиком;
  отмены нет (ни в коде, ни в HAR — DELETE /instanceOperations/{uid} отсутствует).
- Q4: единый контракт жизненного цикла — keep_on_destroy + suspend_on_destroy;
  delete_strategy (YAML) = маппинг на них (noop_warn/inverse/error).
2026-09-30 20:53:31 +03:00
Repinoid 9da97663c6 fix(Q5): сохранять instanceUid при ошибке после создания + partial state
Проблема: CreateGenericInstanceUniversalV6 при ЛЮБОЙ ошибке после создания инстанса
возвращал "", а шаблон Create при ошибке не писал ID в state => облачный инстанс
осиротевал (Terraform о нём не знает, повторный apply упирается в страж дубликатов).

- core/instance_create.go: ошибки после получения instanceUid возвращают uid вместе
  с ошибкой (POST /instanceOperations, пустой opUid, разбор cfsParams, resolve,
  отправка параметров, validate, run, waitForOperationFinish, ensureInstanceCreated).
  До создания uid — по-прежнему "".
- templates/instance.go: при err != nil и id != "" -> data.ID + resp.State.Set (partial
  state), затем AddError.
- client_test.go: TestCreateGenericInstance_KeepsUIDWhenOperationCreateFails,
  TestCreateGenericInstance_EmptyUIDWhenInstanceCreateFails.
- ARCHITECTURE.md: пункт про partial state.

Проверено: 02 (dev) + dev-materialize -> 40 файлов resources_gen содержат фикс;
go build ./... OK; go test ./internal/... -short PASS.
2026-09-30 20:53:14 +03:00
Repinoid 54f036e228 docs(history): замер Q3 — угадывание типа по имени не подтверждается
Замер по generated/dev/resources_yaml (40 файлов, только чтение):
- required-параметров: 852; с пустым data_type — 5;
- всего с пустым data_type: 12 (~1.2%); угадывание по имени даёт != '' только
  для 1 тестового (1_dummy.jsonExample) => гипотеза A4 не подтверждается,
  правка косметическая, не исправление дефекта.
2026-09-30 20:48:18 +03:00
Repinoid 5a0bb432ab docs: промпт Opus раунд 4 + журнал правок ядра/модификаторов
- NOTES/20_prompts/prompt_for_opus_remediation_round4.md — 5 коротких вопросов
  (retry POST, осиротевшая операция, zero-value по подстроке, единый словарь
  жизненного цикла, что упущено в ядре); ответ ≤ 25 строк.
- HISTORY/2026-09-30_core_and_modifiers_remediation.md — журнал: 6 коммитов,
  что отклонено (A3/A4/A5) и почему, что отложено (A2/B8/B9).
2026-09-30 20:42:30 +03:00
Repinoid 0e26e98384 docs(uuid-case): зафиксировать фактический механизм сохранения регистра
- core/refsvc.go: комментарий ссылался на несуществующий блок 'Restore user-provided
  casing' в instance.go. Факт: ref_svc исключены из read-back (InputField только при
  RefSvcId==0), UUID внутри JSON нормализуются при отправке (BuildJSON ->
  LowercaseUUIDsInText).
- docs/60_strategy/terraform_case_sensitivity_fix.md: §4 помечен как историческая
  справка (подхода originalVappUid в коде нет); актуальные §10-§11.

Проверено: go build ./... OK; go test ./internal/... -short -> PASS.
2026-09-30 20:38:37 +03:00
Repinoid 8519ba0f44 fix(modifiers): ImportState заполняет Required-атрибуты
Было: ImportState ставил только id + organization/nsxt_uid, оставляя Required-атрибуты
(vip_configure / ip_space_name) в null — Terraform не мог свести импорт с конфигом.

- nsxt_snat: importIpSpaceName(live) — live-значение, иначе канон no-needed.
- org_ip_allocation: importVipConfigure(live) — канонический JSON из live, иначе [].
- Чистые хелперы + тесты TestImportVipConfigure/TestImportIpSpaceName.

Проверено: go build ./... OK; go test ./internal/resources_core/... -short -> PASS.
Terraform import проверяется владельцем.
2026-09-30 20:36:47 +03:00
Repinoid ea75cac1a8 fix(core): idempotency pre-check сравнивает с live, а не с paramValue формы
Проблема: modifierDesiredEqualsCurrent сравнивает desired с paramValue из cfsParams
(дефолт ФОРМЫ операции), а не с состоянием инстанса. Пропуск modify на такой основе
может быть ложным (HAR/edge_.har: needEnableAVI paramValue=false при live=true).

- core/modifier_compare.go: добавлен modifierDesiredEqualsLive (источник —
  instanceLiveParams/state.params; неопределённость => не пропускаем) и хелперы
  modifierValuesEqual / modifierCodeMap; modifierDesiredEqualsCurrent переведён на них.
- core/operation_run_bycode.go: idempotent-путь использует live-pre-check; при ошибке
  чтения live modify НЕ пропускается.
- resources_core/nsxt_snat_resource.go: setSnat -> RunInstanceOperationUniversalByIdempotent
  (лишний modify на повторном apply больше не отправляется).
- modifier_compare_test.go: TestModifierDesiredEqualsLive (совпало/отличается/live недоступен).

Проверено: go build ./... OK; go test ./internal/core/... -short -> PASS.
2026-09-30 20:35:09 +03:00
Repinoid 383f8ea321 fix(core): транзиентный 401 теперь ретраится для GET
isRetryable (core/http.go): добавлен StatusUnauthorized (401) к {429,502,503,504}.
Gateway может временно отклонять валидный JWT — без этого одиночный 401 ронял
read/plan/поллинг.

- client_test.go: юнит-тест TestIsRetryable (401/429/502/503/504 = true; 400/403/404/500 = false).
- ARCHITECTURE.md: раздел API Resilience приведён к фактическому поведению
  (401 реализован; POST не ретраится намеренно).

Проверено: go build ./... OK; go test ./internal/core/... -short OK.
2026-09-30 20:33:48 +03:00
Repinoid c5a4499094 chore(tools): страж хардкодов покрыл provider/ + id сервиса в именованную константу
check_hardcoded_service_ids.sh:
- область расширена с TOOLS/ на TOOLS/ + provider/internal/ (кроме generated resources_gen/);
- второй паттерн: литеральный ref-service id в ResolveRefSvcParamValue/DisplayName(ctx, N,...);
- справка обновлена (убран удалённый serviceSpecificModifiers);
- сервис-специфичные литералы пояснены как 'именованные константы'.

org_ip_allocation_resource.go: ResolveRefSvcParamValue(ctx, 19, ...) -> svcIDVcOrg.

Проверено: bash TOOLS/scripts/check_hardcoded_service_ids.sh -> OK (exit 0).
2026-09-30 20:33:09 +03:00
Repinoid 047d53a67b docs(architecture): привести TOOLS/ARCHITECTURE.md в соответствие с кодом
- Core Principles 2-3: 'универсально/генерируется' отнесено к core/ и resources_gen/,
  а не ко всему сервис-коду.
- API Resilience: 401 НЕ ретраится (isRetryable = 429/502/503/504, только GET) —
  помечено как незакрытый разрыв со спекой.
- Exception Registry: убран удалённый реестр serviceSpecificModifiers
  (yaml-generator/main.go), описаны ручные модификаторы + несуществующий modifiers.yaml.
- Новый раздел 'Lifecycle Vocabulary': три несогласованных словаря destroy.
- Rules: 'two registries' -> один реестр + ручные ресурсы.
2026-09-30 20:32:29 +03:00
Repinoid 2c51b0392d docs(prompt): промпт для DeepSeek Pro — план правок кода/доков/архитектуры + план проверки
DeepSeek верифицирует гипотезы групп A (ядро: 401/POST-ретраи, обрыв modify, zero-value
fallback, нормализация Read) и B (модификаторы/спека), затем даёт план правок кода, правок
документации и архитектурных решений, трёхуровневый план проверки (юнит / plan-apply на
DEV_STAND/FullPipe / регрессия + стражи) и порядок работ по коммитам. Код не пишет — исполнять
будет Copilot. Журнал Opus-диалога дополнен ссылкой на этот шаг.
2026-09-30 20:20:31 +03:00
Repinoid 47e010edf3 docs(opus): дописаны пропущенные ходы журнала (Ход 10a, 12a, 14)
Записаны: запрос «твоё мнение?» по раунду 2; сообщение с путём к файлу раунда 3 и
отменённый уточняющий вопрос агента; запрос «мнение?» по раунду 3 и полное мнение агента
(в т.ч. сомнение в абсолютном выводе «401 не ретраится нигде» и в трактовке отсутствия
ретрая POST как дефекта). Статус обновлён: чат с Opus исчерпан по токенам.
2026-09-30 20:18:41 +03:00
Repinoid 96adf958bc docs(opus): раунд 3 отвечен — запись в журнал диалога
Дословно сырой лог и отчёт: 5 находок по ядру — 401 не ретраится (расхождение с
ARCHITECTURE.md:105-108), ретрай только для GET, обрыв modify после создания операции,
zero-value fallback по подстроке имени, нормализация Read только для jsonEnv/ref_svc.
Находки 1-3,5 не подтверждены замером.
2026-09-30 20:15:43 +03:00
Repinoid e46bc35b98 docs(opus): раунд 3 — фокус переведён на сам провайдер (устойчивость/корректность)
Жёсткий бюджет ради токенов: ≤10 файлов, ≤5 находок по ≤3 строки, плюс одна строка
«что проверяемо только замером». M6 снят, модификаторы — фон. Границы: ядро, resources_core,
шаблоны/хелперы генератора. В журнал добавлены крит-мнение по раунду 2 и текст раунда 3.
2026-09-30 20:11:24 +03:00
Repinoid e1e45423fa docs(opus): раунд 2 отвечен + вводная пользователя — запись в журнал диалога
Дословно: сырой лог и дельта Opus (M1 сверка номеров строк, M2 факт из check_hardcoded_service_ids.sh,
M3 снятие S4 и переклассификация S2, M4 шкала R2>R3>R6>R5, M5 разбор Read/вечного diff,
U1 modifiers.yaml не существует, U2 тройной словарь жизненного цикла, U3 варианты, M6 запрос двух файлов).
Плюс указание пользователя: модификаторы — небольшая часть, главное — сам провайдер.
2026-09-30 20:07:34 +03:00
Repinoid ea75507fe4 docs(opus): раунд 2 — замечания к отчёту Opus + запись в журнал диалога
Замечания M1–M5 (сверка номеров строк, нарушение «без догадок» в R2, натянутые S2/S4,
приоритет R5, пробел по устойчивости Read/вечный diff) и U1–U3 (modifiers.yaml не существует,
рассинхрон suspend_on_destroy/keep_on_destroy, корневая причина ручных модификаторов).
Разрешён дополнительный список файлов; право копать глубже передано Opus.
2026-09-30 19:59:44 +03:00
Repinoid dc85e7b4e0 docs(opus): полная запись диалога 2026-09-30 — промпт + отчёт Opus по архитектуре и модификаторам
Дословно, без сокращений: задание пользователя, разведка агента, содержимое промпта,
сырой лог сессии Opus и его отчёт (расхождения спека↔код S1–S5, риски R1–R6),
открытый вопрос Opus. Статус: диалог не завершён.
2026-09-30 19:57:36 +03:00
Repinoid 752244fa26 docs(prompt): промпт для Opus 4.8 — анализ архитектуры провайдера + ресурсов-модификаторов
Задача: разбор универсальной архитектуры и слоя модификаторов (nubes_vc_org_ip_allocation,
nubes_vc_nsxt_snat). Жёсткие границы доступа (запрет на HISTORY/NOTES/TMP/HAR/docs и git-историю),
исчерпывающий список из 22 файлов (1 спека + код + YAML-спеки + пример применения),
сжатый формат ответа, режим диалога с правом задать уточняющий вопрос.
2026-09-30 19:44:57 +03:00
Repinoid bed269cf27 release: перезаливка провайдера во все 3 стенда — prod 1.0.0, dev 2.0.0, test 3.0.0
Полный цикл 03 (01+02 → сборка 3 платформ → GPG → заливка S3) по каждому стенду:
- prod nubes/nubes 1.0.0;
- dev  nubes-dev/nubes 2.0.0  (VERSION в profile.env: 2.0.24 → 2.0.0);
- test nubes-test/nubes 3.0.0.

Проверено: sha256 залитого linux-бинарника == локальной сборке на всех трёх;
API /versions отдаёт 1.0.0 / 2.0.0 / 3.0.0; в S3 по 5 объектов на версию.

Последствия (приняты владельцем): версии X.0.0 перезаписаны → у пользователей
с .terraform.lock.hcl будет checksum mismatch (лечится terraform init -upgrade).
Подробности: HISTORY/2026-09-30_release_1_0_0_2_0_0_3_0_0_all_stands.md
2026-09-30 19:16:48 +03:00
Repinoid fd3ab32534 chore(dev-registry): физически удалены версии провайдера старше 2.0.21
В dev-реестре (s3://nubes-terraform-registry/.../nubes-dev/nubes/) удалены
версии 2.0.0–2.0.20 — 21 версия, 105 объектов (~800 MiB). Бакет un-versioned.

Осталось: 2.0.21, 2.0.22, 2.0.23, 2.0.24 (20 объектов).
Проверено: mc ls (20 объектов), API /versions (4), download 2.0.23/2.0.24 → HTTP 206
(ZIP), 2.0.0/2.0.20 → HTTP 404; nubes-test (3.0.0) и nubes (1.0.0) не тронуты.

Резервные копии zip не делались (прямое указание «стереть физически»);
восстановление — только пересборкой из git-истории.
Документация: HISTORY/2026-09-30_dev_registry_prune_versions.md, VERSIONS.md.
2026-09-30 10:50:45 +03:00
Repinoid 46dc548af4 docs(history): UUID-регистр — процедура релиза и карта точек нормализации
Перенесено из служебной памяти VS Code в файл репозитория:
- пошаговая процедура релиза dev (VERSION → 03 → curl-проверка → VERSIONS.md →
  dev-materialize), включая, что доки в реестр не публиковались;
- карта: нормализация нужна в двух местах (сравнение и отправка BuildJSON),
  перечень функций и правила (lower() — костыль; план целиком не нормализуем).
2026-09-30 10:32:22 +03:00
Repinoid 89bfb46b1c docs(history): этап 4 — перепроверка после перегенерации + подводные камни
Перенесено в файл репозитория (а не только в служебную память VS Code):
- результаты полной перегенерации и перепроверки всех трёх стендов;
- подводные камни: случайные default от API (детектор дрейфа по побайтовому
  сравнению не работает); случайный default вшивается в Go-код → drift 15 файлов
  сразу после перегенерации; generated/<стенд>/go|docs стареют после шага 01;
  403 без браузерного User-Agent (DDoS-Guard);
- актуальная карта пайплайна, токены, что удалено и что оставлено осознанно.
2026-09-30 10:30:41 +03:00
Repinoid 5d29010352 docs(history): этап 3 — сверка списков стендов с облачным каталогом
Зафиксирована методика: истина = GET /services?isProductionReady=true
(без фильтра API отдаёт все сервисы платформы, включая DEPRECATED).
Результаты по dev/test/prod и исправление prod (Vault).
2026-09-30 10:13:35 +03:00
Repinoid a68a36a0d2 fix(config): prod — включить Vault (151 k8sOpenbao) по сверке с облачным каталогом
Сверка TOOLS/config/prod/services_list.txt с облачным каталогом
(GET /api/v1/svc/services?isProductionReady=true → 36 сервисов):
- активных в файле было 35, лишних нет, но не хватало 151 k8sOpenbao (Vault);
- комментарий «нет в PROD UI» устарел: сервис отдаётся каталогом prod
  (isProductionReady=true, resourceRealmTypeId=3).

После правки: 36 активных = 36 в облаке, перегенерация prod дала 36 YAML,
включая 151_k8s_openbao.yaml. dev (40/40) и test (36/36) расхождений не имели.
2026-09-30 10:13:13 +03:00
Repinoid 5e1a6f06bc docs(history): этап 2 — удаление мёртвого легаси (что удалено, что оставлено)
- раздел «Этап 2» с таблицей удалённых файлов и обоснованием;
- зафиксировано, что НЕ удалено и почему (index.cfm-совместимость,
  справочная копия DOCS_PIPELINE/publish-docs.sh, исторические документы);
- результаты проверок после удаления (bash -n, smoke-прогон 01 dev).
2026-09-30 09:53:57 +03:00
Repinoid c822ae2f2a docs: актуализировать ссылки после удаления общего services_list.txt
- README.md, HOW_TO/README.md, HOW_TO/DEVOPS_BUILD_PIPELINE.md,
  HOW_TO/HOWTO_ADD_NEW_SERVICE.md, DOCS_PIPELINE/README.md:
  TOOLS/config/services_list.txt → TOOLS/config/<стенд>/services_list.txt;
- HOW_TO/HOWTO_ADD_NEW_SERVICE.md: блок «Быстрый старт» переписан с
  устаревших devops/-путей на канонические (./TOOLS/scripts/*, generated/<стенд>/);
- scripts/publish-doc-page.sh: примеры devops/profiles/<стенд> → TOOLS/config/<стенд>;
- .gitignore: убрана мёртвая строка devops/profiles/*/generated/.

Проверено: bash -n для всех TOOLS/scripts/*.sh и scripts/publish-doc-page.sh — OK.
2026-09-30 09:50:37 +03:00
Repinoid 1e796c8eb1 chore(tools): удалить мёртвые легаси-скрипты и общий services_list.txt
Удалено (100% мёртвое, ничего не вызывает):
- TOOLS/scripts/10_yaml_stability_run.sh
- TOOLS/scripts/11_yaml_stability_run_latest.sh
- TOOLS/scripts/12_generate_yamls_latest.sh
- TOOLS/scripts/13_generate_yamls_clean.sh
- TOOLS/scripts/02_generate_resources_and_docs_template_v2.sh
- TOOLS/config/services_list.txt (общий список: код его не читает, а как
  «объединение» он устарел — в нём активен id 27, который в test/prod
  закомментирован как «нет в UI», и отсутствуют 87/88/97/153 из dev)

Все ссылки в документации указывали на профильные списки либо будут
исправлены отдельным коммитом.
2026-09-30 09:50:28 +03:00
Repinoid cbd559d767 docs(tools): канонический пайплайн + история ужесточения генерации YAML
- TOOLS/README.md: раздел «Канонический пайплайн (порядок шагов)» и описание
  безопасной генерации (staging → атомарная замена, бэкапы, маркер .stand);
- TOOLS/ARCHITECTURE.md: ссылки devops/… → TOOLS/config/<stand>/…;
- HISTORY/2026-09-30_yaml_pipeline_hardening.md: полная история изменений
  (что было не так, что сделано, прогон по стендам, коммиты, проверки).
2026-09-30 09:39:26 +03:00