pypi climate-indices 3.0.0
v3.0.0

4 hours ago

climate_indices 3.0.0

Released 2026-10-12. See the tagged release notes and changelog.

Highlights

  • Fire-weather indices — new climate_indices.fire namespace: KBDI, CFFWIS moisture and behavior indices, Fosberg FFWI, Hot-Dry-Windy, and Haines. KBDI is available from the CLI.
  • Flood-potential indices — new climate_indices.flood namespace: effective precipitation, Effective Drought Index (EDI), Flood Index, and Antecedent Precipitation Index (API). These describe flood potential, not observed flooding; the flood-family EDI is not the Evaporative Demand Drought Index.
  • Self-calibrated Palmer — scpdsi() adds Wells-style self-calibration and a CLI path.
  • More statistical options — SPEI log-logistic distribution; indices.standardized_index(); zero_handling for SPI; output_scale (normal scores, probabilities, bounded values) across SPI/SPEI/standardized_index(); new fit_diagnostics().
  • More public tools — FAO-56 Penman-Monteith PET at the package root; climate_indices.runs; public climate_indices.validation.
  • Gridded execution — time-major (time, *cells) blocks; measured in-process speedups on the reference grid include 4.4x SPI, 3.6x SPEI, 53x Thornthwaite PET, 342x EDDI, and 111.3x PDSI. The xarray DataArray API remains Beta; the NumPy API is the stable integration surface.
  • Optional Rust backend — compiled numerical kernels accelerate eligible calls without changing the public Python API.
  • Python 3.10–3.14 is supported.

Upgrade considerations

Six behavior or exception changes need review:

  1. Daily xarray SPI, SPEI, EDDI, percentage of normal, and Hargreaves PET correct the non-leap-year calendar shift; values may change. Unsupported calendars, daily series not beginning January 1, or monthly series not beginning in January now fail validation.
  2. Ambiguous three-or-more-dimensional NumPy grids must declare spatial_time_major=True or reorder their cell axes. Undeclared gridded EDDI and percentage-of-normal inputs now raise DataShapeError (a changed exception type for percentage of normal).
  3. pci() corrects February boundaries; recompute values and any thresholds calibrated against earlier output.
  4. Invalid periodicity raises PeriodicityError, not ValueError.
  5. Gamma fitting now measures the probability of zero on the Calibration Period's non-missing observations and honors supplied prob_zero values; affected SPI, SPEI, or standardized_index() results can change.
  6. Reversed Calibration Periods now raise CalibrationPeriodError; percentage_of_normal() also rejects windows outside its record.

The legacy spi console script and climate_indices.__spi__ are removed — use climate_indices --index spi. The --save_params and --load_params options have no direct CLI replacement; pass fitted parameters to indices.spi(fitting_params=...). Percentage of normal now prefers calibration_year_initial/calibration_year_final; the old keyword names warn and remain available until 4.0.0.

See the changelog for exact conditions and the migration guide for detection and remedies.


What's Changed

  • chore(deps-dev): bump cryptography from 46.0.6 to 46.0.7 by @dependabot[bot] in #624
  • chore(deps): bump pillow to 12.2.0 and pytest to 9.0.3 by @monocongo in #630
  • chore(dx): restore Claude Code project-layer config from PR #626 by @monocongo in #631
  • fix(dx): address CodeRabbit review issues from PR #631 by @monocongo in #632
  • chore(deps): bump nbconvert from 7.17.0 to 7.17.1 by @dependabot[bot] in #633
  • chore(deps): bump jupyterlab from 4.5.4 to 4.5.7 by @dependabot[bot] in #635
  • chore(deps): bump notebook from 7.5.3 to 7.5.6 by @dependabot[bot] in #634
  • chore(deps): bump pip to 26.1 and jupyter-server to 2.18.0 by @monocongo in #638
  • chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 by @dependabot[bot] in #639
  • chore(deps): bump actions/upload-artifact from 4.6.2 to 7.0.1 by @dependabot[bot] in #640
  • chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 by @dependabot[bot] in #641
  • chore(deps): bump actions/setup-python from 5.6.0 to 6.2.0 by @dependabot[bot] in #642
  • chore(deps): bump astral-sh/setup-uv from e58605a9b6da7c637471fab8847a5e5a6b8df081 to d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 by @dependabot[bot] in #643
  • chore(deps): bump the version-updates group with 8 updates by @dependabot[bot] in #644
  • chore(deps-dev): bump cryptography from 46.0.7 to 48.0.0 by @dependabot[bot] in #646
  • chore(deps-dev): bump types-psutil from 7.2.2.20260130 to 7.2.2.20260408 by @dependabot[bot] in #645
  • chore(deps): bump mistune from 3.2.0 to 3.2.1 in the security-updates group across 1 directory by @dependabot[bot] in #647
  • chore(deps): bump urllib3 from 2.6.3 to 2.7.0 in the security-updates group across 1 directory by @dependabot[bot] in #648
  • chore(deps-dev): bump the version-updates group with 2 updates by @dependabot[bot] in #650
  • chore(deps-dev): bump types-psutil from 7.2.2.20260408 to 7.2.2.20260508 by @dependabot[bot] in #652
  • chore(deps-dev): bump mypy from 1.20.2 to 2.1.0 by @dependabot[bot] in #651
  • chore(deps): bump astral-sh/setup-uv from 5.4.2 to 8.1.0 by @dependabot[bot] in #649
  • Add Python 3.14 support by @monocongo in #654
  • Fix idna security vulnerability by @monocongo in #669
  • chore(deps-dev): bump the version-updates group with 3 updates by @dependabot[bot] in #665
  • chore(deps-dev): bump types-psutil from 7.2.2.20260508 to 7.2.2.20260518 by @dependabot[bot] in #666
  • chore(release): prepare v2.5 validation docs and CI by @monocongo in #658
  • Docs: document trunk release workflow by @monocongo in #668
  • chore(deps): bump tornado from 6.5.5 to 6.5.6 in the security-updates group across 1 directory by @dependabot[bot] in #686
  • chore(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0 by @dependabot[bot] in #683
  • chore(deps): bump actions/download-artifact from 4.3.0 to 8.0.1 by @dependabot[bot] in #682
  • chore(deps): bump actions/checkout from 4.3.1 to 6.0.3 by @dependabot[bot] in #680
  • chore(deps): bump actions/setup-python from 5.6.0 to 6.2.0 by @dependabot[bot] in #681
  • chore(deps): bump the version-updates group across 1 directory with 5 updates by @dependabot[bot] in #689
  • chore(deps): bump the security-updates group across 1 directory with 2 updates by @dependabot[bot] in #687
  • chore(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0 by @dependabot[bot] in #688
  • chore(deps): bump bleach from 6.3.0 to 6.4.0 in the security-updates group across 1 directory by @dependabot[bot] in #690
  • chore(deps): bump jupyter-server from 2.18.0 to 2.20.0 in the security-updates group across 1 directory by @dependabot[bot] in #691
  • chore(deps): bump jupyterlab from 4.5.7 to 4.5.9 in the security-updates group across 1 directory by @dependabot[bot] in #692
  • chore(deps): bump msgpack from 1.1.2 to 1.2.1 in the security-updates group across 1 directory by @dependabot[bot] in #693
  • chore(deps): bump structlog from 25.5.0 to 26.1.0 by @dependabot[bot] in #697
  • chore(deps-dev): bump the version-updates group with 4 updates by @dependabot[bot] in #696
  • chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 by @dependabot[bot] in #695
  • chore(deps): bump actions/setup-python from 6.2.0 to 6.3.0 by @dependabot[bot] in #694
  • chore(deps): bump the version-updates group with 5 updates by @dependabot[bot] in #699
  • chore(deps): bump astral-sh/setup-uv from 8.2.0 to 8.3.2 by @dependabot[bot] in #698
  • chore(deps): bump the security-updates group across 1 directory with 2 updates by @dependabot[bot] in #701
  • Harden Python 3.14 support consistency by @monocongo in #702
  • chore(deps): bump the version-updates group with 5 updates by @dependabot[bot] in #703
  • chore(deps): bump mistune from 3.2.1 to 3.3.0 in the security-updates group across 1 directory by @dependabot[bot] in #704
  • chore(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 by @dependabot[bot] in #705
  • chore(deps): bump actions/setup-python from 6.3.0 to 7.0.0 by @dependabot[bot] in #706
  • chore(deps): bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 by @dependabot[bot] in #707
  • chore(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #708
  • chore(deps-dev): bump twine from 6.2.0 to 7.0.0 by @dependabot[bot] in #710
  • chore(deps-dev): bump the version-updates group with 3 updates by @dependabot[bot] in #709
  • chore(deps-dev): bump the version-updates group with 2 updates by @dependabot[bot] in #713
  • chore(deps-dev): bump cryptography from 49.0.0 to 50.0.0 by @dependabot[bot] in #714
  • chore(deps): bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 by @dependabot[bot] in #712
  • docs(research): record nClimGrid supply-chain facts by @monocongo in #739
  • chore(deps): bump the security-updates group across 1 directory with 3 updates by @dependabot[bot] in #711
  • docs(agents): require branch-based pushes by @monocongo in #738
  • fix(benchmark): harden Hargreaves overhead gate by @monocongo in #741
  • scPDSI PR1: generalize PDSI recursion to accept duration factors by @monocongo in #736
  • Harden CI and release workflows by @monocongo in #743
  • fix: reject fractional window_length and incomplete windows by @monocongo in #746
  • chore(deps-dev): bump the version-updates group across 1 directory with 3 updates by @dependabot[bot] in #745
  • test: add scPDSI reference fixtures and NCEI ground truth for 344 divisions by @monocongo in #744
  • fix: align rolling-window types with accepted inputs by @monocongo in #747
  • scPDSI PR2: self-calibration statistics module by @monocongo in #742
  • chore(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 by @dependabot[bot] in #750
  • chore(deps-dev): bump the version-updates group with 3 updates by @dependabot[bot] in #751
  • chore(deps-dev): bump the version-updates group with 2 updates by @dependabot[bot] in #752
  • docs: record architecture deepening review by @monocongo in #753
  • feat(palmer): add self-calibrating PDSI API by @monocongo in #748
  • docs: fix scPDSI PR3 output-mapping off-by-one by @monocongo in #749
  • fix: address M1/M2/L1 review followups from #755 by @monocongo in #756
  • test: derandomize Hypothesis property tests by @monocongo in #761
  • chore(deps): bump the version-updates group with 8 updates by @dependabot[bot] in #764
  • chore(deps-dev): bump types-psutil from 7.2.2.20260518 to 7.2.2.20260827 by @dependabot[bot] in #765
  • chore(deps): bump the security-updates group across 1 directory with 2 updates by @dependabot[bot] in #763
  • docs: streamline agent guidance by @monocongo in #762
  • docs(skill): clarify climate indices skill triggers by @monocongo in #767
  • fix(xarray): make calendar semantics explicit at the xarray seam by @monocongo in #757
  • fix: correct typos in docstrings, comments, and CLI text by @marekl11 in #768
  • refactor: simplify optional psutil import by @monocongo in #782
  • chore(deps-dev): bump the version-updates group with 2 updates by @dependabot[bot] in #814
  • chore(deps-dev): bump types-psutil from 7.2.2.20260827 to 7.2.2.20260906 by @dependabot[bot] in #815
  • fix: make error messages and docs match what the code does by @marekl11 in #784
  • feat(fire): add the Fosberg Fire Weather Index by @Mihailchik in #817
  • chore: remove commented-out pearson_parameters_previous by @marekl11 in #821
  • feat(fire): define namespaced API surface by @monocongo in #836
  • feat(fire): define recursive state contract by @monocongo in #837
  • docs(agents): ban AI attribution in commit and PR messages by @monocongo in #835
  • docs(agents): make PR merges explicitly maintainer-only by @monocongo in #840
  • feat(eto): add literature-derived PET validation fixtures by @monocongo in #820
  • perf: compute goodness-of-fit K-S statistic directly (9.2x faster SPI) by @monocongo in #818
  • fix(validation): validate SPI against NOAA NCEI reference data by @monocongo in #819
  • fix(deps): keep Dask dashboard dependencies optional by @monocongo in #832
  • feat(fire): add the Hot-Dry-Windy Index by @monocongo in #839
  • Validate EDDI against NOAA PSL reference data by @monocongo in #783
  • fix(e2e): align SPI/SPEI example on the 1980/1981-2010 input contract by @monocongo in #842
  • docs: add issue tracker guide to agent docs by @monocongo in #841
  • docs(scripts): document e2e Zarr input preparation pipeline by @monocongo in #843
  • refactor(e2e): canonical typed xarray API for SPI/SPEI (#825) by @monocongo in #844
  • test: read repository files as UTF-8 on Windows by @mclainv in #845
  • docs: delete stale RELEASE_NOTES.md, point release process at CHANGELOG by @monocongo in #860
  • Fix/pci dropping february by @mclainv in #846
  • docs: remove source-tree-analysis.md in favor of component-inventory by @monocongo in #859
  • docs(notebook): add orientation and xarray/Zarr foundations by @monocongo in #861
  • chore(cli): deduplicate shared CLI helpers and remove profiling recipes by @monocongo in #864
  • docs(e2e): persist and reopen SPI/SPEI results with complete Zarr metadata by @monocongo in #862
  • refactor(fire): remove unused recurrence scaffold by @monocongo in #863
  • chore: remove dead helpers and unused constants by @monocongo in #865
  • docs(code): trim narrative docstring and comment padding by @monocongo in #866
  • docs(fire): define missing-data and gap policy for recursive indices by @monocongo in #867
  • docs(fire): add climate indices for wildfire applications by @monocongo in #868
  • chore: remove BMAD and spec-driven dev artifacts by @monocongo in #870
  • feat(fire): add the Keetch-Byram Drought Index (#799) by @monocongo in #869
  • perf: vectorize PCI month totals and PNP averaging/division by @monocongo in #871
  • test(fire): KBDI validation fixtures and reference tests (#800) by @monocongo in #872
  • refactor(xarray): unify output finalizer and inline dask-backed check by @monocongo in #873
  • refactor(palmer): dedupe CAFEC/K-factor loops and typed API kwargs filters by @monocongo in #874
  • docs(notebook): add selectable-location SPI/SPEI time series by @monocongo in #877
  • test(e2e): harden SPI/SPEI scientific and Zarr regression checks by @monocongo in #875
  • docs(notebook): map persisted SPI and SPEI output by @monocongo in #876
  • docs(notebook): teach Dask chunking, laziness, and execution (#829) by @monocongo in #878
  • docs(notebook): smoke-execute and document the Zarr/Dask tutorial (#833) by @monocongo in #879
  • feat(fire): add CF metadata registry entries for fire indices by @monocongo in #881
  • feat(fire): add xarray adapter for KBDI (#801) by @monocongo in #882
  • test(fire): fix S5778 exception-test findings in CFFWIS moisture tests by @monocongo in #889
  • refactor(metadata): extract the shared Van Wagner & Pickett citation by @monocongo in #888
  • refactor(fire): extract duplicated initial_state.kbdi argument name by @monocongo in #890
  • chore(deps-dev): bump the version-updates group with 3 updates by @dependabot[bot] in #892
  • feat(fire): add xarray adapter for the Hot-Dry-Windy Index by @monocongo in #884
  • chore(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 by @dependabot[bot] in #891
  • feat(fire): add the CFFWIS moisture codes (FFMC, DMC, DC) (#803) by @monocongo in #883
  • perf: add cProfile harness and evidence for gridded SPI (#921) by @monocongo in #934
  • perf(tests): compute Palmer sweeps once per validation session by @monocongo in #935
  • feat(fire): add the CFFWIS behavior indices and orchestrator (#804) by @monocongo in #895
  • refactor(compute): add one scaled-array preparation seam for the fitting-based indices by @monocongo in #907
  • docs(benchmarks): inventory per-cell index invocation sites (#922) by @monocongo in #936
  • feat(cli): add isolated --index kbdi branch by @monocongo in #894
  • ci(tests): isolate validation and meta checks from the version matrix by @monocongo in #938
  • test(fire): validate CFFWIS against the NRCan reference record (#805) by @monocongo in #943
  • test(tests): table-drive the static-data suites (#912) by @monocongo in #945
  • test(tests): retire the pattern-compliance source-grep suite by @monocongo in #939
  • perf(core): fit gridded SPI/SPEI once per spatial block (#923) by @monocongo in #944
  • test(xarray): table-drive attr serialization and history entry tests (#914) by @monocongo in #946
  • feat(fire): Drought Code overwintering and seasonal carry (#806) by @monocongo in #947
  • perf(benchmarks): add gridded SPI/SPEI parallel scaling benchmark (#928) by @monocongo in #948
  • test(tests): single-owner the CF registry contract in test_cf_metadata.py by @monocongo in #949
  • test(tests): consolidate logging and observability tests (#915) by @monocongo in #950
  • ci(tests): single-owner the Zarr/Dask notebook in pytest (#917) by @monocongo in #954
  • docs(agent): require one worktree per session by @monocongo in #955
  • test(tests): enforce the assert_type() checks in CI (#916) by @monocongo in #952
  • chore(cli): deprecate the legacy spi console script (#919) by @monocongo in #958
  • ci(release): install the built wheel on boundary Pythons by @monocongo in #959
  • perf(eto): compute gridded PET once per spatial block (#941) by @monocongo in #951
  • feat(fire): add the CFFWIS xarray adapter (#807) by @monocongo in #953
  • test(tests): add a real CLI end-to-end QA suite (#918) by @monocongo in #956
  • docs(xarray): document Dask chunk shapes for gridded indices (#924) by @monocongo in #961
  • docs(spi): record the fitting-parameter cache as retired (#957) by @monocongo in #962
  • refactor(compute): add one distribution fit/standardize seam for SPI and SPEI by @monocongo in #963
  • test(tests): retire mocked Palmers CLI orchestration tests (#920) by @monocongo in #964
  • perf(cli): apply a 100 MB default Dask array chunk size (#925) by @monocongo in #965
  • refactor(palmer): share one duration-factor contract and one CAFEC/Z-index step (#899) by @monocongo in #966
  • docs(xarray): document input chunk alignment and rechunk cost (#926) by @monocongo in #968
  • feat(fire): add the Haines Index (#810) by @monocongo in #967
  • test(palmer): harden duration-factor and CAFEC bit-identity pins by @monocongo in #969
  • docs(xarray): standardize the multi-core scheduler guidance on processes (#927) by @monocongo in #970
  • refactor(palmer): replace the untyped data dictionary with a typed struct (#899) by @monocongo in #971
  • test(fire): recursive-index benchmarks and published sizing guidance by @monocongo in #972
  • docs(fire): correct benchmark sizing reproduction details by @monocongo in #974
  • fix(cli): convert Palmer inputs to the inches palmer.pdsi() takes (#960) by @monocongo in #973
  • docs(fire): record the fire subsystem scope boundary and sibling-repo criteria by @monocongo in #976
  • refactor(palmer): split the shared data struct into prepared-input and recursion stages by @monocongo in #978
  • docs(notebook): add ERA5 CONUS fire-weather demonstration by @monocongo in #981
  • fix(deps): bump mistune to 3.3.4 to patch recursion DoS by @monocongo in #983
  • perf(core): fit gridded Pearson Type III parameters once per spatial block (#940) by @monocongo in #982
  • perf(core): rank gridded EDDI and percentage of normal once per spatial block (#942) by @monocongo in #977
  • refactor(fire): apply the ADR-0007 day policy through one shared helper by @monocongo in #984
  • docs(readme): add installation instructions by @monocongo in #998
  • ci(docs): gate the published docs build on warnings and passing doctests by @monocongo in #997
  • docs: delete hand-maintained duplicates and stale facts by @monocongo in #999
  • perf(benchmarks): publish the reference-grid before/after table (#929) by @monocongo in #1000
  • docs(benchmarks): reconcile the #929 before/after table with its artifacts by @monocongo in #1001
  • fix(cli): require --scales for --index all; dedupe KBDI arg checks by @monocongo in #1002
  • docs: triage the docs corpus by audience and exclude internal notes (#989) by @monocongo in #1003
  • docs: enable MyST and publish the xarray compatibility matrix (#990) by @monocongo in #1005
  • docs: retarget v2.5 references to 3.0.0 by @monocongo in #1018
  • chore(cli): remove the legacy spi console script (#957) by @monocongo in #1020
  • docs: correct CITATION.cff for the 3.0.0 release by @monocongo in #1019
  • perf(palmer): vectorize the PDSI spell recursion for gridded input by @monocongo in #1017
  • refactor(validation): add a public validation facade for shared input checks by @monocongo in #1021
  • docs(performance): add gridded parallel SPI/SPEI example and guidance (#931) by @monocongo in #1022
  • docs: convert the leaf RST pages to MyST Markdown (#991) by @monocongo in #1023
  • docs: add the AI-assisted development methodology (#1008) by @monocongo in #1024
  • refactor(cli): dispatch indices through per-index registrations (#900) by @monocongo in #1004
  • docs(validation): classify nClimDiv evidence for the Palmer family by @monocongo in #1029
  • docs: document the 3.0.0 breaking changes with migration steps (#1009) by @monocongo in #1028
  • test(core): pin vectorized equivalence to the serial NumPy API (#930) by @monocongo in #1026
  • test(core): dedupe the numerical-equivalence SPI helper (#930) by @monocongo in #1042
  • refactor(api): single-source the typed public API overload signatures (#903) by @monocongo in #1025
  • docs: add resolve-pr-review skill by @monocongo in #1045
  • test(tests): convert function-form pytest.raises to context managers (#1031) by @monocongo in #1044
  • feat(validation): add SPEIbase v2.11 SPEI plausibility fixtures (#779) by @monocongo in #1035
  • test(tests): stop swallowing assertion failures in try/except (python:S5779) by @monocongo in #1033
  • docs: add the 2026-09-18 AI-assisted development report by @monocongo in #1040
  • docs(research): assess DRI/WRCC scPDSI external validation by @monocongo in #1043
  • test(release): guard the 3.0.0 fire namespace in release checks (#1010) by @monocongo in #1034
  • refactor(observability): share the failure-logging and argument-wrapping seams (#905) by @monocongo in #1047
  • docs(palmer): document the exact-zero sentinels in the Palmer recursion (#660) by @monocongo in #1046
  • docs: correct the xarray SPI example in project-overview (#1027) by @monocongo in #1048
  • refactor(exceptions): raise the periodicity and dimension errors the library defines (#904) by @monocongo in #1037
  • ci(tests): add the merge_group trigger and stop cancelling main runs by @monocongo in #1052
  • docs: convert the homepage to MyST Markdown and retire RST support by @monocongo in #1036
  • docs: note the review and conflict-resolution skills in the report by @monocongo in #1054
  • feat(cli): expose scpdsi from the Palmers dispatch (#716, #721, #722) by @monocongo in #1051
  • feat(palmer): register palmer.pdsi with the xarray adapter (#1016) by @monocongo in #1038
  • docs(index): align the homepage's CLI surface with 3.0.0 (#1011) by @monocongo in #1055
  • refactor(palmer): add public duration-factor and calibration-diagnostic seams (#906) by @monocongo in #1053
  • docs(navigation): restructure the site into four reader-need sections (#993) by @monocongo in #1062
  • fix(palmer): resolve the duration-factor override after input validation (#906) by @monocongo in #1057
  • docs: hold the xarray API at Beta through 3.0.0 by @monocongo in #1059
  • test(hdw): reproduce the Srock et al. (2018) Cedar Fire event timing by @monocongo in #1064
  • chore(release): prepare the 3.0.0 release by @monocongo in #1065
  • docs: post-merge review fixes for the homepage CLI surface (#1055) by @monocongo in #1058
  • fix(hdw): address multi-review findings on the Srock fixture by @monocongo in #1066
  • docs(release): correct the 3.0.0 release record by @monocongo in #1070
  • refactor(validation): own the dataset-layout classifier the CLI validates against by @monocongo in #1060
  • docs(explanation): publish the explanation and reference corpus (#994) by @monocongo in #1068
  • chore(deps): bump the security-updates group across 1 directory with 2 updates by @dependabot[bot] in #1069
  • test(docs): tighten the published-nav guard and stale publication notes (#994) by @monocongo in #1067
  • docs: document input data requirements and validation surfaces (#834) by @monocongo in #880
  • feat(fire): add a 30-year baseline and SPI/EDDI overlay to the demo by @monocongo in #1075
  • docs: correct facts contradicted by the code in the published explanation corpus by @monocongo in #1072
  • fix(cli): reject time-major climate division input in the shared-array transport by @monocongo in #1073
  • docs(release): record the DataShapeError contract for gridded input by @monocongo in #1074
  • docs(how-to): cover output writing, parameter choice, and cluster runs (#995) by @monocongo in #1076
  • docs(how-to): correct claims found in review (#995) by @monocongo in #1079
  • fix(cli): preserve h5netcdf input chunksizes by @monocongo in #1081
  • Fix return-type docstring and a duplicated comment in lmoments by @marekl11 in #1082
  • docs: refresh the 2026-09-18 AI-assisted development report by @monocongo in #1056
  • docs(release): record the fixes landed after the release-prep PR by @monocongo in #1077
  • test(cli): pin KBDI acceptance of time-major divisions input by @monocongo in #1083
  • refactor(calendar): share one daily 366-day plan across CLI and adapter by @monocongo in #1078
  • docs(adr): mark every decision record's standing and correct three stale ones (#1071) by @monocongo in #1086
  • fix(cli): honor --chunksizes input in every output writer by @monocongo in #1084
  • docs(tutorials): make the quickstart linear and index the example notebooks by @monocongo in #1085
  • fix(xarray): fail closed when a declared periodicity cannot resolve by @monocongo in #1088
  • docs(release): record the chunk-size and daily-input fixes by @monocongo in #1089
  • fix(indices): allow daily scales up to 2196 days by @monocongo in #1091
  • test(benchmark): use absolute xarray overhead budget by @monocongo in #1094
  • fix(xarray): skip temporal inference when arguments do not bind by @monocongo in #1093
  • docs: add the 2026-09-21 AI-assisted development report by @monocongo in #1095
  • fix(release): target repository when creating release by @monocongo in #1096
  • docs: add flood and wet-extreme applications page by @monocongo in #1123
  • docs(release): add the release rehearsal runbook by @monocongo in #1122
  • perf(benchmarks): real-grid SPI case and the v2.4.0-vs-main CHIRPS results (#1097) by @monocongo in #1119
  • docs(release): fold 3.0.0 gridded, validation, and test details into the changelog by @monocongo in #1125
  • feat(indices): add generic standardized_index() over the SPI fitting pipeline by @monocongo in #1124
  • docs(flood): add SRI and SSI recipes over standardized_index by @monocongo in #1129
  • docs: survey validation oracles for PE, EDI, I_F, and API by @monocongo in #1120
  • chore(deps-dev): bump the version-updates group with 2 updates by @dependabot[bot] in #1134
  • docs(flood): record the flood family API, naming, and scientific conventions by @monocongo in #1133
  • docs(flood): cite retrieved EDI and API sources by @monocongo in #1136
  • docs(release): define the rehearsal repository once by @monocongo in #1137
  • test(flood): add source-backed reference contracts by @monocongo in #1138
  • perf(benchmarks): time the legacy CLI against xarray/Dask on CONUS nClimGrid (#1121) by @monocongo in #1131
  • feat(flood): register CF metadata for planned flood indices by @monocongo in #1140
  • feat(flood): add effective precipitation NumPy kernel by @monocongo in #1141
  • ci(tests): speed up and de-duplicate the test workflow by @monocongo in #1139
  • feat(flood): add fixed-window Effective Drought Index by @monocongo in #1142
  • perf(benchmarks): distributed Dask scale-out mode (#1127) by @monocongo in #1130
  • feat(flood): add annual-maxima Flood Index NumPy API by @monocongo in #1143
  • docs(flood): record the flood scope boundary decision (#1100) by @monocongo in #1145
  • feat(flood): add daily antecedent precipitation index by @monocongo in #1144
  • feat(flood): add xarray adapters for PE, EDI, and Flood Index by @monocongo in #1148
  • feat(flood): add stateful xarray API adapter by @monocongo in #1149
  • feat(cli): add --index values for the flood indices by @monocongo in #1150
  • docs(flood): record validation evidence and shipped API status by @monocongo in #1152
  • docs(flood): add the gridded flood-event demonstration notebook by @monocongo in #1153
  • fix(compute): keep Pearson SPI finite on masked grids by @monocongo in #1155
  • feat(runs): add run theory event identification primitive by @monocongo in #1154
  • fix(flood): exclude PE warm-up year from default calibration by @monocongo in #1182
  • fix: drop the whole-grid calibration sample check for gridded xarray input by @monocongo in #1181
  • feat: add FAO-56 Penman-Monteith PET method by @monocongo in #1183
  • chore: add review validation profile by @monocongo in #1198
  • docs(agents): require conventional branch names and forbid AI attribution by @monocongo in #1201
  • refactor(api): unify calibration-year parameter naming by @monocongo in #1197
  • docs(adr): ADR-0015 zero-handling modes for standardized indices by @monocongo in #1200
  • feat(compute): add a distribution fit diagnostics API by @monocongo in #1202
  • feat(indices): add probability-scale (PIT) output for SPI and SPEI by @monocongo in #1203
  • feat(compute): add zero-handling modes to the gamma and Pearson transforms by @monocongo in #1204
  • feat(xarray): add a fit diagnostics Dataset surface by @monocongo in #1206
  • docs: add SPI fit-diagnostics notebook and how-to by @monocongo in #1208
  • feat(cli): wire SPI zero handling through the CLI and CF metadata by @monocongo in #1207
  • test(zero-handling): pin ADR-0015 modes' closed forms, ideal means, and docs by @monocongo in #1210
  • feat(spei): add log-logistic (generalized logistic) distribution by @monocongo in #1211
  • test(zero-handling): add R SEI/SCI cross-implementation fixtures by @monocongo in #1212
  • test(spei): input-matched SPEIbase v2.11 log-logistic comparison by @monocongo in #1227
  • test(spei): add R SPEI log-logistic cross-implementation fixtures by @monocongo in #1228
  • fix(xarray): route stateless PET and PCI entry points through shared align and provenance by @monocongo in #1229
  • fix(compute): give the Calibration Period one owner by @monocongo in #1232
  • fix(compute): make the Pearson fall back act on fit outcomes, not argument errors by @monocongo in #1233
  • fix(compute): validate Pearson parameters before the all-missing return by @monocongo in #1234
  • refactor(indices): route SPEI through the shared standardized-index pipeline by @monocongo in #1235
  • refactor(fire,flood): extract the shared daily-recurrence runtime (#1220) by @monocongo in #1236
  • refactor(xarray): declare each index contract at registration by @monocongo in #1241
  • refactor(fire): share one CFFWIS moisture-code definition and split _cffwis by @monocongo in #1242
  • fix(pet): preserve Thornthwaite temperature inputs by @monocongo in #1243
  • refactor(cli): one output module for index metadata and atomic writes (#1223) by @monocongo in #1244
  • refactor(palmer): give the standard PDSI spell recursion a Z-series interface by @monocongo in #1245
  • refactor(xarray): one adapter for the stateful daily recurrences (#1222) by @monocongo in #1247
  • refactor(cli): give the shared-array transport an interface (#1224) by @monocongo in #1249
  • refactor(cli): reject arguments no requested index consumes by @monocongo in #1246
  • fix(calibration)!: reject reversed windows everywhere and resolve PNP's window through the shared resolver by @monocongo in #1250
  • refactor(compute): give a fitted distribution one owner by @monocongo in #1248
  • fix(calibration)!: check the window before an all-missing input is returned, and document the 3.0.0 window changes by @monocongo in #1251
  • docs(flood): record interpolated-PE convention for chained xarray calls by @monocongo in #1252
  • fix(calibration): report the calibration period a fit actually used by @monocongo in #1253
  • chore(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 by @dependabot[bot] in #1255
  • chore(deps-dev): bump the version-updates group with 3 updates by @dependabot[bot] in #1256
  • chore(deps): bump urllib3 from 2.7.0 to 2.8.0 in the security-updates group across 1 directory by @dependabot[bot] in #1257
  • docs: disambiguate flood-family EDI from EDDI by @monocongo in #1259
  • docs(release): complete the 3.0.0 changelog and set the release date by @monocongo in #1254
  • feat: add quick NetCDF map plotting utility by @monocongo in #1261
  • feat: add named NetCDF map arguments and NCEI comparisons by @monocongo in #1262
  • fix(deps): bump fsspec to 2026.9.0 for CVE-2026-104851 by @monocongo in #1264
  • chore(deps): bump the security-updates group across 1 directory with 2 updates by @dependabot[bot] in #1263
  • feat(cli): add experimental --pack_output for int16/float32 NetCDF packing by @monocongo in #1260
  • chore(deps): bump multidict from 6.8.0 to 6.9.1 in the security-updates group across 1 directory by @dependabot[bot] in #1265
  • Create bandit.yml by @monocongo in #1267
  • fix(compute): avoid star-in-tuple subscripts flagged by mypy 2.4.0 by @monocongo in #1269
  • chore(deps-dev): bump the version-updates group with 4 updates by @dependabot[bot] in #1268
  • chore(deps): bump notebook from 7.5.8 to 7.6.3 in the security-updates group across 1 directory by @dependabot[bot] in #1286
  • chore: remove the in-repo resolve-pr-review skill by @monocongo in #1289
  • docs(imports): classify reported circular import chains by @monocongo in #1287
  • feat(rust): scaffold the Rust core and port the SPI gamma kernels (RUST-001, RUST-002) by @monocongo in #1285
  • test(benchmark): give the PET Hargreaves overhead gate runner headroom by @monocongo in #1290
  • ci(rust): build, lint, and test the Rust extension in CI (RUST-003) by @monocongo in #1291
  • feat(rust): port the EDDI ranking and inverse normal to climate-core (RUST-005) by @monocongo in #1293
  • feat(rust): port the Pearson Type III and log-logistic kernels to climate-core (RUST-004) by @monocongo in #1296
  • feat(rust): port the PNP and PCI kernels to climate-core (RUST-007) by @monocongo in #1294
  • feat(rust): port the fire-weather recurrences to climate-core (RUST-009) by @monocongo in #1297
  • docs(rust): add the Rust-core ADR and the kernel porting guide (RUST-012) by @monocongo in #1299
  • feat(rust): port the PET compute kernels to climate-core (RUST-006) by @monocongo in #1295
  • ci(release): publish abi3 binary wheels beside the pure-Python artifacts by @monocongo in #1301
  • docs(rust): correct the ADR 0017 and porting-guide claims by @monocongo in #1303
  • docs(rust): pin masked-input normalization in the dispatch contract by @monocongo in #1300
  • docs(dev): walk new contributors through installing the Rust toolchain by @monocongo in #1304
  • fix(native): define masked and degenerate dispatch contracts by @monocongo in #1317
  • feat(rust): port the flood-family kernels to climate-core (RUST-016) by @mclainv in #1302
  • fix(scripts): tolerate a concurrent winner when caching E2E source downloads on Windows by @mclainv in #1318
  • feat(rust): port the Palmer-family kernels to climate-core (RUST-008) by @monocongo in #1316
  • fix(pearson): use poch for the large-alpha gamma ratio in the L-moment fit by @monocongo in #1319
  • feat(rust): consolidate cross-backend parity coverage into one registry by @monocongo in #1320
  • test(parity): compare xarray coordinates in native parity assertions by @monocongo in #1321
  • docs(readme): cover wildfire, flood, Rust backend, validation, and vectorization by @monocongo in #1323
  • docs: verify index links and simplify Python support range by @monocongo in #1325
  • perf(benchmarks): measure every ported Rust kernel against the Python reference (RUST-011) by @monocongo in #1322
  • docs(release): publish the 3.0.0 notes for the optional Rust backend (RUST-014) by @monocongo in #1326
  • chore: fix stale comments and failure messages in tests by @marekl11 in #1330
  • perf: dispatch boundary and Penman-Monteith/Pearson kernels (#1281) by @monocongo in #1328
  • feat: add soil water-capacity ingest, scPDSI benchmark, and nClimGrid AWC fixture by @monocongo in #1327
  • docs(release): reconcile 3.0.0 records and final-cut guidance by @monocongo in #1329
  • docs(release): date the 3.0.0 release records by @monocongo in #1331
  • ci(release): type-check the 3.11+ release stacks only by @monocongo in #1332

New Contributors

Full Changelog: v2.4.0...v3.0.0

Don't miss a new climate-indices release

NewReleases is sending notifications on new releases.