"""Two-system separation + frozen per-trade exit profile. subscriptions: - sys2_budget_pct : daily-budget slice for System 2 (default 0.7) - sys2_cb_tripped_at/reason : independent System-2 circuit breaker bot_trades: - eff_* : the exit profile FROZEN at open. Recovery rehydrates from these instead of the (mutable) Subscription, so a 90-day reversal isn't silently rewritten to the user's Trump stop on restart. """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "009" down_revision: Union[str, None] = "008" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: with op.batch_alter_table("subscriptions") as b: b.add_column(sa.Column("sys2_budget_pct", sa.Float(), nullable=False, server_default="0.7")) b.add_column(sa.Column("sys2_cb_tripped_at", sa.DateTime(), nullable=True)) b.add_column(sa.Column("sys2_cb_reason", sa.String(32), nullable=True)) with op.batch_alter_table("bot_trades") as b: b.add_column(sa.Column("eff_take_profit_pct", sa.Float(), nullable=True)) b.add_column(sa.Column("eff_stop_loss_pct", sa.Float(), nullable=True)) b.add_column(sa.Column("eff_trailing_stop_pct", sa.Float(), nullable=True)) b.add_column(sa.Column("eff_trailing_activate_pct", sa.Float(), nullable=True)) b.add_column(sa.Column("eff_max_hold_hours", sa.Integer(), nullable=True)) b.add_column(sa.Column("eff_invalidation", sa.String(24), nullable=True)) b.add_column(sa.Column("eff_invalidation_price", sa.Float(), nullable=True)) b.add_column(sa.Column("eff_min_hold_until_ts", sa.Float(), nullable=True)) def downgrade() -> None: with op.batch_alter_table("bot_trades") as b: for c in ("eff_min_hold_until_ts", "eff_invalidation_price", "eff_invalidation", "eff_max_hold_hours", "eff_trailing_activate_pct", "eff_trailing_stop_pct", "eff_stop_loss_pct", "eff_take_profit_pct"): b.drop_column(c) with op.batch_alter_table("subscriptions") as b: for c in ("sys2_cb_reason", "sys2_cb_tripped_at", "sys2_budget_pct"): b.drop_column(c)