"""add reflection_message and profile_revision (Phase 2 AI coach loop) Revision ID: 004 Revises: 003 Create Date: 2026-06-16 Phase 2: the AI-coach reflection loop stores its dialogue in reflection_message, and every change to a profile's prose (initial extraction, reflection-applied revision, or manual edit) is snapshotted in profile_revision. """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "004" down_revision: Union[str, None] = "003" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( "reflection_message", sa.Column("id", sa.String(), primary_key=True), sa.Column( "profile_id", sa.String(), sa.ForeignKey("discovery_profile.id"), nullable=False, ), sa.Column( "user_id", sa.String(), sa.ForeignKey("users.id"), nullable=False, ), sa.Column("role", sa.String(), nullable=False), sa.Column("content", sa.Text(), nullable=False), sa.Column("sequence", sa.Integer(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), ) op.create_index( "ix_reflection_message_profile_id", "reflection_message", ["profile_id"], ) op.create_index( "ix_reflection_message_user_id", "reflection_message", ["user_id"] ) op.create_table( "profile_revision", sa.Column("id", sa.String(), primary_key=True), sa.Column( "profile_id", sa.String(), sa.ForeignKey("discovery_profile.id"), nullable=False, ), sa.Column( "user_id", sa.String(), sa.ForeignKey("users.id"), nullable=False, ), sa.Column("source", sa.String(), nullable=False), sa.Column("fields_json", sa.Text(), nullable=False), sa.Column("note", sa.Text(), nullable=True), sa.Column("created_at", sa.DateTime(), nullable=False), ) op.create_index( "ix_profile_revision_profile_id", "profile_revision", ["profile_id"] ) op.create_index( "ix_profile_revision_user_id", "profile_revision", ["user_id"] ) def downgrade() -> None: op.drop_index( "ix_profile_revision_user_id", table_name="profile_revision" ) op.drop_index( "ix_profile_revision_profile_id", table_name="profile_revision" ) op.drop_table("profile_revision") op.drop_index( "ix_reflection_message_user_id", table_name="reflection_message" ) op.drop_index( "ix_reflection_message_profile_id", table_name="reflection_message" ) op.drop_table("reflection_message")