
A satellite said a depot was under water. It was a cloud's shadow, and the parametric trigger was one click from auto-paying $1.2M.
A satellite looked at Mesa Junction Depot, saw a dark patch where dry ground should be, and flagged the location as flooded. A parametric flood policy read that trigger as fact and armed a $1.2M payout to fire automatically, no adjuster, no phone call, no second look. The dark patch was a cloud's shadow. It was gone from the imagery six days later, and the ground under it had never been wet.
I built that exact case on purpose, because it is the one a single satellite frame can never catch. I am Ashutosh, and I run Veriprajna. TriggerProof is a demo I built to prove a specific claim: the dangerous moment in parametric flood insurance is not detection, it is the decision to pay. Every location, tile, river gauge, and field report in it is synthetic, physics-faithful stand-ins I wrote so I could stage the failure modes cleanly. You can open it and drive the whole thing yourself at veriprajna.com/demos/satellite-flood-intelligence. Mesa Junction Depot is where I want to start, because it is the case that taught me what I was actually building.
Four different things darken the same pixels
I did not appreciate the real problem until I sat down to generate the synthetic imagery and had to make four things look identical on one frame. Parametric flood insurance replaced the loss adjuster with a trigger: a satellite says a location is under water, and money moves. The trouble is that on a single optical image or one radar pass, real floodwater, a cloud shadow, a radar or terrain shadow, and a permanent reservoir all go dark the same way. A single frame cannot separate them, because the information that separates them does not live in a single frame.
That reframed the whole demo for me. The catastrophic error in this business is not the flood the trigger misses. It is the flood the trigger invents, a confident $2M payout on a shadow, with no evidence trail to defend the call when a reinsurer asks about it a year later. TriggerProof does not detect floods and does not produce satellite data. It takes a trigger that has already fired and adjudicates whether it should actually pay.
One frame said flood; the next said the ground was never wet
I still remember stepping through the Mesa Junction filmstrip the first time it rendered correctly. The interface lets you open a flagged location and walk the acquisition frames one at a time, optical on top, radar below. In the trigger frame, the dark patch is right there, water-signal green, exactly what fired the alarm. Step to the next acquisition and it is gone. Step back and the radar backscatter under that same patch reads normal in every frame, because radar saw dry ground straight through the cloud the whole time.

The shadow moved; the water would have stayed. You only see that across time and across sensors, never on the single frame that fired the trigger.
The physics is not subtle once you lay the frames side by side. A cloud shadow is transient and it travels at cloud speed, so it is dark in one acquisition and gone in the next. Real floodwater persists across acquisitions and reads dark on optical and low on radar at the same time. Two rules encode exactly that: temporal persistence and radar-optical agreement. On Mesa Junction they both come back FAIL, and the classifier lands on cloud shadow at confidence 1.00. The $1.2M never should have been queued.
The five rules decide, not the language model
I tried, early on, to let the language model make this call, and I am glad I did because it failed in the most instructive way possible. I had an agent reading the same evidence and asked it, in effect, whether the location was really flooded. On an ambiguous case it wrote me a fluent, confident paragraph arguing for a flood, and it was wrong, and nothing in its tone flagged that it was wrong. That afternoon settled a design decision I have not reopened since.
So the decision lives in plain Python, in five inspectable discriminators, with no model anywhere in the path that moves money. Temporal persistence (R1) separates a flood from a transient cloud shadow. Radar-optical agreement (R2) separates a flood from both a cloud shadow and a radar shadow. DEM slope (R3) rejects water that would have to pool on steep terrain. A permanent-water mask (R4) excludes known reservoirs. Hydrological linkage (R5) checks that the wet area actually connects to the drainage network. The verifier decides; the language model only advises. The advisory agent is built on Pydantic AI, model-swappable, defaulting to claude-opus-4-8, and it checks the physics verdict against independent ground signals and returns corroborates, contradicts, or inconclusive. It can be overruled, and when I pull the API key the demo runs fully offline on a deterministic fallback, because the part I trust with a payout cannot be the part that speaks in confident paragraphs.
When the physics itself is unsure, the system escalates instead of guessing
I care more about the case where the system says "I do not know" than about any of the clean catches. Canal Street Hub is that case. The optical and radar signatures are borderline, the flood signal persists across two of three frames, and the independent river gauge never crossed bankfull. The evidence genuinely conflicts. The confidence comes back at 0.151, far under the automation bar of 0.65 that I fitted on the labeled set, and the ground agent contradicts the satellite classification outright.

The policy gate sends that $0.8M to a human with all of the evidence attached, marked "needs proof," rather than flipping a coin and calling it automation. A flood trigger that escalates the genuinely ambiguous case reads to some buyers as the weaker product. I see it the other way. It is the only version I would let run unattended, because the alternative to escalation here is a fast guess on real money, dressed up as a decision.
The portfolio number I keep coming back to
I keep pulling up the eight-location book, because it makes the stakes concrete in a way no single case does. A storm passes a portfolio of eight areas. The legacy single-frame trigger fires on six of them and queues $8.0M in automatic payouts. TriggerProof adjudicates the book: two real floods confirmed and paid at $4.0M, three false positives suppressed (a cloud shadow at $1.2M, a radar shadow at $1.0M, a permanent reservoir at $1.0M) for $3.2M withheld, and the one ambiguous case escalated at $0.8M.

Half of what the legacy trigger would have paid, $4.0M of $8.0M, is either stopped or held for proof. That is the number, and I want to be precise about its scope: this is the demo's synthetic portfolio, eight cases I authored to be physically faithful, not a book of real claims. The mechanism is real and inspectable. The claims are staged so you can watch the mechanism work.
Zero unsafe decisions, and the caveat I refuse to drop
I ran a proper benchmark because a portfolio of eight is a story, not evidence. The harness scores 60 labeled cases spanning clear signatures down to near-threshold noise. The headline is not an accuracy score, it is a safety count: zero unsafe automated decisions, against 48 for a single-frame baseline that pays every flagged case. Eighty percent of cases auto-resolve and the uncertain 20% escalate. Among the auto-resolved cases, false-positive suppression is 36 of 36 and flood recall is 12 of 12, and every one of the 12 genuinely ambiguous cases escalates instead of being auto-decided.

The point was never a perfect score on my own test set. The point is that the system never makes an unsafe automated decision. When it is not sure, it escalates.
The caveat travels with every one of those numbers, and I will not let it get stripped off. They are measured on a fixed, labeled set of 60 synthetic, physically-faithful cases, not an open-world guarantee and not a field result. The honest next step is not a bigger claim, it is validation against real archives like Sen1Floods11 and live Sentinel scenes, and that is the first thing a real engagement would deliver, not something this demo has done. Saying that plainly is what lets me stand behind the rest of the numbers.
A payout you cannot defend later is a liability, even when it was right
I did not set out to make the evidence trail the centerpiece, but by the end it was the part I was most sure an insurer could actually stand behind. A correct payout you cannot reconstruct later is still a liability, because "the satellite said so" is not a defense a reinsurer or an auditor accepts. So every decision, a pay and a suppression alike, emits a forensic dossier: the data lineage of every frame, the per-rule evidence with each discriminator's measured value, the false-positive elimination log, the independent ground cross-reference, and a SHA-256 provenance hash of the decision.

I want to be careful about what that hash is and is not. It is a content hash that makes the record tamper-evident, so anyone can recompute it and check the decision was not altered after the fact. It is not a PKI digital signature, and the satellite retrieval, the SAR tasking, the ground feeds, and the claims-platform integration are all stubbed in this demo, simulated so the whole thing runs on my laptop. What is real is the shape of the record: for every automated payout decision, exactly which physics said what, at what confidence, checked against what independent signal.
Parametric insurance made a genuine trade, giving up the loss adjuster to make payouts instant and disputeless. What it inherited was a physics problem it cannot see past on a single frame, and the failure that trade exposes you to is a fast, confident payout on a shadow. The durable fix lives outside the model: deterministic rules that separate the look-alikes across time and sensors, a gate that escalates the ambiguous case to a person, and a record that makes each decision defensible. A sharper satellite does not fix an adjudication problem, and this is an adjudication problem.
And if you would rather watch it than read me describe it, here is the whole thing running end to end.
Mesa Junction is the case I keep coming back to. Only the second acquisition ever knew the difference between the shadow and the flood, and the trigger fired before it arrived. You can step through that filmstrip yourself, and break the payout you think should have fired, at veriprajna.com/demos/satellite-flood-intelligence. The question I would put to anyone running an automatic flood book is a narrow, answerable one: of the triggers you auto-paid last season, how many could you still prove were water and not a shadow?


