"""retire the report_preference arm's rows Revision ID: 0121 Revises: 0120 Create Date: 2026-10-09 The fixed-question arm that searched for completion-report preferences when a task closed is gone: the reply shapes and the preferences mounted beside them now arrive on the moments. Its rows go with it (there is no legacy to preserve), because each one would otherwise mean something different once the arm is no longer registered: - `retrieval_logs` / `retrieval_judgments` — a source missing from the registry reads as `unregistered_source`, whose advice is "add it to the registry": the opposite of what happened. - `rule_usage_events` — a source missing from `RANKED_SOURCES` reads as ambient, so its surfacings would silently move into the other column of every rule's pull-through. - `retrieval_tuning_events` — the tuning history of a surface that no longer exists. - `settings` — the arm's floor and budget keys, which nothing reads. COST IS BOUNDED BY AN INDEX, NOT BY THE TABLE. A migration runs at boot against the live tables, which CI never has. `retrieval_logs` and `retrieval_judgments` are indexed on `source`. `rule_usage_events` is not, so its delete is also bounded by `created_at` (indexed): no row of the arm predates `ARM_BORN`, and the scan covers weeks rather than the table's whole history. Not reversible: the arm is not coming back, so neither are its rows. """ from alembic import op revision = "0121" down_revision = "0120" branch_labels = None depends_on = None SOURCE = "report_preference" # A safe floor under the arm's first row (it shipped after 2026-09-14). ARM_BORN = "2026-09-01" def upgrade() -> None: op.execute(f"DELETE FROM retrieval_logs WHERE source = '{SOURCE}'") op.execute(f"DELETE FROM retrieval_judgments WHERE source = '{SOURCE}'") op.execute( f"DELETE FROM rule_usage_events WHERE created_at >= '{ARM_BORN}' " f"AND source = '{SOURCE}'" ) op.execute(f"DELETE FROM retrieval_tuning_events WHERE surface = '{SOURCE}'") op.execute( "DELETE FROM settings WHERE key IN " "('kb_reportpref_threshold', 'kb_reportpref_top_k')" ) def downgrade() -> None: pass