fix(sf-08): room_bucket euro-1/euro-2 classification #281
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#281
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/sf-08-room-bucket-euro"
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
SF FixList #8 (Wave 2) —
rooms=2за 26м² фактически euro-формат. Audit подтвердил: DOM.РФ API сам маркирует euro какrooms=2, scraper корректен. Добавлены bucketseuro-1/euro-2.Audit (postgres MCP)
SELECT ... FROM domrf_kn_flats WHERE rooms=2 GROUP BY area_bucket:<35(→ euro-1)35-50(→ euro-2)50-70(normal 2-к)>=70(large 2-к)rooms=3 + area<35: всего 40 единиц (0.09%) — не требует отдельного bucket.
Изменения
backend/app/services/site_finder/best_layouts.py—_SUPPLY_BATCH_SQLCASE добавлены две ветки передrooms IN (1,2,3):WHEN f.rooms = 2 AND f.total_area < 35 THEN 'euro-1'WHEN f.rooms = 2 AND f.total_area < 50 THEN 'euro-2'backend/app/services/site_finder/layout_signature.py—RoomBucketLiteral расширен ("euro-1","euro-2");room_bucket_from_flat()принимаетtotal_areaи применяет ту же логику.fixes/Fix_SF_Room_Bucket_Euro_May17.mdTest plan
mv_layout_velocityREFRESH после deploy — теперь поroom_bucketв('studio','1k','euro-1','euro-2','2k','3k')/analyzeдля test_cad66:41:0702048:27→ Top Layouts показывает euro buckets отдельноRelated: epic #271 item #8 · Wave 2
Merged via deep-code-reviewer — verdict APPROVE.
Анализ:
studio→rooms=0 studio→euro-1(rooms=2 AND area<35) →euro-2(rooms=2 AND area<50) →rooms IN (1,2,3)→4+. Mutually exclusive, first-match.<strict: area=35.0 идёт вeuro-2, area=50.0 идёт в'2'. SQL ↔ Python mirror точный.total_area IS NULL+ rooms=2 →'2'(default). В Python та же логика (skip euro branch).total_area: float | None = Nonekwarg) — existing teststest_layout_signature.pyне сломаны.Post-deploy actions:
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_layout_velocity;(опционально — MV definition не менялась, но per author test plan)./analyzeдля66:41:0702048:27→ проверитьsupply_units_in_radiusдля bucket='2'снизится на ~29.5k euro-формат строк.Known limitations (follow-up PRs нужны):
objective_corpus_room_month.room_bucket(upstream ETL) НЕ знает euro — velocity-side в_INLINE_VELOCITY_SQL/mv_layout_velocityбудет выдавать'2'для всех euro. Следствие: top_layouts пока не покажет euro строки (supply_map ключи euro-1/euro-2 будут «висеть» неиспользованными). Это более точно для bucket='2', но требует ETL update чтобы выделить euro в velocity.frontend/src/types/best-layouts.tsRoomBucketLiteral — out of sync (нет"euro-1"/"euro-2"); runtime safe т.к.TopLayoutRow.room_bucket: string.BestLayoutsBlock.tsx ROOM_BUCKET_LABELS— нет «Евро-1»/«Евро-2», fallback покажет raw"euro-1". Cosmetic.Все три — отдельным PR (ETL + frontend labels + codegen).