diff --git a/docs/research/2026-06-11-subagent-coordinator-experiment.md b/docs/research/2026-06-11-subagent-coordinator-experiment.md index 5d8d209..0954b0e 100644 --- a/docs/research/2026-06-11-subagent-coordinator-experiment.md +++ b/docs/research/2026-06-11-subagent-coordinator-experiment.md @@ -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` —