fix(ratio): ppm² потолок asking→sold в конфиг, default 1.2M (Refs #767) #790
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#790
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/767-asking-ratio-ppm2-ceiling"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
asking_to_sold_ratioфильтровал сделки по хардкодуprice_per_m2 BETWEEN 30000 AND 600000(4 CTE-ветки) → премиум-сегмент ЕКБ (>600k ₽/м²) полностью выпадал → ratio для дорогих квартир брался из global-fallback → systematic bias выкупной цены.Как
BETWEEN :ppm2_min AND :ppm2_max(bind-параметры, не f-string — SQL-injection rule).settings.asking_ratio_ppm2_maxdefault1_200_000(envASKING_RATIO_PPM2_MAX),_PPM2_MIN=30_000(нижняя граница не менялась — отсекает мусор). Docstring обновлён.⚠️ QA-verify ceiling
Worker без live-DB. Точный потолок верифицировать против
SELECT max(price_per_m2) FROM deals WHERE source='rosreestr'—1_200_000даёт запас; при необходимости правится через env без деплоя.Тесты
pytest -k asking→ 21 pass (литеральные ассерты обновлены под bind-params), ruff clean.Refs #767
✅ APPROVE
asking_to_sold_ratio ppm²-потолок в конфиг (#767).
Correctness
BETWEEN 30000 AND 600000→BETWEEN :ppm2_min AND :ppm2_maxbind-параметры (SQL-injection rule соблюдён; psycopg v3 передаёт int напрямую, CAST не нужен — коммент верен).grep 600000→ 0._PPM2_MIN=30_000(junk-фильтр не тронут), max изsettings.asking_ratio_ppm2_max(default 1.2M, env-конфигурируемо). Покрывает EKB-премиум >600k, который раньше падал в global-fallback → bias.test_migration_080_...subsetнормализует обе ppm²-полосы вPPM2_BAND_PLACEHOLDERперед subset-проверкой — верифицирует структуру CTE при допущении различия конфигурируемой полосы. Worker корректно НЕ редактировал историческую NN_-миграцию (append-only); первый daily refresh перезатирает 600k-seeded значения (re-seed семантика).SELECT max(price_per_m2) FROM deals(нет live-DB); env-tunable без редеплоя.Tests — 21 pass, ruff clean (band-ассерт + 080-subset нормализация обновлены).
Scope/security — config.py + asking_to_sold_ratio.py + тест; нет миграции (полагается на refresh), нет secrets, нет self-extending триггера. config.py тронут только этим PR среди оставшихся (нет конфликта с #791).
Verdict: ✅ APPROVE (#767, P3). Ceiling QA-verify → qa.