committed 04:23AM - 17 Jun 26 UTC
* Fix CI failures: lint, coverage, typecheck, zizmor
- Lint: re-run `ruff forma…t` on 8 src/test/notebook files.
- Coverage + Tests workflows: install the `duckdb` extra so
`tests/test_constructors.py` can import it.
- Typecheck workflow: install the `test` group + `duckdb` extra so
`ty` can resolve `pytest` and `duckdb` imports.
- Docs workflow: pass the release tag via env var instead of inline
template expansion (zizmor template-injection finding).
- Add `.github/zizmor.yml` allowing ref-pinning for trusted publishers
(actions/*, astral-sh/*, codecov/*) and suppressing the artipacked
finding on `docs.yml` (mike needs persisted credentials to push to
gh-pages).
* Fix typecheck failures
- Typecheck workflow now installs `notebooks` group so altair/marimo
imports resolve in `notebooks/saxony_station_homogenization.py`.
- `_resolve_break` returns `int | None`; restructured the three step
blocks (general + 6a + 6b) to use `if is_inh and break_year is not
None` narrowing instead of a ternary, so `apply_correction` and
`compute_correction_factor` see a non-None `int`.
- Tightened the predicate registration decorator to preserve the
concrete subclass type (`type[_PredT]`), so subclass dataclass
`__init__` signatures stay visible to `ty`.
- Added `_pred_type: ClassVar[str] = ""` on `BreakPredicate` so `cls
._pred_type = name` no longer fails attr resolution.
- Widened `StationIn.station_ids` / `StepIn.steps` from `frozenset[X]`
to `AbstractSet[X]` (still converted to `frozenset` in
`__post_init__`) — matches the documented API which shows users
passing plain set literals.
- `tests/test_normalization.py::_det_result.mode` typed as
`CorrectionMode` instead of `str`.
- `tests/test_results.py::_make_detection_result.group` typed as
`GroupLabel` instead of `str`.
- `tests/test_preprocessing.py` narrows polars `.max()` via
`isinstance(max_val, float)` before the `<` comparison.
* Update locked DWD expectations to match step-6c re-test
The step 6c diagnostic re-test (HCC6 vs ICC6 per González-Rouco 2001)
and the test-segment boundary fix shift several Saxony group counts:
- Precipitation: H4 240→257, HC4 46→38, HC5 13→10, HCC6 12→6, total
corrections 203→171. No ICC6.
- Temperature: H4 4→6, HC4 5→3, HC5 3→2, HCC6 39→20, **ICC6 0→20**,
total corrections 142→152. Step 6c correctly catches residual
inhomogeneities that the previous unconditional HCC6 assignment hid.
Locked-values header re-dated to 2026-06-17.
Also: `test_station_coverage_check` now adds the GHOST row with
parameter="precip" so the new "multiple parameters" validation
doesn't fire ahead of the unknown-station check.