docs(generator): уточнена мат-спека по итогам ревью, handoff для передачи

- Зачем:
  - повторное адверсариальное ревью нашло ошибку в формуле межсессионной
    паузы (двойной счёт кулдауна) и незакрытый контракт публикации
    device/geo; дизайн-этап завершён, работа передаётся исполнителю.
- Что:
  - исправлена формула паузы (баланс цикла, минус длительность визита);
    зафиксированы каденция device/geo «на каждое событие, как в сиде»,
    правило выбора возвращающегося, стартовое распределение страниц,
    калибровка по медиане и среднему, инвариант потолков конфигурации,
    компактное хранение профиля ссылкой на сид-сессию.
  - уточнены критерии приёмки (среднее паузы вместо медианы, счёт шага
    «товары», имена полей времени) в обеих спеках.
  - добавлен handoff .scratch/handoffs/2026-06-10-generator-spec-to-codex.md
    (передача на детальный план/реализацию), отработавший handoff от
    2026-06-09 удалён.
- Проверка:
  - цифры спеки сверены замерами по полным data/*.jsonl (стартовые страницы
    58/24/17, шаги воронки 98>=94>=56>=35>=25, device 1000 строк / 99
    уникальных); повторное ревью свежим агентом блокеров не оставило.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Dmitry Dementiev
2026-06-10 18:02:57 +03:00
co-authored by Claude Fable 5
parent 0b5fc64f6f
commit bcca8f5127
4 changed files with 123 additions and 81 deletions
@@ -1,52 +0,0 @@
# Handoff: переработка генератора (steady-stream, иерархическая модель)
Дата: 2026-06-09
Ветка: `feature/data-generator`
Жанр: одноразовые леса́ (ADR-0003) — durable-рассуждение в ADR/спеке, не здесь.
> Место: `.scratch/handoffs/` по [ADR-0003](../../docs/adr/0003-handoffs-in-scratch.md)
> и `AGENTS.md` (перекрывают generic-дефолт скилла «temp dir» — у владельца
> мультимашинность + worktrees, где `/tmp` не переживает).
## Где остановились
Брейнсторм-сессия (`brainstorm-with-docs`) завершена **на этапе документов**
кода НЕ трогали. Зафиксировано направление переработки генератора и расчищена
рамка под реализацию. Дальше — отдельная follow-up-спека по математике, затем
реализация.
## Контекст и решения (ссылки, не пересказ)
- **Решение «почему» (генератор A, не реплей C):**
[`docs/adr/0004-steady-stream-synthetic-generator.md`](../../docs/adr/0004-steady-stream-synthetic-generator.md)
- **Форма доработки «что строим» (требования, без математики), статус Draft:**
[`docs/specs/2026-06-09-generator-rework-hierarchical.md`](../../docs/specs/2026-06-09-generator-rework-hierarchical.md)
— там же раздел **Open questions** (список вопросов для мат-спеки) и
**Validation** (критерии приёмки). Не дублирую сюда.
- **Глоссарий:** `CONTEXT.md` — добавлены «популяция пользователей» /
«возвращающийся пользователь».
- **Диагноз дефекта текущей реализации:** `generator/KNOWN_ISSUES.md`.
## Следующий шаг
**Написать follow-up-спеку по математике** генеративной модели. Перечень вопросов
— в разделе *Open questions* спеки доработки (распределения, session-timeout,
раскладка иерархии по тикам, персистентность популяции, `event_type` diversity).
## Ловушки (одной строкой; детали — в спеке)
- Воронка живёт в **`page_url_path`**, не в `event_type` (в сиде 100% `pageview`).
- device/geo — **сессионный** контекст уровня `click`, не «свойство пользователя».
- Модель интенсивности (`_calculate_events_count`, `_hour_factor`) — **сохраняем**;
переписываем только модель сущностей (`generate_batch`). Текущую реализацию
инкрементально не чиним.
## Suggested skills (для следующей сессии)
- **`conventional-commits`** — закоммитить готовые доки (см. git ниже).
- **`brainstorm-with-docs`** (или `grill-with-docs`) — для follow-up-спеки по
математике: продолжает тот же стиль (durable-доки + правка CONTEXT/ADR inline).
- **`tdd`** — на этапе реализации rewrite (у генератора уже есть pytest-набор
`generator/tests/`).
- **`adversarial-review`** / **`code-review`** — ревью переписанной модели
сущностей перед вливанием ветки.
@@ -0,0 +1,65 @@
# Handoff: спеки генератора готовы — передача на детальный план и реализацию
Дата: 2026-06-10
Ветка: `feature/data-generator`
Жанр: одноразовые леса́ (ADR-0003) — durable-рассуждение в спеках/ADR/CONTEXT, не здесь.
> Место: `.scratch/handoffs/` по [ADR-0003](../../docs/adr/0003-handoffs-in-scratch.md)
> (перекрывает generic-дефолт скилла «temp dir»: мультимашинность + worktrees).
> Предыдущий handoff (2026-06-09-generator-rework.md) отработал и удалён.
## Где остановились
Дизайн-этап переработки генератора **завершён**. Спека математической модели
написана, прошла **два** адверсариальных ревью свежими агентами (второе ревью
ловило ошибки правок первого — практика себя оправдала), все находки закрыты,
ключевые цифры перепроверены замерами по полному сиду. Кода по-прежнему
не трогали.
Разделение ролей (см. память проекта): дизайн/спеки — Fable, **детальный план
и реализация — Codex 5.5**. Следующая сессия — скорее всего, подготовка задачи
для Кодекса или сама реализация.
## Документы (источники истины, не пересказываю)
- **Мат-модель (главный документ для исполнителя):**
`docs/specs/2026-06-10-generator-math-model.md` — марковская цепочка по
страницам, формула «популяция ↔ интенсивность ↔ пауза», кулдаун, правило
30 минут на рестарт, критерии приёмки.
- **Форма доработки:** `docs/specs/2026-06-09-generator-rework-hierarchical.md`
(Open questions закрыты ссылкой на мат-спеку).
- **Почему генератор, а не реплей:** `docs/adr/0004-steady-stream-synthetic-generator.md`.
- **Профиль сид-датасета (опора калибровки):** `CONTEXT.md`, раздел
«Профиль сид-датасета» — измерено по полным файлам 2026-06-10.
- **Диагноз дефекта старого кода:** `generator/KNOWN_ISSUES.md`.
## Ловушки (одной строкой; детали — в спеках)
- Ранний «факт» **«1..7 событий на визит» был неверен** (срез файла); реально
1..27, медиана 10. Если встретишь «1..7» где-то ещё в доках/коде — это
остатки ошибки, чинить по профилю сида.
- **Формула паузы в мат-спеке обязательна** при смене λ/популяции; кулдаун в
неё не прибавляется (уже учтён балансом). Вторая ревизия исправляла именно
двойной счёт — не откатить случайно.
- **device/geo публикуются на каждое событие** (как в сиде) — это контракт с
ETL, не деталь.
- `event_timestamp` событий — **запланированное** время, не момент отправки
тика (иначе метки прилипают к сетке тиков).
- Модель интенсивности (`_calculate_events_count`) сохраняем; дефолт
`GEN_LAMBDA_BASE_PER_MIN` меняется 200 → 30.
## Следующий шаг
Передать пару спек Кодексу: детальный план реализации → код. Уровень спек
сознательно «решения и инварианты, без алгоритмов» — конкретику исполнитель
достраивает сам. Возможная подготовка: оформить задачу в `.scratch/<feature>/`
по `docs/agents/issue-tracker.md` (скилл `to-issues`, если план дробить).
## Suggested skills (для следующей сессии)
- **`to-issues`** — если решим дробить реализацию на задачи в локальном трекере.
- **`tdd`** — для этапа реализации (pytest-набор `generator/tests/` существует,
но писался под старую модель — пересмотр под новую неизбежен).
- **`adversarial-review`** / **`code-review`** — ревью реализации против
мат-спеки перед вливанием.
- **`conventional-commits`** — коммиты по правилам репозитория.