Два бага, вскрытых живым прогоном по КрасЛомбару (оба в обработке, не в xfetch):
1. Достройка коротких номеров лепила фальшивку из обрезка полного номера:
сайт делит номер на tel:+7 (391) 271 и tel:271-33-33. Обрезок 7391271
(страна+код города) ошибочно достраивался в 73917391271. Теперь обрезок
«7/8 + код города» распознаётся и выкидывается; настоящие локальные
(включая московские 771-..) — целы. Логику вынес в classifyShort/areaCode.
2. parseBranchList брал ссылку филиала только из href — на части прорисовок
2ГИС ссылка лежит в JSON-данных, филиалы терялись. Берём путь /city/firm/<id>
откуда угодно (с дедупом).
TDD: Autopodbor 49/49.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Москва 495, Питер 812, Екатеринбург 343 — код города берётся со страницы
конкурента или из города запроса, никакой привязки к Красноярску. Защита
от регрессии. Autopodbor 41/41.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Сканер кода сайта выкидывал короткие локальные номера (271-33-33,
2-828-828 и т.п.) как мусор — терялись реальные телефоны филиалов.
Теперь короткий номер из tel:/schema/microdata достраивается кодом
города: сперва по преобладающему коду полных номеров той же страницы,
иначе по коду региона запроса; если код не определить — номер не
теряется, а помечается «требует проверки» (phoneKind=uncertain).
Из тела текста короткие формы не достраиваются (защита от ложных).
TDD: 6 новых тестов, весь Autopodbor 40/40.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>