Overlay 06 "АНАЛИТИКА ДОМА" had several display/chart defects vs the design:
- scatter "Цена × срок продажи" letterboxed into a narrow column
(missing preserveAspectRatio="none", unlike the price-history svg).
- Y-domain wasn't clamped to 0 in buildScatterDetail AND buildScatterMini
(same root-cause bug in both), so a thin/high price cluster could show
a negative "−1M" axis tick.
- "сделки" legend/series rendered even with 0 deal points (Rosreestr ДКП
always have days_on_market=null → never plotted) — now gated like the
avito/yandex conditional legend.
- the "линия тренда" was a literal hardcoded x1/y1/x2/y2 line, entirely
data-independent — removed (a real regression is a separate feature).
- bargainColor sign was inverted: it greened a price RISE, but the
displayed bargainSigned value negates the raw pct, and the fixture
(kpis[1], "−3.0%") greens the price-DROP case actually shown on screen.
- sell-time buckets ignored the backend insufficient_data flag; threaded
it through SellTimeBucket -> SellTimeTier -> sellTimeTierValid so a
bucket the backend calls too thin renders as "—", not a confident value.
- subject scatter point silently used a hardcoded 90-day fallback with no
marker when est_days_on_market was null; now flagged (subjectApprox)
and rendered as a dashed/lower-opacity estimate instead of passing off
as measured data.
- sold_rate_pct lacked a Number.isFinite guard like the other formatters.
- PH_GRID_Y gridlines were unevenly spaced (last gap 40px vs 45px
elsewhere); evened out and exported as the single source of truth so
AnalyticsView's background gridlines can no longer drift from the
yTick label positions (they previously duplicated the same y's as a
second hardcoded literal).