docs(prompt): промпт для DeepSeek Pro — план правок кода/доков/архитектуры + план проверки

DeepSeek верифицирует гипотезы групп A (ядро: 401/POST-ретраи, обрыв modify, zero-value
fallback, нормализация Read) и B (модификаторы/спека), затем даёт план правок кода, правок
документации и архитектурных решений, трёхуровневый план проверки (юнит / plan-apply на
DEV_STAND/FullPipe / регрессия + стражи) и порядок работ по коммитам. Код не пишет — исполнять
будет Copilot. Журнал Opus-диалога дополнен ссылкой на этот шаг.
This commit is contained in:
Repinoid
2026-09-30 20:20:31 +03:00
parent 47e010edf3
commit 2c51b0392d
2 changed files with 119 additions and 1 deletions
@@ -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).
- Настоящий документ ведётся по прямому указанию пользователя «документируй ВЕСЬ диалог,
без сокращений».
@@ -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` (история коммитов).
Нужен файл вне списка — задай вопрос, не читай.
## Формат ответа
- Сжато, тезисами, таблицами. Каждое утверждение проверяемо (`файл:строка`).
- Никаких вступлений, повторения вводной, «лирики».
## Стоп-правило
Задание неоднозначно или данных не хватает — **остановиться и задать один короткий вопрос**.
Не достраивать смысл и не действовать по догадке.