From 96adf958bc5bd36a402bc4e0745167953c400e94 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 30 Sep 2026 20:15:43 +0300 Subject: [PATCH] =?UTF-8?q?docs(opus):=20=D1=80=D0=B0=D1=83=D0=BD=D0=B4=20?= =?UTF-8?q?3=20=D0=BE=D1=82=D0=B2=D0=B5=D1=87=D0=B5=D0=BD=20=E2=80=94=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=B2=20=D0=B6=D1=83?= =?UTF-8?q?=D1=80=D0=BD=D0=B0=D0=BB=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дословно сырой лог и отчёт: 5 находок по ядру — 401 не ретраится (расхождение с ARCHITECTURE.md:105-108), ретрай только для GET, обрыв modify после создания операции, zero-value fallback по подстроке имени, нормализация Read только для jsonEnv/ref_svc. Находки 1-3,5 не подтверждены замером. --- ..._provider_architecture_modifiers_dialog.md | 70 ++++++++++++++++++- 1 file changed, 67 insertions(+), 3 deletions(-) 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. +- Следующее действие не задано пользователем. - Настоящий документ ведётся по прямому указанию пользователя «документируй ВЕСЬ диалог, без сокращений».