From 899a3f07a191f14b01fb0118ab6b963feef02f88 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 14 Jun 2026 13:17:06 +0300 Subject: [PATCH] =?UTF-8?q?docs(research):=20=D0=B7=D0=B0=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D1=88=D0=BD=D0=B5=D0=B5=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B5=D1=82=D0=BB=D0=B8=20=D1=81=D1=83=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - закрыть отложенный заход эксперимента: внешнее ревью результата автономной петли моделью другой родословной (дизайн-линия, не Кодекс). - Что: - добавлена секция об итогах ревью: прогноз по находке 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) --- ...6-06-11-subagent-coordinator-experiment.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) 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` —