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 58ba767..e99dfb7 100644 --- a/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md +++ b/HISTORY/OPUS/2026-09-30_provider_architecture_modifiers_dialog.md @@ -797,13 +797,77 @@ Read , lines 174 to 193 --- +## Ход 13 — Ответ Opus на раунд 3 (дословно, как получен от пользователя) + +### Сырой лог сессии + +``` +Read + +Ограничусь бюджетом. Посмотрю состав `core/` и выберу ключевые непрочитанные файлы. + +Read + +Read + +Read + +Прочитаю ещё 4 ключевых файла ядра: ожидание операций, поиск (дубликаты), нормализацию параметров, cfs. + +Read + +Read + +Прочитаю ещё 2: состояние инстанса (проверка ретрая 401) и нормализацию параметров. + +Read + +Read + +Бюджет: прочитано 6 файлов. ТОП-5 находок по устойчивости/корректности ядра. +``` + +### Отчёт (дословно) + +```markdown +**1. Транзиентный 401 не ретраится нигде; `getInstanceStateWithRetry` — имя-обман (ретрая нет).** +`instance_state.go:39` просто зовёт `doRequest` один раз; `http.go:118` `isRetryable` = {429,502,503,504}, **без 401**. +Прямо противоречит ARCHITECTURE.md:105-108 («GetInstanceState retry 401», «doRequest treats 401 as retryable»). Кратковременный 401 Gateway роняет любой read → срыв plan/apply/поллинга. + +**2. Ретраится только GET; любой POST падает намертво на транзиентном 502/503/сети.** +`http.go:88` — retry только при `method=="GET"`. +Сбой на `/instanceOperations`, `/instanceOperationCfsParams` или `run` рвёт операцию; при create остаётся осиротевший инстанс → следующий apply ловит страж дубликатов `instance_find.go:168`. + +**3. Modify обрывается уже ПОСЛЕ создания операции, если чтение live-параметров сбойнуло.** +`operation_run.go:150` (и симметрично bycode `operation_run_bycode.go:108`): `instanceLiveParams` err → `return`, но POST `/instanceOperations` уже прошёл. +Любой транзиентный сбой чтения live → повисшая pending-операция, блокирующая инстанс до idle. + +**4. Zero-value fallback угадывает тип по ПОДСТРОКЕ имени параметра.** +`params.go:47`: при пустом `dataType` тип берётся из `name/code/label`, содержащих `array/list/map/json`. +Строковый параметр с кодом вроде `whitelist`/`...json...` получит `"[]"`/`"{}"` вместо `""` → неверно-типизированное значение уходит в API на незаданном поле. + +**5. Эквивалентность значения в `Read` захардкожена под `jsonEnv`/ref_svc — прочие строки пишутся как вернул API.** +`state_refresh.go:143` спец-ветка только для `jsonEnv`; остальное — `ParseString(value)` «как есть» `state_refresh.go:168`. Регистровая нормализация есть лишь в ref_svc-пути `refsvc_resolve.go:29`. +Для non-ref_svc строкового поля, где API канонизирует формат (регистр UUID и т.п.), plan≠state → вечный diff. + +Проверяемо только замером (не чтением): №1–3 (поведение при флапающем Gateway, орфан-операции) — прогоном `apply`; №5 (вечный diff) — прогоном `plan`. +``` + +--- + ## Статус -- Раунды 1–2: завершены (отчёты получены, замечания отработаны). -- **Раунд 3 отправлен**: фокус переведён с модификаторов на **сам провайдер** (устойчивость, корректность); - жёсткий бюджет (≤ 10 файлов, ≤ 5 находок ≤ 3 строк). `M6` снят. Ответ ещё НЕ получен. +- Раунды 1–3: все три отчёта получены. Раунд 3 уложился в бюджет (прочитано 6 файлов, 5 находок). +- **Итог раунда 3 (ядро, устойчивость/корректность):** + 1. 401 не ретраится нигде; `isRetryable` без 401 — противоречие `ARCHITECTURE.md:105-108`. + 2. Ретрай только для GET; POST обрывается на 502/503/сети → риск осиротевших операций/инстансов. + 3. Modify может оборваться **после** создания операции (сбой чтения live) → повисшая pending-операция. + 4. Zero-value fallback определяет тип по подстроке имени → возможна неверная типизация незаданного поля. + 5. Нормализация значения в `Read` — только `jsonEnv`/ref_svc → вечный diff на прочих канонизируемых строках. +- Находки №1–3 и №5 **не подтверждены замером** (по словам самого Opus) — перенесены как гипотезы. - Артефакты: `752244f` — промпт раунда 1; `NOTES/20_prompts/prompt_for_opus_provider_architecture_modifiers_round2.md` — замечания раунда 2; `NOTES/20_prompts/prompt_for_opus_provider_core_round3.md` — задание раунда 3. +- Следующее действие не задано пользователем. - Настоящий документ ведётся по прямому указанию пользователя «документируй ВЕСЬ диалог, без сокращений».