source_url пишется только при вставке: его нет ни в ON CONFLICT DO UPDATE, ни в
reconcile-UPDATE. Поэтому канонизация продюсера (#2235) вылечила лишь новые
строки, а миграция 164 — лишь те легаси, чей URL делили несколько строк. Строки
с уникальной ссылкой на карточку застройщика не попали никуда: парсер деталей
требует '/offer/<цифры>/' и отказывает им до обращения к HTML, а
yandex_address_backfill ходит по ним на чужие сайты.
Замер на проде 2026-08-12: 3535 строк, у всех числовой offerId в source_id,
0 с NULL-адресом, 3522 активны. Коллизий нового URL — 0 (и с существующими
строками, и внутри множества). Dry-run (BEGIN…ROLLBACK) тем же телом:
UPDATE 3535, непарсимых после 0, дублей source_url у yandex 0;
url_from_offer_id 3535 → 0; кандидаты yandex_address_backfill с непарсимым
URL 1777 → 0.
Форма адреса взята у продюсера (_canonical_source_url) через CANONICAL_URL_SQL,
тест держит сцепление. Прежние адреса сохранены поимённо: raw_payload ключа
'url' не содержит (0 из 3535), а listing_sources покрывает лишь 3529 и не
отделяется предикатом от 9 чужих строк — поэтому откат опирается на таблицу,
а не на догадку.