Dry-run на проде показал, что DaData без явного города мапит короткие
street-адреса в Москву по умолчанию («улица Просторная» → «г Москва, ул
Просторная»). Это бы привело к catastrophic false-positive enrichment'у
если бы скрипт запустили без --dry-run.
Two-layer fix:
1. `_with_city_context(addr)` — pre-pends «Екатеринбург, » если в адресе
ещё нет упоминания города. Идемпотентен, case-insensitive.
2. `_result_in_ekb(result)` — post-filter. Проверяет `raw.city`
(структурное поле DaData) с fallback на substring search в
`canonical_address`. Защищает даже если DaData проигнорирует city-префикс
и всё равно вернёт другой город (например для homonym streets).
`_is_enriched_result()` теперь требует обе проверки: qc_geo IN (0,1)
AND coords AND city == Екатеринбург. Только так делаем UPDATE coords/cadnum.
Без этого fix'а нельзя запускать backfill — все non-EKB false-positives
перезаписали бы NULL coords мусором.
9 новых тестов: city context (prepend / idempotent / case / empty),
post-filter (raw.city / canonical / Moscow reject / None).
Combined 29 passed.