Virridy Home | Lume — Water Quality Sensing Water for Carbon

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.

The short version. We tried every reasonable way of getting more out of the sensors on the Seine, ten in all. None does clearly better than the site's own lab history: at their best they land a little above it, never by more than one season of 19 exceedances can resolve. That is what a record too small and too unusual to decide looks like, not what a failing sensor or model looks like; the same sensors and methods find clear signal elsewhere in the fleet. Even so, the nowcast already beats the two rules operators most often use: it catches more of the unsafe days and closes the beach on fewer swimmable ones.

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.

approachwhat it doesAUCagainst calibration
Sensor stack (deployed)fleet-trained XGB on the sensor record, rain, flow and basin rain, on top of calibration0.70no better (−0.01; −0.11 to +0.06)
Per-site regression (deployed)a separate ridge regression on each site's own sensor readings0.62lower (−0.09; −0.24 to +0.02)
Engine changesfaster 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 modelseparate routes for fluorescence alone, turbidity alone and both, each against the site's own two-week baseline, plus rain and flow0.61*the sensor routes learned almost no weight
181 site baselinesevery combination of baseline window (3 days to since the last cleaning), gap, centre and form, for fluorescence and turbidity, Seine-only0.50†the best of 181, picked in hindsight (+0.06), is what shuffled sensor data also gives (p = 0.45)
XGB exceedance classifierpredicts the exceedance itself from sensor, rain, flow and the last result, fleet-trained0.73+0.01 (−0.06 to +0.07)
Pooled Seine regressionone Seine-only regression on raw fluorescence, turbidity and rain, correcting calibration0.75+0.04 (−0.09 to +0.13)
Fleet-trained pooled regressionthe same, trained on every region, with river flow0.74+0.03 (−0.02 to +0.07)
54 models, tuned on the seasonregression 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 turn0.72+0.01 (−0.08 to +0.08); picked with hindsight: 0.76 against 0.68
Alarm thresholdfive 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 asthresholdSeine and Marne
(19 unsafe, 125 clean)
Paris
(5 unsafe, 75 clean)
the Marne
(14 unsafe, 50 clean)
2 closures0.338 caught, 20 closed1 caught, 11 closed7 caught, 9 closed
3 closures0.259 caught, 25 closed1 caught, 13 closed8 caught, 12 closed
5 closures (in use)0.1712 caught, 36 closed3 caught, 14 closed9 caught, 22 closed
10 closures0.0917 caught, 59 closed4 caught, 19 closed13 caught, 40 closed
20 closures0.0518 caught, 70 closed4 caught, 23 closed14 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

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
Against the rain rule
+8 unsafe caught
the Seine model at its threshold: 12 of 19 against 4, for 5 more closures (36 against 31)
At the rain rule's closures
11 vs 4 caught
set to close as many swimmable days as the rule (31)
Swimmable days saved
26
set to catch what the rain rule catches (4): 5 unnecessary closures instead of 31
Against yesterday's result
6 days saved
to catch its 2: 1 unnecessary closure instead of 7; or, at its 7, catch 4 instead of 2
policydays closedunsafe caughtunsafe left openswimmable days closed
Rule: after rain (1 mm, 24 h)3541531
Rule: yesterday's result92177
Nowcast: calibration4812736
Nowcast: sensor stack4511834
Nowcast: Seine model4812736
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.

policydays closedunsafe caughtunsafe left openswimmable days closed
Rule: after rain (1 mm, 24 h)210521
Rule: yesterday's result3053
Nowcast: calibration0050
Nowcast: sensor stack131412
Nowcast: Seine model173214
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).

policydays closedunsafe caughtunsafe left openswimmable days closed
Rule: after rain (1 mm, 24 h)1441010
Rule: yesterday's result62124
Nowcast: calibration4812236
Nowcast: sensor stack3210422
Nowcast: Seine model319522
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 daysfluorescence up aloneturbidity up aloneboth up
Paris, exceedance days (3 with a baseline)000
Paris, clean days (49)561
Marne, exceedance days (14)010
Marne, clean days (41)120

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.

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

  1. Units in the water from April and samples from May, so the season opens with a calibrated record rather than a cold start.
  2. The price of a miss agreed with the cities and the threshold fixed from it before the season.
  3. The candidate models named in advance: four are already logging predictions alongside the served one.
  4. 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.
  5. The overflow and discharge logs, if the operators will share them: the likeliest explanation for the dry-weather exceedances nothing could see this year.