From d6520138f66c3c3f2943505e58b8164efd17c994 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Tue, 22 Sep 2026 19:14:59 +0300 Subject: [PATCH] =?UTF-8?q?docs(opus):=20prompt=20=E2=80=94=20=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8F=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20(CreateOnly?= =?UTF-8?q?=20vs=20modifier)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prompt_for_opus_modifiable_architecture.md | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 prompt_for_opus_modifiable_architecture.md diff --git a/prompt_for_opus_modifiable_architecture.md b/prompt_for_opus_modifiable_architecture.md new file mode 100644 index 0000000..ccc42cb --- /dev/null +++ b/prompt_for_opus_modifiable_architecture.md @@ -0,0 +1,61 @@ +# Задача: спроектировать ПРОСТУЮ логику «изменяемости» параметров (CreateOnly vs Modifiable) + +## Проблема + +Генератор terraform-провайдера строит проверку «Нельзя изменить X» (CreateOnly) на основе +только instance-modify. Из-за этого возникают противоречивые и сломанные ситуации: + +`generated/dev/resources_yaml/22_vc_nsxt.yaml`: +- create (id 10), param `needEnableAVI` (id 340) — помечен `is_modifiable: true`; +- instance-modify у `vc_nsxt` НЕТ (modify 111 — это **modifier** `vc_nsxt.network`). + +Генератор: + +``` +ComputeCreateOnly(createParams, instanceModifyParams): + поле считается CreateOnly, если его code нет в instance-modify +``` + +Следствие: `needEnableAVI` попадает в CreateOnly → генерится жёсткая проверка +«Нельзя изменить need_enable_avi», хотя по YAML параметр `is_modifiable: true`. + +Плюс `ConvertParams` вообще **не переносит** `is_modifiable` из ParamSpec в Param — +поле теряется, логика его учесть не может. + +## Ключевые файлы (текущая логика) + +- `TOOLS/lib/types.go` — `ParamSpec.IsModifiable` (есть, `is_modifiable` сериализуется в YAML) +- `TOOLS/resource-generator/internal/types/types.go` — `Param` (НЕТ поля IsModifiable) +- `TOOLS/resource-generator/internal/loader/loader.go` — `ConvertParams` (не переносит IsModifiable) +- `TOOLS/resource-generator/internal/params/params.go` — `ComputeCreateOnly` (игнорирует is_modifiable и modifier) +- `TOOLS/resource-generator/internal/templates/instance.go` — шаблон, рендерит «Нельзя изменить» из `.CreateOnlyParams` +- YAML: `generated/dev/resources_yaml/22_vc_nsxt.yaml` (modify 111 — `kind: modifier`) + +## Существующие понятия операции + +В YAML операции бывают видов: +- `kind: instance` (`create` / `modify` / `suspend` / `resume` / `delete`) +- `kind: modifier` (отдельный TF-ресурс, `modify` на родительском инстансе, например `vc_nsxt.network`) +- `kind: subresource` +- `kind: action` + +## Цель + +Спроектировать **единую, простую и понятную** модель «изменяемости» параметра, чтобы: +1. параметр считался изменяемым, если он изменяем ХОТЯ БЫ через один канал + (instance-modify ИЛИ modifier); +2. «Нельзя изменить» генерировалось ТОЛЬКО для реально create-only параметров; +3. `is_modifiable` из YAML был единственным источником правды (или явно согласован с каналами modify); +4. не было противоречий вида «в YAML is_modifiable:true, а в коде «Нельзя изменить»». + +## Вопросы к Opus + +1. Какая каноническая модель: вычислять изменяемость по `is_modifiable` (флаг из YAML), + по наличию кода в любом modify (instance + modifier), или по комбинации? +2. Где именно проставлять/вычислять флаг — в yaml-generator (при генерации YAML), или в + resource-generator (при генерации Go)? +3. Как связать modifier-параметры (`vc_nsxt.network`) с parent-инстансом (`vc_nsxt`), + чтобы instance знал, что `needEnableAVI` изменяется через modifier? +4. Минимальный, без legacy-наслоений, набор правил. + +Ответ — кратко, с конкретной архитектурой и точками правки (файл + функция).