The Seine in 2026: what we tried, and why the nowcast is still worth using
A brief companion to the Seine 2026 report. Written 2026-09-25 by OpenCurrent. Every number is from the published decision record to 2026-09-23: the 144 Seine lab samples taken after each site's first result was known (Paris 80, the Marne 64), of which 19 exceeded the 900 CFU/100 mL action limit (Paris 5, the Marne 14). Every model was refit only on results known at each sample's hour, so no score below has seen the answer it is scored on unless it says so.
1Everything we tried
Each approach below adds something to the site calibration: every site's own level from its lab results, including the most recent one. The question each asks is whether fluorescence (TLF), turbidity (TOF), rain or river flow add to that. "AUC" is how well an approach ranks the exceedances above the clean samples (0.5 is chance, 1.0 is perfect); calibration alone scores 0.72 on these samples.
| approach | what it does | AUC | against calibration |
|---|---|---|---|
| Sensor stack (deployed) | fleet-trained XGB on the sensor record, rain, flow and basin rain, on top of calibration | 0.70 | no better (−0.01; −0.11 to +0.06) |
| Per-site regression (deployed) | a separate ridge regression on each site's own sensor readings | 0.62 | lower (−0.09; −0.24 to +0.02) |
| Engine changes | faster use of the latest lab result, cold-start rule, install windows, gauge discharge, basin-averaged rain, 96/120-hour rain windows | — | fleet decision cost of the calibration arm 167 to 156; Seine unchanged |
| Pathway model | separate routes for fluorescence alone, turbidity alone and both, each against the site's own two-week baseline, plus rain and flow | 0.61* | the sensor routes learned almost no weight |
| 181 site baselines | every combination of baseline window (3 days to since the last cleaning), gap, centre and form, for fluorescence and turbidity, Seine-only | 0.50† | the best of 181, picked in hindsight (+0.06), is what shuffled sensor data also gives (p = 0.45) |
| XGB exceedance classifier | predicts the exceedance itself from sensor, rain, flow and the last result, fleet-trained | 0.73 | +0.01 (−0.06 to +0.07) |
| Pooled Seine regression | one Seine-only regression on raw fluorescence, turbidity and rain, correcting calibration | 0.75 | +0.04 (−0.09 to +0.13) |
| Fleet-trained pooled regression | the same, trained on every region, with river flow | 0.74 | +0.03 (−0.02 to +0.07) |
| 54 models, tuned on the season | regression or classifier, linear or trees, Seine-only or fleet, three input sets, three settings each; chosen on six weeks, tested on the seventh, every week in turn | 0.72 | +0.01 (−0.08 to +0.08); picked with hindsight: 0.76 against 0.68 |
| Alarm threshold | five approaches, including the median-Colilert test; see below | — | settled at P ≥ 0.17 from a stated price, not tuned on the record |
* 2026-09-08 replay (122 samples, 11 exceedances); calibration 0.65 there. † baseline chosen on earlier data only, 114 samples; calibration 0.65 there. Intervals: 95%, resampling site-weeks. Protocols and code: lume-nowcast/engine/ PATHWAY_ARM.md, SEINE_BENCHMARK.md, SEINE_SEARCH.md, SEINE_TUNED.md.
How we set the alarm threshold
- Chosen from the record, per arm and region (in use before the review): each arm picked its own threshold between 0.20 and 0.35 on its scored samples.
- A full sweep, 0.05 to 0.50, on every arm. Lowering calibration's threshold from 0.30 to 0.20 took it from 3 to 14 of the 19 exceedances, but only by closing Neuilly and St-Maur almost every day: the plain rule "close those two every day" also catches 14.
- Chosen on the other weeks, tested on the held-out one, every week in turn. The chosen threshold swung between 0.20 and 0.45 from week to week, and on the held-out weeks it did worse than never raising an alarm (decision cost 59 to 65 against 57). A threshold tuned on this season does not carry to the next week, let alone the next season.
- Alarming at a lower concentration (300 CFU instead of 900) is the same lever in other units: alarming when the chance of exceeding 300 reaches 0.35 flags exactly the samples where the chance of exceeding 900 reaches 0.13.
- Median-Colilert test. We split the Seine samples at their median lab result (184 CFU) instead of at 900. The models rank that split better (sensor stack AUC 0.73 to 0.79, calibration 0.69 to 0.72), which shows the sensor does track relative water quality. But a flag for Marne versus Paris alone improves just as much (0.67 to 0.71), so much of that gain is which site the sample came from, and the closure decision is still made at 900. It told us something real about the sensor; it could not set the alarm.
- What we settled on: a stated price. A missed exceedance is counted as five unnecessary closures, because the cities want the rare high days caught. At that price closing breaks even when the chance of an exceedance reaches 1/(1+5) ≈ 0.17, so every model raises the Seine and Marne alarm there, and the arms are compared at the same price. The number follows from the price, not from this season's samples; the price itself should be agreed with the cities before 2027.
What other prices would have done
The price is a policy choice, so here is the 2026 record at five of them. Each row fixes the threshold from the price alone, 1/(1 + price), with no tuning on the samples. Figures are for the Seine model: exceedances caught, and swimmable (clean) sampled days closed.
| a miss counts as | threshold | Seine and Marne (19 unsafe, 125 clean) | Paris (5 unsafe, 75 clean) | the Marne (14 unsafe, 50 clean) |
|---|---|---|---|---|
| 2 closures | 0.33 | 8 caught, 20 closed | 1 caught, 11 closed | 7 caught, 9 closed |
| 3 closures | 0.25 | 9 caught, 25 closed | 1 caught, 13 closed | 8 caught, 12 closed |
| 5 closures (in use) | 0.17 | 12 caught, 36 closed | 3 caught, 14 closed | 9 caught, 22 closed |
| 10 closures | 0.09 | 17 caught, 59 closed | 4 caught, 19 closed | 13 caught, 40 closed |
| 20 closures | 0.05 | 18 caught, 70 closed | 4 caught, 23 closed | 14 caught, 47 closed |
Each step up buys more caught exceedances at a rising cost in closures: from 3 to 5, three more caught for 11 more closures; from 5 to 10, five more for 23; from 10 to 20, one more for 11, by which point the Marne sites are closed on 47 of their 50 clean days. So five sits just before the curve steepens. Calibration and the sensor stack trace the same shape (at a price of 10: 14 and 16 caught, with 53 and 62 closures); calibration closes no Paris site at a price of 5 or below and catches its first Paris exceedance only at 20, since the Paris sites' usual level sits far below the limit. For comparison, the two operator rules in section 2 caught 4 with 31 closures (after rain) and 2 with 7 (yesterday's result).
Probabilities at each sample's hour; the published alarm also holds for a while once raised, so the live counts differ slightly.
Why this points to the data and the season
- Nineteen exceedances, five of them in Paris. Paris was sampled for three weeks (08-06 to 08-27) before the units came out. With this few events, differences under about 0.1 AUC cannot be told apart, and every serious approach above falls inside that band.
- The search is exhaustive, and it hits the same ceiling every way. At their best, the model families, the 181 ways of reading the sensors and the 54 tuned candidates all land between 0.70 and 0.76, against calibration's 0.72. When changing the target, the model, the inputs and the tuning makes no difference, the limit is the record, not the method.
- An unusual season. River flow sat in the bottom tenth for the time of year from August to late September; there was no flow event while Paris was sampled.
- Exceedances with nothing to see. Bercy 08-10 and St-Maur 09-03, 09-07 and 09-10 (2,045 to 8,972 CFU) came with no rain in the preceding five days. Every sensor-based model missed St-Maur. Catching them needs a signal none of the models has, most likely the operators' overflow and discharge logs.
- A mid-season break in the sensor record. The 08-18 cleaning stepped fluorescence up 4.3× at Bercy and 2.3× at Bras Marie, three to five days before the Paris exceedances of 08-21 and 08-23, leaving the sensors too little record on the new scale to compare against.
- The same sensors and methods work where the data allow. In Chicago, at the same number of false alarms, the sensor stack catches 38 of 53 exceedances where calibration catches 22; in Boulder, river flow cut the decision cost from 39 to 33.
What the record cannot do is show the reverse either: that the sensors help on the Seine. It is too small and too unusual to decide. Section 4 is how 2027 decides it.
2Why the nowcast is worth using: against the rules operators use
Two rules stand in for current practice. After rain: close if at least 1 mm fell in the previous 24 hours. Yesterday's result: close if the most recent lab result known that morning exceeded 900 (results arrive one to two days late). The nowcast closes when its probability of an exceedance reaches 0.17, the threshold fixed from the stated price of a miss. Three versions of it are shown: calibration (each site's own lab history, no sensor); the sensor stack, which serves six of the seven Seine sites on the live feed today; and the Seine model (the pooled Seine regression, running alongside since 2026-09-25). Counts are sampled site-days: days with a lab result at that site, 2026-07-31 to 09-10. Open the Seine and the Marne together, Paris, or the Marne below.
The Seine and the Marne together: 144 sampled days, 19 unsafe
| policy | days closed | unsafe caught | unsafe left open | swimmable days closed |
|---|---|---|---|---|
| Rule: after rain (1 mm, 24 h) | 35 | 4 | 15 | 31 |
| Rule: yesterday's result | 9 | 2 | 17 | 7 |
| Nowcast: calibration | 48 | 12 | 7 | 36 |
| Nowcast: sensor stack | 45 | 11 | 8 | 34 |
| Nowcast: Seine model | 48 | 12 | 7 | 36 |
Paris: 80 sampled days, 5 unsafe
Neither rule caught a single Paris exceedance. The rain rule closed 21 swimmable days and caught none; yesterday's result closed 3 and caught none. The Seine model caught 3 of the 5 while closing 14 swimmable days: 3 more unsafe days caught and 7 swimmable days saved against the rain rule, at the same time. Calibration never closed a Paris site (the Paris sites' usual level sits far below the limit), which avoids every unnecessary closure and misses all five, like the rules.
| policy | days closed | unsafe caught | unsafe left open | swimmable days closed |
|---|---|---|---|---|
| Rule: after rain (1 mm, 24 h) | 21 | 0 | 5 | 21 |
| Rule: yesterday's result | 3 | 0 | 5 | 3 |
| Nowcast: calibration | 0 | 0 | 5 | 0 |
| Nowcast: sensor stack | 13 | 1 | 4 | 12 |
| Nowcast: Seine model | 17 | 3 | 2 | 14 |
The Marne: 64 sampled days, 14 unsafe
Set to close as many swimmable days as the rain rule (10), the Seine model catches 7 unsafe days instead of 4; set to catch the rule's 4, it closes 2 swimmable days instead of 10, 8 swimmable days saved. Against yesterday's result: at its 4 unnecessary closures it catches 4 unsafe days instead of 2, or catches the same 2 with 1 unnecessary closure, 3 swimmable days saved. At its threshold it catches 9 of 14 with 22 unnecessary closures; calibration catches 12 of 14 but keeps the Marne sites closed on most days (48 of 64).
| policy | days closed | unsafe caught | unsafe left open | swimmable days closed |
|---|---|---|---|---|
| Rule: after rain (1 mm, 24 h) | 14 | 4 | 10 | 10 |
| Rule: yesterday's result | 6 | 2 | 12 | 4 |
| Nowcast: calibration | 48 | 12 | 2 | 36 |
| Nowcast: sensor stack | 32 | 10 | 4 | 22 |
| Nowcast: Seine model | 31 | 9 | 5 | 22 |
How far to trust these numbers
- The tables use the nowcast's fixed threshold, set before the comparison. The "at the rule's closures" and "swimmable days saved" figures instead set the threshold to match each rule after the fact; they compare how well each ranks the days, not a threshold anyone chose in advance.
- Against the rain rule the advantage is real: across the Seine every version of the nowcast catches more unsafe days at the rule's number of closures, and the 95% interval of the difference excludes zero (Seine model: 11 against 4, interval +2 to +16).
- Against yesterday's result it is directionally better but not proven: the intervals include zero (Seine model at 7 closures: 4 against 2, interval −3 to +9).
- Paris and the Marne alone are counts, not rates: five and fourteen exceedances are too few for intervals, and one season is one season.
- The Seine model is not yet the one serving: it runs alongside and would serve a site once its own logged record beats the current arm there, which is one setting away.
3Why the Lume did not observe the Seine exceedances
The Lume did not miss spikes that were there. At the Seine exceedances neither fluorescence nor turbidity moved relative to the unit's own recent record, so there was nothing to catch. The table counts days on which each channel stood more than two robust standard deviations above that unit's previous two weeks (ending two days before the sample, within the current cleaning period):
| sampled days | fluorescence up alone | turbidity up alone | both up |
|---|---|---|---|
| Paris, exceedance days (3 with a baseline) | 0 | 0 | 0 |
| Paris, clean days (49) | 5 | 6 | 1 |
| Marne, exceedance days (14) | 0 | 1 | 0 |
| Marne, clean days (41) | 1 | 2 | 0 |
The other two Paris exceedances (Bercy and Bras Marie, 08-21) had no baseline at all: the 08-18 cleaning had restarted each unit's record three days before.
The occasional excursions fell on clean days, not on unsafe ones. So the question is not why the Lume missed the signal, but why contamination could push E. coli over the limit without moving the optics. The answer is how little sewage an exceedance takes.
- An exceedance needs very little sewage. Raw sewage carries very roughly 106 to 107 E. coli per 100 mL, so 900 CFU/100 mL takes somewhere around 0.01 to 0.1% sewage in the river. At that fraction sewage adds a few percent at most to the fluorescence of river water that already carries natural organic matter and upstream treated effluent (which fluoresces strongly but carries few E. coli), and next to nothing to its turbidity. Both are smaller than the river's ordinary day-to-day variation.
- This summer's Seine exceedances were the dilute kind. Flow sat in the bottom tenth for the time of year, and several exceedances came with no rain in the five days before: small dry-weather sources (a leaking outfall, misconnections, boats, birds) that raise bacteria without raising the optics.
- Where contamination arrives in bulk, the Lume sees it. In Chicago exceedances come from combined-sewer overflows, a large sewage fraction that moves the optics: at the same number of false alarms the sensor stack catches 38 of 53 exceedances where calibration catches 22. In Boulder, storm runoff raises bacteria, sediment and organic matter together.
- The one apparent Paris signal is an artifact. Fluorescence reads far higher on the Paris exceedance days (median 39.9 against 12.7 on clean days), but four of the five came after the 08-18 cleaning, which stepped fluorescence up 4.3× at Bercy and 2.3× at Bras Marie. The sensors read higher because their optics were clean, not because the water changed.
- Ruled out: boat traffic. Paris turbidity has no daily rhythm (its busiest hour is 3% above its quietest; Boulder's is 41%), so navigation does not drive it at the hourly scale.
- The event the Lume is built for came as Paris sampling ended. The 08-27 storm (34 mm in Paris) produced the season's largest Marne exceedances, 11,199 and 15,531 CFU at Neuilly on 08-28 and 08-29, and the sensor stack caught them. Paris sampling stopped and its units came out the same day, so the Paris record holds only the dilute, dry-weather kind.
The sewage-fraction figures are order-of-magnitude reasoning, not measurements on the Seine, and three Paris exceedance days are three. But everything the record shows fits them: the Lume reads contamination that arrives in bulk, and the 2026 Paris season never gave it any. A season with units in the water before the first storms is what tests it.
4What makes 2027 decisive
- Units in the water from April and samples from May, so the season opens with a calibrated record rather than a cold start.
- The price of a miss agreed with the cities and the threshold fixed from it before the season.
- The candidate models named in advance: four are already logging predictions alongside the served one.
- A pass/fail line agreed beforehand: catch more unsafe days than the city's current rule with no more closures, on 2027 data, judged on the logged record.
- The overflow and discharge logs, if the operators will share them: the likeliest explanation for the dry-weather exceedances nothing could see this year.