"""Create the profile-activation decision audit table.""" from __future__ import annotations import sqlalchemy as sa from alembic import op revision = "0012_profile_activations" down_revision = "0011_index_operations" branch_labels = None depends_on = None def upgrade() -> None: op.execute(sa.text("CREATE SCHEMA IF NOT EXISTS profiles")) op.create_table( "activation_decisions", sa.Column("id", sa.Uuid(), primary_key=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.Column("dataset_id", sa.String(64), nullable=False), sa.Column("dataset_version", sa.String(64), nullable=False), sa.Column("baseline_run_id", sa.Uuid(), nullable=False), sa.Column("candidate_run_id", sa.Uuid(), nullable=False), sa.Column("baseline_profile", sa.JSON(), nullable=False), sa.Column("candidate_profile", sa.JSON(), nullable=False), sa.Column("gate_thresholds_version", sa.String(64), nullable=False), sa.Column("gate_passed", sa.Boolean(), nullable=False), sa.Column("gate_regressions", sa.JSON(), nullable=False), sa.Column("activated", sa.Boolean(), nullable=False), sa.Column("candidate_alias_name", sa.String(128), nullable=True), sa.Column("candidate_collection_name", sa.String(128), nullable=True), sa.Column("candidate_version", sa.String(128), nullable=True), sa.Column("candidate_model_digest", sa.String(128), nullable=True), sa.Column("index_operation_id", sa.Uuid(), nullable=True), sa.Column("previous_collection", sa.String(128), nullable=True), sa.Column("rolled_back", sa.Boolean(), nullable=False), sa.Column("rolled_back_at", sa.DateTime(timezone=True), nullable=True), schema="profiles", ) op.create_index( "ix_profiles_activation_decisions_created_at", "activation_decisions", ["created_at"], schema="profiles", ) def downgrade() -> None: op.drop_index( "ix_profiles_activation_decisions_created_at", table_name="activation_decisions", schema="profiles", ) op.drop_table("activation_decisions", schema="profiles") op.execute(sa.text("DROP SCHEMA IF EXISTS profiles"))