Skip to content

feat: Update to main - #769

Merged
baumbude merged 390 commits into
paper_JOSSfrom
main
Aug 20, 2026
Merged

feat: Update to main#769
baumbude merged 390 commits into
paper_JOSSfrom
main

Conversation

@baumbude

Copy link
Copy Markdown
Collaborator

Description

Brief description of the changes in this PR.

Type of Change

  • Bug fix
  • New feature
  • Documentation update
  • Code refactoring

Related Issues

Closes #(issue number)

Testing

  • I have tested my changes
  • Existing tests still pass

Checklist

  • My code follows the project style
  • I have updated documentation if needed
  • I have added tests for new functionality (if applicable)

FBumann and others added 30 commits January 6, 2026 14:32
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
  | Case             | Layout                                                                  |
  |------------------|-------------------------------------------------------------------------|
  | Simple (no dims) | Single heatmap                                                          |
  | Periods only     | Vertical stack (1 column)                                               |
  | Scenarios only   | Horizontal layout                                                       |
  | Both             | Grid (periods as rows, scenarios as columns via facet_cols=n_scenarios) |

  | File                                            | Issue                                                     | Fix                                                 |
  |-------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------|
  | docs/notebooks/03-investment-optimization.ipynb | Division by zero when solar_size = 0                      | Added guard: if solar_size > 0 else float('nan')    |
  | flixopt/clustering/base.py:181-235              | ClusterStructure.plot() crashes for multi-period/scenario | Added NotImplementedError with helpful message      |
  | flixopt/components.py:1256-1265                 | Obsolete linopy LP writer bug workaround                  | Removed + 0.0 workaround (fixed in linopy >= 0.5.1) |
  | flixopt/dataset_plot_accessor.py:742-780        | to_duration_curve crashes on variables without time dim   | Added guard to skip non-time variables              |
  | flixopt/features.py:234-236                     | Critical: Startup count ignores cluster weighting         | Now multiplies by cluster_weight before summing     |
  | flixopt/structure.py:268-281                    | scenario_weights docstring misleading                     | Updated docstring to accurately describe behavior   |

  Nitpick Fixes

  | File                                               | Fix                                                                                       |
  |----------------------------------------------------|-------------------------------------------------------------------------------------------|
  | docs/notebooks/data/generate_example_systems.py    | Fixed type hint pd.DataFrame → pd.Series for _elec_prices, added timezone guard           |
  | flixopt/statistics_accessor.py:2103-2132           | Added detailed comment explaining secondary y-axis offset strategy                        |
  | tests/test_cluster_reduce_expand.py                | Moved import xarray as xr to top of file                                                  |
  | docs/notebooks/data/generate_realistic_profiles.py | Clarified warnings.resetwarnings() comment                                                |
  | flixopt/transform_accessor.py                      | Removed unused cluster_coords and time_coords params from _combine_slices_to_dataarray_2d |
  | flixopt/comparison.py                              | Added error handling to _concat_property for FlowSystems lacking optimization data        |
Adds support for controlling status behavior at cluster boundaries:
- 'relaxed' (default): No constraint at cluster boundaries, prevents phantom startups
- 'cyclic': Each cluster's final status equals its initial status

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…key changes:

  Changes Made

  | Change                                         | Lines Saved | Description                                     |
  |------------------------------------------------|-------------|-------------------------------------------------|
  | Added _select_dims() helper                    | +8 lines    | Reusable helper for period/scenario selection   |
  | Simplified get_cluster_order_for_slice()       | -6 lines    | Reduced from 7 lines to 1 line                  |
  | Simplified get_cluster_occurrences_for_slice() | -5 lines    | Reduced from 7 lines to 2 lines                 |
  | Simplified get_timestep_mapping_for_slice()    | -6 lines    | Reduced from 7 lines to 1 line                  |
  | Refactored expand_data()                       | -20 lines   | Extracted _expand_slice helper, unified logic   |
  | Simplified heatmap()                           | -40 lines   | Replaced manual loops with vectorized np.repeat |
…ues for their previous_* parameters, causing TypeError: unsupported operand type(s) for -/+: '...' and 'NoneType'.

  Fixes applied:

  1. BoundingPatterns.state_transition_bounds (line 574-630):
    - Updated type hint: previous_state: float | xr.DataArray | None = 0
    - Made the initial constraint conditional: skip when previous_state is None (relaxed)
  2. ModelingPrimitives.consecutive_duration_tracking (line 244-357):
    - Updated type hint: previous_duration: xr.DataArray | None = 0
    - Fixed big-M calculation to use 0 when previous_duration is None
    - Made both initial and initial_lb constraints conditional

  These None values come from features.py:218 and features.py:251 when there's no previous status/duration data, indicating a "relaxed" initial state with no constraint at t=0.
  1. Fixed consecutive_duration_tracking type hint: previous_duration: xr.DataArray | float | int | None = None
  2. Updated docstring to clarify which constraint keys are present based on parameters
  3. Updated state_transition_bounds docstring to note initial_constraint is None when previous_state is None

  clustering/base.py:
  1. Added guard in get_cluster_occurrences_for_slice - raises ValueError if period/scenario dims exist but weren't selected
  2. Added length assertion in heatmap expansion - validates len(original_time) == expanded_values.shape[0]
  3. Added dimension validation in expand_data._expand_slice - validates data slice only has expected dimensions before fancy indexing
  1. flixopt/transform_accessor.py:1352 - Fixed boolean check on xarray DataArray in _apply_soc_decay:
  # Before: if not (loss_value > 0).any():  # Returns DataArray, not bool
  # After:  if not np.any(loss_value.values > 0):  # Returns Python bool
  2. flixopt/flow_system.py:2100 - Fixed boolean check in scenario_weights setter:
  # Before: if np.isclose(norm, 0.0).any():  # Returns DataArray
  # After:  if np.isclose(norm, 0.0).any().item():  # Returns Python bool
  3. flixopt/clustering/base.py:134, 342 - Fixed mutation of self.n_clusters and self.n_representatives during serialization:
  # Before: self.n_clusters = self.n_clusters.rename(n_clusters_name)  # Mutates self
  # After:  n_clusters_da = self.n_clusters.rename(n_clusters_name)     # Local variable
  4. flixopt/clustering/intercluster_helpers.py:87 - Fixed documentation inconsistency:
  # Docstring now correctly says 1e6 to match DEFAULT_UNBOUNDED_CAPACITY constant
…d PV capacity scaling (Major issue):

  # Before: system_efficiency = 0.15 * 0.85  # Only ~12.75% output
  # After: performance_ratio = 0.85  # Standard kWp scaling with losses
  1. Now correctly treats capacity_kw as installed DC capacity (kWp).
  2. flixopt/optimization.py:110-120 - Added missing deprecation warning for normalize_weights:
  if normalize_weights is not None:
      warnings.warn(
          f'\n\nnormalize_weights parameter is deprecated...',
          DeprecationWarning, stacklevel=3
      )
  3. docs/notebooks/08a-aggregation.ipynb (cell 7) - Fixed comment about resolution:
  # Before: "Resample from 15-min to 4h resolution"
  # After: "Resample from 1h to 4h resolution"
  4. docs/design/cluster_architecture.md - File doesn't exist (skipped)
github-actions Bot and others added 27 commits July 21, 2026 09:50
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ffects (#719) (#720)

* fix(stats): apply threshold along breakdown dimension in plot.effects

`stats.plot.effects(by='component'|'contributor')` lays entities out along a
coordinate of a single variable (e.g. `costs`) rather than as separate data
variables. The threshold filter only dropped whole data variables, so
non-invested components with a ~0 contribution were still shown (#719).

Generalize the filter to also drop small entries along the breakdown
dimension, split it into named helpers, and rename it `_drop_small` since it
no longer filters variables only. Adds a parametrized regression test.

Fixes #719

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* style: apply ruff format

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(stats): drop empty breakdown instead of falling back to full dataset

When every entry along the breakdown dimension is below threshold,
_drop_small_along_dim returned the unfiltered dataset, silently ignoring the
user's threshold (an all-below-threshold effects breakdown showed everything).
Return the empty selection instead. The full effects render handles the empty
dataset without crashing (verified across all aspects / by / effect combos).

Scope: only the new dim-path helper is changed. The pre-existing
_drop_small_data_vars fallback shared by 8 other plot methods is left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bumps [dash](https://github.com/plotly/dash) from 3.3.0 to 4.4.0.
- [Release notes](https://github.com/plotly/dash/releases)
- [Changelog](https://github.com/plotly/dash/blob/dev/CHANGELOG.md)
- [Commits](plotly/dash@v3.3.0...v4.4.0)

---
updated-dependencies:
- dependency-name: dash
  dependency-version: 4.4.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: flixopt-release-bot[bot] <246706635+flixopt-release-bot[bot]@users.noreply.github.com>
Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2 to 3.
- [Release notes](https://github.com/dependabot/fetch-metadata/releases)
- [Commits](dependabot/fetch-metadata@v2...v3)

---
updated-dependencies:
- dependency-name: dependabot/fetch-metadata
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Speed up ci by only ranning fast tests on drafts

* Remove deprecated from drafts

* Improve test selection

* Make docs match this pattern

* Add include paths to workflows:
  - flixopt/** (source code)
  - tests/** (test files)
  - pyproject.toml (config/dependencies)

* Added .github/workflows/** to both tests and docs workflows. Now CI config changes will trigger both.

* Retrigger CI

* Ensure workflows are triggered on ready_for_review
…739)

tsam-xarray 0.6.4 makes output dimension names configurable through
DimNames. Pass DimNames(period='original_cluster') to aggregate() so the
original-period axis no longer collides with a real 'period' slice dim.

This removes the entire rename/unrename adapter that existed only to work
around the fixed 'period'/'cluster' output names:
- cluster()/apply_clustering() no longer rename period->_period etc. in
  and back out, and apply_clustering() applies the stored ClusteringResult
  directly instead of rebuilding one with renamed slice dims.
- _ReducedFlowSystemBuilder and Clustering lose _unrename_map/_unrename.

The only renames left are the honest tsam<->flixopt boundary translations
timestep->time / timestep->segment. Bumps the tsam_xarray pin to 0.6.4.

All public clustering outputs (cluster_assignments, cluster_occurrences,
original/reconstructed/residuals/accuracy, dim_names, disaggregate, the
reduced FlowSystem's (cluster, time) vars and cluster_weight) keep identical
dim names, shapes and values in single- and multi-period systems.

BREAKING CHANGE: the serialized clustering format changed - slice dims are
now stored as 'period' (was '_period') plus a new 'dim_names' key. Clustering
artifacts saved to JSON/netCDF by an older flixopt no longer load for
apply_clustering()/expand() in this version; re-run transform.cluster() to
regenerate them. Fresh clustering and same-version round-trips are unaffected.
Also raises the minimum tsam_xarray to 0.6.4.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…fs (#742)

Files written before flixopt 7.0 stored clustering.original_data and
clustering._metrics as ':::original_data|...' / ':::metrics|...' references
in the clustering attrs JSON. The target arrays are no longer serialized
(they only fed the removed plot.compare()), and the current Clustering
constructor rejects the _original_data_refs / _metrics_refs keys outright.

As a result, FlowSystem.from_netcdf() on any such file raised
"Referenced DataArray 'original_data|...' not found in dataset".

Drop the two legacy keys in _restore_clustering before resolving so old
files remain loadable. 7.2.x files themselves are unaffected (they write
no such references).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: dimension-aware effect-total consistency check

The post-solve validation in _create_effects_dataset compared
ds[effect].sum(...) against solution[label] via np.allclose on the raw
.values. When the two arrays carry the same dims in a different order --
e.g. a clustered system expanded back yields (scenario, period) while the
computed total is (period, scenario) -- numpy cannot broadcast (3,2) against
(2,3) and raises ValueError, turning a soft warning into a hard crash.

Align the two label-aware before comparing: warn on a genuine dimension-set
mismatch, otherwise transpose solution[label] to the computed dim order.
Applies to both copies of the check (StatisticsAccessor and Results).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test: clustered FlowSystem save/load/expand round-trip matrix

Curated from property-based fuzzing that ran save -> load -> expand over random
combinations of periods (0-3), scenarios (0-3), storage (all initial-charge modes),
converters and optimize on/off, same-version and cross-version (7.0.0/7.1.0 -> 7.2.3).
No round-trip failures were found; these 24 cases pin the representative dimension
layouts so the path stays intact, and assert the effect-total validation does not
crash on any layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The lint job ran `uvx ruff` unpinned, so it silently tracked the latest
release while the repo pins ruff==0.15.21 in [dev]. Ruff 0.16.0 began
formatting Python code blocks inside Markdown, which flags 26 docs files
and fails lint on every open PR regardless of its contents.

Pinning to the same version pre-commit uses makes CI reproducible and
puts ruff upgrades back under dependabot's control, where the docs
reformat can land as a reviewed change alongside the bump.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: support linopy 0.9.0 by routing constraint mutation through update()

linopy 0.8 added Constraint.update() and 0.9 deprecates assignment to
Constraint.lhs. flixopt escalates DeprecationWarning from its own package to
an error, so every effect-bearing model failed to build on linopy 0.9.

Add modeling._set_constraint_lhs(), which dispatches to Constraint.update()
where it exists and to the .lhs setter on linopy < 0.8, and route the six
in-place LHS mutations (share accumulators, bus imbalance, transmission
absolute losses) through it. Term order is unchanged on every version.

Widen the linopy pin to >=0.5.1,<0.10.

* test: assert determinate quantities in two degenerate clustering tests

Both tests pinned one arbitrary vertex of a degenerate optimal face, so they
flipped when linopy 0.9 changed internal ordering and HiGHS landed on the
mirrored optimum. The objective and all flow rates were unchanged.

test_storage_cyclic_charge_discharge_pattern: the two clusters carry identical
data, so which one gets which absolute SOC offset is arbitrary (any level in
[50, 100] is optimal). Assert the SOC deltas and the cyclic wrap instead.

test_expanded_storage: gas price and boiler efficiency are flat, so storage
earns nothing and every cycling depth -- including none -- is optimal. The
old `nansum(charge_state) > 0` passed on linopy 0.7 only on ~1e-5 noise.
* fix: load clustered NetCDF files written before flixopt 7.0

Files written before 7.0 serialize the clustering under a `results` key
holding {'dim_names': [...], 'results': {key: tsam_blob}}, where each key
is the slice coordinates joined into a string ('2030|low', or
'__single__' when the clustering is undivided). Clustering now expects a
`clustering_result` matching tsam_xarray's ClusteringResult.from_dict,
which takes a list of {'key': [...], 'clustering': tsam_blob} entries, so
loading any pre-7.0 clustered file fails with:

    Failed to create instance of Clustering:
    Clustering.__init__() got unexpected keyword arguments: {'results'}

The per-slice tsam blobs are byte-identical between the two layouts, so
only the surrounding structure is rewritten. Two details matter:

- Legacy keys are strings, but the current schema indexes clusterings by
  the coordinate values, so '2030' has to become the integer 2030 or
  every lookup misses. The value is recovered by matching against the
  restored coordinate rather than by guessing a type, so scenario labels
  that merely look numeric survive unchanged.
- Slice dims are stored under their pre-rename spelling, so 'period'
  becomes '_period' to match what tsam_xarray is handed today.

Verified against files generated by flixopt 6.1.0 and 6.2.1 — plain,
solved, multi-period, and period+scenario. Cluster assignments compare
equal per slice, and an expanded solved file reproduces each original
cluster from its typical cluster.

The multi-dim fixture moves to module scope so the new tests can reuse
its deliberately-different per-slice assignments, which is what catches
keys landing on the wrong slice.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor: fold legacy clustering key restoration into one pass

The key restoration was a second method scanning the coordinate index once
per key part. Building a stringified lookup per slice dim up front collapses
it into the migration itself, at the same cost.

Behaviour is unchanged: 291 clustering tests pass, and files generated by
flixopt 6.1.0 and 6.2.1 (plain, solved, multi-period, period+scenario) still
load with assignments equal per slice.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Updates the requirements on [xarray](https://github.com/pydata/xarray) to permit the latest version.
- [Release notes](https://github.com/pydata/xarray/releases)
- [Commits](pydata/xarray@v2024.02.0...v2026.07.0)

---
updated-dependencies:
- dependency-name: xarray
  dependency-version: 2026.7.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* ci: always report lint and test on pull requests

The ruleset on main requires lint and test (3.11-3.14). #562 added a paths
filter to the pull_request trigger, and a workflow that never triggers never
reports its checks, so any PR touching only files outside flixopt/, tests/,
pyproject.toml or .github/workflows/ is permanently blocked. Release PRs
change exactly CHANGELOG.md, .release-please-manifest.json and CITATION.cff,
so #740 cannot merge; #737 predates the filter and ran normally.

The filter moves into a `changes` job that reads the PR's file list, and the
install and pytest steps become conditional on it. The jobs still run and
still report, but a docs-only PR costs a runner start instead of a full
matrix. Detection failures fall back to running the tests, so a bad lookup
wastes CI rather than skipping a real test run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* ci: fall back to running tests when PR file lookup fails

Steps run under `bash -e`, so `paths=$(gh pr view ...)` aborted the step on a
failed lookup rather than falling through to the empty-listing fallback. The
changes job would fail, test would be skipped via needs, and the required
checks would go unreported - the same block this workflow exists to prevent.
Guarding the assignment lets the intended fallback run.

Also declares least-privilege permissions for the workflow, matching
release.yaml and dependabot-auto-merge.yaml; pull-requests: read is what the
file-list lookup needs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: flixopt-release-bot[bot] <246706635+flixopt-release-bot[bot]@users.noreply.github.com>
8.0.0 shipped with a breaking-change notice describing a clustering format
change that is not in the release. #739 introduced it and #746 reverted it
before release, but release-please does not pair a revert with its original,
so the BREAKING CHANGE footer both drove the major bump and rendered into
the notes.

Replaces the notice with a note explaining why the major carries no breaking
change, and moves #739 from Code Refactoring to Reverts.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
tsam_xarray 0.6.5 renamed AggregationResult.cluster_weights to
cluster_counts, keeping the old name as a deprecated property. The `full`
extra allows >= 0.6.1, so a fresh install resolves to 0.6.5 and every
cluster() call emits a FutureWarning -- and fails outright under -W error,
which is how the test suite runs: 254 of 286 clustering tests failed on
0.6.5 before this change.

cluster_counts does not exist before 0.6.5, so the floor moves with the
rename rather than merely allowing the new version.

This shipped in neither 8.0.0 nor its predecessor: #755 carried the same
change but was retargeted onto an intermediate branch that merged into main
first, so it landed on that branch instead of main.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: flixopt-release-bot[bot] <246706635+flixopt-release-bot[bot]@users.noreply.github.com>
Bumps [tsam-xarray](https://github.com/FBumann/tsam_xarray) from 0.6.5 to 0.6.6.
- [Release notes](https://github.com/FBumann/tsam_xarray/releases)
- [Changelog](https://github.com/FBumann/tsam_xarray/blob/main/CHANGELOG.md)
- [Commits](FBumann/tsam_xarray@v0.6.5...v0.6.6)

---
updated-dependencies:
- dependency-name: tsam-xarray
  dependency-version: 0.6.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](pre-commit/pre-commit@v4.6.0...v4.6.1)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-version: 4.6.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.21 to 0.16.0.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.15.21...0.16.0)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [nbformat](https://github.com/jupyter/nbformat) from 5.10.4 to 5.11.0.
- [Release notes](https://github.com/jupyter/nbformat/releases)
- [Changelog](https://github.com/jupyter/nbformat/blob/main/CHANGELOG.md)
- [Commits](jupyter/nbformat@v5.10.4...v5.11.0)

---
updated-dependencies:
- dependency-name: nbformat
  dependency-version: 5.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](pre-commit/pre-commit@v4.6.1...v4.6.2)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-version: 4.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6a2e0e87-0313-4d5f-8dc6-837ad137e80a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@baumbude baumbude changed the title Update to main feat: Update to main Aug 20, 2026
@baumbude
baumbude merged commit a7401dd into paper_JOSS Aug 20, 2026
13 of 14 checks passed
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.

2 participants