millwright 0.2.1__tar.gz → 2.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. millwright-2.2.1/.cargo/audit.toml +5 -0
  2. millwright-2.2.1/.github/dependabot.yml +59 -0
  3. millwright-2.2.1/.github/workflows/ci.yml +270 -0
  4. {millwright-0.2.1 → millwright-2.2.1}/.github/workflows/release-crate.yml +1 -1
  5. {millwright-0.2.1 → millwright-2.2.1}/.github/workflows/release-python.yml +32 -13
  6. {millwright-0.2.1 → millwright-2.2.1}/CHANGELOG.md +44 -3
  7. {millwright-0.2.1 → millwright-2.2.1}/CONTRIBUTING.md +2 -1
  8. {millwright-0.2.1 → millwright-2.2.1}/Cargo.lock +107 -80
  9. {millwright-0.2.1 → millwright-2.2.1}/Cargo.toml +7 -5
  10. {millwright-0.2.1 → millwright-2.2.1}/GUIDE.md +1 -1
  11. {millwright-0.2.1 → millwright-2.2.1}/PKG-INFO +4 -7
  12. {millwright-0.2.1 → millwright-2.2.1}/README.md +3 -6
  13. {millwright-0.2.1 → millwright-2.2.1}/RELEASING.md +10 -5
  14. millwright-2.2.1/deny.toml +34 -0
  15. {millwright-0.2.1 → millwright-2.2.1}/docs/index.html +2 -2
  16. {millwright-0.2.1 → millwright-2.2.1}/guide.html +3 -2
  17. {millwright-0.2.1 → millwright-2.2.1}/index.html +3 -3
  18. {millwright-0.2.1 → millwright-2.2.1}/pyproject.toml +5 -1
  19. millwright-2.2.1/scripts/release.ps1 +64 -0
  20. {millwright-0.2.1 → millwright-2.2.1}/scripts/release.sh +13 -4
  21. millwright-2.2.1/scripts/sync-version.py +80 -0
  22. {millwright-0.2.1 → millwright-2.2.1}/src/automl.rs +48 -2
  23. {millwright-0.2.1 → millwright-2.2.1}/src/backends/smartcore.rs +30 -11
  24. {millwright-0.2.1 → millwright-2.2.1}/src/ensemble.rs +2 -89
  25. millwright-2.2.1/src/ensemble_tests.rs +87 -0
  26. {millwright-0.2.1 → millwright-2.2.1}/src/evaluate.rs +29 -4
  27. {millwright-0.2.1 → millwright-2.2.1}/src/explain.rs +3 -0
  28. {millwright-0.2.1 → millwright-2.2.1}/src/lib.rs +1 -1
  29. {millwright-0.2.1 → millwright-2.2.1}/src/monitor.rs +52 -9
  30. millwright-2.2.1/src/onnx.rs +349 -0
  31. millwright-2.2.1/src/onnx_native.rs +565 -0
  32. millwright-2.2.1/src/onnx_tests.rs +161 -0
  33. {millwright-0.2.1 → millwright-2.2.1}/src/pipeline.rs +3 -1
  34. {millwright-0.2.1 → millwright-2.2.1}/src/profile.rs +7 -353
  35. millwright-2.2.1/src/profile_render.rs +197 -0
  36. millwright-2.2.1/src/profile_tests.rs +156 -0
  37. {millwright-0.2.1 → millwright-2.2.1}/src/python.rs +16 -174
  38. millwright-2.2.1/src/python_data.rs +163 -0
  39. {millwright-0.2.1 → millwright-2.2.1}/src/registry.rs +195 -39
  40. {millwright-0.2.1 → millwright-2.2.1}/src/selection/mod.rs +3 -0
  41. {millwright-0.2.1 → millwright-2.2.1}/src/selection/scoring.rs +21 -14
  42. {millwright-0.2.1 → millwright-2.2.1}/src/serve.rs +139 -10
  43. {millwright-0.2.1 → millwright-2.2.1}/src/table.rs +10 -2
  44. millwright-2.2.1/src/transform.rs +468 -0
  45. millwright-2.2.1/src/transform_advanced.rs +437 -0
  46. millwright-2.2.1/src/transform_tests.rs +196 -0
  47. millwright-2.2.1/tests/python/conftest.py +21 -0
  48. millwright-2.2.1/tests/python/test_frame_and_profile.py +42 -0
  49. millwright-2.2.1/tests/python/test_pipeline.py +46 -0
  50. millwright-2.2.1/tests/python/test_search_and_portability.py +53 -0
  51. millwright-0.2.1/.github/workflows/ci.yml +0 -168
  52. millwright-0.2.1/src/onnx.rs +0 -1075
  53. millwright-0.2.1/src/transform.rs +0 -1096
  54. {millwright-0.2.1 → millwright-2.2.1}/.gitignore +0 -0
  55. {millwright-0.2.1 → millwright-2.2.1}/CNAME +0 -0
  56. {millwright-0.2.1 → millwright-2.2.1}/LICENSE +0 -0
  57. {millwright-0.2.1 → millwright-2.2.1}/benches/throughput.rs +0 -0
  58. {millwright-0.2.1 → millwright-2.2.1}/docs/data.html +0 -0
  59. {millwright-0.2.1 → millwright-2.2.1}/docs/deploy.html +0 -0
  60. {millwright-0.2.1 → millwright-2.2.1}/docs/insight.html +0 -0
  61. {millwright-0.2.1 → millwright-2.2.1}/docs/pipelines.html +0 -0
  62. {millwright-0.2.1 → millwright-2.2.1}/docs/python.html +0 -0
  63. {millwright-0.2.1 → millwright-2.2.1}/docs/site.css +0 -0
  64. {millwright-0.2.1 → millwright-2.2.1}/examples/automl.rs +0 -0
  65. {millwright-0.2.1 → millwright-2.2.1}/examples/backends.rs +0 -0
  66. {millwright-0.2.1 → millwright-2.2.1}/examples/explore.rs +0 -0
  67. {millwright-0.2.1 → millwright-2.2.1}/examples/insight.rs +0 -0
  68. {millwright-0.2.1 → millwright-2.2.1}/examples/operations.rs +0 -0
  69. {millwright-0.2.1 → millwright-2.2.1}/examples/portability.rs +0 -0
  70. {millwright-0.2.1 → millwright-2.2.1}/examples/specialized.rs +0 -0
  71. {millwright-0.2.1 → millwright-2.2.1}/examples/spine.rs +0 -0
  72. {millwright-0.2.1 → millwright-2.2.1}/examples/trust.rs +0 -0
  73. {millwright-0.2.1 → millwright-2.2.1}/examples/workflow.rs +0 -0
  74. {millwright-0.2.1 → millwright-2.2.1}/src/anomaly.rs +0 -0
  75. {millwright-0.2.1 → millwright-2.2.1}/src/backends/chronos.rs +0 -0
  76. {millwright-0.2.1 → millwright-2.2.1}/src/backends/incremental.rs +0 -0
  77. {millwright-0.2.1 → millwright-2.2.1}/src/backends/linfa.rs +0 -0
  78. {millwright-0.2.1 → millwright-2.2.1}/src/backends/mod.rs +0 -0
  79. {millwright-0.2.1 → millwright-2.2.1}/src/balance.rs +0 -0
  80. {millwright-0.2.1 → millwright-2.2.1}/src/calibration.rs +0 -0
  81. {millwright-0.2.1 → millwright-2.2.1}/src/diagnostics.rs +0 -0
  82. {millwright-0.2.1 → millwright-2.2.1}/src/error.rs +0 -0
  83. {millwright-0.2.1 → millwright-2.2.1}/src/frame.rs +0 -0
  84. {millwright-0.2.1 → millwright-2.2.1}/src/logistic.rs +0 -0
  85. {millwright-0.2.1 → millwright-2.2.1}/src/rng.rs +0 -0
  86. {millwright-0.2.1 → millwright-2.2.1}/src/selection/cv.rs +0 -0
  87. {millwright-0.2.1 → millwright-2.2.1}/src/selection/search.rs +0 -0
  88. {millwright-0.2.1 → millwright-2.2.1}/src/traits.rs +0 -0
  89. {millwright-0.2.1 → millwright-2.2.1}/src/viz.rs +0 -0
  90. {millwright-0.2.1 → millwright-2.2.1}/tests/ensemble_zoo.rs +0 -0
  91. {millwright-0.2.1 → millwright-2.2.1}/tests/golden.rs +0 -0
  92. {millwright-0.2.1 → millwright-2.2.1}/tests/hero_snippet.rs +0 -0
  93. {millwright-0.2.1 → millwright-2.2.1}/tests/onnx_export.rs +0 -0
  94. {millwright-0.2.1 → millwright-2.2.1}/tests/real_data.rs +0 -0
@@ -0,0 +1,5 @@
1
+ [advisories]
2
+ # quick-xml 0.39.4 is retained in Cargo.lock by an inactive optional dependency
3
+ # and does not appear in Cargo's resolved graph for any target or feature set.
4
+ # Keep these explicit until the upstream package drops that stale lock edge.
5
+ ignore = ["RUSTSEC-2026-0194", "RUSTSEC-2026-0195"]
@@ -0,0 +1,59 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: cargo
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ open-pull-requests-limit: 5
8
+ groups:
9
+ rust-infrastructure:
10
+ patterns: ["*"]
11
+ exclude-patterns:
12
+ # These crates form type/serialization boundaries with the exact-pinned
13
+ # ML engines. Upgrade them deliberately, with the full feature matrix.
14
+ - "ndarray"
15
+ - "prost"
16
+ - "sha2"
17
+ - "criterion"
18
+ ignore:
19
+ # Engine versions are exact by design. Dependabot PRs cannot safely infer
20
+ # coordinated upgrades across their ndarray and ONNX type boundaries.
21
+ - dependency-name: "ndarray"
22
+ - dependency-name: "prost"
23
+ - dependency-name: "sha2"
24
+ - dependency-name: "criterion"
25
+ - dependency-name: "smartcore"
26
+ - dependency-name: "imbalance-rs"
27
+ - dependency-name: "model-selection-rs"
28
+ - dependency-name: "linfa*"
29
+ - dependency-name: "hyperopt-rs"
30
+ - dependency-name: "regression-diagnostics"
31
+ - dependency-name: "shap-rs"
32
+ - dependency-name: "plotters-statistical"
33
+ - dependency-name: "onnx-export-rs"
34
+ - dependency-name: "driftwatch"
35
+ - dependency-name: "chronos-ts"
36
+ - dependency-name: "incremental-rs"
37
+ - dependency-name: "polars"
38
+ labels: ["dependencies", "rust"]
39
+
40
+ - package-ecosystem: github-actions
41
+ directory: /
42
+ schedule:
43
+ interval: weekly
44
+ groups:
45
+ actions:
46
+ patterns: ["*"]
47
+ exclude-patterns: ["dtolnay/rust-toolchain"]
48
+ ignore:
49
+ # @1.95 is a Rust toolchain selector, not an action release. It is also
50
+ # expressed as an input in CI, but keep this guard against regressions.
51
+ - dependency-name: "dtolnay/rust-toolchain"
52
+ labels: ["dependencies", "github-actions"]
53
+
54
+ - package-ecosystem: pip
55
+ directory: /
56
+ schedule:
57
+ interval: weekly
58
+ open-pull-requests-limit: 3
59
+ labels: ["dependencies", "python"]
@@ -0,0 +1,270 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ # One in-flight run per ref; a new push cancels the previous.
10
+ concurrency:
11
+ group: ci-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ env:
15
+ CARGO_TERM_COLOR: always
16
+ # Every job builds against the committed Cargo.lock. `--locked` turns a stale
17
+ # or drifted lockfile into a hard error — the reproducibility guarantee that
18
+ # pairs with the exact-version engine pins in Cargo.toml.
19
+ CARGO_NET_RETRY: "3"
20
+ RUSTFLAGS: "-D warnings"
21
+
22
+ jobs:
23
+ consistency:
24
+ name: version & links
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v7
28
+ - uses: actions/setup-python@v7
29
+ with:
30
+ python-version: "3.x"
31
+ - name: verify every public version marker
32
+ run: python scripts/sync-version.py --check
33
+ - name: check local and external HTML links
34
+ uses: lycheeverse/lychee-action@v2
35
+ with:
36
+ args: >-
37
+ --no-progress
38
+ --accept 200,204,206,429
39
+ --retry-wait-time 2
40
+ index.html guide.html docs/*.html README.md CONTRIBUTING.md RELEASING.md
41
+ fail: true
42
+
43
+ fmt:
44
+ name: rustfmt
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v7
48
+ - uses: dtolnay/rust-toolchain@stable
49
+ with:
50
+ components: rustfmt
51
+ - run: cargo fmt --all --check
52
+
53
+ clippy:
54
+ name: clippy (${{ matrix.features }})
55
+ runs-on: ubuntu-latest
56
+ strategy:
57
+ fail-fast: false
58
+ matrix:
59
+ include:
60
+ - features: "--no-default-features"
61
+ - features: "" # default features
62
+ - features: "--features full"
63
+ steps:
64
+ - uses: actions/checkout@v7
65
+ - uses: dtolnay/rust-toolchain@stable
66
+ with:
67
+ components: clippy
68
+ - uses: Swatinem/rust-cache@v2
69
+ - run: cargo clippy --locked --all-targets ${{ matrix.features }}
70
+
71
+ docs:
72
+ name: doc
73
+ runs-on: ubuntu-latest
74
+ env:
75
+ RUSTDOCFLAGS: "-D warnings"
76
+ steps:
77
+ - uses: actions/checkout@v7
78
+ - uses: dtolnay/rust-toolchain@stable
79
+ - uses: Swatinem/rust-cache@v2
80
+ # `full` is every Rust-facing feature (python is a cdylib, doc'd separately
81
+ # by maturin/pyo3), so this exercises the whole documented surface.
82
+ - run: cargo doc --locked --no-deps --features full
83
+
84
+ test:
85
+ name: test (${{ matrix.name }})
86
+ runs-on: ubuntu-latest
87
+ strategy:
88
+ fail-fast: false
89
+ matrix:
90
+ include:
91
+ # The spine, minimal: no backend at all, then the smartcore spine.
92
+ - { name: "core-only", features: "--no-default-features" }
93
+ - { name: "spine", features: "--no-default-features --features smartcore-backend" }
94
+ # The default install.
95
+ - { name: "default", features: "" }
96
+ # Each feature in isolation. Dependencies declared by that feature are
97
+ # enabled transitively; unrelated defaults cannot hide a bad edge.
98
+ - { name: "eda", features: "--no-default-features --features eda" }
99
+ - { name: "calibration", features: "--no-default-features --features calibration" }
100
+ - { name: "anomaly", features: "--no-default-features --features anomaly" }
101
+ - { name: "linfa", features: "--no-default-features --features linfa-backend" }
102
+ - { name: "hpo", features: "--no-default-features --features hpo" }
103
+ - { name: "diagnostics", features: "--no-default-features --features diagnostics" }
104
+ - { name: "explain", features: "--no-default-features --features explain" }
105
+ - { name: "viz", features: "--no-default-features --features viz" }
106
+ - { name: "onnx", features: "--no-default-features --features onnx" }
107
+ - { name: "registry", features: "--no-default-features --features registry" }
108
+ - { name: "monitor", features: "--no-default-features --features monitor" }
109
+ - { name: "serve", features: "--no-default-features --features serve" }
110
+ - { name: "timeseries", features: "--no-default-features --features timeseries" }
111
+ - { name: "incremental", features: "--no-default-features --features incremental" }
112
+ - { name: "automl", features: "--no-default-features --features automl" }
113
+ # Everything at once — the superset build, including both ndarray worlds.
114
+ - { name: "full", features: "--features full" }
115
+ steps:
116
+ - uses: actions/checkout@v7
117
+ - uses: dtolnay/rust-toolchain@stable
118
+ - uses: Swatinem/rust-cache@v2
119
+ with:
120
+ key: ${{ matrix.name }}
121
+ - run: cargo test --locked ${{ matrix.features }}
122
+
123
+ # Cross-platform confidence on the default install, without multiplying the
124
+ # whole feature matrix across three operating systems.
125
+ os:
126
+ name: test (${{ matrix.os }})
127
+ runs-on: ${{ matrix.os }}
128
+ strategy:
129
+ fail-fast: false
130
+ matrix:
131
+ os: [windows-latest, macos-latest]
132
+ steps:
133
+ - uses: actions/checkout@v7
134
+ - uses: dtolnay/rust-toolchain@stable
135
+ - uses: Swatinem/rust-cache@v2
136
+ - run: cargo test --locked
137
+
138
+ msrv:
139
+ name: minimum Rust 1.95
140
+ runs-on: ubuntu-latest
141
+ steps:
142
+ - uses: actions/checkout@v7
143
+ - uses: dtolnay/rust-toolchain@stable
144
+ with:
145
+ toolchain: "1.95"
146
+ - uses: Swatinem/rust-cache@v2
147
+ - run: cargo check --locked --all-targets --features full
148
+
149
+ supply-chain:
150
+ name: advisories
151
+ runs-on: ubuntu-latest
152
+ steps:
153
+ - uses: actions/checkout@v7
154
+ - uses: dtolnay/rust-toolchain@stable
155
+ - run: cargo install cargo-audit --locked
156
+ - run: cargo audit
157
+
158
+ dependency-policy:
159
+ name: dependency policy
160
+ runs-on: ubuntu-latest
161
+ steps:
162
+ - uses: actions/checkout@v7
163
+ - uses: taiki-e/install-action@cargo-deny
164
+ - run: cargo deny check
165
+
166
+ coverage:
167
+ name: coverage
168
+ runs-on: ubuntu-latest
169
+ steps:
170
+ - uses: actions/checkout@v7
171
+ - uses: dtolnay/rust-toolchain@stable
172
+ with:
173
+ components: llvm-tools-preview
174
+ - uses: taiki-e/install-action@cargo-llvm-cov
175
+ - uses: Swatinem/rust-cache@v2
176
+ - name: measure full-feature Rust coverage
177
+ run: cargo llvm-cov --locked --features full --workspace --lcov --output-path lcov.info
178
+ - name: enforce coverage floor
179
+ run: >-
180
+ cargo llvm-cov report --summary-only
181
+ --fail-under-lines 82
182
+ --fail-under-functions 75
183
+ --fail-under-regions 84
184
+ - uses: actions/upload-artifact@v7
185
+ with:
186
+ name: rust-coverage
187
+ path: lcov.info
188
+ if-no-files-found: error
189
+
190
+ branch-coverage:
191
+ name: branch coverage
192
+ runs-on: ubuntu-latest
193
+ steps:
194
+ - uses: actions/checkout@v7
195
+ # LLVM branch instrumentation remains a nightly-only cargo-llvm-cov mode.
196
+ - uses: dtolnay/rust-toolchain@nightly
197
+ with:
198
+ components: llvm-tools-preview
199
+ - uses: taiki-e/install-action@cargo-llvm-cov
200
+ - uses: Swatinem/rust-cache@v2
201
+ with:
202
+ key: branch-coverage
203
+ - name: measure decision coverage
204
+ run: >-
205
+ cargo +nightly llvm-cov --locked --features full --workspace --branch
206
+ --cobertura --output-path branch-coverage.xml
207
+ - uses: actions/upload-artifact@v7
208
+ with:
209
+ name: rust-branch-coverage
210
+ path: branch-coverage.xml
211
+ if-no-files-found: error
212
+
213
+ semver:
214
+ name: public API compatibility
215
+ runs-on: ubuntu-latest
216
+ steps:
217
+ - uses: actions/checkout@v7
218
+ - uses: dtolnay/rust-toolchain@stable
219
+ - run: cargo install cargo-semver-checks --locked
220
+ - run: cargo semver-checks check-release
221
+
222
+ # Compile and *run* the examples (the `test` jobs only build the library and
223
+ # its tests), plus a compile-check of the benchmarks. The dedicated `msrv`
224
+ # job above proves the declared Rust 1.95 floor independently.
225
+ examples:
226
+ name: examples & benches
227
+ runs-on: ubuntu-latest
228
+ steps:
229
+ - uses: actions/checkout@v7
230
+ - uses: dtolnay/rust-toolchain@stable
231
+ - uses: Swatinem/rust-cache@v2
232
+ - name: run every example
233
+ run: |
234
+ for ex in spine explore trust workflow backends insight portability operations specialized automl; do
235
+ echo "::group::$ex"
236
+ cargo run --locked --features full --example "$ex"
237
+ echo "::endgroup::"
238
+ done
239
+ - name: compile benchmarks
240
+ run: cargo bench --locked --features full --no-run
241
+
242
+ package:
243
+ name: package (publish dry-run)
244
+ runs-on: ubuntu-latest
245
+ steps:
246
+ - uses: actions/checkout@v7
247
+ - uses: dtolnay/rust-toolchain@stable
248
+ # No rust-cache here: `cargo publish` builds a copy under target/package,
249
+ # which the cache action's post-step chokes on.
250
+ # Prove the crate packages and builds from its packaged form as it would on
251
+ # crates.io — catches missing files, bad metadata, and path/dev-dep leaks.
252
+ - run: cargo publish --dry-run --locked
253
+
254
+ python:
255
+ name: python wheel
256
+ runs-on: ubuntu-latest
257
+ steps:
258
+ - uses: actions/checkout@v7
259
+ - uses: dtolnay/rust-toolchain@stable
260
+ - uses: actions/setup-python@v7
261
+ with:
262
+ python-version: "3.9"
263
+ - uses: Swatinem/rust-cache@v2
264
+ # The `python` feature can't be linked by `cargo test` (pyo3's
265
+ # extension-module defers libpython), so it is built the way it ships:
266
+ # as an abi3 wheel via maturin, then smoke-imported.
267
+ - run: pip install maturin pytest
268
+ - run: maturin build --locked --release
269
+ - run: pip install --find-links target/wheels millwright
270
+ - run: pytest -q tests/python
@@ -19,7 +19,7 @@ jobs:
19
19
  contents: read
20
20
  id-token: write # required for crates.io Trusted Publishing (OIDC)
21
21
  steps:
22
- - uses: actions/checkout@v5
22
+ - uses: actions/checkout@v7
23
23
  - uses: dtolnay/rust-toolchain@stable
24
24
  - uses: Swatinem/rust-cache@v2
25
25
 
@@ -12,15 +12,32 @@ permissions:
12
12
  contents: read
13
13
 
14
14
  jobs:
15
+ verify-version:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+ - uses: dtolnay/rust-toolchain@stable
20
+ - name: check Cargo, Python, and tag versions agree
21
+ shell: bash
22
+ run: |
23
+ cargo_version="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')"
24
+ python_version="$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")"
25
+ test "$cargo_version" = "$python_version" || { echo "::error::Cargo $cargo_version != Python $python_version"; exit 1; }
26
+ if [[ "$GITHUB_REF" == refs/tags/* ]]; then
27
+ tag="${GITHUB_REF_NAME#v}"
28
+ test "$tag" = "$cargo_version" || { echo "::error::tag $tag != package $cargo_version"; exit 1; }
29
+ fi
30
+
15
31
  linux:
32
+ needs: verify-version
16
33
  runs-on: ubuntu-latest
17
34
  strategy:
18
35
  fail-fast: false
19
36
  matrix:
20
37
  target: [x86_64, aarch64]
21
38
  steps:
22
- - uses: actions/checkout@v5
23
- - uses: actions/setup-python@v5
39
+ - uses: actions/checkout@v7
40
+ - uses: actions/setup-python@v7
24
41
  with:
25
42
  python-version: "3.x"
26
43
  - name: build wheel (${{ matrix.target }})
@@ -31,20 +48,21 @@ jobs:
31
48
  # `[tool.maturin] features = ["python"]` in pyproject.toml selects the
32
49
  # feature; abi3-py39 means one wheel covers Python 3.9+.
33
50
  args: --release --locked --out dist
34
- - uses: actions/upload-artifact@v4
51
+ - uses: actions/upload-artifact@v7
35
52
  with:
36
53
  name: wheels-linux-${{ matrix.target }}
37
54
  path: dist
38
55
 
39
56
  windows:
57
+ needs: verify-version
40
58
  runs-on: windows-latest
41
59
  strategy:
42
60
  fail-fast: false
43
61
  matrix:
44
62
  target: [x64]
45
63
  steps:
46
- - uses: actions/checkout@v5
47
- - uses: actions/setup-python@v5
64
+ - uses: actions/checkout@v7
65
+ - uses: actions/setup-python@v7
48
66
  with:
49
67
  python-version: "3.x"
50
68
  architecture: ${{ matrix.target }}
@@ -53,20 +71,21 @@ jobs:
53
71
  with:
54
72
  target: ${{ matrix.target }}
55
73
  args: --release --locked --out dist
56
- - uses: actions/upload-artifact@v4
74
+ - uses: actions/upload-artifact@v7
57
75
  with:
58
76
  name: wheels-windows-${{ matrix.target }}
59
77
  path: dist
60
78
 
61
79
  macos:
80
+ needs: verify-version
62
81
  runs-on: macos-latest
63
82
  strategy:
64
83
  fail-fast: false
65
84
  matrix:
66
85
  target: [x86_64, aarch64]
67
86
  steps:
68
- - uses: actions/checkout@v5
69
- - uses: actions/setup-python@v5
87
+ - uses: actions/checkout@v7
88
+ - uses: actions/setup-python@v7
70
89
  with:
71
90
  python-version: "3.x"
72
91
  - name: build wheel (${{ matrix.target }})
@@ -74,21 +93,22 @@ jobs:
74
93
  with:
75
94
  target: ${{ matrix.target }}
76
95
  args: --release --locked --out dist
77
- - uses: actions/upload-artifact@v4
96
+ - uses: actions/upload-artifact@v7
78
97
  with:
79
98
  name: wheels-macos-${{ matrix.target }}
80
99
  path: dist
81
100
 
82
101
  sdist:
102
+ needs: verify-version
83
103
  runs-on: ubuntu-latest
84
104
  steps:
85
- - uses: actions/checkout@v5
105
+ - uses: actions/checkout@v7
86
106
  - name: build sdist
87
107
  uses: PyO3/maturin-action@v1
88
108
  with:
89
109
  command: sdist
90
110
  args: --out dist
91
- - uses: actions/upload-artifact@v4
111
+ - uses: actions/upload-artifact@v7
92
112
  with:
93
113
  name: wheels-sdist
94
114
  path: dist
@@ -102,7 +122,7 @@ jobs:
102
122
  permissions:
103
123
  id-token: write # PyPI Trusted Publishing (OIDC) — no stored token
104
124
  steps:
105
- - uses: actions/download-artifact@v4
125
+ - uses: actions/download-artifact@v8
106
126
  with:
107
127
  pattern: wheels-*
108
128
  merge-multiple: true
@@ -111,4 +131,3 @@ jobs:
111
131
  uses: pypa/gh-action-pypi-publish@release/v1
112
132
  with:
113
133
  packages-dir: dist
114
- skip-existing: true
@@ -6,6 +6,48 @@ All notable changes to Millwright are recorded here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.2.1] - 2026-08-24
10
+
11
+ ### Added
12
+ - Enforced line, function, and region coverage floors, plus nightly LLVM branch
13
+ coverage artifacts.
14
+ - Expanded the installed-wheel Python suite to cover validation, classification,
15
+ regression, search, explainability, profiling, and ONNX round trips.
16
+ - Added protected MSRV, branch-coverage, Windows, and macOS checks on `main`.
17
+
18
+ ### Changed
19
+ - Isolated ONNX native execution, profile rendering, advanced transforms, and
20
+ Python data/EDA bindings into focused production modules.
21
+ - Hardened Dependabot so compatibility-boundary and exact-pinned engine upgrades
22
+ remain deliberate, while safe GitHub Actions updates stay automated.
23
+ - Updated GitHub Actions and kept release publishing on trusted OIDC workflows.
24
+
25
+ ### Fixed
26
+ - Version synchronization now includes the root `Cargo.lock` package entry and
27
+ the maintained Python version assertion.
28
+ - Removed the obsolete standalone Python smoke script after migrating CI to the
29
+ pytest behavioral suite.
30
+ - Corrected the MSRV workflow selector so dependency automation cannot rewrite
31
+ Rust 1.95 as an action version.
32
+
33
+ ## [2.2.0] - 2026-08-24
34
+
35
+ ### Added
36
+ - Complete Rust and Python ML lifecycle: typed ingest and EDA, preprocessing,
37
+ model selection and HPO, ensembles, diagnostics and explainability, ONNX
38
+ portability, serving, registry, drift monitoring, specialized estimators, and
39
+ AutoML.
40
+ - Cross-platform Python abi3 wheels and synchronized crates.io/PyPI releases.
41
+
42
+ ### Changed
43
+ - Hardened feature isolation, packaging, MSRV, SemVer, advisory, example, and
44
+ benchmark checks across the full CI matrix.
45
+ - Updated the Python extension to PyO3 0.29 and documented the stable 2.2 API.
46
+
47
+ ### Security
48
+ - Added explicit dependency advisory handling and removed vulnerable PyO3
49
+ releases from the resolved graph.
50
+
9
51
  ## [0.2.1] - 2026-08-23
10
52
 
11
53
  ### Added
@@ -125,9 +167,8 @@ All notable changes to Millwright are recorded here. The format follows
125
167
  feature-matrix CI (fmt, clippy `-D warnings`, docs, matrix, OS, examples,
126
168
  benches, publish dry-run, wheel).
127
169
  - `selection.rs` split into `selection/{scoring,cv,search}`.
128
- - MSRV is **1.95** (dep-dictated — `sysinfo` via tract, and polars); enforced by
129
- cargo via `rust-version` rather than a dedicated CI job (which would break on
130
- every transitive bump). The default install needs 1.85.
170
+ - MSRV is **1.95** (dep-dictated — `sysinfo` via tract, and polars), declared
171
+ through `rust-version` and exercised by a dedicated CI job.
131
172
  - De-staled the crate and module docs (no more "Phase 0 · the spine").
132
173
 
133
174
  ### Fixed
@@ -45,7 +45,8 @@ cargo doc --no-deps --features full # with RUSTDOCFLAGS="-D warnings"
45
45
 
46
46
  Maintainers: bump `Cargo.toml` + `pyproject.toml`, roll `CHANGELOG.md`, and tag
47
47
  `vX.Y.Z` — the workflows publish to crates.io and PyPI via OIDC. The helper
48
- `scripts/release.sh X.Y.Z` does the mechanical steps. See
48
+ `scripts/release.sh X.Y.Z` (Linux/macOS) or `scripts/release.ps1 X.Y.Z`
49
+ (Windows) does the mechanical steps. See
49
50
  [`RELEASING.md`](RELEASING.md).
50
51
 
51
52
  ## Scope & conduct