feat(generator): добавлена стартовая история через backfill

- Зачем:
  - стенду нужна повторяемая история с живым продолжением от модельной границы без дублей и разрыва визитов.
- Что:
  - добавлен backfill-режим с `GEN_MODEL_T_END`, manifest и state на `T_end`.
  - live-запуск восстанавливается из manifest без настенной дельты и проверяет совместимость state.
  - добавлены SQL-проверки формы данных, повторяемости и стыка backfill с live.
- Проверка:
  - make generator-test.
  - два чистых ClickHouse-прогона backfill дали одинаковые manifest checksums и digest.
  - reviewer gate issue 05 пройден после исправлений state/manifest.
This commit is contained in:
2026-06-14 19:45:58 +03:00
parent fcb06da16e
commit d5408f28e9
11 changed files with 1509 additions and 21 deletions
@@ -165,22 +165,29 @@ resume_model_at =
#### Манифест стартовой истории
Стартовая история состоит из трёх частей: события, слепок состояния и манифест.
Манифест хранится как JSON и минимум содержит:
Манифест хранится как JSON в Kafka compact-topic
`generator_startup_history_manifest`, ключ `default`. Слепок состояния хранится
в `generator_state`, ключ `default`. Манифест минимум содержит:
- `manifest_version`;
- `generated_at` — настенная UTC-метка создания артефакта;
- `gen_seed`;
- `model_t0`, `model_t_end`, `model_timezone`;
- `run_mode = "backfill"`;
- настройки генерации, влияющие на поток;
- `state_version` и ссылку на файл или запись слепка состояния;
- настройки генерации, влияющие на поток, в `generation_settings`;
- `state_version` и ссылку на запись слепка состояния;
- контрольные числа по каждому топику: количество строк, минимум и максимум
`event_timestamp`, контрольная сумма;
- итоговые контрольные числа для проверки в ClickHouse: события, визиты,
пользователи и диапазон модельного времени.
Нельзя смешивать события, state и манифест от разных `GEN_SEED`, `T0`, `T_end`
или настроек генерации. Такое смешивание считается ошибкой запуска.
или настроек генерации. Live-запуск использует manifest как стартовую историю
только если `state.last_batch_id`, `state.model_timestamp`, `GEN_SEED`,
`GEN_MODEL_T0`, `GEN_MODEL_T_END`, `GEN_MODEL_TIMEZONE`, `GEN_MODEL_TIME_SPEED`
и `generation_settings` совпадают. Startup-history state без подходящего
manifest считается несовместимым и ведёт к чистому старту, а не к восстановлению
по правилу live-сбоя.
#### Повторяемая проверка в ClickHouse