Commit Graph
111 Commits
Author SHA1 Message Date
Repinoid 4cb3645ab8 docs(history): раздел о синхронизации документов по итогам ревью + моя ошибка
Проверено: разделы 1-8, факты (166060 байт, сравнение разделов) — из проверок.
2026-10-02 08:58:38 +03:00
Repinoid 39af8bfcbf docs(history): в раздел 6 добавлены убранные команда и фраза; ошибка в раздел 7
Проверено: факты (161643 байта, нулевые вхождения) — из проверки живой страницы.
2026-10-02 08:52:28 +03:00
Repinoid 215e57baa8 docs(history): порядок разделов, чистка недоступного пользователю, мои ошибки
- новый раздел 6: «Быстрый старт» первым, описание ниже; убраны раздел про
  instanceOperations и ссылка на HISTORY/…; убраны ссылки на внутренний код
  (crud.go:171, refsvc_find.go:47), на строки apps/locals.tf:45,57,68 и абзац про
  прежние имена; со страницы убрано «смотрите журнал операции»;
- раздел про ошибки стал 7; добавлены три ошибки: нерабочий блок диагностики
  перенёс дальше, не проверив пригодность для читателя; много текста вперёд без
  согласования порядка.
Проверено: разделы 1-7 на месте, факты (162257 байт, нулевые вхождения) — из
проверки живой страницы.
2026-10-02 08:46:58 +03:00
Repinoid 02114bf195 docs(history): ревизия README «глазами юзера» + перезаливка страницы + своя ошибка
- в таблицу правок добавлен коммит 272d405 (клонирование, шаг 4 с адресами,
  диагностика, суффикс nodejsk8s);
- в раздел про ручную публикацию: страница перезаливалась дважды, после правок
  на живой странице 167269 байт, cmp с локальной сборкой совпал;
- в «Мои ошибки»: склейка двух строк таблицы «Файлы» из-за замены строки вместе
  с переводом строки (обнаружено и исправлено); отсутствие в README входа
  (клонирование) и выхода (адреса приложений).
Проверено: все четыре вставки на месте, структура файла цела.
2026-10-02 08:34:18 +03:00
Repinoid 25f9114950 docs(history,todo): ручная публикация страницы CRUD на TEST + отметка в TODO
HISTORY (раздел 5, раздел с ошибками стал 6):
- сборка test-стенда без публикации (S3CFG_REGISTRY в несуществующий путь —
  штатного флага «build-only» у 04 нет);
- заливка в S3 (алиас regdocs из secrets/.s3cfg_registry) и копирование на ВМ
  в /var/www/tf-docs/nubes-test/curated/crud/three_apps/ — сайт отдаёт nginx с ВМ,
  а не из S3;
- проверка: живой URL 200, 163789 байт, cmp с локальной сборкой совпадает,
  version 3.0.0, 5.0.5 нет;
- ограничение: в меню других страниц ссылки нет (их навигация старая);
- заметка: ssh naeel@5.172.178.213 без алиаса не пускает, нужен алиас vps;
- в «Мои ошибки» добавлена неверная формулировка про домены.
TODO: добавлен раздел «Что уже сделано вручную (временно)» и следствие — полная
пересборка нужна, чтобы пример появился в меню, а версии совпали с profile.env.
Проверено: разделы 1-6 в HISTORY, структура TODO на месте, блоки кода парные.
2026-10-02 08:29:50 +03:00
Repinoid 07773ed963 docs(todo): пересборка и публикация документации стендов — отдельная работа
В docs/TODO/docs_publish_stale_versions.md зафиксировано:
- проблема: на nubes-test в примерах версия 5.0.5 (в profile.env 3.0.0), на
  nubes-dev 2.0.23 (2.0.0), prod 1.0.0 совпадает;
- причина: {{VERSION}} подставляется при сборке из profile.env (04:185-198),
  сайты не пересобирались после смены нумерации 2026-09-03;
- что сделать: 04 --profile dev/test + заливка mc mirror с ВМ 5.172.178.213
  (команды из DOCS_PIPELINE/README.md), затем проверка версий на живых страницах;
- что уедет заодно: правки curated/crud/three_apps.md (ab9f7d2, 39849bf),
  страницы k8svalkey/k8s_ziti_controller/nodered/nifi;
- предупреждения: публикация = деплой (только по команде), публикация без версии
  в URL со стиранием старых файлов, риск root-овой сборки site/.
В HISTORY-записи раздела 4 добавлена ссылка на этот TODO.
Проверено: 2 блока кода (чётно), раздел «Связанные документы» на месте.
2026-10-02 08:22:07 +03:00
Repinoid 6015a7ebe8 docs(history): проверка опубликованных сайтов — версии провайдера устарели
Проверено по запросу владельца (страница nubes-test/curated/postgres/pg_user_db):
- nubes-test: на сайте 5.0.5, в profile.env 3.0.0 — устарел;
- nubes-dev: на сайте 2.0.23, в profile.env 2.0.0 — устарел;
- nubes (prod): 1.0.0 = 1.0.0 — совпадает.
Причина: в исходнике плейсхолдер {{VERSION}} подставляется при сборке из profile.env
(04:185-198), значит сайты собраны до смены нумерации 2026-09-03 и с тех пор не
пересобирались. Подтверждение: на nubes-test нет страниц, которые есть на nubes-dev
(k8svalkey, k8s_ziti_controller, nodered, nifi), и нет сегодняшних правок
curated/crud/three_apps.md. Локальный site/ (28.09 09:40) — сборка dev, 5.0.5 в нём нет.
Публикацию не запускал: это деплой, ждёт команды.
Проверено: раздел на месте, нумерация разделов файла 1-5.
2026-10-02 08:20:47 +03:00
Repinoid 9d47149070 docs(history): отмечен пуш по всем репозиториям
Вместо раздела «Открытый вопрос» — таблица «Пуш»: tf_provider 4197a76..17ba645
(58 коммитов), tf_examples df44774..d9bc08f, tfnodejscrud 23338cb..3fdda9e;
остальные пять уже были синхронны. Там же зафиксировано, что переформатирование
views/index.ejs (3fdda9e) не меняло разметку и EJS-выражения.
Проверено: HEAD = origin/master по всем восьми репозиториям, незакоммиченного нет.
2026-10-02 08:16:06 +03:00
Repinoid 17ba64517e docs(history): запись о путях к репозиториям CRUD + оглавление обновлено
HISTORY/60_stands/2026-10-02_crud_repo_paths_terraform_org.md:
- что было неверно: Nail/tfluceecrud|tfflaskcrud|tfnodejscrud в tf_examples/CRUD
  (locals.tf и README.md) вместо terraform/*;
- таблица перепроверки всех путей анонимным git ls-remote: приложения CRUD — в
  terraform/*, IOT (tf-iot-*) и сам tf_examples — в Nail/*; старые адреса отдают 301;
- что проверено и оказалось верным: TEST_STAND/CRUD/apps/locals.tf,
  DEV_STAND/CRUD/locals.tf, docs/curated/crud/three_apps.md, локальные клоны;
- что добавлено в TEST_STAND/CRUD/README.md (раздел «Код приложений (git)», 3f05d79)
  и почему там нет git_revision (в стенде такого поля нет);
- открытый вопрос: коммит d9bc08f в tf_examples не запушен в gitea.
HISTORY/README.md: строка записи + счётчики 7->8 и 76->77.
Проверено: на диске 8 файлов в 60_stands и 77 всего — совпало со счётчиками.
2026-10-02 08:14:03 +03:00
Repinoid b32f087b39 docs(history): в запись CRUD добавлены коммиты про параметры юзера и уникальность имён
- в таблицу правок README: 7b63f12 (раздел «Что пользователь задаёт сам») и
  39849bf (тот же раздел на странице сайта);
- в раздел про страницу сайта: отметка о синхронизации и проверке diff;
- в «Мои ошибки»: дважды пропустил главное для новичка — какие параметры он задаёт
  сам и что имена/домены обязаны быть уникальными.
Проверено: файл читается, разделы на месте.
2026-10-02 08:08:49 +03:00
Repinoid d0c20f42a0 docs(history): запись о правках документации CRUD + оглавление обновлено
HISTORY/50_docs/2026-10-02_crud_docs_page_and_manual_pages_pipeline.md:
- правки README стенда (5fdbc31 раздел «Как это устроено» без натянутых терминов,
  6ef003b apply+destroy, 5674b86/b8f5238 справка по выходам pg и перенос в конец);
- переписанная страница сайта curated/crud/three_apps.md (ab9f7d2): таблица «было -> стало»;
- разбор пайплайна: что копируется в docs_dir (04:157-173), запрет использовать docs/
  целиком (04:94), docs_dir = generated/<стенд>/docs (04:95-98), nav/exclude_docs
  (mkdocs.yml:52 и 4-15), подстановка плейсхолдеров (04:182-198), публикация (04:344);
  два способа публиковать ручные страницы: A (в docs/curated + nav — сделано) и
  B (добавить копирование в 04 — НЕ сделано, ждёт команды);
- раздел «Мои ошибки»: неверный термин decoupling, однобокая формулировка про destroy,
  скрытый факт про ручной creds.json.
HISTORY/README.md: строка новой записи в 50_docs, счётчики 9->10 и 75->76.
Проверено: в 50_docs 10 файлов, всего 76 файлов (кроме README), счётчики совпали.
2026-10-02 08:05:12 +03:00
Repinoid 669672af27 docs(history): README с описанием каждой папки и каждого файла
HISTORY/README.md:
- назначение архива и приказ владельца документировать всё, включая ошибки;
- соглашения: имя файла YYYY-MM-DD_<тема>.md, нумерация папок шагом 10 как в NOTES/,
  куда писать новую запись, почему диалоги с LLM держатся авторскими подпапками;
- таблица «папка -> о чём -> сколько файлов» (75 файлов);
- по каждому файлу строка с темой: 10_reviews (2), 20_releases (8), 30_provider (6),
  40_generator (3), 50_docs (9), 60_stands (7), 70_infra (4), 90_llm (36:
  gemini 2, OPUS 17, SONNET 17);
- помечены ⛔ четыре файла Opus от 2026-09-22 («ложный путь», отменено 2026-09-24);
- раздел «Известные особенности»: упоминания несуществующих 3006_0.md/3006_1.md
  и ссылка на старый внешний репозиторий tf_registry/HISTORY/HOWTO-UPLOAD.md;
- раздел «Реорганизация»: перенос 2026-10-02 и путь к резервной копии.

Проверено: все 75 файлов с диска присутствуют в таблицах README, лишних нет
(кроме намеренно упомянутого несуществующего имени), все ссылки-папки существуют.
2026-10-02 07:36:51 +03:00
Repinoid 2aa2946700 docs(history): обновлены перекрёстные ссылки на файлы HISTORY после переноса
Перенос в тематические папки сломал бы все ссылки, поэтому обновлены пути:
- HISTORY/OPUS/ -> HISTORY/90_llm/OPUS/, HISTORY/SONNET/ -> HISTORY/90_llm/SONNET/;
- 15 целевых файлов из корня получили свой тематический префикс
  (HISTORY/<файл>.md -> HISTORY/<папка>/<файл>.md) — в 33 файлах репозитория.

Затронуто вне HISTORY: README.md, VERSIONS.md, HOW_TO/DEVOPS_BUILD_PIPELINE.md,
NOTES/README.md, NOTES/10_plans/, NOTES/20_prompts/, NOTES/30_analysis/,
NOTES/40_chat_summaries/, docs/curated/{crud,postgres}, docs/help/dev-reference/,
docs/ops/TESTING.md.

Проверки после правки:
- ссылок вида HISTORY/<дата> без тематической папки не осталось;
- все пути HISTORY/*.md из markdown-ссылок существуют (кроме трёх упоминаний,
  которые не были файлами и до переноса: HISTORY/90_llm/OPUS/3006_1.md,
  3006_0.md — планировавшиеся имена в старых транскриптах,
  и HISTORY/HOWTO-UPLOAD.md — ссылка на старый внешний репозиторий tf_registry);
- ссылки по «голому» имени внутри 90_llm/OPUS/ остались корректными (соседние файлы).
2026-10-02 07:36:09 +03:00
Repinoid 2c196e8cc8 docs(history): раскладка HISTORY по тематическим папкам (75 файлов)
Было: 41 файл в корне HISTORY/ + авторские папки OPUS/ и SONNET/ (34 файла).
Стало — тематическая нумерация в стиле NOTES/ (10_, 20_, …):

  10_reviews/    ревью кода и разборы от LLM (2)
  20_releases/   заливки версий в реестр, чистки реестра, нумерация версий (8)
  30_provider/   ядро провайдера: архитектура, модификаторы, UUID, nested (6)
  40_generator/  генератор YAML/спеки, формат MAN (3)
  50_docs/       пайплайн документации, навигация, публикация, хостинг S3 (9)
  60_stands/     стенды и примеры: CRUD, FullPipe, Штурвал, TEST_STAND (7)
  70_infra/      реестр, API Gateway, DDoS-Guard, VPN/213, зеркала (4)
  90_llm/        диалоги и промпты с LLM вне тематики: OPUS/, SONNET/, gemini/ (34)

OPUS/ и SONNET/ перенесены как есть в 90_llm/ — чтобы не рвать пары
«бриф → ответ» внутри диалогов. Все переносы — через git mv (история сохранена).
Перед правкой: TMP/backup_2026-10-02/HISTORY_before_restructure.tar.gz.
Перекрёстные ссылки обновляются следующим коммитом.
2026-10-02 07:35:32 +03:00
Repinoid 9cc7b3f260 docs(history): находки по хостингу документации на S3 static website + версии развития
Новый файл HISTORY/2026-10-02_s3_static_website_docs_hosting.md:
- итог живой проверки: у Nubes включён static website на Ceph RGW (Squid),
  сайт целиком работает из S3 без ВМ; незакрыт только домен/TLS (принадлежит Nubes);
- единственное изменение состояния: PUT Bucket website (IndexDocument=index.html)
  на бакете terraform-registry + команда отката; статус — оставлено, решения владельца нет;
- найдено уже настроенным у Nubes: NoSuchWebsiteConfiguration до PUT (значит API есть),
  wildcard DNS *.s3-website.msk-1.ngcloud.ru -> 89.169.61.167, валидный TLS,
  порт 80 закрыт, bucket policy PublicReadGetObject (Principal *);
- проверки: анонимные 200 с размерами, совпадающими с index.html (148758/139835/150021),
  фактическая раскладка ключей docs/{nubes,nubes-dev,nubes-test}/nubes/…,
  объектный эндпоинт каталоги не умеет (403) — резолвинг только на website-эндпоинте;
- зафиксирована моя ошибка: 403 приходили на НЕСУЩЕСТВУЮЩИЙ ключ docs/nubes/index.html;
  уроки — сначала list-objects-v2, потом URL; сверять размеры и проверять анонимно+подписанно;
- побочные находки: list-buckets видит бакеты других тенантов; в secrets/.s3cfg_registry
  лежат чужие ключи (tazet@narod.ru, ntazetdinov@nubes.ru);
- версии развития V0 (213+nginx) -> V1 (website-эндпоинт, проверена) -> V2 (origin их фронта),
  отклонённые V3a/V3b/V3c и чек-лист дальнейших изменений.
2026-10-02 07:31:58 +03:00
Repinoid 4e65c1e07a docs(release): перезаливка 1.0.0/2.0.0/3.0.0 после фикса unknown password
- VERSIONS.md: новые sha256 всех трёх сборок;
- HISTORY: разбор бага (Computed-атрибут оставался unknown в ветках усыновления),
  что правилось в 64328ab и 93784e4, проверки до заливки, а также зафиксированы
  ошибки исполнителя (правки без разрешения, лишняя перегенерация, неверная
  оценка в первом ревью).
2026-10-01 19:45:46 +03:00
Repinoid cc8f338969 docs(release): перезаливка 1.0.0/2.0.0/3.0.0 с выходом password у подресурсов
- старые x.0.0 удалены физически из реестра по команде владельца, затем залиты заново
  теми же номерами; sha256 всех трёх сверен с локальными сборками;
- VERSIONS.md: новые sha256 + пометка об удалении версий;
- HISTORY: зачем, что удалено, схема залитой сборки (password — новый выход у
  postgres_user/kafka_user/clickhouse_user/mongodb_user; у mariadb_user и pgadmin
  это прежние входные параметры), проверка стенда, состояние state.
2026-10-01 17:31:26 +03:00
Repinoid db69965520 docs(release): перезаливка 1.0.0/2.0.0/3.0.0 с keep_on_destroy + разбор грабель
- VERSIONS.md: три строки обновлены, добавлены первые 16 символов sha256 каждой сборки;
- HISTORY: что заливалось, как проверялось (схема 60/62 ресурсов, исключения —
  action-шаблон mongodb_rollback и рукописный service_operation), грабли
  checksum mismatch при той же версии + лечение, и найденный факт: state
  TEST_STAND/CRUD пуст (serial 38), инстансы в облаке помечены deleted.
2026-10-01 16:08:53 +03:00
Repinoid 61405dd3dd docs: пароль БД через vault_secrets["users"] — задокументировано, чтобы не искать
Проверено по API 2026-10-01 (pg4crud2, TEST):
GET /instances/<uid>/vault/users -> {"users":{"user4crudpg":{"password":"..."}}}.
Пароль ЕСТЬ; state.out.users — метаданные без пароля (их легко перепутать).

- README.md: строка навигации «Пароль БД / секреты Vault» + раздел «Грабли, на которые уже наступали»
  (Invalid index из-за одного apply; errorLog врёт — смотреть stages; лишний sensitive).
- docs/curated/postgres/pg_user_db.md: раздел «Пароль пользователя БД и секреты Vault» (ловушки,
  два apply, диагностика через /instanceOperations?fields=stages); исправлено утверждение «все 4 ресурса
  за один apply» — для приложений, читающих пароль, нужен второй apply.
- docs/30_registry/guides/getting-started.md: помечены устаревшие ключи adminUser/adminPass (сейчас 404).
- HISTORY/2026-10-01_...: дополнение с фактами и указанием, что первый разбор ошибся.
2026-10-01 14:06:06 +03:00
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 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 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 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 b3cce5bb70 docs(history): раунд 4 — решения Q1-Q5 и их статус 2026-09-30 20:53:41 +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 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 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 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 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
Repinoid b81dc88abe docs(uuid-case): отметить, что фикс выпущен в dev 2.0.24
- HISTORY/2026-09-30: раздел «Следствия» — релиз 2.0.24 (залито в реестр), доки не публиковались.
- terraform_case_sensitivity_fix.md §11: «не выпущено» -> «выпущено в 2.0.24»; уточнение по костылю lower().
2026-09-30 08:50:35 +03:00