docs(history): этап 4 — перепроверка после перегенерации + подводные камни

Перенесено в файл репозитория (а не только в служебную память VS Code):
- результаты полной перегенерации и перепроверки всех трёх стендов;
- подводные камни: случайные default от API (детектор дрейфа по побайтовому
  сравнению не работает); случайный default вшивается в Go-код → drift 15 файлов
  сразу после перегенерации; generated/<стенд>/go|docs стареют после шага 01;
  403 без браузерного User-Agent (DDoS-Guard);
- актуальная карта пайплайна, токены, что удалено и что оставлено осознанно.
This commit is contained in:
Repinoid
2026-09-30 10:30:41 +03:00
parent 5d29010352
commit 89bfb46b1c
@@ -186,6 +186,69 @@ GET {NUBES_API_ENDPOINT}/services?limit=200&isProductionReady=true
Исправлено коммитом `a68a36a`: `151 k8sOpenbao` раскомментирован (комментарий «нет в PROD UI»
устарел), prod перегенерирован — 36 YAML, ровно как в облаке.
## Этап 4 — перепроверка после полной перегенерации + подводные камни
Команда: «сгенери YAML для всех стендов, проследи чтобы старого ничего не осталось,
перепроверь после генерации всё». Выполнено три прогона `01`:
```bash
for s in dev test prod; do ./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/$s; done
# все три: exit=0
```
### Результат перепроверки (2026-09-30)
| Стенд | YAML | = активных в списке | = облако (`isProductionReady=true`) | Stale | Дубли id | Failures |
|---|---|---|---|---|---|---|
| dev | 40 | ✅ 40 | ✅ 40 | нет | нет | пусто |
| test | 36 | ✅ 36 | ✅ 36 | нет | нет | пусто |
| prod | 36 | ✅ 36 | ✅ 36 | нет | нет | пусто |
Дополнительно проверено:
- staging-каталоги (`resources_yaml.staging.*`) — не осталось ни одного;
- в `resources_yaml/` только `*.yaml`, `.stand`, `embed.go` — посторонних файлов нет;
- `.stand` в каждом каталоге совпадает с профилем (`dev`/`test`/`prod`);
- бэкапы прошлых версий: dev 3, test 2, prod 2 (ротация `KEEP_BACKUPS=5`);
- `generated/<стенд>/tmp/yaml_gen_failures.txt` — пусты;
- `git status` — чисто.
### ⛔ Подводные камни, найденные при перепроверке (важно на будущее)
1. **API отдаёт случайные `default`.** Часть параметров приходит со случайным
суффиксом (`db-ievgpdvu` → `db-ujama5rb`, `kvname-grzjes7l` → `kvname-g3s0uof2`,
`flask-seqtiq3t` → `flask-xwfdxdqh`). Поэтому **побайтовое сравнение двух прогонов
не является детектором дрейфа** — различия в этих строках не регрессия.
2. **Случайный `default` вшивается в сгенерированный Go-код.**
Пример: `generated/dev/go/151_k8s_openbao_kv_resource.go` содержит
`Default: stringdefault.StaticString("kvname-XXXX")`. Следствие:
`check_generated_drift.sh dev` показывает **дрейф 15 файлов сразу после любой**
перегенерации YAML — это не ошибка оператора.
3. **Производные артефакты стареют молча.** `generated/<стенд>/go` и `generated/<стенд>/docs`
создаются шагом `02` и после нового `01` становятся старше своих источников
(на момент проверки: `go`/`docs` dev — 08:46, YAML dev — 10:18). Отдельно живёт
эфемерная копия `provider/internal/resources_gen` + `provider/resources_yaml`
(её кладёт `dev-materialize.sh`, маркер `.stand` = стенд). Их нужно обновлять
шагом `02` после каждого `01`.
4. **Прямые HTTP-запросы к API без браузерного `User-Agent` получают 403**
(DDoS-Guard). С `User-Agent` + `Referer` — 200.
### Актуальная карта пайплайна на 2026-09-30
- Единственный путь генерации YAML: `TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/<стенд>`
(`--profile` обязателен, без него `exit 2`).
- Один универсальный движок на все стенды: `TOOLS/bin/yaml-generator`, стенд задаётся
переменными окружения (`NUBES_API_ENDPOINT`, `NUBES_API_TOKEN`, `NUBES_SERVICE_ID`,
`NUBES_SERVICE_NAME`, `NUBES_OUTPUT_DIR`); список сервисов — свой у каждого стенда.
- Стенд-специфичных хардкодов в коде нет — контролируется `check_hardcoded_service_ids.sh`.
- Токены: `secrets/{dev,test,prod}.token` (валидны на 2026-09-30, срок до 2026-12-27);
обновление — `TOOLS/scripts/00_token_manager.sh` (keycloak refresh, `THRESHOLD_MIN=10`).
- Удалены как мёртвые (`1e796c8`): `10/11/12/13_yaml_*.sh`,
`02_generate_resources_and_docs_template_v2.sh`, общий `TOOLS/config/services_list.txt`.
- Оставлены осознанно: поддержка легаси-прокси `index.cfm`, справочная копия
`DOCS_PIPELINE/publish-docs.sh`, исторические `HISTORY/`/`NOTES/`/`docs/`,
ручные утилиты `scripts/*.py`.
## Открытые вопросы (на решение владельца)
1. Поддержка легаси-прокси `index.cfm`: оставляем или выпиливаем (README уже помечает