Skip to content

feat(ilamb): emit kind, clean units and scalar reference identity#777

Merged
lewisjared merged 6 commits into
mainfrom
feat/layer-a-ilamb
Jul 1, 2026
Merged

feat(ilamb): emit kind, clean units and scalar reference identity#777
lewisjared merged 6 commits into
mainfrom
feat/layer-a-ilamb

Conversation

@lewisjared

@lewisjared lewisjared commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Description

Brings ILAMB series and scalar metric values onto the shared metric-value contract (kind, clean presentation units, and reference identity on scalars) introduced in #772.

Previously ILAMB flagged references with a source_id == "Reference" sentinel, emitted raw pint-repr units (e.g. "gram / day / meter ** 2"), and omitted reference_source_id from scalars, so comparison stats could not be grouped by which reference they scored against.

This PR:

  • Emits an explicit kind on every series: reference traces (Reference.nc) get kind="reference" and drop the "Reference" source_id sentinel, while model traces get kind="model" and keep both source_id and reference_source_id so the two group together.
  • Normalises presentation units to a clean CF/UDUNITS form so a model series and its reference agree (e.g. "kg / meter ** 2 / second" and "kg m-2 s-1" both become "kg m-2 s-1"), and populates the typed presentation fields (value_units, value_long_name, index_units, calendar). This also fixes a latent bug where calendar was read after the index was converted to ISO strings and so was never captured.
  • Adds reference_source_id and kind to the scalar json_structure (placed outermost so the ragged statistic level stays terminal).
  • Re-mints the committed ILAMB regression baselines. The native output blobs are unchanged, so only the committed bundles and test_case_version bumps change; make regression-gate replays all 20 manifest-backed cases with zero drift.

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

  • New Features

    • Added clearer comparison labelling by distinguishing model versus reference series using kind and reference_source_id.
    • Improved output metadata: consistently cleaned, CF-compatible units and populated presentation fields (including calendar where available).
  • Bug Fixes

    • Refined time-series and comparison grouping so reference data no longer relies on the prior sentinel approach.
  • Tests

    • Updated regression fixtures to reflect the new schema/formatting and regenerated expected JSON outputs.

Reference series now carry kind="reference" and drop the "Reference"
source_id sentinel; model series keep both source_id and reference_source_id.
Presentation units are normalised to a clean CF/UDUNITS form so a model
series and its reference agree, and the typed presentation fields
(value_units, value_long_name, index_units, calendar) are populated.
Scalars carry reference_source_id and kind in their json_structure.
@coderabbitai

coderabbitai Bot commented Jul 1, 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: 2791b508-18a1-482a-bbe1-21c0ca096d3f

📥 Commits

Reviewing files that changed from the base of the PR and between e890155 and b10371f.

📒 Files selected for processing (38)
  • packages/climate-ref-ilamb/src/climate_ref_ilamb/standard.py
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/unit/test_standard_helpers.py
✅ Files skipped from review due to trivial changes (25)
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/regression/output.json
🚧 Files skipped from review as they are similar to previous changes (7)
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/manifest.json
  • packages/climate-ref-ilamb/src/climate_ref_ilamb/standard.py
  • packages/climate-ref-ilamb/tests/unit/test_standard_helpers.py

📝 Walkthrough

Walkthrough

This PR updates ILAMB series metadata handling to normalise units, add kind and reference_source_id dimensions, and build series entries from trace files. It also refreshes regression fixtures and changelog content to match the new output structure and metadata.

Changes

Core standard.py changes and unit tests

Layer / File(s) Summary
Series metadata helpers
packages/climate-ref-ilamb/src/climate_ref_ilamb/standard.py, packages/climate-ref-ilamb/tests/unit/test_standard_helpers.py, changelog/777.feature.md
Adds _clean_units and _build_series, updates CMEC bundle dimensions for kind and reference_source_id, routes execution result assembly through the new series builder, updates reference plot caption metadata, and adds tests for unit cleaning, series construction, and CMEC bundle structure.

Regression test-data fixture regeneration

Layer / File(s) Summary
Regression fixtures
packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/*, packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/*, packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/*, packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/*, packages/climate-ref-ilamb/tests/test-data/gpp-wecann/*, packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/*, packages/climate-ref-ilamb/tests/test-data/mrro-lora/*, packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/*, packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/*, packages/climate-ref-ilamb/tests/test-data/snc-esacci/*, packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/*, packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/*
Updates manifest hashes, diagnostic schemas and result nesting, output key ordering, empty series arrays, and series metadata/value formatting across the refreshed regression fixtures.

Possibly related PRs

  • Climate-REF/climate-ref#755: Both PRs modify _build_cmec_bundle in standard.py; that earlier change also touches the same CMEC output shaping path.
  • Climate-REF/climate-ref#772: Both PRs adjust ILAMB series and reference handling around kind, reference_source_id, and presentation metadata in the same data flow.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 46.15% 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 succinctly matches the main change: emitting kind, cleaning units, and adding scalar reference identity.
Description check ✅ Passed The description includes the required sections and covers the main changes; only the docs checkbox is left unchecked.
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/layer-a-ilamb

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

@codecov

codecov Bot commented Jul 1, 2026

Copy link
Copy Markdown

Codecov Report

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

Files with missing lines Patch % Lines
...limate-ref-ilamb/src/climate_ref_ilamb/standard.py 96.29% 1 Missing and 1 partial ⚠️
Flag Coverage Δ
core 92.35% <ø> (ø)
providers 86.56% <96.29%> (+0.25%) ⬆️

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

Files with missing lines Coverage Δ
...limate-ref-ilamb/src/climate_ref_ilamb/standard.py 84.50% <96.29%> (+2.40%) ⬆️
🚀 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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/regression/series.json (1)

3-18: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add kind: "model" to these CESM2 trace fixtures.

These two model series still serialise source_id and reference_source_id but never emit the new top-level kind, while the reference traces below already do. That leaves the re-minted baseline out of sync with the shared metric-value contract and it won’t catch a missing-model-kind regression. Please regenerate after the model traces also serialise kind: "model".

Also applies to: 238-240, 460-466, 695-697

packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/series.json (1)

3-18: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add kind: "model" to these CanESM5 trace fixtures.

Both model series here still omit the new top-level kind even though the reference traces further down now emit kind: "reference". As committed, this baseline won’t enforce the model-trace side of the shared metric-value contract. Please regenerate after the model traces also serialise kind: "model".

Also applies to: 202-204, 388-403, 587-589

packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/series.json (1)

3-18: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add the explicit model-series discriminator to these fixtures.

These model trace entries still only carry source_id and reference_source_id; they never emit kind: "model", even though the same file now emits kind: "reference" for reference traces. That leaves the regenerated bundle out of sync with the new series contract, and the matching cmip7 fixture has the same gap.

Also applies to: 820-826

🧹 Nitpick comments (1)
packages/climate-ref-ilamb/tests/unit/test_standard_helpers.py (1)

129-134: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Please lock index_units into this happy-path test as well.

This helper now owns the typed presentation fields, but the series test never asserts index_units. Adding that check would pin the new contract down and stop this path regressing quietly.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0aaf57e5-53f9-4237-b42c-049dac12e324

📥 Commits

Reviewing files that changed from the base of the PR and between ff0e8da and 6dcdc55.

📒 Files selected for processing (83)
  • changelog/777.feature.md
  • packages/climate-ref-ilamb/src/climate_ref_ilamb/standard.py
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/burntfractionall-gfed/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/csoil-hwsd2/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/emp-gleamgpcp2.3/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-fluxnet2015/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/gpp-wecann/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/lai-avh15c1/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrro-lora/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/mrsos-wangmao/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/nbp-hoffman/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/snc-esacci/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/so-woa2023-surface/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip6/regression/series.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/manifest.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/regression/diagnostic.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/regression/output.json
  • packages/climate-ref-ilamb/tests/test-data/thetao-woa2023-surface/cmip7/regression/series.json
  • packages/climate-ref-ilamb/tests/unit/test_standard_helpers.py

Comment thread packages/climate-ref-ilamb/src/climate_ref_ilamb/standard.py
…ce_id

Reference plots carried a source_id="Reference" sentinel; emit kind="reference"
and reference_source_id instead so the output bundle matches the series/scalar
contract. Also lock index_units into the series unit tests.
@lewisjared lewisjared merged commit 383bd3f into main Jul 1, 2026
24 checks passed
@lewisjared lewisjared deleted the feat/layer-a-ilamb branch July 1, 2026 11:27
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