Миграция 250 была снята с деплоя #2792: её DROP INDEX ждал ACCESS EXCLUSIVE
29 минут за чужой аналитической сессией и увёл за собой запросы приложения
(четыре смерженных PR не доехали до прода). Конвенция и гейт закреплены
#2791 — возвращаю сам снос с `SET LOCAL lock_timeout = '5s'`.
Файл — первый настоящий вход гейта scripts/check-migration-lock-timeout.py
(порог для tradein: NN >= 250). Прогон локально: зелёный на файле как есть,
красный на нём же с вырезанной строкой SET LOCAL (негативный контроль).
Критерий «таблица тиха», записанный в #2791/#2793 ДО работы, выполнен на
проде 2026-08-09 16:54 UTC: pg_locks по trade_in_estimates = 0, долгих
транзакций в БД нет вообще.
Подтверждение разбора #2752 свежим замером (16:54 UTC, +2 суток к прошлому):
дубль trade_in_estimates_expires_at_idx — 21 скан, переживший
trade_in_estimates_expires_idx — по-прежнему 234, счётчик заморожен.
Планировщик держит весь живой трафик на дубле (relpages 5 против 6), то есть
состояние устойчивое. EXPLAIN до сноса: Index Scan using
trade_in_estimates_expires_at_idx.
Уточнён критерий приёмки: наблюдаемый темп ~7 сканов/сутки, поэтому «сдвиг
idx_scan в течение часа» — недостаточное окно. Детерминированная проверка
сразу после деплоя — EXPLAIN с именем пережившего индекса; счётчик честно
подтверждается за сутки.
Refs #2793, #2752, #2791