← All problems

Problem

Forecasting record-breaking weather extremes at least as well as operational NWP

Build forecast models that match or beat ECMWF's operational IFS HRES on record-breaking heat, cold and wind extremes: the events that drive insurance losses, grid stress and energy-price spikes, and the ones worth paying for. On average skill, AI models already beat IFS: GenCast beat IFS ENS on 97.2% of 1,320 WeatherBench-2 targets. Scored only on events where the observed value breaks the prior record, however, IFS HRES still wins, and AI models systematically underforecast both how often records break and by how much. SOLVED means the following, per variable and lead time, on a held-out period with at least 100 record events. First, latitude-weighted RMSE on the record-event set is at least X% below IFS HRES on the same events. Second, the mean underforecast on those events is within a stated tolerance (e.g. 0.5 K). Third, the model catches strictly more record events than HRES with no more false alarms, so forecasting 'extreme' everywhere cannot win. Records must come from climatology that ends before the evaluation period, and forecasts must be genuine initial-time forecasts with no look-ahead.

Funding

$640M

Raised by the 7 companies working on it, 2 undisclosed.

Prize money for solving it$0
Open competition pools$0

Why it is still open

A Science Advances 2026 study (arXiv 2508.15724) evaluates forecasts on record-breaking heat, cold and wind events. It finds that ECMWF HRES consistently outperforms GraphCast, Pangu-Weather and FuXi there, and that the AI models underestimate both the frequency and the magnitude of record exceedance. Average-skill leaderboards (WeatherBench 2) hide this because record events are a tiny fraction of the scored points.

Source: science.org

Who is working on it

WindBorne Systems$62M Runs a constellation of about 600 long-duration sensing balloons that feed its WeatherMesh AI models. It claims WeatherMesh-6 is the most accurate model on public benchmarks, ahead of both AI and physics-based models. InvestorsKhosla Ventures, Galvanize, Translink Capital, Biprogy, Lux Capital
Jua$27M Builds EPT-2/EPT-2e, a 'Large Physics Model' for energy traders. Jua claims it beats ECMWF HRES at every lead time from 0 to 240 h, and beats the 50-member ENS mean on RMSE and CRPS, for energy-relevant surface variables on WeatherBench 2. InvestorsAnanda Impact Ventures, Future Energy Ventures, 468 Capital, Promus Ventures, Green Generation Fund, session.vc, Kadmos Capital, Notion Capital
Brightband$10M Builds open-source AI weather models, training data and evaluation metrics that forecast directly from satellite and radar observations, then sells paid, industry-tailored products on top. InvestorsPrelude Ventures, Starshot Capital, Garage Capital, Future Back Ventures (Bain & Company), Preston-Werner Ventures, CLAI Ventures
Silurian AI$6M Founded by ex-Microsoft Aurora/ClimaX leads. Builds the Generative Forecasting Transformer (GFT), a global foundation model covering weather, air quality, ocean waves and hurricane tracks, and claims to beat US and European agency forecasts on many parameters. InvestorsY Combinator
Tomorrow.io$535M Weather-intelligence platform that is deploying DeepSky, a satellite constellation it calls 'AI-native', to feed its own AI forecast models. Forecast skill is one part of a broader SaaS and agentic-ops product. InvestorsStonecourt Capital, HarbourVest, Pitango, Harel Group
Google DeepMind / Google Research (Alphabet)undisclosed GraphCast, then GenCast (beat ECMWF ENS on 97.2% of 1,320 targets), then WeatherNext 2 (FGN architecture, Nov 2025, beats WeatherNext on 99.9% of variables/lead times). Deployed in Search, Maps and Earth Engine, and hosts WeatherBench 2.
Microsoft (Aurora)undisclosed Aurora is an atmospheric foundation model at 0.1° resolution, pretrained on more than 1M hours of data. Microsoft reports it outperforms IFS HRES and GraphCast against analysis, station observations and extremes at about 5,000x lower compute.

Also active

NVIDIA (Earth-2) Earth-2 is an open family of models and tools: a medium-range model claimed to surpass GenCast, nowcasting, GPU data assimilation, CorrDiff downscaling and FourCastNet 3, all served through Earth2Studio.

Funding for these is not counted: the problem is a small part of what they do, or they contribute data and tools.

Prizes

PrizeStatusPays forAmount
WMO S2S AI Challenge (1st/2nd/3rd = CHF 15,000/10,000/5,000)AwardedSolving$33k
ECMWF AI Weather QuestOpenRanking—

What counts as solved

The acceptance condition, stated in Lean 4. Measurements a computer cannot produce on its own are named inputs, supplied by whoever attests them.

import Mathlib.Data.Real.Basic
import Mathlib.Algebra.Order.BigOperators.Group.Finset
import Mathlib.Tactic.Linarith
import Mathlib.Tactic.NormNum
import Mathlib.Tactic.Positivity
import Mathlib.Data.Fintype.Prod

/-!
# Forecasting record-breaking weather extremes at least as well as operational NWP

On mean WeatherBench-2 skill, AI forecasts already beat ECMWF IFS. What stays
open is the tail. Evaluated on events where the observed value breaks the prior
record, IFS HRES still outperforms GraphCast, Pangu-Weather and FuXi, and the AI
models underestimate both how often records break and by how much (Science
Advances 2026, arXiv 2508.15724). This file states "solved" on that event set
only.

Concrete here:
* The **record-event set**, `recordEvents`. It holds every (initialisation, cell)
  pair whose verifying truth exceeds that cell's prior record. It is computed
  from truth and records, so neither the submitter nor the host picks the events.
* The **latitude-weighted squared error on that set**, and "beats the baseline
  by margin δ in RMSE". The comparison is stated in squared form, over the same
  events, so the normalisation cancels.
* **Bounded underestimation.** The weighted mean signed error on record events
  must be at least `-biasTol`. This is the failure mode the literature reports.
* **Detection without crying wolf.** The submission must catch strictly more
  record events than the baseline, and raise no more false alarms than the
  baseline. False alarms are forecasts above record where none occurred.
  Without this clause, "always forecast extreme" could score well.

Orientation: records here are maxima, as for heat and wind. For cold records, a
board supplies negated temperature fields; nothing else changes.

Opaque oracle (`Eval`), for one variable at one lead time:
* verification truth (for example ERA5 or station observations over the held-out period);
* the IFS HRES forecasts from the archive;
* latitude weights;
* per-cell prior records, from climatology that ends before the evaluation period starts;
* attestations of no look-ahead, and that model weights and records predate the
  evaluation period.

Who must attest: the benchmark host publishes truth, records, weights and the
baseline archive version. An independent party attests that the submissions are
genuine initial-time forecasts.

Units: fields and `biasTol` are in the variable's own units (K for T2M, m/s for
10 m wind). Weights and `margin` are dimensionless; 0.05 means 5 % lower RMSE.

Checked with Lean 4.33.0 / Mathlib using:
  lake env lean <absolute-path-to-this-file>
-/

namespace OpenSpur.Problems.WeatherRecordExtremes

/-- A field indexed by initialisation time and grid cell, for one variable and lead. -/
abbrev Field (n g : ℕ) := Fin n → Fin g → ℝ

/-- Sealed evaluation data. -/
structure Eval (n g : ℕ) where
  /-- Latitude-cosine grid weights. -/
  weight : Fin g → ℝ
  truth : Field n g
  /-- Operational baseline forecast (IFS HRES) at the same lead. -/
  baseline : Field n g
  /-- Per-cell record maximum from climatology ending before the evaluation period. -/
  record : Fin g → ℝ
  noLookAhead : Prop
  weightsPredateEval : Prop
  recordsPredateEval : Prop

variable {n g : ℕ}

/-- Record-breaking events: the truth exceeds the prior record. -/
noncomputable def recordEvents (E : Eval n g) : Finset (Fin n × Fin g) :=
  Finset.univ.filter (fun x => E.record x.2 < E.truth x.1 x.2)

/-- Pairs where a forecast `f` exceeds the prior record. -/
noncomputable def forecastRecords (E : Eval n g) (f : Field n g) : Finset (Fin n × Fin g) :=
  Finset.univ.filter (fun x => E.record x.2 < f x.1 x.2)

/-- Record events the forecast also puts above record. -/
noncomputable def hits (E : Eval n g) (f : Field n g) : ℕ :=
  (recordEvents E ∩ forecastRecords E f).card

/-- Forecast records where no record occurred. -/
noncomputable def falseAlarms (E : Eval n g) (f : Field n g) : ℕ :=
  (forecastRecords E f \ recordEvents E).card

/-- Weighted squared error of `f` on the record-event set. -/
noncomputable def eventSSE (E : Eval n g) (f : Field n g) : ℝ :=
  ∑ x ∈ recordEvents E, E.weight x.2 * (f x.1 x.2 - E.truth x.1 x.2) ^ 2

/-- Weighted signed error of `f` on the record-event set (negative = underforecast). -/
noncomputable def eventBias (E : Eval n g) (f : Field n g) : ℝ :=
  ∑ x ∈ recordEvents E, E.weight x.2 * (f x.1 x.2 - E.truth x.1 x.2)

/-- Total weight of the record-event set. -/
noncomputable def eventWeight (E : Eval n g) : ℝ :=
  ∑ x ∈ recordEvents E, E.weight x.2

structure Thresholds where
  /-- RMSE improvement over the baseline on record events; must lie in `[0, 1]`. -/
  margin : ℝ
  /-- Largest tolerated weighted mean underforecast on record events. -/
  biasTol : ℝ
  /-- Minimum number of record events, so the test is not decided by a handful. -/
  minEvents : ℕ

/-- Acceptance predicate for a submitted forecast `f`. -/
def Solved (T : Thresholds) (E : Eval n g) (f : Field n g) : Prop :=
  E.noLookAhead ∧ E.weightsPredateEval ∧ E.recordsPredateEval ∧
  (∀ p, 0 < E.weight p) ∧
  0 ≤ T.margin ∧ T.margin ≤ 1 ∧
  T.minEvents ≤ (recordEvents E).card ∧
  eventSSE E f ≤ (1 - T.margin) ^ 2 * eventSSE E E.baseline ∧
  -T.biasTol * eventWeight E ≤ eventBias E f ∧
  hits E E.baseline < hits E f ∧
  falseAlarms E f ≤ falseAlarms E E.baseline

/-- Rung `k`: `5 (k+1)` % lower RMSE on record events, underforecast at most 0.5
units on average, and at least 100 record events. -/
noncomputable def Rung (k : ℕ) : Thresholds where
  margin := 0.05 * ((k : ℝ) + 1)
  biasTol := 0.5
  minEvents := 100

theorem rung_margin_mono {j k : ℕ} (h : j ≤ k) : (Rung j).margin ≤ (Rung k).margin := by
  have hjk : (j : ℝ) ≤ (k : ℝ) := Nat.cast_le.mpr h
  simp only [Rung]
  linarith

theorem eventSSE_nonneg (E : Eval n g) (hw : ∀ p, 0 < E.weight p) (f : Field n g) :
    0 ≤ eventSSE E f :=
  Finset.sum_nonneg fun x _ => mul_nonneg (hw x.2).le (sq_nonneg _)

/-- Solving a higher rung implies solving every lower rung. -/
theorem solved_rung_mono {j k : ℕ} (h : j ≤ k) (E : Eval n g) (f : Field n g) :
    Solved (Rung k) E f → Solved (Rung j) E f := by
  rintro ⟨h1, h2, h3, hw, _, hk1, hev, hsse, hbias, hhit, hfa⟩
  have hm := rung_margin_mono h
  have hj0 : 0 ≤ (Rung j).margin := by
    simp only [Rung]; positivity
  have hsq : (1 - (Rung k).margin) ^ 2 ≤ (1 - (Rung j).margin) ^ 2 := by
    have : 0 ≤ 1 - (Rung k).margin := by linarith
    nlinarith
  refine ⟨h1, h2, h3, hw, hj0, by linarith, hev, ?_, hbias, hhit, hfa⟩
  exact le_trans hsse (mul_le_mul_of_nonneg_right hsq (eventSSE_nonneg E hw _))

end OpenSpur.Problems.WeatherRecordExtremes

Public resources

Join

Tell us what you want settled.

Two questions. We read every one.

I am a

What are you looking to solve?

Where should we reply?

Received

That is with us.

We read every message and reply to the ones we can help.