All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.3.0 - 2026-08-04
cyclops.monitor:Detector.detect_shift_by_subgroup()runs the fitted drift tester independently on each subgroup of a target dataset (e.g. age band, sex, hospital site, defined via the existingSliceSpec), instead of only testing the aggregate population - a model can look stable overall while drifting badly for a specific subgroup, which matters for health-equity-aware monitoring. Includes Bonferroni correction across subgroups and a minimum-sample-size guard.cyclops.monitor:DCTester.explain_shift()explains a detected shift using SHAP on the domain classifier trained bytester_method="classifier", returning features ranked by how strongly they indicate a sample belongs to the shifted distribution.cyclops.evaluate.metrics.experimental: added calibration metrics -BinaryBrierScore/MulticlassBrierScoreandBinaryCalibrationError(Expected Calibration Error / Maximum Calibration Error), plus their functional counterparts. Discrimination metrics like AUROC don't tell you whether a predicted probability can be trusted at face value, which matters for clinical risk scores that are often acted on directly.
cyclops.monitor:errorfill()crashed on the defaultcolor=Nonebecause matplotlib removedax._get_lines.prop_cycler.cyclops.monitor:TSTester.test_shift()mutatedp_val_thresholdin place on every call, so the Bonferroni correction compounded across repeated calls (e.g. inDetector's sweep loops) instead of being computed fresh each time; also fixed anUnboundLocalErrorwhen the input isn't a plainnp.ndarray.cyclops.monitor:ContextMMDWrapperwas missing thepreprocess_at_initargument in its positional argument list to alibi-detect'sContextMMDDrift, silently shifting every later argument by one slot.ContextMMDWrapperandLKWrappernow pass keyword arguments so future alibi-detect signature changes fail loudly instead of silently misaligning.cyclops.monitor:ReductorraisedTypeErrorwhen torchvision wasn't installed andtransformswas passed, becauseisinstance(transforms, Compose)was called withCompose is None.cyclops.monitor: removedplot_label_distribution, an unreachable, untested, and uncalled function with a use-before-assignment bug.cyclops.report:ModelCardReport.export()raisedIndexErrorwhen noPerformanceMetrichad been logged.cyclops.report:_process_metric_name()raisedUnboundLocalErrorfor any metrictypenot prefixed withBinary/Multiclass/Multilabel(e.g. a custom metric name).cyclops.report:export()'s default output filename was a staticmodel_card.html/.json, so repeated calls into the sameoutput_dirsilently overwrote prior reports and broke trend/history comparisons. The default filename is now timestamped per call.cyclops.report:Citation.content(raw BibTeX text) was rendered with Jinja's|safefilter, bypassing autoescaping for no reason.cyclops.utils:exchange_extension()dropped the filename entirely for paths with no existing extension (e.g."myfile"->".csv"instead of"myfile.csv").cyclops.models:MLPModel(the packaged"mlp_pt"model) could not be constructed at all - an activation class was inserted intonn.Sequentialinstead of an instance, the first hidden layer was double-wrapped in a list, and the loop connecting hidden layers used the wrong input dimension. The packagedmlp_pt.yamlconfig also passed a nonexistentlayer_dimargument left over from the RNN/GRU/ LSTM configs.cyclops.data:SliceSpec's datetimedaycomponent filter (filter_datetime) silently matched on year instead of day of month.
cyclops.monitor.utils: removed ~470 lines of unused temporal-modeling scaffolding (Data,get_data,run_model,get_serving_data,scale,daterange,get_obj_from_str,load_model/save_model,print_metrics_binary,load_ckp,get_device,get_temporal_model,Loader, and a stray__main__demo block) that was neither exported, imported elsewhere in the repo, nor tested.
- Added a
uvecosystem entry to Dependabot sopyproject.toml/uv.lockdependencies get automated update PRs. - Fixed the README's "integration tests" badge, which linked to a workflow file that no longer exists; replaced with the (existing, previously unlinked) unit tests badge.
- Expanded
CONTRIBUTING.mdwith environment setup, test-running, and repository layout sections.