feat(site-finder): additive objective_lots price fallback for competitors (#307 OBJ-3) #1332
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1332
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/obj3-objective-price-fallback"
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?
Summary (OBJ-3, #307)
Site Finder competitors price-сигнал мёртв на проде:
competitors._AVG_PRICE_SQLчитаетdomrf_kn_flats.price_per_m2, но на последнем snapshot эта колонка = 0 строк (скрапер перестал отдавать per-flat цены ~2026-06-03) →avg_price_per_m2=Noneпочти всем конкурентам →_price_similarity(вес 0.20) вырождается в нейтраль 0.5.Additive fallback: где domrf-цены нет → медиана
objective_lots.price_per_m2_rubчерезobjective_complex_mapping(obj_id↔project, 1:1 мост). domrf-цены приоритетны (precedence domrf > objective; существующие непустые выводы байт-идентичны). Новое полеprice_source(domrf/objective/null) — прозрачность провенанса для инвест-рекомендаций.⚠️ User-facing: восстанавливает мёртвый price-сигнал → competitor relevance ordering снова учитывает цену для ~262 mapped ЕКБ obj_id (прод-median 136k руб/м², диапазон 80k-250k ✓). Веса/формула НЕ менялись;
mv_layout_velocityне тронут (#295 defer). best_layouts price уже на objective — не трогал.Test plan
Notes
objective_lot_id), медиана по текущим лотам, без per-snapshot дублей. No-snapshot-filter консистентно с уже-смерженным OBJ-3 bridgeparcels.py:1603.Refs #307
competitors._AVG_PRICE_SQL читает domrf_kn_flats.price_per_m2, но на последнем snapshot эта колонка пуста (0 строк, скрапер перестал отдавать per-flat цены ~2026-06-03) -> avg_price_per_m2=None почти всем конкурентам, price_similarity вырождается в нейтраль 0.5. Добавлен additive fallback: где domrf-цены нет, берём медиану objective_lots.price_per_m2_rub через objective_complex_mapping (1:1 мост, ~80% покрытие, прод-median 136k руб/м²). domrf-цены приоритетны (precedence domrf > objective); новое поле price_source ('domrf'/'objective') для прозрачности инвест-рекомендаций. Веса и mv_layout_velocity не тронуты (#295 defer). Медиана (не weighted-avg) устойчива к хвостам. api-types.ts regenerated (v7.13.0 pinned + prettier). Refs #307