[Fable 5][P4] §25.3 _geo_weight: подтверждённо-далёкий проект (>6.9 км) получает вес ниже floor для проекта без координат — инверсия против комментария
fix(forecasting): correct _geo_weight unknown floor so far projects rank low (#1633)
normalize.py: 0-заполненная сетка SalesSeries.units сводит guard _count_full_years к диапазону дат, а не к числу реальных наблюдений (латентно, до подключения #979)
fix(forecasting): count non-zero observations in normalize guard (#1638)
fix(llm): INN redaction requires context anchor, stop eating large numbers (#1640)
INN-regex затирает легитимные слитные 10/12-значные числа (крупные суммы в рублях) в text/строковых fields перед отправкой в LLM
fix(site-finder): robust is_residential_zone detection for NSPD zone codes (#1353)
[medium] is_residential_zone: prefix-проверка мертва для NSPD zone_code, детект жилой зоны держится на хрупкой подстроке 'жил' без negative-list
fix(parcels): _score_label honor «хорошо»=25→«отлично» boundary (#1357)
[medium] _score_label игнорирует порог 'хорошо'=25 — участки со score 15..25 помечены 'хорошо' вместо 'средне'
fix(site-finder): normalize POI weighted score to 0..100 on backend (#1486)
(high) site-finder-api.ts/useParcelPoiScoreQuery: poi_weighted_score из weight в неверной шкале — клиент видит абсурдный «~10/100»