"""M6 project evaluation and isolated embedding migrations. Revision ID: 20260825_0009 Revises: 20260825_0008 """ import sqlalchemy as sa from alembic import op revision = "20260825_0009" down_revision = "20260825_0008" branch_labels = None depends_on = None def _id() -> sa.Column: return sa.Column("id", sa.Uuid(), primary_key=True) def _created() -> sa.Column: return sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()) def upgrade() -> None: op.add_column( "service_clients", sa.Column("workload_priority", sa.String(32), nullable=False, server_default="production"), ) op.create_table( "project_evaluation_bindings", _id(), _created(), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("project_id", sa.Uuid(), nullable=False), sa.Column("adapter_kind", sa.String(64), nullable=False), sa.Column("endpoint", sa.Text(), nullable=False), sa.Column("current_target", sa.String(128), nullable=False), sa.Column("shadow_target", sa.String(128)), sa.Column("enabled", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("configuration", sa.JSON(), nullable=False), sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"), sa.UniqueConstraint("project_id", name="uq_project_evaluation_binding"), ) op.create_index("ix_project_evaluation_bindings_project_id", "project_evaluation_bindings", ["project_id"]) op.create_table( "embedding_migrations", _id(), _created(), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("project_id", sa.Uuid(), nullable=False), sa.Column("source_embedding_space", sa.String(255), nullable=False), sa.Column("target_embedding_space_id", sa.Uuid(), nullable=False), sa.Column("source_index_ref", sa.Text(), nullable=False), sa.Column("target_index_ref", sa.Text(), nullable=False, unique=True), sa.Column("corpus_revision", sa.String(128), nullable=False), sa.Column("status", sa.String(32), nullable=False, server_default="planned"), sa.Column("total_chunks", sa.Integer(), nullable=False, server_default="0"), sa.Column("completed_chunks", sa.Integer(), nullable=False, server_default="0"), sa.Column("failed_chunks", sa.Integer(), nullable=False, server_default="0"), sa.Column("retried_chunks", sa.Integer(), nullable=False, server_default="0"), sa.Column("batch_size", sa.Integer(), nullable=False), sa.Column("concurrency", sa.Integer(), nullable=False), sa.Column("priority", sa.String(32), nullable=False, server_default="background"), sa.Column("preflight_evidence", sa.JSON(), nullable=False), sa.Column("progress_evidence", sa.JSON(), nullable=False), sa.Column("validation_evidence", sa.JSON(), nullable=False), sa.Column("operational_metrics", sa.JSON(), nullable=False), sa.Column("evaluation_eligibility", sa.Boolean(), nullable=False, server_default=sa.false()), sa.Column("cancel_requested", sa.Boolean(), nullable=False, server_default=sa.false()), sa.Column("failure_code", sa.String(64)), sa.Column("failure_message", sa.Text()), sa.Column("started_at", sa.DateTime(timezone=True)), sa.Column("finished_at", sa.DateTime(timezone=True)), sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["target_embedding_space_id"], ["embedding_spaces.id"], ondelete="RESTRICT"), ) for column in ("project_id", "target_embedding_space_id", "status"): op.create_index(f"ix_embedding_migrations_{column}", "embedding_migrations", [column]) op.create_table( "evaluation_suites", _id(), _created(), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.Column("project_id", sa.Uuid(), nullable=False), sa.Column("key", sa.String(128), nullable=False), sa.Column("name", sa.String(255), nullable=False), sa.Column("description", sa.Text(), nullable=False), sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"), sa.UniqueConstraint("project_id", "key", name="uq_evaluation_suite_key"), ) op.create_index("ix_evaluation_suites_project_id", "evaluation_suites", ["project_id"]) op.create_table( "evaluation_suite_revisions", _id(), _created(), sa.Column("suite_id", sa.Uuid(), nullable=False), sa.Column("revision", sa.String(128), nullable=False), sa.Column("dataset_revision", sa.String(128), nullable=False), sa.Column("definition_digest", sa.String(64), nullable=False), sa.Column("metrics", sa.JSON(), nullable=False), sa.Column("top_k", sa.Integer(), nullable=False), sa.Column("retrieval_settings", sa.JSON(), nullable=False), sa.Column("thresholds", sa.JSON(), nullable=False), sa.Column("immutable_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.ForeignKeyConstraint(["suite_id"], ["evaluation_suites.id"], ondelete="RESTRICT"), sa.UniqueConstraint("suite_id", "revision", name="uq_evaluation_suite_revision"), sa.UniqueConstraint("definition_digest", name="uq_evaluation_revision_digest"), ) op.create_index("ix_evaluation_suite_revisions_suite_id", "evaluation_suite_revisions", ["suite_id"]) op.create_table( "evaluation_cases", _id(), _created(), sa.Column("suite_revision_id", sa.Uuid(), nullable=False), sa.Column("case_key", sa.String(128), nullable=False), sa.Column("query", sa.Text(), nullable=False), sa.Column("relevant_chunk_ids", sa.JSON(), nullable=False), sa.Column("relevant_document_ids", sa.JSON(), nullable=False), sa.Column("relevance_grades", sa.JSON(), nullable=False), sa.Column("label_provenance", sa.JSON(), nullable=False), sa.Column("critical", sa.Boolean(), nullable=False), sa.Column("review_status", sa.String(32), nullable=False), sa.Column("immutable_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.ForeignKeyConstraint(["suite_revision_id"], ["evaluation_suite_revisions.id"], ondelete="RESTRICT"), sa.UniqueConstraint("suite_revision_id", "case_key", name="uq_evaluation_case_key"), ) op.create_index("ix_evaluation_cases_suite_revision_id", "evaluation_cases", ["suite_revision_id"]) op.create_index("ix_evaluation_cases_critical", "evaluation_cases", ["critical"]) op.create_table( "evaluation_runs", _id(), _created(), sa.Column("project_id", sa.Uuid(), nullable=False), sa.Column("suite_revision_id", sa.Uuid(), nullable=False), sa.Column("target_kind", sa.String(32), nullable=False), sa.Column("target_index_ref", sa.Text(), nullable=False), sa.Column("embedding_space_ref", sa.String(255), nullable=False), sa.Column("capability_deployment_id", sa.Uuid()), sa.Column("status", sa.String(32), nullable=False), sa.Column("corpus_revision", sa.String(128), nullable=False), sa.Column("retrieval_config_digest", sa.String(64), nullable=False), sa.Column("environment_fingerprint", sa.JSON(), nullable=False), sa.Column("environment_digest", sa.String(64), nullable=False), sa.Column("expected_cases", sa.Integer(), nullable=False), sa.Column("completed_cases", sa.Integer(), nullable=False), sa.Column("error_count", sa.Integer(), nullable=False), sa.Column("aggregate_metrics", sa.JSON(), nullable=False), sa.Column("started_at", sa.DateTime(timezone=True)), sa.Column("completed_at", sa.DateTime(timezone=True)), sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["suite_revision_id"], ["evaluation_suite_revisions.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["capability_deployment_id"], ["capability_deployments.id"], ondelete="RESTRICT"), ) for column in ("project_id", "suite_revision_id", "capability_deployment_id", "status", "environment_digest"): op.create_index(f"ix_evaluation_runs_{column}", "evaluation_runs", [column]) op.create_table( "evaluation_case_results", _id(), _created(), sa.Column("run_id", sa.Uuid(), nullable=False), sa.Column("case_id", sa.Uuid(), nullable=False), sa.Column("ranked_results", sa.JSON(), nullable=False), sa.Column("relevant_results", sa.JSON(), nullable=False), sa.Column("first_relevant_rank", sa.Integer()), sa.Column("metrics", sa.JSON(), nullable=False), sa.Column("latency_ms", sa.Float(), nullable=False), sa.Column("error_code", sa.String(64)), sa.ForeignKeyConstraint(["run_id"], ["evaluation_runs.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["case_id"], ["evaluation_cases.id"], ondelete="RESTRICT"), sa.UniqueConstraint("run_id", "case_id", name="uq_evaluation_case_result"), ) op.create_index("ix_evaluation_case_results_run_id", "evaluation_case_results", ["run_id"]) op.create_index("ix_evaluation_case_results_case_id", "evaluation_case_results", ["case_id"]) op.create_table( "evaluation_comparisons", _id(), _created(), sa.Column("project_id", sa.Uuid(), nullable=False), sa.Column("baseline_run_id", sa.Uuid(), nullable=False), sa.Column("candidate_run_id", sa.Uuid(), nullable=False), sa.Column("comparability", sa.String(32), nullable=False), sa.Column("comparability_evidence", sa.JSON(), nullable=False), sa.Column("metric_deltas", sa.JSON(), nullable=False), sa.Column("improved_cases", sa.Integer(), nullable=False), sa.Column("unchanged_cases", sa.Integer(), nullable=False), sa.Column("regressed_cases", sa.Integer(), nullable=False), sa.Column("critical_regressions", sa.Integer(), nullable=False), sa.Column("case_comparisons", sa.JSON(), nullable=False), sa.Column("promotion_eligibility", sa.String(32), nullable=False), sa.Column("eligibility_evidence", sa.JSON(), nullable=False), sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["baseline_run_id"], ["evaluation_runs.id"], ondelete="RESTRICT"), sa.ForeignKeyConstraint(["candidate_run_id"], ["evaluation_runs.id"], ondelete="RESTRICT"), sa.UniqueConstraint("baseline_run_id", "candidate_run_id", name="uq_evaluation_comparison"), ) for column in ("project_id", "baseline_run_id", "candidate_run_id"): op.create_index(f"ix_evaluation_comparisons_{column}", "evaluation_comparisons", [column]) def downgrade() -> None: for table in ( "evaluation_comparisons", "evaluation_case_results", "evaluation_runs", "evaluation_cases", "evaluation_suite_revisions", "evaluation_suites", "embedding_migrations", "project_evaluation_bindings", ): op.drop_table(table) op.drop_column("service_clients", "workload_priority")