| 0 | From notebook to package | Repo skeleton; prep/sites; install & CI | PEP 621; src vs flat layouts | Available |
| 1 | Orientation — repo, environment, package anatomy | pyproject.toml, editable installs, the layout map | pip editable installs; PEP 621 optional deps | Available |
| 2 | The foundation — CRS, DuckDB, parcels | core/{crs,duckdb_session}; prep/parcels | EPSG:2230; DuckDB spatial extension | Available |
| 3 | Routes & facilities | prep/static_layers — routes (AUTO + HTC) and facilities | HTC buffer rule; dissolve-by-attribute | Available |
| 4 | Sites — customer accounts | prep/sites — points layer, spatial join to parcels | GeoPandas sjoin; point-in-polygon | Available |
| 5 | Tonnage — Excel to parquet | tonnage/*; core/vehicle_ids; docs deploy | idempotent upsert; hash-based dedup; MkDocs Material | Available |
| 6 | GPS adapters & cache | adapters/gps/{base,geotab,postgres}; cache/gps_cache | Protocol; env-var config; cache-first reads | Available |
| 7 | The substrate — indexes & WKB | prep/parcels_wkb; cache/{gps_indexes,master_index} | WKB; STAC-like bbox cross-join | Available |
| 8 | Routing engine — enrichment | engine/{enrichment,config} — ping ↔ all GIS layers | One DuckDB CTAS; speed-gated parcel attribution | Available |
| 9 | Segments — load-organized timeline | engine/segments — depot / windshield / collection / dump + violations | haversine; gap-and-island; load-numbering | Available |
| 10 | Pattern detection — route-agnostic chunked DuckDB | patterns/{config,window,detector,runner,validator} | (parcel, vehicle) ranking; composite biweekly; idempotent chunks | Available |
| 11 | RouteView — the interactive map | routeview/{rank,trail,parcel_eval,render,runner} | MapLibre HTML; trail as dots; patterns overlay | Available |
| 12 | Publishing | LICENSE · README · CHANGELOG · CITATION · release.yml | Apache 2.0; PyPI; the repeatable release loop | Available |