Skip to content

Mint ESMValTool CMIP6 regression baselines#764

Merged
lewisjared merged 5 commits into
mainfrom
feat/mint-esmvaltool-cmip6-baselines
Jun 29, 2026
Merged

Mint ESMValTool CMIP6 regression baselines#764
lewisjared merged 5 commits into
mainfrom
feat/mint-esmvaltool-cmip6-baselines

Conversation

@lewisjared

@lewisjared lewisjared commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Description

Establishes the canonical native regression baselines for all 25 ESMValTool CMIP6 test cases (23 literal cmip6 cases plus the two zero-emission-commitment cmip6 parent cases). Native snapshots are uploaded to the ref-baselines-public store; this branch tracks the committed bundle (regression/), the dataset catalog (catalog.yaml) and the manifest (manifest.json) per case. Local file-path catalogs and output/ work slots remain gitignored.

While minting, ECS, TCR, TCRE and ZEC failed with can only concatenate str (not "datetime.timedelta") to str. Root cause: catalogs serialised to YAML store start_time as an ISO-like string (cftime datetimes are not natively YAML-serialisable), so loading a committed catalog yields a str where a fresh in-memory dataframe yields a cftime datetime. get_child_and_parent_dataset then did child_start + (branch_time_in_parent - branch_time_in_child), mixing str and timedelta. The existing tests only exercised the cftime-object path, so the regression was invisible.

Changes

  • fix(esmvaltool): parse the string start_time back to a calendar-aware cftime datetime in get_child_and_parent_dataset; add a regression test for the string path; declare cftime.datetime.strptime in the vendored stub.
  • test(esmvaltool): add CMIP6 regression baselines (catalog + manifest + committed bundle) for all 25 diagnostics.

Checklist

Please confirm that this pull request has done the following:

  • Tests added
  • Documentation added (where applicable)
  • Changelog item added to changelog/

Summary by CodeRabbit

  • Bug Fixes
    • Resolved failures when generating ECS, TCR, TCRE and ZEC diagnostics from committed catalogues by restoring calendar-aware timerange calculations.
    • Improved handling of dataset start/end times provided as text so derived timeranges calculate correctly.
  • Tests
    • Expanded and refreshed regression test fixtures and integrity manifests across many CMIP6 workflows.
    • Introduced canonical CMIP6 regression baselines for all diagnostics.
    • Added unit tests covering string-based start times and regression-fixture recipe adjustments.

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 389fe7dd-6b6c-4b0a-9ef6-f4843fc76802

📥 Commits

Reviewing files that changed from the base of the PR and between 8b936be and 9cf0e9b.

📒 Files selected for processing (3)
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py
  • packages/climate-ref-esmvaltool/tests/unit/test_recipe.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py
  • packages/climate-ref-esmvaltool/tests/unit/test_recipe.py

📝 Walkthrough

Walkthrough

Fixes string handling in get_child_and_parent_dataset, adds a regression-fixture reduction hook for regional historical diagnostics, and updates CMIP6 test data with catalog, manifest, regression, and series fixtures for the diagnostic suite.

Changes

String child_start fix and CMIP6 test data baselines

Layer / File(s) Summary
String child_start parse fix, stub, and unit test
packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py, stubs/cftime/__init__.pyi, packages/climate-ref-esmvaltool/tests/unit/test_recipe.py, changelog/764.fix.md, changelog/764.trivial.md
get_child_and_parent_dataset now parses string start_time values back into a calendar-aware cftime.datetime before deriving parent timeranges. The cftime stub adds strptime, a unit test covers ISO string inputs, and the changelogs describe the fix and baseline updates.
Regional historical regression reduction
packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py, packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/regional_historical_changes.py, packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_base.py
ESMValToolDiagnostic gains a regression-fixture reduction hook that is called while writing recipes. RegionalHistoricalTimeSeries adds reduced test variables and regions, uses the reduced variable set in its CMIP6 request, and rewrites extract-shape region lists for test- executions.
CMIP6 catalog fixtures
packages/climate-ref-esmvaltool/tests/test-data/*/cmip6/catalog.yaml
New catalog YAML files define CMIP6 and where applicable obs4mips selectors plus fully specified dataset entries for the diagnostic test cases.
Regression fixtures
packages/climate-ref-esmvaltool/tests/test-data/*/cmip6/regression/diagnostic.json, packages/climate-ref-esmvaltool/tests/test-data/*/cmip6/regression/output.json, packages/climate-ref-esmvaltool/tests/test-data/*/cmip6/regression/series.json
Regression fixtures add DIMENSIONS/RESULTS payloads, expected output metadata for data/html/plots/provenance, and either empty or populated series arrays for the supported diagnostics.
Manifest integrity metadata
packages/climate-ref-esmvaltool/tests/test-data/*/cmip6/manifest.json
Manifest files record catalog hashes plus committed and native artefact digests and sizes for the generated test outputs and supporting files.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 77.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the main change: minting CMIP6 regression baselines for ESMValTool.
Description check ✅ Passed The description matches the template with Description and Checklist sections and covers the main changes and checklist items.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/mint-esmvaltool-cmip6-baselines

Comment @coderabbitai help to get the list of available commands.

lewisjared added a commit that referenced this pull request Jun 29, 2026
Confidence: high
Scope-risk: narrow
@codecov

codecov Bot commented Jun 29, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.23529% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...valtool/diagnostics/regional_historical_changes.py 84.61% 1 Missing and 1 partial ⚠️
Flag Coverage Δ
core 92.60% <ø> (+<0.01%) ⬆️
providers 85.49% <88.23%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...ool/src/climate_ref_esmvaltool/diagnostics/base.py 89.57% <100.00%> (+0.12%) ⬆️
...ef-esmvaltool/src/climate_ref_esmvaltool/recipe.py 86.82% <100.00%> (+0.20%) ⬆️
...valtool/diagnostics/regional_historical_changes.py 85.15% <84.61%> (-0.19%) ⬇️

... and 7 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: dc0f10f7-50bf-4d83-b37c-7efdcf37c7aa

📥 Commits

Reviewing files that changed from the base of the PR and between fda1ac6 and 995454a.

📒 Files selected for processing (130)
  • changelog/764.fix.md
  • changelog/764.trivial.md
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/unit/test_recipe.py
  • stubs/cftime/__init__.pyi

Comment on lines +67 to +124
"executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_eq_pr_bias.nc": {
"description": "",
"dimensions": {
"reference_source_id": "GPCP-V2.3",
"statistic": "zonal bias in the time-mean pr structure across the equatorial Pacific"
},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_eq_pr_bias.nc",
"long_name": "Zonal bias in the time-mean precipitation structure across the equatorial Pacific (averaged between 5°S-5°N), illustrating the increased precipitation in the eastern Pacific and decreased precipitation in the western Pacific."
},
"executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_eq_pr_seacycle.nc": {
"description": "",
"dimensions": {},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_eq_pr_seacycle.nc",
"long_name": "Zonal bias in the amplitude of the mean seasonal cycle of precipitation in the equatorial Pacific (averaged between 5°S-5°N)."
},
"executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_pr_double.nc": {
"description": "",
"dimensions": {},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_pr_double.nc",
"long_name": "Meridional bias in the time-mean precipitation structure across the eastern Pacific (averaged between 150-90°W), primarily illustrating the double intertropical convergence zone (ITCZ) bias."
},
"executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_pr_double_seacycle.nc": {
"description": "",
"dimensions": {
"statistic": "meridional bias in the amplitude of the mean seasonal pr cycle in the eastern Pacific"
},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/GPCP-V2.3_pr_double_seacycle.nc",
"long_name": "Meridional bias in the amplitude of the mean seasonal precipitation cycle in the eastern Pacific (averaged between 150-90°W). "
},
"executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_sst_bias.nc": {
"description": "",
"dimensions": {
"reference_source_id": "TROPFLUX",
"statistic": "zonal bias in the time-mean sst structure across the equatorial Pacific"
},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_sst_bias.nc",
"long_name": "Zonal bias in the sea surface temperature structure across the equatorial Pacific (averaged between 5°S-5°N), primarily illustrating the cold tongue bias (typically warmer near South America and cooler further west)."
},
"executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_sst_seacycle.nc": {
"description": "",
"dimensions": {},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_sst_seacycle.nc",
"long_name": "Zonal bias in the amplitude of the mean seasonal cycle of sea surface temperature in the equatorial Pacific (averaged between 5°S-5°N)."
},
"executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_tauu_bias.nc": {
"description": "",
"dimensions": {
"reference_source_id": "TROPFLUX",
"statistic": "zonal bias in the time-mean tauu structure across the equatorial Pacific"
},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_tauu_bias.nc",
"long_name": "Zonal bias in the structure of zonal wind stress across the equatorial Pacific (averaged between 5°S-5°N), primarily highlighting the trade winds bias (typically weaker circulation in the central Pacific and stronger in the western Pacific)."
},
"executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_tauu_seacycle.nc": {
"description": "",
"dimensions": {},
"filename": "executions/recipe/work/diagnostic_metrics/plot_script/TROPFLUX_eq_tauu_seacycle.nc",
"long_name": "Zonal bias in the amplitude of the mean seasonal cycle of zonal wind stress in the equatorial Pacific (averaged between 5°S-5°N)."

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Normalise dimensions for the reference NetCDF artefacts.

These rows commit three different metadata shapes for the same reference-output family: some entries carry both reference_source_id and statistic, one carries only statistic, and several are {} even though the filename/long_name still identify the same dimensions. Because output.json is the canonical regression contract, baking this in will mask metadata regressions and make dimension-based lookups unreliable for those artefacts.

Catalogs serialised to YAML store start_time as an ISO-like string because
cftime datetimes are not natively YAML-serialisable. Loading a committed
catalog (mint/replay/build) therefore yields a str where a fresh in-memory
dataframe yields a cftime datetime, so `child_start + (branch_time_in_parent
- branch_time_in_child)` raised "can only concatenate str (not
datetime.timedelta) to str". This broke minting for every diagnostic that
derives a parent timerange from branch times: ECS, TCR, TCRE and ZEC.

Parse the string back to a calendar-aware cftime datetime when needed. The
existing tests only exercised the cftime-object path, so the regression was
invisible; add a string-start_time test mirroring the cftime case, and
declare cftime.datetime.strptime in the vendored stub.

Constraint: catalog.yaml cannot store cftime datetimes natively, so the
  string round-trip must be handled at read time
Confidence: high
Scope-risk: narrow
Not-tested: start_time strings with sub-second precision or years < 1
…xture

The committed series.json for this diagnostic has one entry per
(variable, region, statistic); with all 5 variables over the 58 AR6 regions it
was ~12 MB, too large to carry in git history. Reduce the cmip6 regression
fixture on two axes that do not affect production:

- variables: the cmip6 test request now uses a representative subset
  (``test_variables`` = pr, tas) instead of the full set.
- regions: a new ``reduce_recipe_for_regression_fixture`` hook (no-op in the
  base class) restricts the recipe's extract_shape regions to ``test_regions``
  (3 AR6 regions) for fixture runs only, detected via the ``test-`` execution
  key. Production runs are untouched and still process all regions.

This brings the committed series.json from ~12 MB to ~240 KB.

Constraint: production must still process all variables and AR6 regions, so
  the reduction is gated on the regression-fixture execution key
Rejected: shorten the test time_span | recipe hardcodes the period, so it has
  no effect on a local-catalog test run
Confidence: high
Scope-risk: narrow
Mint the canonical native baselines for all 25 ESMValTool CMIP6 test cases
(23 literal `cmip6` cases plus the two zero-emission-commitment cmip6 parent
cases). Native snapshots are uploaded to the ref-baselines-public store; this
commit tracks the committed bundle (regression/), the dataset catalog
(catalog.yaml) and the manifest (manifest.json) per case. Local file-path
catalogs and the output/ work slots remain gitignored.

ECS, TCR, TCRE and ZEC depend on the start_time parsing fix, and
regional-historical-timeseries on the fixture reduction, in the preceding
commits.

Confidence: high
Scope-risk: narrow
Confidence: high
Scope-risk: narrow
@lewisjared lewisjared force-pushed the feat/mint-esmvaltool-cmip6-baselines branch from 995454a to 8b936be Compare June 29, 2026 05:59

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9a4490da-7845-4485-b901-c84628635e71

📥 Commits

Reviewing files that changed from the base of the PR and between 995454a and 8b936be.

📒 Files selected for processing (133)
  • changelog/764.fix.md
  • changelog/764.trivial.md
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/regional_historical_changes.py
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_base.py
  • packages/climate-ref-esmvaltool/tests/unit/test_recipe.py
  • stubs/cftime/__init__.pyi
✅ Files skipped from review due to trivial changes (99)
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/unit/test_recipe.py
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/series.json
  • changelog/764.trivial.md
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/output.json
  • changelog/764.fix.md
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clwvi-pr/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-zonal/cmip6/manifest.json
  • stubs/cftime/init.pyi
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clivi-lwcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-annual-cycle/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-clt-swcre/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-basic-climatology/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/regression/diagnostic.json
🚧 Files skipped from review as they are similar to previous changes (23)
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/enso-characteristics/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-1pctCO2-parent/regression/diagnostic.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-nh-mar/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-scatterplots-cli-ta/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py
  • packages/climate-ref-esmvaltool/tests/test-data/global-mean-timeseries/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-sensitivity/cmip6/manifest.json
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-lat-time/cmip6/regression/series.json
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/sea-ice-area-basic/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-at-global-warming-levels/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/ozone-sh-oct/cmip6/regression/output.json
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-trend/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/regional-historical-annual-cycle/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/equilibrium-climate-sensitivity/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/zero-emission-commitment/cmip6-esm-1pctCO2-parent/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/climate-drivers-for-fire/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response-emissions/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/cloud-radiative-effects/cmip6/catalog.yaml
  • packages/climate-ref-esmvaltool/tests/test-data/transient-climate-response/cmip6/catalog.yaml

Comment on lines +642 to +647
for preprocessor in recipe.get("preprocessors", {}).values():
if not isinstance(preprocessor, dict):
continue
extract_shape = preprocessor.get("extract_shape")
if isinstance(extract_shape, dict) and isinstance(extract_shape.get("ids"), dict):
extract_shape["ids"]["Name"] = keep

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Only rewrite AR6 shape filters here.

This currently rewrites every extract_shape.ids.Name block in the recipe, not just AR6 ones. If another shape preprocessor is added later, this will silently change its selector as well.

Suggested fix
         keep = list(self.test_regions)
         for preprocessor in recipe.get("preprocessors", {}).values():
             if not isinstance(preprocessor, dict):
                 continue
             extract_shape = preprocessor.get("extract_shape")
-            if isinstance(extract_shape, dict) and isinstance(extract_shape.get("ids"), dict):
+            if (
+                isinstance(extract_shape, dict)
+                and extract_shape.get("shapefile") == "ar6"
+                and isinstance(extract_shape.get("ids"), dict)
+                and "Name" in extract_shape["ids"]
+            ):
                 extract_shape["ids"]["Name"] = keep
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
for preprocessor in recipe.get("preprocessors", {}).values():
if not isinstance(preprocessor, dict):
continue
extract_shape = preprocessor.get("extract_shape")
if isinstance(extract_shape, dict) and isinstance(extract_shape.get("ids"), dict):
extract_shape["ids"]["Name"] = keep
for preprocessor in recipe.get("preprocessors", {}).values():
if not isinstance(preprocessor, dict):
continue
extract_shape = preprocessor.get("extract_shape")
if (
isinstance(extract_shape, dict)
and extract_shape.get("shapefile") == "ar6"
and isinstance(extract_shape.get("ids"), dict)
and "Name" in extract_shape["ids"]
):
extract_shape["ids"]["Name"] = keep

@lewisjared lewisjared enabled auto-merge June 29, 2026 07:20
@lewisjared lewisjared disabled auto-merge June 29, 2026 12:05
@lewisjared lewisjared merged commit a73f0a4 into main Jun 29, 2026
23 checks passed
@lewisjared lewisjared deleted the feat/mint-esmvaltool-cmip6-baselines branch June 29, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant