How reports get routed to jurisdictions

Citizens drop a pin, we figure out who's responsible. The routing pipeline is intentionally simple — no curated boundary files, no ZIP-code lookups — and it works worldwide.

The mental model:

1. **Geocode in reverse.** The submission's lat/lng goes to the OpenStreetMap Nominatim API, which returns a structured address: country, state/province, county, city/town/village, and (if available) neighborhood + street + house number. Free, worldwide, no API key — limited to 1 req/sec, which is fine for the v1 submission volume.
2. **Bucket into slugs.** Each level becomes a jurisdiction slug. `norfolk-va` for the city, `norfolk-county-va` for the county (if any), `va-state-us` for the state, `us` for the country, plus a neighborhood slug if Nominatim returned one (e.g. `ghent-norfolk-va`).
3. **Upsert.** Any of those slugs that aren't already in `civicJurisdictions` get auto-created as turtini-seed-verified placeholders with the report's lat/lng as their centroid. The first report in a new region puts the region on the map.
4. **Stamp the report.** The report's `jurisdictionSlugs` array gets every slug in the hierarchy, and `primaryJurisdictionSlug` is set to the deepest (neighborhood → city → county → state → country). The primary is what surfaces in the UI; the slugs array is what queries filter on.
5. **Bump counters.** Each jurisdiction's `openCount` + `byCategory` is incremented.
6. **Fire integrations.** For each jurisdiction with a claiming-org + an enabled integration, the adapter posts the report to the external case-management system.

What this means in practice:
- A pothole on a state highway running through Norfolk could be the state DOT's responsibility, not the city's. Both Norfolk AND the state are in `jurisdictionSlugs`, so claiming orgs at either level see it. Whoever triages first wins; the other can skip it.
- A graffiti report in a privately-managed HOA neighborhood inside Norfolk will route to all four levels (HOA + city + county + state). If the HOA has claimed its slug, the report shows up in their workspace even though the city also sees it.
- A report from a coordinate that Nominatim can't resolve (deep ocean, Antarctic interior) ends up in `jurisdictionSlugs: []` — visible publicly but not routed anywhere. These show up in admin as "orphan reports" for manual review.

Why no curated boundary files in v1:
- Boundary files (US Census, GADM, OSM admin polygons) are heavy and inconsistent across countries. Nominatim's reverse-geocode is good enough for routing — accuracy of 0.01° is plenty for "which jurisdiction" purposes even if specific point-in-polygon answers would be marginally better.
- The auto-create flow means coverage grows organically. Once a jurisdiction has reports, it has a profile. Once it has a profile, it can be claimed.