feat(generator): добавлен артефакт стартовой истории

- Зачем:
  - чистый стенд должен восстанавливать стартовую историю без повторной генерации.
- Что:
  - добавлены export/import артефакта через Kafka и compact-топики.
  - добавлена manifest-aware сверка ClickHouse и защита от смешения state.
  - добавлен runbook использования стартовой истории.
- Проверка:
  - uv run --with-requirements generator/requirements.txt pytest generator/tests -q.
  - bash -n scripts/check_startup_history_manifest.sh scripts/export_startup_history_artifact.sh scripts/import_startup_history_artifact.sh.
  - git diff --check.
This commit is contained in:
2026-07-04 18:23:54 +03:00
parent ee4c9f5857
commit 3c38465d89
16 changed files with 1746 additions and 177 deletions
@@ -62,6 +62,16 @@ def _kafka_importer():
return _facade_attr("_import_kafka", _import_kafka)
def kafka_event_value_json(event: dict) -> str:
"""Возвращает JSON value ровно в формате Kafka producer генератора."""
return json.dumps(event)
def kafka_event_value_bytes(event: dict) -> bytes:
"""Возвращает Kafka value bytes для события генератора."""
return kafka_event_value_json(event).encode("utf-8")
@dataclass
class BatchRecord:
"""Запись об отправленном батче."""
@@ -380,7 +390,7 @@ class KafkaPublisher:
logger.info(f"Connecting to Kafka at {self.bootstrap_servers}")
self.producer = KafkaProducerCls(
bootstrap_servers=self.bootstrap_servers,
value_serializer=lambda v: json.dumps(v).encode("utf-8"),
value_serializer=kafka_event_value_bytes,
key_serializer=lambda k: k.encode("utf-8") if k else None,
batch_size=16384,
linger_ms=100,