"""V2: rename pull requests to proposals, add intel/coord/health tables. No backwards compatibility. Hard rename musehub_pull_requests → musehub_proposals. No view alias. Add V2 risk + domain columns to proposals. Rename review/comment tables. Add musehub_symbol_index, musehub_health_snapshots, musehub_coord_reservations, musehub_coord_tasks. Revision ID: 0011 Revises: 0010 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision: str = "0011" down_revision: str = "0010" branch_labels = None depends_on = None def upgrade() -> None: # ── Rename pull_requests → proposals ────────────────────────────────────── op.rename_table("musehub_pull_requests", "musehub_proposals") # Add V2 risk + domain columns to proposals op.add_column("musehub_proposals", sa.Column("domain_diff", sa.JSON(), nullable=True)) op.add_column("musehub_proposals", sa.Column("risk_score", sa.Float(), nullable=True)) op.add_column("musehub_proposals", sa.Column("blast_delta", sa.Float(), nullable=True)) op.add_column("musehub_proposals", sa.Column("breakage_count", sa.Integer(), nullable=True, server_default="0")) op.add_column("musehub_proposals", sa.Column("test_gap_count", sa.Integer(), nullable=True, server_default="0")) op.add_column("musehub_proposals", sa.Column("symbols_changed", sa.Integer(), nullable=True, server_default="0")) # ── Rename pr_reviews → proposal_reviews ────────────────────────────────── op.rename_table("musehub_pr_reviews", "musehub_proposal_reviews") # ── Rename pr_comments → proposal_comments ──────────────────────────────── op.rename_table("musehub_pr_comments", "musehub_proposal_comments") # Add symbol_address to proposal_comments (V2: anchor to symbol, not line number) op.add_column("musehub_proposal_comments", sa.Column("symbol_address", sa.String(512), nullable=True)) # ── New: musehub_symbol_index ────────────────────────────────────────────── op.create_table( "musehub_symbol_index", sa.Column("index_id", sa.String(36), nullable=False), sa.Column("repo_id", sa.String(36), nullable=False), sa.Column("ref", sa.String(64), nullable=False), sa.Column("symbol_history", sa.LargeBinary(), nullable=True), sa.Column("hash_occurrence", sa.LargeBinary(), nullable=True), sa.Column("built_at", sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(["repo_id"], ["musehub_repos.repo_id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("index_id"), ) op.create_index("ix_symbol_index_repo_id", "musehub_symbol_index", ["repo_id"]) # ── New: musehub_health_snapshots ────────────────────────────────────────── op.create_table( "musehub_health_snapshots", sa.Column("snapshot_id", sa.String(36), nullable=False), sa.Column("repo_id", sa.String(36), nullable=False), sa.Column("ref", sa.String(64), nullable=False), sa.Column("score", sa.Float(), nullable=True), sa.Column("breakage_count", sa.Integer(), nullable=False, server_default="0"), sa.Column("dead_code_count", sa.Integer(), nullable=False, server_default="0"), sa.Column("type_coverage", sa.Float(), nullable=True), sa.Column("test_gap_count", sa.Integer(), nullable=False, server_default="0"), sa.Column("blast_risk_p95", sa.Float(), nullable=True), sa.Column("computed_at", sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(["repo_id"], ["musehub_repos.repo_id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("snapshot_id"), ) op.create_index("ix_health_snapshots_repo_id", "musehub_health_snapshots", ["repo_id"]) # ── New: musehub_coord_reservations ─────────────────────────────────────── op.create_table( "musehub_coord_reservations", sa.Column("reservation_id", sa.String(36), nullable=False), sa.Column("repo_id", sa.String(36), nullable=False), sa.Column("symbol_address", sa.String(512), nullable=False), sa.Column("agent_id", sa.String(255), nullable=False), sa.Column("agent_model_id", sa.String(255), nullable=False, server_default=""), sa.Column("ttl_s", sa.Integer(), nullable=False, server_default="300"), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False), sa.Column("released_at", sa.DateTime(timezone=True), nullable=True), sa.ForeignKeyConstraint(["repo_id"], ["musehub_repos.repo_id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("reservation_id"), ) op.create_index("ix_coord_reservations_repo_id", "musehub_coord_reservations", ["repo_id"]) op.create_index( "ix_coord_reservations_active", "musehub_coord_reservations", ["repo_id", "symbol_address", "released_at"], ) # ── New: musehub_coord_tasks ─────────────────────────────────────────────── op.create_table( "musehub_coord_tasks", sa.Column("task_id", sa.String(36), nullable=False), sa.Column("repo_id", sa.String(36), nullable=False), sa.Column("queue", sa.String(255), nullable=False, server_default="default"), sa.Column("priority", sa.Integer(), nullable=False, server_default="50"), sa.Column("payload", sa.JSON(), nullable=False), sa.Column("status", sa.String(20), nullable=False, server_default="pending"), sa.Column("claimed_by", sa.String(255), nullable=True), sa.Column("claimed_at", sa.DateTime(timezone=True), nullable=True), sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True), sa.Column("depends_on", sa.JSON(), nullable=False), sa.Column("run_id", sa.String(255), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(["repo_id"], ["musehub_repos.repo_id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("task_id"), ) op.create_index("ix_coord_tasks_repo_queue_status", "musehub_coord_tasks", ["repo_id", "queue", "status"]) op.create_index("ix_coord_tasks_repo_priority", "musehub_coord_tasks", ["repo_id", "priority"]) def downgrade() -> None: op.drop_index("ix_coord_tasks_repo_priority", table_name="musehub_coord_tasks") op.drop_index("ix_coord_tasks_repo_queue_status", table_name="musehub_coord_tasks") op.drop_table("musehub_coord_tasks") op.drop_index("ix_coord_reservations_active", table_name="musehub_coord_reservations") op.drop_index("ix_coord_reservations_repo_id", table_name="musehub_coord_reservations") op.drop_table("musehub_coord_reservations") op.drop_index("ix_health_snapshots_repo_id", table_name="musehub_health_snapshots") op.drop_table("musehub_health_snapshots") op.drop_index("ix_symbol_index_repo_id", table_name="musehub_symbol_index") op.drop_table("musehub_symbol_index") op.drop_column("musehub_proposal_comments", "symbol_address") op.rename_table("musehub_proposal_comments", "musehub_pr_comments") op.rename_table("musehub_proposal_reviews", "musehub_pr_reviews") op.drop_column("musehub_proposals", "symbols_changed") op.drop_column("musehub_proposals", "test_gap_count") op.drop_column("musehub_proposals", "breakage_count") op.drop_column("musehub_proposals", "blast_delta") op.drop_column("musehub_proposals", "risk_score") op.drop_column("musehub_proposals", "domain_diff") op.rename_table("musehub_proposals", "musehub_pull_requests")