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:
@@ -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` (история коммитов).
|
||||
Нужен файл вне списка — задай вопрос, не читай.
|
||||
|
||||
## Формат ответа
|
||||
|
||||
- Сжато, тезисами, таблицами. Каждое утверждение проверяемо (`файл:строка`).
|
||||
- Никаких вступлений, повторения вводной, «лирики».
|
||||
|
||||
## Стоп-правило
|
||||
|
||||
Задание неоднозначно или данных не хватает — **остановиться и задать один короткий вопрос**.
|
||||
Не достраивать смысл и не действовать по догадке.
|
||||
Reference in New Issue
Block a user