climate_indices 3.0.0
Released 2026-10-12. See the tagged release notes and changelog.
Highlights
- Fire-weather indices — new
climate_indices.firenamespace: 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.floodnamespace: 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_handlingfor SPI;output_scale(normal scores, probabilities, bounded values) across SPI/SPEI/standardized_index(); newfit_diagnostics(). - More public tools — FAO-56 Penman-Monteith PET at the package root;
climate_indices.runs; publicclimate_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:
- 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.
- Ambiguous three-or-more-dimensional NumPy grids must declare
spatial_time_major=Trueor reorder their cell axes. Undeclared gridded EDDI and percentage-of-normal inputs now raiseDataShapeError(a changed exception type for percentage of normal). pci()corrects February boundaries; recompute values and any thresholds calibrated against earlier output.- Invalid periodicity raises
PeriodicityError, notValueError. - Gamma fitting now measures the probability of zero on the Calibration Period's non-missing observations and honors supplied
prob_zerovalues; affected SPI, SPEI, orstandardized_index()results can change. - 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
- @marekl11 made their first contribution in #768
- @Mihailchik made their first contribution in #817
- @mclainv made their first contribution in #845
Full Changelog: v2.4.0...v3.0.0