"""Step 산출물 무결성 검증 리포트 dataclass.

verify_completion()이 반환하는 CompletionReport와 cleanup_artifacts()가 반환하는
CleanupReport를 정의한다. 모두 frozen — 호출자는 로깅·결정에만 사용.
"""
from dataclasses import dataclass
from typing import Literal


@dataclass(frozen=True)
class CompletionReport:
    """Step 산출물 무결성 검증 결과.

    is_complete=True → resume entry verify에서 skipped 결정 + exit verify에서 completed 마킹.
    is_complete=False → entry: ResumeDecision evaluation, exit: status='partial' 마킹.

    origin (Block B B1, plan v2.1.3 / spec V5 §2.1): verify 결과의 분류.
    ResumeDecision 평가 시 사용 — B7/B8 의 prerequisite. backward-compat:
    기존 verifier 가 origin 미지정 시 default 'artifact_missing' (현재 운영
    semantics 유지).
      - clean: 정상
      - artifact_missing: DB row / PNG / cp 파일 부재 (default)
      - contract_drift: schema/config_hash mismatch / loader contract / AppError
      - invariant_drift: sentinel/hash drift (mutator/manual/unknown)
      - verify_crashed: verifier 의 unexpected exception (B7 에서 fail-fast 격상)
    """
    is_complete: bool
    missing: list[str]                 # 사람이 읽는 결손 목록
    severity: Literal["clean", "partial", "missing"]
    metadata: dict                     # 진단용 — count/file paths
    origin: Literal[
        "clean", "artifact_missing", "contract_drift",
        "invariant_drift", "verify_crashed",
    ] = "artifact_missing"


@dataclass(frozen=True)
class CleanupReport:
    """force/auto-rerun 시 stale artifact 정리 결과.

    deleted_db_rows + deleted_files == 0 이면 noop (override 안 한 step의 default).
    """
    deleted_db_rows: int
    deleted_files: int
    targets: list[str]                 # 정리된 대상 (감사 로그)
    skipped: list[str]                 # self-origin 외 보호된 대상 (drift detection)
