"""Classify snapshots whose sole Alpha failure is the unopened PPAC theme.""" import sqlalchemy as sa from alembic import op revision = "0022" down_revision = "0021" branch_labels = None depends_on = None def upgrade(): # Reuse the indexed check_type column; preserve all raw evidence and check stages. table = sa.table("alphas", sa.column("id", sa.String()), sa.column("checks", sa.JSON()), sa.column("check_type", sa.String(20))) connection = op.get_bind() last_id = None while True: query = sa.select(table.c.id, table.c.checks).order_by(table.c.id).limit(500) if last_id is not None: query = query.where(table.c.id > last_id) rows = connection.execute(query).mappings().all() if not rows: break candidates = [] for row in rows: # Freeze the current interpretation instead of importing application code. checks = row["checks"] if isinstance(row["checks"], list) else [] failures = [check for check in checks if isinstance(check, dict) and check.get("name") != "REGULAR_SUBMISSION" and isinstance(check.get("result"), str) and check["result"].upper() == "FAIL"] if len(failures) == 1 and failures[0].get("name") == "PURE_POWER_POOL_THEME": candidates.append(row["id"]) if candidates: connection.execute(table.update().where(table.c.id.in_(candidates)).values(check_type="PPAC_CANDIDATE")) last_id = rows[-1]["id"] def downgrade(): table = sa.table("alphas", sa.column("check_type", sa.String(20))) op.execute(table.update().where(table.c.check_type == "PPAC_CANDIDATE").values(check_type="FAIL_1"))