Sentinel.

IMPERIAL AI HACKATHON · 2026

About 40 sewage spills a day happen on dry days.
Almost none are caught.

So we built agents that catch them as they happen, check each other's work, and write the report to the regulator. A person signs off.

150spills started in 48 h
73dry-day spills in 48 h

Live run, 14 Nov 2026

↓

Watch it run

Demo video coming soon
Fig. 0 — The Sentinel app on a live run: the map, one case, the agents' conversation
Dry-day spill Rain nearby No working gauge Fig. 1 · Dot size = hours discharging · lines = rain gauges checked

Every storm overflow in England

Nine water companies publish live overflow status. We pull all of them and keep the 157 that started spilling in the last 48 hours.

Checked against real rainfall

For each spill we look at the three nearest Environment Agency rain gauges within 10 km. Blue ones had rain nearby, so they're probably allowed.

The dry ones stand out

73 spills started when every nearby gauge had less than 0.25 mm of rain on each of the two days before. If even one gauge was wet, we let the spill go, so we're erring on the side of caution.

The case we follow

We'll take one of these dry-day spills and follow it all the way through the agents.

How it works

A Databricks job runs on a schedule and hands anything suspicious to a team of five agents. Every step is traced in MLflow, so you can see exactly what each one did.

Out [2]:

Live open data

9 water-company overflow feedsArcGIS, ~13k overflows
EA rain gauges15-minute readings

Databricks · Delta

Bronzeraw snapshots
Silverdischarge events + nearest rain
Golddry-spill candidates
Memorysite history, past verdicts

Agent team

InvestigatorClaude · builds the case
SkepticGPT on Databricks · argues innocence
Evidence agentLinkup live search · cites sources
AdjudicatorClaude · weighs both sides, final confidence
DrafterClaude · evidence pack + EA report

Action

Human approvesnothing is sent automatically
Fig. 2 — Pipeline and agent team, one scheduled Databricks job

The skeptic runs on a different model on purpose, so the agents can't all just agree with each other. Anything the evidence agent claims comes with a link to its source. And every verdict gets saved, so the sites that keep doing it start to show up.

Dry-day spill candidates by company

Spills that started in the 48 hours before the run, with no real rain at any gauge nearby.

Out [3]:

Fig. 3 — Dry-day spill candidates by water company

One case, end to end

Out [4]:

1The data

Wettest 24 hours of the two days before the spill, per gauge. The dashed line is the 0.25 mm dry-day threshold.

Fig. 4 — Rainfall at the nearest EA gauges

2Investigator Claude

Builds the case that this was a breach, using the data and what we already know about the site.

3Skeptic different model

Tries to find an innocent reason: a faulty sensor, rain the gauges missed, a pump failure, a tidal outfall. Then scores how likely it is to be a real breach.

4Evidence agent Linkup

Searches the web for anything that backs up either side: local news, beach closures, past fines, works going on.

5Adjudicator Claude

Goes through the skeptic's objections one by one against the evidence, decides which hold up, and sets the final confidence.

6Drafter Claude

Writes up the evidence pack and a draft message to the Environment Agency. A person reads it before anything goes out.

The agent outputs for this case will appear here from a real traced run. We don't show made-up agent output.

A dry-day spill is a candidate, not proof

Built with

Databricks (Delta Lake, Unity Catalog, Jobs, MLflow Tracing, model serving) · Anthropic Claude · Linkup Search API · water company ArcGIS feeds · EA flood-monitoring API · deck.gl

Built at the Imperial AI Hackathon, 14 to 15 November 2026 · Source on GitHub · Overflow data CC BY 4.0 from each water company via Stream Water Data · Rainfall © Environment Agency, Open Government Licence