Eight statutory rows for one California parcel, each on a named published map of a stated vintage — and beside every row the number the statute deliberately throws away: the separation between this parcel and the nearest boundary of a different class.
That is the buyer's decision: an underwriting lead at an insurer or a mortgage lender. But the person who reads the sheet is often not the buyer — a producer, an agent, a disclosure preparer, or a homeowner contesting a wildfire score. Which is why the app is outward-facing, and why its tone is a public register rather than an ops console.
The second decision is statutory and on a clock. California's 10 CCR §2644.9 makes an insurer hand over a wildfire risk score in writing — within 15 days of an application, 45 days before renewal, 75 before non-renewal — and give written notice of the right to appeal it, acknowledged in 10 days and answered in 30. An appeal needs evidence, and the only evidence available is published mapping.
A geocoded address is a street position, interpolated along a centreline's address ranges. A suburban parcel is 15–40 m across. Where a flood boundary runs at parcel scale, that displacement changes the published answer 6.7 % of the time.
Measured on a fixed-seed sample of 1,200 assessor addresses over Concord and Walnut Creek, 2026-08-18.
Neither survived contact with what California actually publishes.
California publishes no wind hazard zone. The ASCE design-wind API answers a keyless request with its own HTML shell and needs a key — barred by the on-prem rule. The ATC alternative is unreachable. The only reachable surface is a tract-level rating that reads Very Low on 8,391 of 9,106 California tracts. Wind is dropped; dam-failure inundation takes its slot, because that one is statutory, is a polygon, and is on the form.
The governing instrument is Civil Code §1103 — a statutory disclosure form with six hazards in a fixed order. Fire severity, a flood zone, a fault band and a liquefaction zone are four different kinds of statement. Averaging them produces a grade, and the app would then be a worse version of four better-funded products, one of which is regulator-approved for rating.
Flood · dam inundation · fire severity in the state responsibility area · fire severity in the local one · wildland area · fault zone · liquefaction · earthquake-induced landslide. Two of the fire questions have different class sets, different adoption states and vintages 18 months apart.
The app produces no score, no grade, no rank, no composite and no total. Eight panes cannot be averaged into one — the integrity guarantee is the layout.
| What it is | What it returns | Where it stops |
|---|---|---|
| Property-risk score APIs HazardHub · PerilPulse | 50+ peril scores per address, 1,200+ risk factors, one API call | Distances are to things — a coast, a hydrant, a fault line — never to the edge of the zone that produced the verdict |
| Property-level peril models ZestyAI · Verisk FireLine · Cape/Moody's | A modelled propensity — FireLine's 0–30, Z-FIRE's approved rating score | A model output, not a reading of a published map. The zone is not what they compute, so there is no edge to be near |
| Climate physical-risk platforms Climate X · XDI · Jupiter | Modelled loss to 2050 / 2100, portfolio and asset level | Different tense and different unit. No single-address report at all |
| The free public viewers Cal OES MyHazards · EQ Zapp · NFHL viewer | One peril at a time, free, per address | The state's own lookup says it "does not always allow accurate determination" against a boundary — and refers you elsewhere |
| The real incumbent: the California NHD report JCP-LGS / First American et al · $47–$150 | 34 pages, statutory statement, per-hazard chapter with a public-record citation | The rule it follows deliberately discards the margin — see the next slide |
Assembling four public perils onto one page is table stakes, not novelty — anyone can look each one up. The novelty has to be something none of them will say.
Civil Code §1103.2 says that where a map "is not of sufficient accuracy or scale that a reasonable person can determine if the subject real property is included", the seller marks Yes. The commercial reporting standard puts it operationally:
So a parcel one metre inside and a parcel four kilometres inside produce the identical statutory answer. Ambiguity resolves against the property, by rule, and the quantity discarded in order to be safe is exactly the quantity a reader needs.
And there is a real action on the other end of it. A federal Letter of Map Amendment is the free process by which a property inadvertently mapped inside a Special Flood Hazard Area is established as outside it — after which the mandatory purchase requirement does not apply. "38 m inside the boundary" is the difference between paying flood insurance for the life of the loan and paying a surveyor once.
The margin never contradicts the verdict. If the parcel is IN, the row says IN — and then says by how much. It qualifies confidence; it never overturns a published answer.
Vintage is a regulated field, not a footnote. The federal Standard Flood Hazard Determination Form must record the map and panel numbers and the date of the map used — and a determination may lawfully rest on a map up to seven years old. "What does the map say now" is a different question from "what does my file say".
The scaffold treated the margin as one number — distance to the edge. Against 400 real parcels and the real flood surface that is wrong in the most common case: the line runs through the property four times out of five.
The naive degrees × 111,320 conversion is wrong by a median 2.6 % and a maximum 26.7 % on this sample. One degree of longitude at 37.98 °N is 87,646 m, not 111,320. Every margin is computed in a local azimuthal-equidistant projection centred on the parcel.
Three states stay distinct everywhere — in the data, on the map, in the legend, in the sheet and in the PDF: in a mapped zone · analysed and outside it · no published map here. The third is never coloured as danger and never as safety.
Because the statute's unit is the parcel, and because a geocoder's own best qualifier does not predict a correct verdict. On 1,124 matched addresses the flood answer differed between the street point and the parcel 75 times. Thirty-one of those carried the geocoder's Exact flag — and:
A design that greyed the sheet on a poor match and trusted it on a good one would have presented every dangerous reading at full confidence. So the basis is the parcel, and match quality qualifies the basis — never the verdict.
The disagreement is also peril-specific — flood 6.7 %, wildfire 0.0 % on the same addresses — because fire polygons are coarser than a suburban parcel while flood polygons follow a creek at parcel scale. A single global confidence flag would be wrong in both directions. The margin, per row, is what tells the reader which rows are sensitive to the basis.
Drop the pin onto ground with no parcel and the app falls to point basis — and every margin on the sheet is qualified, in words, in the panel, in the CSV and in the PDF.
If a register changes, the suite goes red and the constants are known stale rather than quietly wrong. Every figure the app prints comes from a service this build probed, and the suite re-probes on every run.
Emitting a flat rings list as one GeoJSON Polygon makes every part after the first a hole. The legend counted 47, the source held 47, the layer was visible — and the map painted zero. Every non-visual assertion was green. Only a screenshot showed it.
The statewide dam-inundation surface returns 46 MB of geometry for one envelope over Sacramento, and times out. The fix is not a bigger timeout — it is to ask the service for the verdict and bisect the radius with buffered count-only probes. Where the budget is exceeded, the row says so and prints no number.
The most consequential bug in the build was a spatial-relation flag. On these services esriSpatialRelContains returns nothing where esriSpatialRelWithin returns the container — so the query for "which polygons contain this parcel" came back empty for every parcel, silently turning every inside verdict into a crosses. The app's most consequential distinction, inverted, with no error anywhere.
A first read takes 10–40 seconds — eight statutory layers, queried live, some of them statewide. There is no cache and nothing is stored between lookups, by design. Every one of these limits is written into the delivered application's own README.
Your assessor parcel layer, the hazard surfaces your jurisdiction actually publishes as polygons, and the disclosure instrument that fixes the row order. The margin, the four states, the basis line and the export contract come as they are.
Ask this first, before the layout is drawn: which perils does this jurisdiction publish as boundaries? A peril with no boundary cannot carry a proximity claim — which is how wind left this sheet, and it is the question that decides whether a re-point is a configuration or a different product.