feat(generator): добавлена популяция пользователей

- Зачем:
  - steady-stream генератору нужны устойчивые пользователи и возвраты между визитами, чтобы поток был похож на живую модель поведения.
- Что:
  - добавлена ограниченная популяция с кулдауном возврата, ротацией новых пользователей и защитой от второго активного визита.
  - UUID переведены на единый ГПСЧ генератора, а завершение визита считается по запланированному последнему событию.
  - добавлены регрессионные тесты и обновлена документация генератора.
- Проверка:
  - uv run --with-requirements generator/requirements.txt pytest generator/tests -q
This commit is contained in:
Dmitry Dementiev
2026-06-11 16:08:37 +03:00
parent d8da27187e
commit fda5db8ad9
7 changed files with 435 additions and 14 deletions
@@ -1,4 +1,4 @@
Status: ready-for-agent
Status: ready-for-human
# Популяция пользователей и возвраты
@@ -17,14 +17,14 @@ Status: ready-for-agent
## Acceptance criteria
- [ ] На длинной симуляции получается здоровая пирамида
- [x] На длинной симуляции получается здоровая пирамида
`users < sessions < events`.
- [ ] Один пользователь может иметь несколько `click_id` во времени.
- [ ] Один `click_id` принадлежит ровно одному `user_domain_id`.
- [ ] Пользователь не получает новый визит раньше минимального кулдауна возврата.
- [ ] Если доступных возвращающихся пользователей нет, новый визит достаётся
- [x] Один пользователь может иметь несколько `click_id` во времени.
- [x] Один `click_id` принадлежит ровно одному `user_domain_id`.
- [x] Пользователь не получает новый визит раньше минимального кулдауна возврата.
- [x] Если доступных возвращающихся пользователей нет, новый визит достаётся
новому пользователю.
- [ ] Размер активной популяции не растёт выше заданного потолка; при
- [x] Размер активной популяции не растёт выше заданного потолка; при
переполнении вытесняется давно неактивный пользователь без активного визита.
## Blocked by
@@ -33,3 +33,17 @@ Status: ready-for-agent
## Comments
2026-06-11: реализовано через ограниченную популяцию в `TickStreamGenerator`.
Профиль пользователя переиспользуется между визитами, активный пользователь не
получает второй визит, после завершения действует `GEN_MIN_RETURN_MINUTES`.
Если доступных возвратов нет или срабатывает `GEN_P_NEW_USER`, создаётся новый
пользователь с вытеснением давно неактивного профиля без роста выше
`GEN_POPULATION_MAX`.
Проверка: `uv run --with-requirements generator/requirements.txt pytest
generator/tests -q` — 88 passed. В песочнице `/snap/bin/uv` падает на
`snap-confine`, поэтому полный pytest запускался вне песочницы.
После свежего ревью исправлены две детали: UUID теперь создаются через единый
ГПСЧ генератора, а кулдаун пользователя начинается от запланированного времени
последнего события визита, а не от времени позднего тика.