"""Phase Resume Integrity: step_run.recovery_count + last_recovery_reason +
image_asset.variant_label String(8) → String(32).

PID 0bb48ebf 사고로 step_run의 recovery 추적이 없어 silent fallback이 발생.
이번 마이그레이션은 그 가시성 컬럼을 도입하고 chain_bg/state_variant/composite의
긴 variant label을 수용하기 위해 variant_label 길이를 확장한다.

Revision ID: 003_resume_integrity
Revises: 002_phase5_image_asset_variants
Create Date: 2026-05-01
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = "003_resume_integrity"
down_revision: Union[str, None] = "002_phase5_image_asset_variants"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """Add recovery tracking columns to step_run + extend variant_label length."""
    op.add_column(
        "step_run",
        sa.Column(
            "recovery_count",
            sa.Integer(),
            nullable=False,
            server_default="0",
        ),
    )
    op.add_column(
        "step_run",
        sa.Column(
            "last_recovery_reason",
            sa.Text(),
            nullable=True,
        ),
    )
    op.alter_column(
        "image_asset",
        "variant_label",
        type_=sa.String(length=32),
        existing_type=sa.String(length=8),
        existing_nullable=False,
        existing_server_default="v00",
    )


def downgrade() -> None:
    """Reverse the upgrade in inverse order."""
    op.alter_column(
        "image_asset",
        "variant_label",
        type_=sa.String(length=8),
        existing_type=sa.String(length=32),
        existing_nullable=False,
        existing_server_default="v00",
    )
    op.drop_column("step_run", "last_recovery_reason")
    op.drop_column("step_run", "recovery_count")
