v0.8.10
🔒 Security — mistune 3.3.2 → 3.3.4 (dev dependency)
- Bumped the transitive
mistunedev dependency (pulled in via
jupyter→nbconvert) from3.3.2to3.3.4via
uv lock --upgrade-package mistune, resolvingGHSA-6m44-fpc8-c3rq
(HIGH). Dev-only; no runtime dependency change.
🐛 Bug Fixes — Core
-
X/y desync on duplicate index labels (OC-12): the pandas paths of
DropMissingRowsandDeduplicateselectedyby label
(y.loc[X_clean.index]); with duplicate index labels.locreturns all
matching rows, soycame back longer thanXwith misaligned labels — a
silent wrong-labels bug. Both paths now compute a positional keep mask
(notnathreshold /duplicated), selectX.iloc[kept], and filtery
positionally via the new_pandas_filter_y_by_kept_positionshelper in
preprocessing/drop_and_missing/_common.py, mirroring the already-correct
polars paths. Added duplicate-index regression tests in
tests/integration/test_drop_rows.pyand
tests/integration/test_drop_and_missing_gaps.py. -
Numeric→boolean cast divergence on polars (OC-58): polars' default
numeric→Boolean cast is C-style truthiness (x != 0) and never raises, so a
value like2.0silently becameTrueon polars while pandas
(astype("boolean")) produced<NA>— and strict mode raised on pandas but
not on polars. The polars path inpreprocessing/casting.pynow mirrors the
pandas reference: only exact 0/1 values map toFalse/True, everything
else (including non-integer floats) becomes null, and strict mode raises
ValueErroron those nulls. Added regression tests in
tests/integration/test_casting.py(coerce, strict, pure 0/1, and
engine-parity cases). -
Non-reproducible
fingerprint()for object-dtype arrays (OC-62):
artifact_digestinpipeline/seal.pydigestednp.ndarrayvia
arr.tobytes(); fordtype=objectarrays that serialises rawPyObject*
pointers, which are allocator/ASLR dependent — so the fingerprint of any
artifact holding an object-dtype array (e.g. OneHotEncoder/LabelEncoder
categories_) changed across processes and was useless for caching or
comparison. The ndarray branch now digests the shape plus each element
recursively, so the digest reflects values. Added regression tests in
tests/unit/test_pipeline_coverage.py.