feat(site-finder): VelocityBlock в MarketTab (#34 sub-PR 2/2 FINAL) #147
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#147
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/34-velocity-block-frontend"
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
#34 D2 Velocity-score — sub-PR 2/2 FINAL. Backend service merged #146; этот PR — UI render.
Visual elements
TS types
Velocity, VelocityCompetitor, VelocityPeriod. ParcelAnalysis.velocity? optional.
Integration
MarketTab.tsx между market_trend и competitors. Guard 'velocity' in data.
Checks
Vault
code/modules/Module_Velocity_Block.md NEW
Closes #34
Refs: #144 (backend), audit #127
Bot review (SHA
33b6148) — НЕ мержу, нашёл cross-stack contract mismatchCI зелёный, но tsc проверяет только consistency внутри frontend, не контракт с backend. Я сравнил TS типы с тем что реально отдаёт
velocity.py(merged в PR #146) — два поля разъезжаются.Bug: TS types vs backend
sample_competitorsВ
velocity.py:compute_velocity()строки строятся так (PR #146):То есть payload содержит:
obj_id,name,dev_name,obj_class,district_name,distance_m,total_sqm_period.TS
VelocityCompetitorв этом PR:И
VelocityBlock.tsxобращается к этим именам:{c.class && <span>{c.class}</span>}—undefined && ...всегда false → класс ЖК никогда не показывается{Math.round(c.total_sqm).toLocaleString("ru")}—Math.round(undefined)=NaN→NaN.toLocaleString("ru")= «не число» в колонке «Продано м²» для всех 5 строк top-sellers таблицыКак поправить
Cleanest вариант — frontend conforms к backend (backend уже задеплоен через PR #146):
1. TS type:
2. VelocityBlock.tsx:
После push'а нового SHA — на следующем тике cron перепроверю и смерджу если корректно.
Альтернатива (если предпочтительнее backend-side rename)
Можно переименовать в
velocity.py:obj_class→class(ноclass— reserved word в Python, не критично здесь т.к. dict key, не attribute, но в JS/TS это reserved word и valid identifier только в object literal, не как class field name TS auto-completes... — лучше избегать)total_sqm_period→total_sqmНе рекомендую —
classв TS object фактически работает, но семантически зарезервирован у читателя в голове.Bonus замечания (не блокеры)
MarketTab guard
"velocity" in data— корректно: проверяет наличие ключа, не truthiness. Если backend пришлётvelocity: null(sub-PR #146 returnsvelocity_data: dict[str, Any] | None = None),"velocity" in data= true, и VelocityBlock получитnull. VelocityBlock корректно обрабатывает:if (!velocity) return <EmptyState>. ✓Цветовая schema gauge (0.66/0.33 thresholds) — visual decision, не блокер.
Confidence chip + Russian labels (
Высокая/Средняя/Низкая) — match backend literal types ✓Final review (SHA
c6cabc1, CI ✅) — closes #34Field naming bug исправлен корректно:
✅ TS
VelocityCompetitor:obj_class+total_sqm_period+ bonus optionaldev_name?/district_name?— точное соответствие backend payload✅ VelocityBlock.tsx:
c.obj_classв conditional render,c.total_sqm_periodв м²-колонке✅ Backend SUCCESS + frontend SUCCESS — оба чека прошли
approve merge