← Harrison Wolf

Neighborhood-intelligence engine

A family picker on the surface. An analytics platform underneath.

Stack
Python + SQLite
Core
~3 months
Tests
948 across 78 files
Region
Fresno County
Private product repo — architecture walkthrough on request. · Public Audit Edition → · Full platform case study →

01The picker

What a family sees: pick your priorities, get neighborhoods ranked to match — star ratings for schools, safety, and market, over an interactive map of Fresno County with the county's official GIS layers as toggleable overlays. Every dot is one parcel; every figure is a precomputed score.

Agent workspace on Fresno County
The agent workspace. The footer stamps every view with its data lineage.
The same map zoomed to Clovis street level A single-parcel detail panel: APN, address, neighborhood cell, modeled price, data-quality label
Down to street level, and one parcel opened: APN, neighborhood cell, modeled price, with the data-quality label right beside it.

02The engine

The picker is the last of eight stages. Six external sources — county GIS, two school datasets, school attendance boundaries, market data, and a safety baseline — arrive with different formats, update cycles, and failure modes. Each source is adapted into a canonical SQLite schema of 53 tables before scoring; published results are frozen in versioned bundles, and the web app reads a separate 14-table runtime. Roughly 50 metrics are computed per county, with source-file provenance retained for published values.

1 extractlive ArcGIS + retried, hash-verified fetches → raw batch + manifest 2 adaptper-source-family dispatch into one shape, version-stamped 3 normalizecanonical schema — reference, observation, and metadata rows 4 snapshotgeometry frozen into serving artifacts (hex-cell engine) 5 scoretwo scoring layers, Bayesian shrinkage throughout 6 publishimmutable versioned bundle — payloads, thumbnails, manifest 7 bootstrapfresh per-scope runtime DB from the latest bundle, idempotent 8 serverequest-time ranking, PDF reports, share links, rate limits

One make refresh-county run, end to end: 26,000 source rows through adapt → normalize → snapshot (55 ZIPs, 663 cells) → score → a published bundle, with per-stage timings.

Terminal output of one full pipeline run: adapt, normalize, snapshot, score, publish, with per-stage timings
The engine, one run end to end. Click to read.

03Below the waterline

Most of what the engine computes, the picker never shows:

heat map

A full per-hex-cell market heat map. Value, tightness, trend, acceleration, are more, are precomputed, stored, and served whole on every page load. The picker ships with the layer switched off.

detail

Per-neighborhood school assignment with split-boundary disclosure, and per-ZIP safety composites with letter grades, percentiles, and source citations are reduced to single star rows in the picker.

scale

Multi-county spin-up — registry, induction, live GIS querying — is fully built and tested, deployed at exactly one county.

refusal

The commute-weight slider was deliberately withheld, and pinned to zero in code, until real commute data exists to back it.

04Discipline

The normal scoring path rejects data normalized by an older schema version and reports which stage must be re-run. Each artifact records the code version that produced it, and the runtime refuses a bundle with a mismatched payload version. Sparse data is suppressed instead of zero-filled; report quotas use one atomic insert covered by a two-thread concurrency test. At the pictured commit, the repository contained 29,000 lines of tests and 26,000 lines of source.

I designed the architecture, schema, scoring, and test gates. AI coding agents produced most of the code by volume, working across git worktrees under a written rulebook; merges had to pass the project's tests and review gates. The private repository and supporting evidence are available in a walkthrough.

A public, synthetic-data-only Audit Edition isolates five of the reliability mechanisms and their tests for independent inspection. The product, data, interface, and private history remain private.

← Back to the portfolio Schema and runtime deep dive →