fix(site_finder): correct best-layouts supply fan-out (~8.5x) + objects-first perf #1944
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#1944
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "perf/best-layouts-objects-first"
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?
⚠️ USER-FACING: best-layouts supply/sold_pct/is_oversold меняются ~8.5x (к верному)
Это исправление видимых чисел в блоке Best Layouts (фронт
BestLayoutsBlock.tsx). ТЗ-рекомендация и PDF НЕ меняются (они считаются изsum_deals, не из supply). Anton — учти, что цифры supply/sold_pct/срок-распродажи в этом блоке сдвинутся (старые скрины/деки на инфлированном supply устарели).Баг (correctness)
domrf_kn_objects— snapshot-измерение (UNIQUE(obj_id, snapshot_date), ~8 снимков/obj_id)._SUPPLY_BATCH_SQLджойнил flats ко ВСЕМ object-snapshot строкам (без фильтраo.snapshot_date) → каждый flat считался ~8.5x. Итог (user-facing,best_layouts.py:571-611):supply_units_in_radiusзавышен ~8.5x (показывается raw),sold_pct_of_supply = deals_window/supplyзанижен ~8.5x,is_oversold = ratio>100недо-фаерит.Числитель (
deals_window, objective velocity) НЕ инфлирован → отношение реально искажено (не сокращается). Чистое отношение без тюнингового порога → фикс однозначно корректен.Фикс
Objects-first MATERIALIZED CTE:
DISTINCT ON (obj_id) ORDER BY snapshot_date DESC(один ряд на obj_id = последний снимок) →ST_DWithinпо этим координатам → join flats через существующийidx_kn_flats_obj.unitsтеперь = один счёт на flat. Это ещё и выравнивает supply-знаменатель с deals-числителем (_COMPETITORS_IN_RADIUS_SQLуже использует DISTINCT ON latest snapshot).Доказательства (prod, read-only)
units == count(*) == count(DISTINCT f.id) == 9612для 65 объектов. Correction factor 8.56x @1.5km, 9.13x @1.0km.Bitmap Index Scan idx_kn_flats_obj, no parallel seq scan.Проверки
test_best_layouts36 passed (вкл. новый fan-out guardtest_supply_dedups_objects_to_latest_snapshot) · обновил stale EXPLAIN-зеркало вtest_phantom_columns.database-expert + deep-code-reviewer независимо перепроверили downstream на проде (не по relayed authority).