"""retrieval_judgments — a reviewer's verdict on each line of a logged menu (#4772) Revision ID: 0115 Revises: 0114 Create Date: 2026-10-03 Whether an injected line RELATED, which the usage tables cannot say: since every line carries its matched passage, "not opened" no longer implies "not relevant". FK-free like the telemetry tables beside it; no CHECK on `verdict`, which the service validates. """ import sqlalchemy as sa from alembic import op revision = "0115" down_revision = "0114" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "retrieval_judgments", sa.Column("id", sa.BigInteger(), primary_key=True), sa.Column( "created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()"), ), sa.Column("user_id", sa.BigInteger(), nullable=True), sa.Column("retrieval_log_id", sa.BigInteger(), nullable=False), sa.Column("source", sa.Text(), nullable=False), sa.Column("query", sa.Text(), nullable=True), sa.Column("record_id", sa.BigInteger(), nullable=False), sa.Column("rank", sa.Integer(), nullable=False), sa.Column("score", sa.Float(), nullable=True), sa.Column("within_budget", sa.Boolean(), nullable=False), sa.Column("verdict", sa.Text(), nullable=False), sa.Column("reason", sa.Text(), nullable=False), sa.Column("opened_after", sa.Boolean(), nullable=True), sa.UniqueConstraint( "retrieval_log_id", "record_id", "user_id", name="uq_retrieval_judgment_line", ), ) op.create_index( "ix_retrieval_judgments_source_created", "retrieval_judgments", ["source", "created_at"], ) def downgrade() -> None: op.drop_index( "ix_retrieval_judgments_source_created", table_name="retrieval_judgments", ) op.drop_table("retrieval_judgments")