fix(tradein/dedup): fias-key clustering + cross-fias merge guard + identity carry-over (#1772 follow-up) #2185

Merged
lekss361 merged 1 commit from fix/tradein-dedup-by-fias into main 2026-07-02 18:00:59 +00:00
Owner

Summary

После DaData-backfill (2026-07-02, house_fias_id у 5 122 домов) на проде видны 1 282 группы дублей (2 737 строк с одинаковым ФИАС) — canon их не ловит (разные написания). Плюс подтверждён класс canon-ошибок «слэш-коллапс» («Сулимова, 32» ≡ канон «Сулимова, 3/2») — ревизия 23/25 расхождений решена в пользу DaData.

Изменения в house_dedup_merge.py (recurring merge #1772):

  1. Two-pass кластеризация: сначала fias-pass ('fias:'||lower(house_fias_id), только группы >1), затем прежний canon-pass — pipeline параметризован по key-expression, без копипасты. Geo-guard 250 м сохранён в обоих проходах.
  2. Cross-fias guard в canon-pass: если у keeper и loser оба ФИАС заполнены и различаются — НЕ мержить (это разные здания, слэш-коллапс канона). Анти-overmerge.
  3. Identity carry-over: перед delete losers keeper COALESCE-заполняется из losers (9 полей: fias/кадастр/gar_/dadata_), донор детерминирован (geom → min id). Merge больше не теряет обогащение.

Прод-прогон (после merge+deploy)

Scheduler-only entry (tradein-scraper), расписание house_dedup_merge DORMANT (мигр. 135). План: dry-run через jsonb_set(default_params,'{dry_run}','true') + enabled=true + next_run_at=now() → валидация counters в scrape_runs → боевой dry_run=false.

Test plan

  • 7 новых STATIC-тестов (fias-ключ, cross-fias guard, carry-over 9 полей, порядок проходов, no ::-cast) + 1 real-Postgres (self-skip без БД); файл дедупа 33 passed
  • Полный pytest tradein-backend: 2856 passed, 5 skipped, 1 failed — pre-existing test_search_api::test_search_cache_hit (401 env-артефакт, воспроизводится на чистом main)
  • ruff + pre-commit green

Связано: PR #2184 (fias_exact tier), DaData suggest-backfill 2026-07-02, ревизия dadata_fias_revision (23 канон-ошибки).

## Summary После DaData-backfill (2026-07-02, `house_fias_id` у 5 122 домов) на проде видны **1 282 группы дублей** (2 737 строк с одинаковым ФИАС) — canon их не ловит (разные написания). Плюс подтверждён класс canon-ошибок «слэш-коллапс» («Сулимова, 32» ≡ канон «Сулимова, 3/2») — ревизия 23/25 расхождений решена в пользу DaData. Изменения в `house_dedup_merge.py` (recurring merge #1772): 1. **Two-pass кластеризация**: сначала fias-pass (`'fias:'||lower(house_fias_id)`, только группы >1), затем прежний canon-pass — pipeline параметризован по key-expression, без копипасты. Geo-guard 250 м сохранён в обоих проходах. 2. **Cross-fias guard в canon-pass**: если у keeper и loser оба ФИАС заполнены и различаются — НЕ мержить (это разные здания, слэш-коллапс канона). Анти-overmerge. 3. **Identity carry-over**: перед delete losers keeper COALESCE-заполняется из losers (9 полей: fias/кадастр/gar_*/dadata_*), донор детерминирован (geom → min id). Merge больше не теряет обогащение. ## Прод-прогон (после merge+deploy) Scheduler-only entry (`tradein-scraper`), расписание `house_dedup_merge` DORMANT (мигр. 135). План: dry-run через `jsonb_set(default_params,'{dry_run}','true') + enabled=true + next_run_at=now()` → валидация counters в `scrape_runs` → боевой `dry_run=false`. ## Test plan - [x] 7 новых STATIC-тестов (fias-ключ, cross-fias guard, carry-over 9 полей, порядок проходов, no `::`-cast) + 1 real-Postgres (self-skip без БД); файл дедупа 33 passed - [x] Полный pytest tradein-backend: 2856 passed, 5 skipped, 1 failed — pre-existing `test_search_api::test_search_cache_hit` (401 env-артефакт, воспроизводится на чистом main) - [x] ruff + pre-commit green Связано: PR #2184 (fias_exact tier), DaData suggest-backfill 2026-07-02, ревизия `dadata_fias_revision` (23 канон-ошибки).
lekss361 added 1 commit 2026-07-02 17:55:17 +00:00
fix(tradein/dedup): fias-key clustering + cross-fias merge guard + identity carry-over (#1772 follow-up)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
c4b1992de5
lekss361 merged commit 1c520cadb7 into main 2026-07-02 18:00:59 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2185
No description provided.