-- Remove dead column district_economics.sat_factor (#1509). -- -- sat_factor = 1 + ((sold_pct - 50) / 100) * 0.30 was computed in 09_macro_and_trend.py -- and written here, but was never read by any scoring logic (10_score_v2.py, server.py). -- The live market sub-score uses sat_score = min(100, sold_pct * 100 / 70) directly, -- so sat_factor double-counts absorption without being applied anywhere. -- All code references removed in the same commit as this migration. -- -- NB: ALTER TABLE *IF EXISTS* — district_economics is created by the site-finder -- pipeline (09_macro_and_trend.py / server.py), NOT by data/sql migrations, so it may -- be absent on the main Postgres. Without IF EXISTS the deploy fails with -- "relation district_economics does not exist" (DROP COLUMN IF EXISTS only guards the -- column, not the table). Idempotent + safe when the table is absent. BEGIN; ALTER TABLE IF EXISTS district_economics DROP COLUMN IF EXISTS sat_factor; COMMIT;