feat(generator): добавлена модель связанного визита

- Зачем:
  - генератор должен создавать учебно полезный визит с общим click_id, правдоподобным путём и честным тиковым бюджетом событий.
- Что:
  - добавлена марковская цепочка страниц, запланированные метки времени и потолок GEN_MAX_SESSION_EVENTS.
  - добавлен набор тикового батча из нескольких визитов до рассчитанного бюджета событий.
  - обновлены тесты, README, KNOWN_ISSUES и статусы задач 01/02.
- Проверка:
  - uv run --with pytest --with-requirements generator/requirements.txt pytest generator/tests -q
This commit is contained in:
Dmitry Dementiev
2026-06-11 12:52:48 +03:00
parent d38124263a
commit 32f4fee41c
7 changed files with 354 additions and 47 deletions
@@ -1,4 +1,4 @@
Status: ready-for-agent
Status: ready-for-human
# Минимальный связанный визит в новом ядре
@@ -18,16 +18,16 @@ Kafka-топиков. Kafka на этом шаге не нужна: задача
## Acceptance criteria
- [ ] Тест через публичный интерфейс генератора создаёт один визит с несколькими
- [x] Тест через публичный интерфейс генератора создаёт один визит с несколькими
browser-событиями под одним `click_id`.
- [ ] У всех событий визита разные валидные `event_id`, а `click_id` не берётся
- [x] У всех событий визита разные валидные `event_id`, а `click_id` не берётся
из исходного сида.
- [ ] Для каждого browser-события есть связанная location-запись с тем же
- [x] Для каждого browser-события есть связанная location-запись с тем же
`event_id`.
- [ ] Для каждого события визита публикуются device- и geo-записи с тем же
- [x] Для каждого события визита публикуются device- и geo-записи с тем же
`click_id`; их содержимое в рамках визита одинаковое, как в сиде.
- [ ] Один `click_id` связан ровно с одним `user_domain_id`.
- [ ] Старый тестовый контракт "одно событие = один новый click_id" удалён или
- [x] Один `click_id` связан ровно с одним `user_domain_id`.
- [x] Старый тестовый контракт "одно событие = один новый click_id" удалён или
заменён на новый контракт визита.
## Blocked by
@@ -35,4 +35,3 @@ Kafka-топиков. Kafka на этом шаге не нужна: задача
None - can start immediately.
## Comments
@@ -1,4 +1,4 @@
Status: ready-for-agent
Status: ready-for-human
# Путь визита по страницам и монотонное время
@@ -17,17 +17,17 @@ Status: ready-for-agent
## Acceptance criteria
- [ ] Тест через публичный интерфейс генератора показывает, что
- [x] Тест через публичный интерфейс генератора показывает, что
`event_timestamp` внутри одного `click_id` строго возрастает.
- [ ] Метки времени событий являются запланированными моментами визита, а не
- [x] Метки времени событий являются запланированными моментами визита, а не
одинаковым `now()` для всего набора событий.
- [ ] Паузы внутри визита меньше 30 минут; 95-й перцентиль на симуляции лежит в
- [x] Паузы внутри визита меньше 30 минут; 95-й перцентиль на симуляции лежит в
масштабе единиц минут.
- [ ] Визит не может зациклиться бесконечно: длина ограничена потолком
- [x] Визит не может зациклиться бесконечно: длина ограничена потолком
`GEN_MAX_SESSION_EVENTS` или его новым эквивалентом.
- [ ] Доля визитов, дошедших до `/confirmation`, на симуляции сопоставима с
- [x] Доля визитов, дошедших до `/confirmation`, на симуляции сопоставима с
ориентиром сида около 25%.
- [ ] Визит может продолжаться после `/confirmation`; `/confirmation` не
- [x] Визит может продолжаться после `/confirmation`; `/confirmation` не
считается обязательным последним событием визита.
## Blocked by
@@ -35,4 +35,3 @@ Status: ready-for-agent
- `.scratch/feature-data-generator/issues/01-minimal-connected-visit.md`
## Comments