docs(research): зафиксировано внешнее ревью петли субагентов

- Зачем:
  - закрыть отложенный заход эксперимента: внешнее ревью результата
    автономной петли моделью другой родословной (дизайн-линия, не Кодекс).
- Что:
  - добавлена секция об итогах ревью: прогноз по находке A не оправдался,
    петля её поймала (try→fresh + регрессионный тест в коммите 640050e).
  - зафиксировано, что внешний взгляд добавил сквозные находки (расхождение
    живого/восстановленного путей, форма распределения длины визита).
  - уточнена гипотеза о пользе reviewer-а другой родословной.
- Проверка:
  - git show --stat HEAD; чтение docs/research/2026-06-11-subagent-coordinator-experiment.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 13:17:06 +03:00
co-authored by Claude Opus 4.8
parent ce3552eaf2
commit 899a3f07a1
@@ -349,6 +349,77 @@ worker чинит выбранное -> reviewer проверяет риск ->
при большом исправлении повторить reviewer -> координатор коммитит при большом исправлении повторить reviewer -> координатор коммитит
``` ```
## Внешнее ревью другой моделью (отложенный заход, 2026-06-14)
Отложенное ревью результата петли (его наметил handoff
`2026-06-11-generator-time-adr-and-pending-review.md`) выполнено. Ревью провела
**модель другой родословной** — та, что вела дизайн, ADR и спеки, а не линия
Кодекс, писавшая код. Это и есть проверка центральной гипотезы эксперимента:
какой класс дефектов автономная петля систематически не видит без внешнего
взгляда.
Основа проверки: перечитаны ADR-0004/0005 и обе спеки; код прочитан помодульно;
марковская модель путей прогнана симуляцией на 300 тыс. визитов; прогнан весь
набор тестов (113 passed); происхождение обёртки `try→fresh` прослежено по git.
### Прогноз по находке A не оправдался — петля её поймала
Handoff предсказывал, что петля пропустит ссылочную целостность при
`restore_state` («слепые зоны одной линии Кодекс скоррелированы»). На деле:
- висячая ссылка визит→пользователь ловится валидатором формы (`state.py:88`);
- висячая ссылка пользователь→словарь (неизвестный `seed_click_id`) валидатору
формы недоступна, но петля **в коммите задачи 06** (`640050e`) добавила обёртку
`try→fresh` вокруг `restore_state` в сервисе **и** написала регрессионный тест
`test_invalid_restored_v2_state_starts_fresh` (профиль с `missing-click-id`).
Это совпадает с разделом «Наблюдения по задаче 06»: и саморевью worker-а, и
отдельный reviewer независимо нашли «битый v2 проходит `from_dict_safe`, но
роняет `restore_state`».
Вывод: многоролевой цикл (worker + саморевью + отдельный reviewer) **поймал**
ровно тот класс дефекта, который ставился как главный индикатор эксперимента.
Прогноз о скоррелированной слепоте по этому пункту ошибочен.
### Что внешний взгляд всё же добавил
Дефекты, дожившие до внешнего ревью, оказались **не точечными, а сквозными**
их не пинит ни один тест, и каждый по отдельности «проходит»:
- **Расхождение живого и восстановленного путей.** Живой визит берёт
браузер/локацию из *случайной* сид-сессии и `event_id` = `_new_uuid`
(`generation.py`), восстановленный — из сид-сессии *профиля* и `event_id` =
`uuid5` (`runtime.py`). У визита, пережившего рестарт, атрибуты «доезжающих»
событий меняются на середине. Инвариант «один визит — однородный контекст»
нарушается на стыке двух путей, который ни один тест не сводит вместе.
- **Форма распределения длины визита.** Среднее (10.7) и конверсия в
`/confirmation` (27%) на цели, воронка монотонна — это тесты проверяют и
подтверждают. Но *форма* дальше от сида: спайк 16% на длине 2 (форс минимума в
2 события убирает визиты-отказы из одного события, которые сид допускает),
~6.6% визитов срезаются о потолок 30, медиана 8 сидит на нижней границе
тестовой полосы 8–12. Тесты пинят средние и пороги, но не форму распределения.
### Уточнённая гипотеза
Главный индикатор A был *локальным* дефектом — падение в одной точке на битом
входе; того же семейства, что и прочие находки задачи 06 (раздутый снимок,
неполная валидация). Такие вещи дисциплинированный многоролевой цикл ловит
хорошо. А выжили до внешнего ревью свойства **межмодульные** (инвариант поверх
двух путей кода) и **распределительные** (форма, а не среднее) — ровно там, где
слабы и ревью внутри одной линии, и покритериальные тесты.
Отсюда уточнение к открытому вопросу «когда нужен отдельный reviewer»: ценнее
всего reviewer **другой родословной**, и именно там, где (а) свойство тянется
через несколько модулей/путей, либо (б) корректность распределительная (форма),
а не одно утверждение. Для точечных дефектов на входе хватает саморевью и
отдельного reviewer той же линии.
### Побочно подтвердилось
Разделение двух линий сработало: ADR-0005 (модельные часы ×K) остался решением
на бумаге, код петли честно держался реал-тайм-модели, нечаянного переплетения
линий нет. Процессное решение «не мешать брейншторм времени с петлёй 06/07»
выдержало.
## Связанные артефакты ## Связанные артефакты
- `.scratch/handoffs/2026-06-11-subagent-coordinator-experiment.md` - `.scratch/handoffs/2026-06-11-subagent-coordinator-experiment.md`