# Heat map contract

Surface: interactive PropertyLab portal, Mapbox native GeoJSON fill and line layers, with accessible cell and property lists. This extends the existing property explorer, rather than exporting a report.

Question: how do reported scheme PSF, scheme median prices, and mapped scheme concentration vary spatially? Interpretation: colour represents the selected metric for a fixed geographic cell; users inspect exact values and contributing schemes before comparing areas.

Grain: one unique scheme ID from the existing source snapshot per cell. Price metrics are the unweighted median of positive, finite scheme-level values, not transaction-weighted regional medians. Concentration counts mapped schemes, not homes, availability, transactions or demand. PSF area basis and underlying source aggregate periods remain unconfirmed. Snapshot collected 7 September 2026; no time-trend inference.

Geometry: a fixed WGS84 grid, approximately 0.5, 1 or 2 km at the equator (degrees = km / 111.32). The actual east-west width varies with latitude; cells are analytical bins, not neighbourhood boundaries. Counts and medians use complete cells, independent of viewport clipping. State and type controls restrict the cohort before aggregation. Duplicate IDs and invalid coordinates are excluded.

Price coverage: every positive finite observation contributes to the displayed median, including single-property cells. Cells with one or two valid properties display their actual metric colour plus a Limited coverage label in details, list and hover; this is not an area benchmark. Occupied cells with zero valid price values have a neutral fill and a No valid price data label; empty cells have no fill. Missing or nonpositive prices do not become zeros. All counts remain inspectable. No smoothing or interpolation into unsampled locations.

Palette: user-requested light green → green → yellow → orange → red → dark red, from lower to higher values with fixed, labelled thresholds per metric; numeric cell details and an accessible cell list provide non-colour access. PSF uses eight bands: <400; 400–<500; 500–<700; 700–<800; 800–<1,000; 1,000–<1,500; 1,500–2,000; >2,000 RM/sq ft. Their colours are light green (#bbf7d0), green (#22c55e), yellow-green (#a3e635), yellow (#facc15), amber (#f59e0b), orange (#f97316), red (#ef4444), and dark red (#991b1b). Exactly 2,000 belongs to the 1,500–2,000 band. Price and concentration retain six bands, splitting their previous open upper bands at RM 2 million and 41 schemes respectively. Each metric uses matching map/list colours and fully labelled sidebar and map-overlay legends. Fixed bins remain unchanged while panning and filtering. Concentration and price never share a unit label. Outliers are retained in the open upper band.

QA: deterministic fixtures for median, missingness, duplicate IDs, type/state cohorts, stable cell assignment, bin boundaries and sparse cells. Real browser QA for metric switching, type filters, cell click, keyboard list selection, map-style reload, navigation to Explorer, three-tab order, fresh Advisor entry, mobile fit, and reduced marker hit targets. Inspect real screenshots before delivery.
