From 98be7228086f135222e842e309b5fc4c2f019277 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Tue, 7 Jul 2026 22:29:42 +0300 Subject: [PATCH] =?UTF-8?q?docs(generator):=20=D0=B4=D0=B8=D0=B0=D0=B3?= =?UTF-8?q?=D0=BD=D0=BE=D0=B7=20=D1=84=D0=BB=D0=B0=D0=BA=D0=B8-=D0=B3?= =?UTF-8?q?=D0=B5=D0=B9=D1=82=D0=B0=20=D0=B2=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=2020,=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=2013?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - Codex-диагноз нашёл корень нестабильности runtime-гейта: гонка остановки live-генератора, batch публикуется по топикам без атомарности, seam-SQL маскирует непарные строки под смену фактуры; - попутно закрыт второй открытый вопрос задачи 13 - запасная ветка рождения визита уже хранит донора (фикс задачи 09). - Что: - задача 20: диагноз с судьбой трёх гипотез, направление фикса (управляемая остановка live + precheck непарных строк), статус ready-for-agent; - задача 13: вопрос про fallback-ветку закрыт, статус ready-for-human (осталось решение по развилке реализации). - Проверка: - утверждение про донора перепроверено по generation.py:194-209; эмпирика диагноза - в логах прогонов, пути в задаче 20. Co-Authored-By: Claude Fable 5 --- .../13-backfill-top-up-from-snapshot.md | 10 ++-- .../issues/20-flaky-runtime-seam-check.md | 60 +++++++++++++------ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/.scratch/generator-model-time-startup-history/issues/13-backfill-top-up-from-snapshot.md b/.scratch/generator-model-time-startup-history/issues/13-backfill-top-up-from-snapshot.md index c7aea31..6f38af9 100644 --- a/.scratch/generator-model-time-startup-history/issues/13-backfill-top-up-from-snapshot.md +++ b/.scratch/generator-model-time-startup-history/issues/13-backfill-top-up-from-snapshot.md @@ -1,4 +1,4 @@ -Status: needs-info +Status: ready-for-human # Глагол next-day: собрать следующий модельный день @@ -59,10 +59,10 @@ Status: needs-info хранит один state на конец полной истории, поэтому live-продолжение возможно только после последней порции; промежуточные дни — batch-only (для учебного сценария этого достаточно). -- [ ] Для варианта 2 — решение по запасной ветке рождения визита - (`generation.py`, ветка без донора-кандидата): либо закрепить проверкой, - что она не срабатывает, либо ограничить длину визита так, чтобы fallback - не менял фактуру на стыке. Унаследовано из прежней редакции задачи. +- [x] Для варианта 2 — решение по запасной ветке рождения визита: **уже + закрыто фиксом задачи 09** (проверено по коду 2026-07-07 при диагнозе + задачи 20): ветка хранит донора (`generation.py:194-209`) и громко падает + на неполных locations, восстановление воспроизводит её детерминированно. ## Acceptance criteria (черновые) diff --git a/.scratch/generator-model-time-startup-history/issues/20-flaky-runtime-seam-check.md b/.scratch/generator-model-time-startup-history/issues/20-flaky-runtime-seam-check.md index 04a4673..e370a20 100644 --- a/.scratch/generator-model-time-startup-history/issues/20-flaky-runtime-seam-check.md +++ b/.scratch/generator-model-time-startup-history/issues/20-flaky-runtime-seam-check.md @@ -1,4 +1,4 @@ -Status: needs-triage +Status: ready-for-agent # Runtime-проверка стыка нестабильна: фактура меняется через раз @@ -33,28 +33,52 @@ Status: needs-triage - Задача 13 (глагол next-day) навешивает на этот же механизм цепочку границ — ей нужен доверенный, стабильный гейт. -## Гипотезы (проверить при диагнозе) +## Диагноз (Codex, 2026-07-07; ключевой факт перепроверен координатором) -1. **Тихая запасная ветка рождения визита** (`generation.py`, ветка без - донора-кандидата): при истории в 1 час словарь визитов маленький, донора - с достаточным числом событий может не найтись. Задача 09 требовала - «молча оставить как есть нельзя» — проверить, что сделал фикс. -2. Недетерминизм live-части: реальное время тиков решает, какие визиты - пересекут границу; сам факт «через раз» указывает на зависимость от - wall-clock, а не от сида. -3. Проверочный SQL: убедиться, что сравнение полей не цепляет поля, - легитимно различающиеся (по образцу исключения `event_id` в задаче 09). +**Корень: гонка остановки live-генератора, а не смена фактуры.** Цепочка: +`run_generated_history_runtime_check.sh` останавливает live сразу после первых +новых STG-строк -> генератор публикует batch по четырём топикам +последовательно, без атомарности -> `docker compose stop generator` может +оборвать процесс между топиками -> часть browser-событий остаётся без парных +location/device/geo -> DDS строит `dds.event` через `LEFT JOIN location`, +и такие строки получают `NULL` в referer/utm -> seam-SQL считает это «сменой +фактуры внутри click_id». -## Acceptance criteria (черновые) +Эмпирика: в красном прогоне `browser_raw=2776`, но `location_raw=2736` — +40 live-событий без пары; в зелёном `browser_raw=location_raw=2815`, поэтому +проверка прошла (хотя device/geo и там отстали: 2781). -- [ ] Причина расхождения 8/19 найдена и названа (код, не догадка). -- [ ] Либо генератор починен (фактура на стыке стабильна при любом профиле), - либо проверка исправлена (если ловила легитимные различия) — с объяснением. +Судьба гипотез: + +1. Запасная ветка рождения — **опровергнута**: ветка уже хранит донора + (`generation.py:194-209`, комментарий «Запасная ветка тоже восстановима») + и громко падает на неполных locations. Перепроверено координатором по коду. +2. Недетерминизм live — **подтверждена частично**: решает не сид, а настенный + момент остановки процесса и какие топики успели дописаться. +3. Проверочный SQL — **опровергнута в формулировке**: поля не «легитимно + различаются», SQL маскирует пропущенный location под «смену фактуры». + +## Направление фикса (из диагноза) + +1. **Основное:** сделать остановку live управляемой — завершать после полного + batch/tick и flush всех топиков (bounded live mode или ожидание записи + `generator_batch_history` с полными sent-счётчиками). +2. **Дополнительно:** precheck в seam-check на непарные + browser/location/device/geo live-строки — чтобы ошибка называла реальную + причину, а не «фактура поменялась». +3. Просто увеличить sleep перед stop — отклонено: снижает вероятность, + но гонку не убирает. + +## Acceptance criteria + +- [x] Причина расхождения 8/19 найдена и названа (код, не догадка) — + см. «Диагноз» выше. +- [ ] Остановка live в runtime-check управляемая: batch дописывается во все + топики целиком до остановки (направление фикса, пункт 1). +- [ ] Seam-check различает «непарные live-строки» и «смена фактуры»: + precheck называет реальную причину (пункт 2). - [ ] `make generated-history-runtime-check` стабилен: N подряд прогонов зелёные (N >= 3), зафиксировано в задаче. -- [ ] Если срабатывает запасная ветка рождения — она стала громкой или - воспроизводимой при восстановлении (наследие задачи 09 и открытый вопрос - задачи 13 закрываются согласованно). ## Blocked by