-
-
Predict: 90-day forecast for 241,588 Dallas buildings. 61% of the top 2,000 got a report on a held-out quarter vs a 6.4% base rate.
-
Home: the screen a code-compliance team opens each morning: today's clusters, next moves, cases inbox, data health.
-
Simulate: 400 futures for one building and its neighbours, and the 3 firebreaks whose repair spares the most reports.
-
Resolution playbook: origin, simulation, firebreaks, costed work orders and a crew route, then a person holds Approve.
-
District brief: one page per council office, with tomorrow's crew route.
-
Neural field (FALCON): sparse-sensor ConvLSTM retrained on 104 weeks of Dallas, sending search crews to quiet cells.
-
Evidence: every test on a quarter the model never saw, including the ones that failed.
Inspiration
Property distress spreads like fire. A code violation, a vacant house, a landlord who stops answering: each one raises the odds for the buildings around it. Every one of those signals is already logged somewhere (311, the appraisal roll, permits), but none of those systems share an ID, so nobody sees the pattern until the block has already tipped. Dashboards show what already happened, and inspectors still work the queue in the order calls arrive.
What it does
Firebreak forecasts every building in Dallas for the next 90 days, traces each new problem to the building that most likely set it off, and plans the few repairs that spare the most neighbours. It is one loop across five screens:
On a quarter the model never saw, 61% of its top 2,000 got a report, against a 6.4% base rate (9.6x). A crew following the list reaches 1,018 cases a median 18.5 days before the first 311 call. Measured links: next door 1.26x, same owner 1.20x, shared pipes and streets 0.99x (no effect).
- Detect: every 311 report on the map, a live pull of today's reports, and a subset-scan alarm for clusters growing faster than their own history.
- Predict: gradient-boosted risk for every building, calibrated with Venn-Abers intervals, a certified watch list that promises at most 10% wrong, and a neural field (FALCON) for the blocks nobody calls about.
- Simulate: click any building and a spatio-temporal Hawkes model plays out its cascade 400 times; a CELF search then finds the three repairs that prevent the most reports at other buildings.
- Act: press R on a cluster and the resolution playbook traces it to its origin, simulates it, costs the work orders and routes a crew with a 2-opt route, then stops and waits for a person to hold Approve. The playbook is a deterministic pipeline of the console's own tools, not an LLM, and nothing is sent anywhere without approval.
- Evidence: a model card with every test run on a quarter the model never saw, a fairness audit by council district (four-fifths rule), and the experiments that failed.
It serves three teams from one engine: code compliance (morning brief, district briefs, budget plans ranked by reports prevented per dollar, never by property value), owners and managers (how much of a portfolio's risk comes from buildings it doesn't own, stress tests, watchlists), and acquisitions (distressed, non-owner-occupied leads only; owner-occupied homes are never included, and homes are shown at the 100-block level).
How we built it
We joined Dallas 311 reports (Socrata) to the county appraisal roll by location, since the sources share no IDs, and placed every report on a building. On top of that we trained a gradient-boosted classifier, fit a spatio-temporal Hawkes process for spread, built a subset-scan cluster alarm, and trained the FALCON neural field. The pipeline writes static files with a written contract (meta.json, buildings.bin, events.bin, hawkes.json, alarms.json, falcon.json), so the console renders every building in the browser from any CDN with no database. Moving to a new city means swapping two loaders: a property roll and a time-stamped event log (many cities publish Open311 GeoReport v2).
Challenges we ran into
Entity resolution without shared IDs, and keeping ourselves honest. Every claim is tested on a held-out quarter after the model was frozen. Some hypotheses failed: we expected shared pipes and streets to be a real spread channel, tested it, and it isn't, so the console says so instead of hiding it. The base rate of a new report in a quarter is 6.4%, and every lift we report is measured against that.
Other tests failed too, and the console shows them. Our Hawkes model ranks worse than boosted trees (54% vs 61% on the top 2,000), so the trees rank and Hawkes runs the what-ifs. FALCON lost as well: its top 1% of cells caught 4.3% of next-quarter reports against 5.6% for the boosted model. What survived is its search idea: crews sent to quiet cells find 105 new hotspots, against 23 for crews patrolling last year's. Closing a code case fast looks protective (-8%), but the same gap existed before the case opened, so it is not causal.
Accomplishments that we're proud of
- Finding a hidden dependency no map shows: a building's risk rises when another building with the same owner gets a report.
- A playbook that goes from alarm to an approved, costed, routed case in minutes, with a human in the loop.
- Publishing the failed experiments and a fairness audit alongside the wins.
What we learned
Calibration and honest evaluation matter more than a big AUC. A forecast is only useful if an inspector can act on it, which is why every output ends in a work order, a route and an approval.
What's next for Firebreak
A shared case store with sign-in per team, alert subscriptions, and an Open311 loader so the next city is a config change.
Built With
- dallas-open-data
- deck.gl
- equinox
- github
- html5
- javascript
- jax
- machine-learning
- maplibre
- numpy
- optax
- pandas
- python
- scikit-learn
- scipy
- socrata
- vite
- web-workers