gendesign/frontend/src/types
lekss361 247c252b04 fix(sf-05): clamp sold_pct_of_supply at 100% + add is_oversold flag
Symptom: sold_pct_of_supply = sum_deals_24mo / supply_count_snapshot * 100
yields >100% (e.g. 199%) for fast-selling small formats due to incompatible
time windows (24-month deals vs point-in-time supply snapshot).

Option A (hotfix): clamp to 100.0, expose is_oversold=True for UI badge.

- best_layouts.py: compute sold_pct_raw, clamp with min(..., 100.0),
  set is_oversold = raw > 100%
- parcel.py TopLayoutRow: add is_oversold: bool field
- best-layouts.ts TopLayoutRow: add is_oversold: boolean
- BestLayoutsBlock.tsx: show warn badge ">100%" when is_oversold=True
- tests: two new cases — raw 199% clamps + is_oversold=True;
  raw 50% passes through + is_oversold=False

Closes (epic part) #271 item 5
2026-05-17 11:57:29 +03:00
..
analytics.ts feat(velocity): migrate D2 sales source → objective_corpus_room_month (#158) 2026-05-15 09:34:00 +03:00
best-layouts.ts fix(sf-05): clamp sold_pct_of_supply at 100% + add is_oversold flag 2026-05-17 11:57:29 +03:00
customPoi.ts feat(#254,#114): custom POI UI + score breakdown stacked-bar viz 2026-05-17 09:35:35 +03:00
nspd.ts fix(#234): NSPD harvest ETA badge + SETNX dedupe (Sub-PR C) 2026-05-17 09:13:06 +03:00
site-finder.ts feat(nspd): TIER 4 opportunity layers + red lines (#94 PR2 of 4) 2026-05-16 19:06:22 +03:00