from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime from typing import Any @dataclass(frozen=True) class IngestionJobSpec: source_uid: str job_type: str parser_version: str artifact_uid: str | None = None parameters: dict[str, Any] = field(default_factory=dict) force_rerun: bool = False @dataclass(frozen=True) class IngestionJobRecord: uid: str source_uid: str job_type: str parser_version: str idempotency_key: str actor_uid: str | None artifact_uid: str | None = None parameters: dict[str, Any] = field(default_factory=dict) status: str = "created" statistics: dict[str, Any] = field(default_factory=dict) last_error: str | None = None attempt_count: int = 0 failure_stage: str | None = None force_rerun: bool = False created_at: datetime | None = None updated_at: datetime | None = None started_at: datetime | None = None finished_at: datetime | None = None @dataclass(frozen=True) class JobTransition: source_status: str target_status: str