docs(opus): раунд 3 отвечен — запись в журнал диалога

Дословно сырой лог и отчёт: 5 находок по ядру — 401 не ретраится (расхождение с
ARCHITECTURE.md:105-108), ретрай только для GET, обрыв modify после создания операции,
zero-value fallback по подстроке имени, нормализация Read только для jsonEnv/ref_svc.
Находки 1-3,5 не подтверждены замером.
This commit is contained in:
Repinoid
2026-09-30 20:15:43 +03:00
parent e46bc35b98
commit 96adf958bc
@@ -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.
- Следующее действие не задано пользователем.
- Настоящий документ ведётся по прямому указанию пользователя «документируй ВЕСЬ диалог,
без сокращений».