feat(generator): откалиброван поток steady-stream генератора

- Зачем:
  - поток генератора должен соответствовать модели интенсивности и профилю сида перед реализацией состояния версии 2.
- Что:
  - событийный бюджет тика переведён в рождения визитов через ожидаемую среднюю длину визита.
  - дефолты интенсивности и обычный docker-compose запуск синхронизированы с целевыми 30 событиями в минуту.
  - добавлены статистические проверки длины визита, воронки, новых пользователей, межсессионных пауз и долгого окна потока.
  - обновлены README, OPERATIONS и карточка задачи 05.
- Проверка:
  - uv run --with-requirements generator/requirements.txt pytest generator/tests -q.
  - git diff --check.
This commit is contained in:
Dmitry Dementiev
2026-06-11 17:17:34 +03:00
parent d7c5a56675
commit 8f1e997cc9
11 changed files with 345 additions and 65 deletions
@@ -1,4 +1,4 @@
Status: ready-for-agent
Status: ready-for-human
# Интенсивность и калибровка потока
@@ -19,16 +19,16 @@ Status: ready-for-agent
## Acceptance criteria
- [ ] Средняя интенсивность событий за длинное окно соответствует
- [x] Средняя интенсивность событий за длинное окно соответствует
`GEN_LAMBDA_BASE_PER_MIN * часовой коэффициент` с разумным отклонением.
- [ ] Рождения визитов рассчитываются из бюджета событий и средней длины визита,
- [x] Рождения визитов рассчитываются из бюджета событий и средней длины визита,
а не из старых границ `GEN_MIN/MAX_EVENTS_PER_TICK` в прежнем смысле.
- [ ] Доля новых пользователей за длинное окно близка к `GEN_P_NEW_USER`.
- [ ] Межсессионные паузы одного пользователя не меньше кулдауна, а среднее на
- [x] Доля новых пользователей за длинное окно близка к `GEN_P_NEW_USER`.
- [x] Межсессионные паузы одного пользователя не меньше кулдауна, а среднее на
дефолтах находится в районе расчёта из спеки.
- [ ] Распределение длины визита на симуляции сопоставимо с сидом: медиана около
- [x] Распределение длины визита на симуляции сопоставимо с сидом: медиана около
10, среднее около 10, максимум не выше потолка.
- [ ] Воронка по шагам `/home -> товары -> /cart -> /payment -> /confirmation`
- [x] Воронка по шагам `/home -> товары -> /cart -> /payment -> /confirmation`
монотонно затухает на длинной симуляции.
## Blocked by
@@ -37,3 +37,19 @@ Status: ready-for-agent
## Comments
2026-06-11: реализована калибровка потока через `TickStreamGenerator`: событийный
бюджет тика копится как бюджет рождений визитов через ожидаемую среднюю длину
визита (~10 событий), а фактические события выходят по запланированным паузам
активных визитов. Дефолт `GEN_LAMBDA_BASE_PER_MIN` в коде снижен до 30
событий/мин и синхронизирован с обычным запуском через `docker-compose.yml`;
`GEN_MIN/MAX_EVENTS_PER_TICK` теперь ограничивают событийный бюджет тика до
пересчёта в рождения визитов.
Калибровка таблицы переходов и пауз проверена тестами: средняя интенсивность
длинного окна близка к целевому бюджету, доля новых пользователей близка к
`GEN_P_NEW_USER`, межсессионные паузы не меньше кулдауна и имеют часовой
масштаб около формульного ориентира из спеки, длина визита сопоставима с сидом,
доля `/confirmation` остаётся около 25%, воронка монотонно затухает.
Проверка: `uv run --with-requirements generator/requirements.txt pytest
generator/tests -q` — 96 passed.