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:
@@ -349,6 +349,77 @@ worker чинит выбранное -> 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` —
|
||||
|
||||
Reference in New Issue
Block a user