diff --git a/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md b/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md index e9ea662..7a0e6bf 100644 --- a/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md +++ b/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md @@ -926,6 +926,8 @@ Read `e46bc35` — задание раунда 3; `NOTES/20_prompts/prompt_for_opus_provider_architecture_modifiers_round2.md`, `NOTES/20_prompts/prompt_for_opus_provider_core_round3.md`. -- Следующее действие не задано пользователем. +- Следующий шаг (2026-09-30): промпт для **DeepSeek Pro** — + `NOTES/20_prompts/prompt_for_deepseek_pro_remediation_plan.md` (план правок кода/документации/архитектуры + + план проверки/тестов; гипотезы групп A/B переданы ему на верификацию; исполнять будет Copilot). - Настоящий документ ведётся по прямому указанию пользователя «документируй ВЕСЬ диалог, без сокращений». diff --git a/NOTES/20_prompts/prompt_for_deepseek_pro_remediation_plan.md b/NOTES/20_prompts/prompt_for_deepseek_pro_remediation_plan.md new file mode 100644 index 0000000..d99ccfb --- /dev/null +++ b/NOTES/20_prompts/prompt_for_deepseek_pro_remediation_plan.md @@ -0,0 +1,116 @@ +# Промпт для DeepSeek Pro — план правок кода/документации/архитектуры + стратегия проверки + +**Репо:** `/home/naeel/TF/tf_provider` — `terraform-provider-nubes` (Go, Terraform Plugin Framework). +**Дата:** 2026-09-30. **Стенд-источник фактов:** `dev`. + +--- + +## Роль и исполнитель + +- Ты — архитектор / ведущий инженер. +- Ты **НЕ пишешь код** и **НЕ меняешь файлы**. Только анализ + план. +- Результат твоей работы — **план правок** (код, документация, архитектура) и **план проверки/тестов**. +- **Исполнять будет другой агент (Copilot)** — строго по твоему плану. Поэтому план должен быть + исполнимым: точные пути файлов, функции, что именно менять, чем проверять. + +## Вводная + +- Главное — **сам провайдер**: устойчивость, корректность, отсутствие вечных diff. +- Модификаторы (`nubes_vc_org_ip_allocation`, `nubes_vc_nsxt_snat`) — новая, возможно сложная, но + **НЕБОЛЬШАЯ** часть сервиса. Не раздувай их. +- Ниже — **ГИПОТЕЗЫ** предыдущего анализа. Они **НЕ подтверждены замером**. + Твоя первая задача — проверить их по коду и разделить на «подтверждено / опровергнуто / нужен замер». + +## Гипотезы к проверке + +### Группа A — ядро (приоритет) +- **A1.** 401 не ретраится: `provider/internal/core/instance_state.go:39` зовёт `doRequest` один раз; + `isRetryable` в `provider/internal/core/http.go:118` = {429,502,503,504} без 401. + Противоречит `TOOLS/ARCHITECTURE.md:105-108` («GetInstanceState retry 401», «doRequest treats 401 as retryable»). +- **A2.** Ретрай только для GET (`http.go:88`); POST (`/instanceOperations`, `/instanceOperationCfsParams`, + `run`) обрывается на транзиентном 502/503/сети → возможны осиротевшая операция/инстанс; далее срабатывает + страж дубликатов (`instance_find.go:168`). +- **A3.** Modify может оборваться **после** создания операции, если чтение live-параметров сбойнуло: + `operation_run.go:150` и `operation_run_bycode.go:108` (`instanceLiveParams` err → `return`). +- **A4.** Zero-value fallback угадывает тип по **подстроке** имени параметра при пустом `dataType`: + `params.go:47` (ищет `array/list/map/json` в `name/code/label`). +- **A5.** В `Read` нормализация значения только для `jsonEnv`/ref_svc: `state_refresh.go:143` и `:168`; + регистровая нормализация только в ref_svc-пути (`refsvc_resolve.go:29`) → возможен вечный diff. + +### Группа B — модификаторы (второстепенно) +- **B1.** `TOOLS/ARCHITECTURE.md:225` («Exception Registry») ссылается на реестр `serviceSpecificModifiers` + в `TOOLS/yaml-generator/main.go`, которого **нет** (удалён при рефакторинге; см. комментарий `main.go:80-90`). +- **B2.** Спека не описывает **ручные сервисные оверлеи** (`provider/internal/resources_core/org_ip_allocation_resource.go`, + `nsxt_snat_resource.go`) — нет категории «ручной сервисный ресурс», неясно, входит ли `resources_core` в «core». +- **B3.** Страж `TOOLS/scripts/check_hardcoded_service_ids.sh:15` сканирует **только** `TOOLS/` + и ловит **только** `.ServiceID==N`/`.ID==N` → hardcoded `19`/`22`/`"no-needed"` вне охвата. +- **B4.** Порядок «edge → аллокация» не гарантируется провайдером — держится на пользовательском `depends_on` + (`DEV_STAND/FullPipe/modifiers.tf`). +- **B5.** У `nubes_vc_org_ip_allocation` нет способа снять аллокацию через атрибут (пустой массив запрещён) — только `destroy`. +- **B6.** `modify` выполняется всегда (нет pre-check идемпотентности), хотя idempotent-путь в ядре есть. +- **B7.** `ImportState` модификаторов не заполняет Required-атрибуты. +- **B8.** `modifiers.yaml` (оверлей) **не существует**, при этом генерируемый слой модификаторов готов + (`TOOLS/resource-generator/internal/loader/loader.go:57-86`, `internal/templates/modifier.go`) и не используется. +- **B9.** Три несогласованных словаря жизненного цикла: у генерируемых ресурсов `suspend_on_destroy`/`keep_on_destroy`, + у генерируемых модификаторов `delete_strategy` (compile-time), у ручных модификаторов снова `keep_on_destroy`. + +## Что нужно на выходе (строго в этом порядке) + +**A. Верификация гипотез** +Таблица: `№ | подтверждено / опровергнуто / нужен замер | опора (файл:строка) | примечание`. +Опровергнутые — обосновать, почему вывод неверен. + +**B. План правок кода** +Таблица: `№ | файл | функция/место | что изменить | зачем | риск (низк/сред/высок) | ломает ли совместимость`. +Только правки, вытекающие из подтверждённых пунктов. Никаких «заодно улучшим». + +**C. План правок документации и архитектуры** +Что именно и в каком файле (`TOOLS/ARCHITECTURE.md`, `README.md`, `VERSIONS.md`, `HOW_TO/**`, `docs/**`). +Отдельно: какие **архитектурные решения** надо зафиксировать (напр. единый словарь жизненного цикла). + +**D. План проверки и тестирования** +Для каждой правки — три уровня: +1. **Юнит/пакетный тест** — какой пакет, что проверяет, где лежит (есть примеры: `provider/internal/resources_core/*_test.go`, + `TOOLS/resource-generator/internal/loader/loader_modifier_test.go`). +2. **Интеграционная проверка** — `terraform plan` / `apply` на `DEV_STAND/FullPipe`: что запустить, что ожидать + в выводе, на что смотреть (с учётом: `apply`/`destroy` выполняет **владелец**, не агент). +3. **Регрессия** — что ещё может сломаться и как это поймать. +Плюс статические стражи: `TOOLS/scripts/check_generated_drift.sh`, `check_hardcoded_service_ids.sh`, +сборка `03_build_and_upload_provider.sh`, `dev-materialize.sh`. + +**E. Порядок работ** +Шаги, сгруппированные в **отдельные коммиты**, от безопасных к рискованным. Для каждого шага — 1 строка: +что делаем и как проверяем, после чего фиксируем коммитом. + +**F. Открытые вопросы** +Только то, что нельзя выяснить из кода (значения, решения владельца). + +## Ограничения + +- **Ничего не менять**: не править файлы, не коммитить, не запускать `terraform`/`go`. +- `terraform apply` и `destroy` — **только владелец**. +- Каждое утверждение — с `файл:строка`. **Факт и предположение разделяй явно.** +- Бюджет: читать **не более ~20 файлов**; ответ — компактный, таблицами, **без воды и без «а ещё могу»**. +- Не предлагать переписывание с нуля без доказанной необходимости. + +## Границы доступа + +Разрешено читать: +- `TOOLS/**` (архитектура, генераторы, скрипты, конфиги) +- `provider/**` (кроме `artifacts/`, `bin/`, `generated/`) +- `generated/dev/resources_yaml/**` +- `docs/**`, `HOW_TO/**`, `README.md`, `VERSIONS.md` +- `DEV_STAND/FullPipe/**` (пример использования) + +Запрещено: `HISTORY/**`, `NOTES/**`, `TMP/**`, `HAR/**`, `secrets/**`, `! /`, `.git` (история коммитов). +Нужен файл вне списка — задай вопрос, не читай. + +## Формат ответа + +- Сжато, тезисами, таблицами. Каждое утверждение проверяемо (`файл:строка`). +- Никаких вступлений, повторения вводной, «лирики». + +## Стоп-правило + +Задание неоднозначно или данных не хватает — **остановиться и задать один короткий вопрос**. +Не достраивать смысл и не действовать по догадке.