"""add handoff_count to thread_state (Спринт 6a, блок B) Revision ID: d9b612a04e75 Revises: c7f3d18a45e2 Create Date: 2026-04-25 12:00:00.000000 Счётчик жёстких handoff'ов в рамках одного диалога. По достижении cap (=3 в коде) оркестратор автоматически уводит диалог в `escalate_human` с reason=routing_loop — защита от петель маршрутизации (v2 §4.3). """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = 'd9b612a04e75' down_revision: Union[str, None] = 'c7f3d18a45e2' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: with op.batch_alter_table('thread_state', recreate='always') as batch: batch.add_column(sa.Column('handoff_count', sa.Integer(), nullable=False, server_default='0')) def downgrade() -> None: with op.batch_alter_table('thread_state', recreate='always') as batch: batch.drop_column('handoff_count')