fix(scrapers): cian _walk_price_range stop silently truncating tail (#1393)
(low) Cian _walk_price_range: force-paginate ветка молча теряет хвост ценового бакета (задокументированная потеря в hot path)
fix(sql): v_supply_layers_latest keep dev_group_name in DISTINCT ON key (#1650)
v_supply_layers_latest (м.125) схлопывает все L3 dev_group'ы района в 1 строку — DISTINCT ON без dev_group_name заново вносит #970 на read-слое future_supply
fix(scrapers): disambiguate EMISS yearly vs Q1 in dedup key (#1606)
EMISS-парсер: годовой агрегат (PERIOD='год') и I квартал коллидируют по obs_date=date(year,1,1) — последний Series молча затирает первый
fix(forecasting): correct _geo_weight unknown floor so far projects rank low (#1633)
[Fable 5][P4] §25.3 _geo_weight: подтверждённо-далёкий проект (>6.9 км) получает вес ниже floor для проекта без координат — инверсия против комментария
normalize.py: 0-заполненная сетка SalesSeries.units сводит guard _count_full_years к диапазону дат, а не к числу реальных наблюдений (латентно, до подключения #979)
fix(forecasting): count non-zero observations in normalize guard (#1638)
INN-regex затирает легитимные слитные 10/12-значные числа (крупные суммы в рублях) в text/строковых fields перед отправкой в LLM
fix(llm): INN redaction requires context anchor, stop eating large numbers (#1640)
fix(site-finder): robust is_residential_zone detection for NSPD zone codes (#1353)
[medium] is_residential_zone: prefix-проверка мертва для NSPD zone_code, детект жилой зоны держится на хрупкой подстроке 'жил' без negative-list