Status: ready-for-human # Состояние версии 2 и рестарт ## What to build Расширить состояние генератора до версии 2: кроме тика и состояния генератора случайных чисел сохранять популяцию пользователей и активные визиты. После рестарта генератор должен продолжать коротко прерванные визиты и закрывать сильно просроченные, не теряя популяцию пользователей. Задача проверяет поведение состояния через публичные методы сохранения и восстановления, без реального Kafka-брокера там, где достаточно сериализации. Источник решений: `docs/specs/2026-06-10-generator-math-model.md`, раздел «Персистентность через рестарты». ## Acceptance criteria - [x] Состояние версии 2 сериализуется в JSON и восстанавливает тик, ГПСЧ, популяцию пользователей и активные визиты. - [x] Старое состояние версии 1 или битое состояние не валит генератор: фиксируется предупреждение, генератор начинает с чистого листа. - [x] После простоя не больше 30 минут активный визит продолжается, а созревшие события досылаются со своими исходными запланированными метками времени. - [x] После долгого простоя просроченный активный визит закрывается без досылки остатка. - [x] Популяция пользователей переживает простой любой длины. - [x] `GEN_STATE_RESET=true` явно сбрасывает состояние, как и раньше. ## Blocked by - `.scratch/feature-data-generator/issues/05-intensity-and-flow-calibration.md` ## Comments 2026-06-11: задачу нельзя считать самостоятельной к реализации, пока не закрыты предыдущие срезы генератора: 02 (путь визита и монотонное время), 03 (тики и активные визиты), 04 (популяция и возвраты), 05 (интенсивность и калибровка). Преждевременный кодовый задел state v2 был откатан, чтобы он не попал в коммиты следующих задач. Возвращаться к этой задаче нужно после реализации зависимостей и заново проверять все acceptance criteria на актуальной модели генератора. 2026-06-11: реализовано состояние версии 2 для `TickStreamGenerator`: в снимок попадают тик, ГПСЧ, компактная популяция пользователей, компактные активные визиты и остаток бюджета рождений визитов. `GeneratorService` теперь владеет одним тиковым потоком, сохраняет его снимок и восстанавливает его при старте. Короткий простой продолжает активные визиты и досылает созревшие события с исходными метками времени; долгий простой закрывает просроченные визиты без досылки остатка; популяция сохраняется. Старое state v1 и битое v2-state деградируют в чистый старт с предупреждением; `GEN_STATE_RESET=true` по-прежнему пропускает загрузку состояния. Проверка: `uv run --with-requirements generator/requirements.txt pytest generator/tests -q` — 112 passed.