"""gpu_job.triage_status — the probe's verdict on an errored job's FILE Failure triage (#125): a periodic sweep probes each errored image's file (sha256 + decode, verify_integrity's machinery) exactly once and stores the verdict here — 'defect' (the file is bad: recovery material, excluded from /retry_errors) or 'file_ok' (failure was operational, safe to retry). NULL means not yet probed; selecting on NULL is what makes the sweep resumable. No index: the errored slice the sweep scans is tiny by design (tombstones). Revision ID: 0072 Revises: 0071 Create Date: 2026-07-02 """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "0072" down_revision: Union[str, None] = "0071" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.add_column( "gpu_job", sa.Column("triage_status", sa.String(16), nullable=True) ) def downgrade() -> None: op.drop_column("gpu_job", "triage_status")