fix(site-finder): honest POI-score label + drop duplicate MOI column (audit #1871 P2) #1877
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#1877
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "audit/1871-p2-invest-moi"
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
Audit-issue #1871 — два 🟠 P2 disclosure-фикса + 3 consistency follow-up (по code-review).
invest_score = взвешенная POI-сумма (distance-decay + center-bonus, max-ref 40), НЕ калиброванный инвест-рейтинг (
scorer.py— пустой стаб). Был мислейбл «Инвест-балл». Формулу/SCORE_MAX_REFERENCEне трогаем — только честная подпись:score_explanation→ «POI-скор (0–40, оценочный)... Не инвест-рейтинг...»KpiCard— новый optionalcaptionprop (backward-compat)Section1ParcelInfo— «Инвест-балл» → «POI-скор · 0–40» + caption «оценочный»legacy site-finder+CompareTable— тот же rename (CompareTable показывал тот же score как «Инвест-балл»)app/page.tsx— «Score 0–100» → «POI-скор 0–40» (реальная шкала)Section1 scoreColor— пороги 0–100 → калиброванные 0–40 (_score_label: <5 плохо · 5–15 средне · 15–25 хорошо · ≥25 отлично). Раньше хороший ~30/40 участок рисовался red прямо рядом с честным «0–40» лейблом — видимое противоречие.MOI (months_of_inventory) математически КОРРЕКТЕН — по определению не зависит от горизонта проекции (MOI = сток / месячный темп). Не баг. Но дублировался колонкой на 4 горизонта в
ForecastHorizonsBlock(116.6/116.6/117.6/117.6 — выглядело сломанным). Убрал колонку; MOI остаётся 1 раз вSection6key_numbers.deficit_index(варьируется — информативен) сохранён.Test plan
Не тронуто
ptica InvestScoreBlock (уже honest — §22 overall_score /10); формула score / SCORE_MAX_REFERENCE.
Refs #1871
🤖 Generated with Claude Code
Два disclosure-фикса + 3 consistency follow-up (по code-review). invest_score = взвешенная POI-сумма (distance-decay + center-bonus, max-ref 40), НЕ калиброванный инвест-рейтинг (scorer.py — пустой стаб). Был мислейбл «Инвест-балл». Формулу/SCORE_MAX_REFERENCE не трогаем — только честная подпись. - backend parcels.py: score_explanation → «POI-скор (0–40, оценочный)... Не инвест-рейтинг...» - KpiCard: новый optional caption prop (backward-compat). - Section1ParcelInfo: KPI «Инвест-балл» → «POI-скор · 0–40» + caption «оценочный». - legacy site-finder: scoreLabel → «POI-скор · {label} · оценочный». - CompareTable: «Инвест-балл» → «POI-скор · 0–40» (тот же score, был мислейбл). - landing app/page.tsx: «Score 0–100» → «POI-скор 0–40» (реальная шкала). - Section1 scoreColor: пороги 0–100 → 0–40 калиброванные (_score_label: <5 плохо · 5–15 средне · 15–25 хорошо · ≥25 отлично) — раньше хороший ~30/40 участок рисовался red рядом с честным «0–40» лейблом. MOI (months_of_inventory) математически КОРРЕКТЕН — по определению не зависит от горизонта проекции (MOI = сток / месячный темп). Не баг. Но дублировался колонкой на 4 горизонта в ForecastHorizonsBlock (116.6/116.6/117.6/117.6 — выглядело сломанным). Убрал колонку; MOI остаётся 1 раз в Section6 key_numbers. deficit_index (варьируется) сохранён. Подчищены unused balanced/DEFICIT_BALANCE_EPS. 138 frontend vitest passed, ruff/tsc/lint clean. Refs #1871