fix(sf-20): adaptive district threshold 30→15 with data_confidence flag #288
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#288
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/sf-20-district-threshold-adaptive"
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?
Problem
v_bucket_success_scoreSQL view имелHAVING COUNT(*) >= 30. В районах с меньшей плотностью (например Кировский), блок «Что хорошо продаётся» возвращал empty даже с 15-29 useful rows. Valuable location data была спрятана.Fix
data/sql/86_v_bucket_success_score.sql:HAVING >= 30→>= 15; two-tier: 15-29 = weak, ≥30 = strong (COMMENT updated)backend/app/api/v1/parcels.py:SUCCESS_REC_MIN_DEALS=15,SUCCESS_REC_STRONG_DEALS=30constantsn_deals < 15, computesdata_confidence='strong'|'weak', adds to responsefrontend/src/types/site-finder.ts:ParcelSuccessRecommendation.data_confidence: "strong" | "weak"frontend/src/components/site-finder/SuccessRecommendationBlock.tsx:data_confidence === 'weak'Test plan
66:41:0702048:27) — должен теперь показывать данные (раньше empty)CREATE OR REPLACE VIEW, idempotent)Related: epic #271 item #20 · Wave 3 (P2)
Deep Code Review — verdict APPROVE
Files: 4 (P0: 1 SQL, P1: 1 backend, P2: 2 frontend) · +70/-28 · mergeable=true
Что проверено
SQL
data/sql/86_v_bucket_success_score.sqlCREATE OR REPLACE VIEW+BEGIN/COMMIT— idempotent, auto-apply черезdeploy.yml. OK.HAVING COUNT(*) >= 15— только threshold, структура view не меняется → backward compat для consumers.Backend
backend/app/api/v1/parcels.pySUCCESS_REC_MIN_DEALS=15/SUCCESS_REC_STRONG_DEALS=30вынесены, читаемо.valid_rows = [r for r in success_rows if int(r["n_deals"]) >= 15]— explicit guard на случай если view вернёт <15 (defense in depth).data_confidence = "strong" if max_deals >= 30 else "weak"— корректная two-tier логика.top_bucket = dict(valid_rows[0])— безопасно, подif valid_rows:.data_confidenceчисто additive, не ломает старых клиентов.Cross-file impact
backend/app/services/analytics_queries.py:1790(_bucket_success_ranking) — другой consumer view, читает все колонки. SQL изменение только понижает порог → больше строк, но schema идентична. Не ломается.analytics_queries.py:2250(recommend_mix) — hardcodedn_deals >= 30для mix-shift. Это intentional conservative gate: SF-20 опускает порог только для отображения, но не для алгоритмического сдвига долей. Корректно.frontend/MarketTab.tsx:83— пробрасываетdata.success_recommendationв block, TS-тип расширен консистентно.Frontend
var(--warn-soft)/var(--warn)— consistent с design tokens (PR #287 pattern)..claude/rules/ui-ux.md.(мин 15)синхронизирован с backend константой.*вместо emoji ⭐ — соответствует ui-ux.md.Vault
fixes/Fix_SF_District_Threshold_May17.mdexists — задокументировано (epic #271, item #20). OK.Risk score
HAVING >=30revert + redeploy.Merging.
Merged via deep-code-reviewer — verdict APPROVE. Merge commit
9eed55cd.Post-deploy smoke checks
SQL view applied (после
deploy.yml):Ожидаем — появятся районы, ранее отсутствовавшие (Кировский и др. low-density).
API smoke —
66:41:0702048:27(Кировский):Ожидаем: non-null объект,
data_confidence: "weak",ranking[].n_deals >= 15.Frontend — открыть участок с 15-29 сделок: amber badge «слабые данные, ориентировочно» рядом с заголовком блока. Участок с ≥30 сделок: badge нет.