From 07fdf9dbd6f95a2184f4511fd598b78bf3d04871 Mon Sep 17 00:00:00 2001 From: Niall Siegenheim Date: Fri, 26 Jun 2026 10:12:56 +0200 Subject: [PATCH 1/2] feat(models)!: remove retired ecmwf_aifs025_ensemble Contract-phase removal. The open-meteo AIFS ensemble has been retired backend -side (replaced by hosted aifs_ens, added in the preceding commit). Drop the enum member and its meta so the SDK no longer advertises an id the query engine rejects. BREAKING CHANGE: Models.ECMWF_AIFS_ENSEMBLE is removed. Use Models.AIFS_ENS (hosted, grid access) instead. Note aifs_ens does not serve 500hPa geopotential. Built on top of the AIFS_ENS addition (#82); must merge after #82 and after the jua-core backend removal is ready, per the reverse-order contraction plan. --- src/jua/weather/_model_meta.py | 6 ------ src/jua/weather/models.py | 1 - tests/weather/test_aifs_ens_meta.py | 9 ++++----- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/jua/weather/_model_meta.py b/src/jua/weather/_model_meta.py index f0bd2cc..007f9d1 100644 --- a/src/jua/weather/_model_meta.py +++ b/src/jua/weather/_model_meta.py @@ -242,12 +242,6 @@ class ModelMetaInfo: # num_lats=720 / num_lons=1440, so no override needed. temporal_resolution=TemporalResolution(base=6), ) -_MODEL_META_INFO[Models.ECMWF_AIFS_ENSEMBLE] = ModelMetaInfo( - forecast_name_mapping="ecmwf_aifs025_ensemble", - full_forecasted_hours=360, - has_forecast_file_access=False, - has_statistics=True, -) _MODEL_META_INFO[Models.ECMWF_IFS_ENSEMBLE] = ModelMetaInfo( full_forecasted_hours=360, has_forecast_file_access=False, diff --git a/src/jua/weather/models.py b/src/jua/weather/models.py index 4ee9c45..43cd1fe 100644 --- a/src/jua/weather/models.py +++ b/src/jua/weather/models.py @@ -38,7 +38,6 @@ class Models(str, Enum): NOAA_GFS_SINGLE = "noaa_gfs_single" # Without Grid Access - ECMWF_AIFS_ENSEMBLE = "ecmwf_aifs025_ensemble" ECMWF_IFS_ENSEMBLE = "ecmwf_ens" GFS_GLOBAL_ENSEMBLE = "gfs_global_ensemble" GFS_GLOBAL_SINGLE = "gfs_global_single" diff --git a/tests/weather/test_aifs_ens_meta.py b/tests/weather/test_aifs_ens_meta.py index 270e11f..0337570 100644 --- a/tests/weather/test_aifs_ens_meta.py +++ b/tests/weather/test_aifs_ens_meta.py @@ -1,10 +1,9 @@ """Regression tests for the hosted AIFS ENS model metadata. -The hosted ClickHouse ``aifs_ens`` model is added alongside the existing -open-meteo ``ecmwf_aifs025_ensemble`` (additive / expand phase). Unlike the -point-only open-meteo model, the hosted model exposes full grid access plus -ensemble statistics, so it must not regress into the "point queries only" -behaviour gated by ``has_grid_access``. +The hosted ClickHouse ``aifs_ens`` model replaced the retired open-meteo +``ecmwf_aifs025_ensemble``. Unlike that point-only open-meteo model, the hosted +model exposes full grid access plus ensemble statistics, so it must not regress +into the "point queries only" behaviour gated by ``has_grid_access``. """ from jua.weather._model_meta import get_model_meta_info From e20ad84b6794f2e1c969958a538b6fd5421b7da9 Mon Sep 17 00:00:00 2001 From: Niall Siegenheim Date: Fri, 26 Jun 2026 12:11:17 +0200 Subject: [PATCH 2/2] test(models): assert retired ecmwf_aifs025_ensemble is gone Add a regression assertion that Models.ECMWF_AIFS_ENSEMBLE / the 'ecmwf_aifs025_ensemble' value no longer exist, guarding the removal. --- tests/weather/test_aifs_ens_meta.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/weather/test_aifs_ens_meta.py b/tests/weather/test_aifs_ens_meta.py index 0337570..5cf5b06 100644 --- a/tests/weather/test_aifs_ens_meta.py +++ b/tests/weather/test_aifs_ens_meta.py @@ -20,3 +20,10 @@ def test_aifs_ens_is_fully_accessible() -> None: assert (meta.num_lats, meta.num_lons) == (720, 1440) # 0-360h forecast horizon. assert meta.full_forecasted_hours == 360 + + +def test_retired_open_meteo_aifs_ensemble_is_removed() -> None: + # The open-meteo ecmwf_aifs025_ensemble was retired; only the hosted + # aifs_ens remains. Guard against the enum member being reintroduced. + assert not hasattr(Models, "ECMWF_AIFS_ENSEMBLE") + assert "ecmwf_aifs025_ensemble" not in {m.value for m in Models}