Skip to content

Score specification

Model p5v4-2026.07. This page describes the current public stop-loss; the machine contracts remain authoritative.

A tract score is a hand-weighted composite of county-relative percentiles, on a 0–100 scale, coverage-damped and risk-penalized:

  • Percentile inputs. Each allowed factor (yield, market heat, tax, halo, and similar property/market signals) is ranked across the combined Cook + Lake service area. A value of 50 means service-area median, not county median.
  • Hand weights. Fixed weights per strategy, published on the flip and BRRRR pages. Weight learning against realized outcomes is planned (P3), not shipped.
  • Coverage damping. Below 70% source coverage, the score loses 0.5 points per missing coverage point. Restricted income/crime fields do not affect public scores.
  • Risk penalties. Flat deductions inside the composite (distress proximity, tax traps, closing friction) — distinct from the separate risk score.

The raw composite is rank-transformed against scorable tracts so the public tract value is ordinal. It is a location screen, not a probability and not a property-level underwriting result. Public property strategy scores are withheld whenever the valuation is range-only, area context, stale, or suppressed.

deal = max(flip, brrrr) × economics_factor × (0.6 + 0.4 × coverage) + motivation, capped at 100
  • economics_factor ranges 0.35–1.0 and gates multiplicatively: terrible deal math collapses any tract score (underwriting).
  • coverage is tract data coverage 0–1 (defaults to 0.7 when unknown).
  • motivation adds min(12, 4 × detected signals): price cuts, “as-is”, estate sale, and similar remark keywords.

A listing or tract missing strategy-critical data renders grey with a reason string, and deal_score is null in the API — never a silent 0. Null and 0 mean different things: “cannot score” versus “scores terribly.”

  1. Relative mode: final score = percentile rank of the raw composite among scorable tracts per strategy. Best tract = 99–100 by construction, median = 50, full range used monthly. Fixes compression honestly.
  2. Calibrated mode: isotonic mapping to outcome probabilities — only after realized outcomes accumulate. No faked probabilities before the data exists.

Every output carries model_version; releases that change scores are logged in the changelog.