Root cause: migration 090 used ON CONFLICT (source) DO NOTHING; prod already had
a row source='deactivate_stale_avito' with enabled=false (inserted before 090 ran),
so the INSERT was silently skipped. The scheduler's WHERE enabled=true filter meant
the task never fired (last_run_id=NULL, next_run_at=2026-06-01 expired).
Fix: add migration 100 — idempotent UPDATE SET enabled=true, next_run_at=NOW()
WHERE source='deactivate_stale_avito' AND enabled=false. Safe to re-run: 0 rows
matched once the row is already enabled. Auto-applied on next deploy via
_schema_migrations tracking in deploy-tradein.yml.
Migration 090 seed (enabled=true + ON CONFLICT DO NOTHING) is already correct for
fresh installs — no change needed there.
Tests: 7 new assertions in test_deactivate_stale_avito.py for migration 100
(exists, UPDATE source, SET enabled=true, idempotent guard, BEGIN/COMMIT, no
psycopg trap, next_run_at reset). 39 tests pass total.
Refs #759