[tradein] dedup regression: PR #2429 сломал сравнение корпуса дома между avito/cian («NкM») и domklik («N/M») #2431

Closed
opened 2026-07-04 17:07:00 +00:00 by lekss361 · 1 comment
Owner

Найдено собственной live-перезамерой сразу после мержа/деплоя PR #2429 (2026-07-04) — тем же способом, что верифицировался сам #2429 (pre/post-fix сравнение на одном и том же сегодняшнем датасете).

Баг

PR #2429 починил avito-баг «глухое название метро вместо номера дома» (regex _DEDUP_HOUSE_NO_RE теперь не ломается на «2Чкаловская11-15 мин» → дом «2»). Но тот же regex-фикс ввёл новый разрыв: domklik пишет корпус через слэш («65/4», «37/1»), а avito/cian — слитно через букву «к» без пробела («65к4», «37к1»). После #2429 regex на glued-форме матчит только \d+ (буква-суффикс отбраковывается lookahead'ом (?!\w), как и задумано против #2423), но НЕ восстанавливает отброшенную цифру корпуса — итог house="65" для avito/cian vs house="65/4" для domklik. guard_house в _dedup_cross_source видит два разных непустых значения и блокирует легитимное слияние.

Масштаб (live-перезамер, тот же день, тот же датасет что и #2429)

  • Candidate cross-source groups: 4841
  • OLD (post-#2429, замер до фикса regression): 457 survivors → фактически 555 после самого #2429 (сравнение с допущением #2429)
  • Конкретно от ЭТОЙ регрессии — 226 групп заблокированы из-за kN/slash несовпадения (больше, чем #2429 исправил — 128 групп).

Fix

fix/tradein-dedup-corpus-format-normalize (commit deffd311) — новая _normalize_house_no(), канонизирующая ЛЮБУЮ нотацию корпуса («NкM» глухо/с пробелом, «N корпус M», «N/M») к единому «N/M» перед сравнением в guard_house. Литер (единственная буква без цифры за ней, «24г») НЕ трогается — остаётся как есть, не путается с корпусом.

Live-перезамер после фикса (тот же день, тот же датасет): candidate 4841 → OLD survivors 5441, NEW survivors 5261 (−180 строк, 185 из 186 изменившихся кластеров полностью схлопнулись). Zero guard-violations по всем 4841 кластерам. Подтверждено на реальных адресах: «Викулова, 37к1» (cian) vs «Викулова, 37/1» (domklik) → оба «37/1»; «Щербакова, 31к2Чкаловская21-30 мин.Ботаническая» (avito, corpus+metro-glue одновременно) → «31/2», #2429 не регрессирован.

Известный побочный эффект (не баг, отдельный вопрос)

6 кластеров дали обратный эффект (1→2 survivors): один источник пишет «голый» номер дома без корпуса («77»), другой — конкретный корпус («77к1»). Подтверждено живыми данными (ул. Щербакова, 77к1Ботаническая avito vs улица Щербакова, 77 domklik/cian/yandex — реальная мульти-корпусная застройка). Это восстановление до-#2429 поведения (сам #2429 случайно склеивал их через усечение цифры), не новая регрессия. Архитектурный вопрос «считать ли голый номер wildcard'ом для любого корпуса того же дома» — вне scope, отдельный follow-up при необходимости.

Refs #2429, #2423, #2291

Найдено собственной live-перезамерой сразу после мержа/деплоя PR #2429 (2026-07-04) — тем же способом, что верифицировался сам #2429 (pre/post-fix сравнение на одном и том же сегодняшнем датасете). ## Баг PR #2429 починил avito-баг «глухое название метро вместо номера дома» (regex `_DEDUP_HOUSE_NO_RE` теперь не ломается на «2Чкаловская11-15 мин» → дом «2»). Но тот же regex-фикс ввёл новый разрыв: domklik пишет корпус через слэш («65/4», «37/1»), а avito/cian — слитно через букву «к» без пробела («65к4», «37к1»). После #2429 regex на glued-форме матчит только `\d+` (буква-суффикс отбраковывается lookahead'ом `(?!\w)`, как и задумано против #2423), но НЕ восстанавливает отброшенную цифру корпуса — итог `house="65"` для avito/cian vs `house="65/4"` для domklik. `guard_house` в `_dedup_cross_source` видит два разных непустых значения и блокирует легитимное слияние. ## Масштаб (live-перезамер, тот же день, тот же датасет что и #2429) - Candidate cross-source groups: 4841 - OLD (post-#2429, замер до фикса regression): 457 survivors → фактически 555 после самого #2429 (сравнение с допущением #2429) - Конкретно от ЭТОЙ регрессии — 226 групп заблокированы из-за kN/slash несовпадения (больше, чем #2429 исправил — 128 групп). ## Fix `fix/tradein-dedup-corpus-format-normalize` (commit `deffd311`) — новая `_normalize_house_no()`, канонизирующая ЛЮБУЮ нотацию корпуса («NкM» глухо/с пробелом, «N корпус M», «N/M») к единому «N/M» перед сравнением в `guard_house`. Литер (единственная буква без цифры за ней, «24г») НЕ трогается — остаётся как есть, не путается с корпусом. Live-перезамер после фикса (тот же день, тот же датасет): candidate 4841 → OLD survivors 5441, NEW survivors 5261 (−180 строк, 185 из 186 изменившихся кластеров полностью схлопнулись). Zero guard-violations по всем 4841 кластерам. Подтверждено на реальных адресах: «Викулова, 37к1» (cian) vs «Викулова, 37/1» (domklik) → оба «37/1»; «Щербакова, 31к2Чкаловская21-30 мин.Ботаническая» (avito, corpus+metro-glue одновременно) → «31/2», #2429 не регрессирован. ## Известный побочный эффект (не баг, отдельный вопрос) 6 кластеров дали обратный эффект (1→2 survivors): один источник пишет «голый» номер дома без корпуса («77»), другой — конкретный корпус («77к1»). Подтверждено живыми данными (`ул. Щербакова, 77к1Ботаническая` avito vs `улица Щербакова, 77` domklik/cian/yandex — реальная мульти-корпусная застройка). Это восстановление до-#2429 поведения (сам #2429 случайно склеивал их через усечение цифры), не новая регрессия. Архитектурный вопрос «считать ли голый номер wildcard'ом для любого корпуса того же дома» — вне scope, отдельный follow-up при необходимости. Refs #2429, #2423, #2291
Author
Owner

Закрыто PR #2432 (merge, задеплоено 2026-07-04). Live-перезамер на свежих пост-деплой данных подтверждён лично (не только отчётом воркера): внутри живого tradein-backend контейнера напрямую вызвал _parse_street_house — «Викулова, 37к1» и «Викулова, 37/1» оба дают house="37/1" (мердж теперь возможен), «Щербакова, 77к1Ботаническая» → "77/1" корректно отличается от «Щербакова, 77» → "77" (раскрытый в issue edge case — разные источники, разная специфичность корпуса, не баг), исходный #2423-пример не регрессирован.

Закрыто PR #2432 (merge, задеплоено 2026-07-04). Live-перезамер на свежих пост-деплой данных подтверждён лично (не только отчётом воркера): внутри живого `tradein-backend` контейнера напрямую вызвал `_parse_street_house` — «Викулова, 37к1» и «Викулова, 37/1» оба дают `house="37/1"` (мердж теперь возможен), «Щербакова, 77к1Ботаническая» → `"77/1"` корректно отличается от «Щербакова, 77» → `"77"` (раскрытый в issue edge case — разные источники, разная специфичность корпуса, не баг), исходный #2423-пример не регрессирован.
Sign in to join this conversation.
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#2431
No description provided.