Status: ready-for-agent # Восстановление state v2 от модельной точки ## Parent `.scratch/generator-model-time-startup-history/PRD.md` ## What to build Привести восстановление state v2 к модельному времени. Один и тот же слепок должен уметь восстанавливаться в двух разных случаях: после сбоя, где время действительно прошло, и при старте из стартовой истории, где продолжение идёт от `T_end` без искусственного разрыва. Срез должен доказать поведение не только локальными тестами состояния, но и данными в ClickHouse: активные визиты продолжаются или закрываются по правилам модельного времени. ## Acceptance criteria - [ ] State сохраняет достаточно данных, чтобы после сбоя вычислить модельную точку возобновления при ×K. - [ ] Восстановление после короткого модельного сбоя продолжает активные визиты и досылает созревшие события с исходными модельными метками. - [ ] Восстановление после долгого модельного сбоя закрывает сильно просроченные активные визиты без досылки остатка. - [ ] Восстановление из стартовой истории использует `T_end` как точку возобновления и не обрывает активные визиты из-за настенного простоя. - [ ] Визит, переживший восстановление, остаётся однородным: события до и после восстановления не меняют контекст визита и не создают второй путь генерации внутри одного `click_id`. - [ ] Повреждённый или несовместимый state не валит сервис: генератор стартует с чистого листа и пишет предупреждение. - [ ] ClickHouse-проверка подтверждает, что на стыке восстановления нет дублей событий и нет разрыва `click_id` внутри продолжающегося визита. - [ ] После реализации выполнено саморевью worker-а и отдельное reviewer-ревью, потому что задача меняет state/serialization и сервисное восстановление. - [ ] Если исправление после ревью меняет формат state или способ восстановления, выполнен повторный reviewer-круг. ## Blocked by - `.scratch/generator-model-time-startup-history/issues/03-model-speed-and-day-factor.md` - Review gate из `PRD.md`: сквозной инвариант времени после задачи 3