"""drop note_links — [[wiki-links]] are removed (note 2897) Revision ID: 0024 Revises: 0023 Create Date: 2026-08-22 ThoughtSync is an intermediary surface for capture and recall; a linking system is organization, which is not what it is for. Backlinks, the graph and the name index went with it. 0023 (which added `note_links.target_id`) is deliberately left in the chain rather than deleted. It shipped in an image and may already be applied, and removing an applied revision would strand a database's alembic_version pointer. So the column is dropped here along with the table it lived on, and the history stays honest about the fact that it existed for a day. No down-migration data concern: note_links was always DERIVED from note bodies. The `[[text]]` is still sitting in every body it was written in; nothing a person typed is lost by this. """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision = "0024" down_revision = "0023" branch_labels = None depends_on = None def upgrade() -> None: op.drop_table("note_links") def downgrade() -> None: op.create_table( "note_links", sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True), sa.Column( "source_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("notes.id", ondelete="CASCADE"), nullable=False, ), sa.Column( "target_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("notes.id", ondelete="SET NULL"), nullable=True, ), sa.Column("target_norm", sa.Text(), nullable=False), ) op.create_index("ix_note_links_target", "note_links", ["target_norm"]) op.create_index("ix_note_links_target_id", "note_links", ["target_id"])