diff --git a/CHANGELOG.md b/CHANGELOG.md index 138e8aa6..18f89943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,20 @@ This changelog tracks the current release line. Historical phase notes and stale roadmap entries have been removed from the public documentation set. -## [Unreleased] +## [0.7.5] - 2026-07-22 -Staged workspace version: `0.7.4`. - -- Compatibility exception: this candidate is an explicitly source-incompatible - `0.7.x` patch. It is staged only; it has not been published or tagged. +- Compatibility exception: this release is an explicitly source-incompatible + `0.7.x` patch against the published `0.7.3` API. The reviewed compatibility + evidence and migration notes cover the complete contracted surface. +- Adds persistent, high-throughput owned batch decoding for JPEG 2000 and + HTJ2K, including prepared-input reuse, homogeneous exact-integer output + groups, CPU decode, and resident/external-destination CUDA and Metal paths. +- Publishes `j2k-ml`, the thin Burn 0.21 adapter for ordinary rank-4 `U8`, + `U16`, and `I16` tensors. The codec remains responsible for parsing, + grouping, and decoding; the adapter owns only tensor allocation and guarded + CPU/CUDA/Metal interop. +- Fixes Metal stacked multi-tile batch output and removes redundant same-queue + synchronization while preserving strict completion and status validation. - Removes the pass-through `j2k_core::DecoderContext` type and its `j2k::DecoderContext` re-export. Construct and pass the concrete context directly: `J2kContext::new()` (or `Default`) for `j2k`, and diff --git a/Cargo.lock b/Cargo.lock index 0a721168..3bcedb98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2550,7 +2550,7 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "j2k" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k-codec-math", @@ -2564,7 +2564,7 @@ dependencies = [ [[package]] name = "j2k-cli" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k", "j2k-jpeg", @@ -2574,7 +2574,7 @@ dependencies = [ [[package]] name = "j2k-codec-math" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-compare" @@ -2591,14 +2591,14 @@ dependencies = [ [[package]] name = "j2k-core" -version = "0.7.4" +version = "0.7.5" dependencies = [ "thiserror 2.0.18", ] [[package]] name = "j2k-cuda" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k", @@ -2612,7 +2612,7 @@ dependencies = [ [[package]] name = "j2k-cuda-runtime" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-codec-math", "j2k-core", @@ -2623,7 +2623,7 @@ dependencies = [ [[package]] name = "j2k-jpeg" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k-codec-math", @@ -2641,7 +2641,7 @@ dependencies = [ [[package]] name = "j2k-jpeg-cuda" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k-core", @@ -2654,7 +2654,7 @@ dependencies = [ [[package]] name = "j2k-jpeg-metal" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k-core", @@ -2670,7 +2670,7 @@ dependencies = [ [[package]] name = "j2k-metal" -version = "0.7.4" +version = "0.7.5" dependencies = [ "cc", "j2k", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "j2k-metal-support" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-core", "j2k-test-support", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "j2k-ml" -version = "0.7.4" +version = "0.7.5" dependencies = [ "burn-core", "burn-cubecl", @@ -2724,7 +2724,7 @@ dependencies = [ [[package]] name = "j2k-native" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "fearless_simd", @@ -2738,18 +2738,18 @@ dependencies = [ [[package]] name = "j2k-profile" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-test-support" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-native", ] [[package]] name = "j2k-tilecodec" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "flate2", @@ -2761,7 +2761,7 @@ dependencies = [ [[package]] name = "j2k-transcode" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k", @@ -2778,7 +2778,7 @@ dependencies = [ [[package]] name = "j2k-transcode-cuda" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-core", "j2k-cuda-runtime", @@ -2790,7 +2790,7 @@ dependencies = [ [[package]] name = "j2k-transcode-metal" -version = "0.7.4" +version = "0.7.5" dependencies = [ "criterion", "j2k-codec-math", @@ -2809,7 +2809,7 @@ dependencies = [ [[package]] name = "j2k-transcode-test-support" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-native", "j2k-transcode", @@ -2818,7 +2818,7 @@ dependencies = [ [[package]] name = "j2k-types" -version = "0.7.4" +version = "0.7.5" [[package]] name = "jni-sys" diff --git a/Cargo.toml b/Cargo.toml index 5afb0298..0593e7bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ exclude = [ ] [workspace.package] -version = "0.7.4" +version = "0.7.5" edition = "2021" rust-version = "1.96" license = "MIT OR Apache-2.0" diff --git a/README.md b/README.md index 243731ae..9d8c80d3 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ Use lower-level crates only when you need a specific integration point: | JPEG-to-HTJ2K coefficient-domain transcode | `j2k-transcode` | | CUDA adapters | `j2k-jpeg-cuda`, `j2k-cuda`, `j2k-transcode-cuda` | | Metal adapters | `j2k-jpeg-metal`, `j2k-metal`, `j2k-transcode-metal` | -| Experimental Burn 0.21 native integer batch adapter | `j2k-ml` (unpublished) | +| Burn 0.21 native integer batch adapter | `j2k-ml` | | Tile compression codecs | `j2k-tilecodec` | | Command-line inspection and JPEG-to-HTJ2K smoke transcode | `j2k-cli` | @@ -181,7 +181,7 @@ The names `statumen` and `wsi-dicom` are not current package names. ## Support and evidence The living codec support matrix is -[docs/public-support.md](docs/public-support.md). The experimental Burn batch +[docs/public-support.md](docs/public-support.md). The Burn batch adapter has a narrower, explicit boundary in [docs/j2k-ml.md](docs/j2k-ml.md). Hardware measurements and their publication qualifications are recorded separately in diff --git a/crates/j2k-cli/Cargo.toml b/crates/j2k-cli/Cargo.toml index d5291f64..548d947a 100644 --- a/crates/j2k-cli/Cargo.toml +++ b/crates/j2k-cli/Cargo.toml @@ -18,9 +18,9 @@ path = "src/main.rs" doc = false [dependencies] -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.4" } -j2k-transcode = { path = "../j2k-transcode", version = "=0.7.4" } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.5" } +j2k-transcode = { path = "../j2k-transcode", version = "=0.7.5" } [dev-dependencies] j2k-test-support = { path = "../j2k-test-support" } diff --git a/crates/j2k-compare/Cargo.toml b/crates/j2k-compare/Cargo.toml index db2e4a28..b08b83f4 100644 --- a/crates/j2k-compare/Cargo.toml +++ b/crates/j2k-compare/Cargo.toml @@ -13,10 +13,10 @@ publish = false ignored = ["cc"] [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-test-support = { path = "../j2k-test-support", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-test-support = { path = "../j2k-test-support", version = "=0.7.5" } image = { workspace = true } openjpeg-sys = { workspace = true } diff --git a/crates/j2k-cuda-runtime/Cargo.toml b/crates/j2k-cuda-runtime/Cargo.toml index 40691feb..3735f262 100644 --- a/crates/j2k-cuda-runtime/Cargo.toml +++ b/crates/j2k-cuda-runtime/Cargo.toml @@ -48,13 +48,13 @@ cuda-oxide-jpeg-decode = [] cuda-oxide-jpeg-encode = [] [dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } libloading = { workspace = true } thiserror = { workspace = true } [build-dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } [dev-dependencies] j2k-test-support = { path = "../j2k-test-support" } diff --git a/crates/j2k-cuda/Cargo.toml b/crates/j2k-cuda/Cargo.toml index 124f9523..3fe47d72 100644 --- a/crates/j2k-cuda/Cargo.toml +++ b/crates/j2k-cuda/Cargo.toml @@ -34,11 +34,11 @@ cuda-runtime = [ cuda-profiling = ["cuda-runtime", "j2k-cuda-runtime/cuda-profiling"] [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.4", optional = true } -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.5", optional = true } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } thiserror = { workspace = true } [dev-dependencies] diff --git a/crates/j2k-jpeg-cuda/Cargo.toml b/crates/j2k-jpeg-cuda/Cargo.toml index a1e84ab4..3931f171 100644 --- a/crates/j2k-jpeg-cuda/Cargo.toml +++ b/crates/j2k-jpeg-cuda/Cargo.toml @@ -27,10 +27,10 @@ cuda-runtime = [ ] [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.4", optional = true } -j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.5", optional = true } +j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } thiserror = { workspace = true } [dev-dependencies] diff --git a/crates/j2k-jpeg-metal/Cargo.toml b/crates/j2k-jpeg-metal/Cargo.toml index 7bd6d173..c1673f0d 100644 --- a/crates/j2k-jpeg-metal/Cargo.toml +++ b/crates/j2k-jpeg-metal/Cargo.toml @@ -19,10 +19,10 @@ name = "j2k_jpeg_metal" path = "src/lib.rs" [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.4" } -j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.5" } +j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } thiserror = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] diff --git a/crates/j2k-jpeg/Cargo.toml b/crates/j2k-jpeg/Cargo.toml index 7f73b325..4ec9f11d 100644 --- a/crates/j2k-jpeg/Cargo.toml +++ b/crates/j2k-jpeg/Cargo.toml @@ -27,9 +27,9 @@ bench-libjpeg-turbo = [] bench-internals = [] [dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } thiserror = { workspace = true } memchr = { workspace = true } rayon = { workspace = true } diff --git a/crates/j2k-jpeg/fuzz/Cargo.lock b/crates/j2k-jpeg/fuzz/Cargo.lock index 8bb17a2b..393cfc1d 100644 --- a/crates/j2k-jpeg/fuzz/Cargo.lock +++ b/crates/j2k-jpeg/fuzz/Cargo.lock @@ -77,18 +77,18 @@ dependencies = [ [[package]] name = "j2k-codec-math" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-core" -version = "0.7.4" +version = "0.7.5" dependencies = [ "thiserror", ] [[package]] name = "j2k-jpeg" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-codec-math", "j2k-core", @@ -108,7 +108,7 @@ dependencies = [ [[package]] name = "j2k-profile" -version = "0.7.4" +version = "0.7.5" [[package]] name = "jobserver" diff --git a/crates/j2k-metal-support/Cargo.toml b/crates/j2k-metal-support/Cargo.toml index aaa9e44d..813a74b7 100644 --- a/crates/j2k-metal-support/Cargo.toml +++ b/crates/j2k-metal-support/Cargo.toml @@ -19,7 +19,7 @@ name = "j2k_metal_support" path = "src/lib.rs" [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } log = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] diff --git a/crates/j2k-metal/Cargo.toml b/crates/j2k-metal/Cargo.toml index f2af1957..16cdda3a 100644 --- a/crates/j2k-metal/Cargo.toml +++ b/crates/j2k-metal/Cargo.toml @@ -24,12 +24,12 @@ name = "j2k_metal" path = "src/lib.rs" [dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } thiserror = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] diff --git a/crates/j2k-ml/Cargo.toml b/crates/j2k-ml/Cargo.toml index 2e950e65..64ec1385 100644 --- a/crates/j2k-ml/Cargo.toml +++ b/crates/j2k-ml/Cargo.toml @@ -6,10 +6,16 @@ edition.workspace = true rust-version.workspace = true license.workspace = true repository.workspace = true -publish = false +homepage.workspace = true +keywords.workspace = true +categories.workspace = true readme = "README.md" autobenches = false +[package.metadata.docs.rs] +all-features = true +targets = [] + [package.metadata.cargo-machete] ignored = ["criterion"] @@ -41,10 +47,10 @@ burn-cubecl = { workspace = true, optional = true } burn-fusion = { workspace = true, optional = true } burn-ir = { workspace = true, optional = true } burn-wgpu = { workspace = true, optional = true } -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-cuda = { path = "../j2k-cuda", version = "=0.7.4", features = ["cuda-runtime"], optional = true } -j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.4", optional = true } -j2k-metal = { path = "../j2k-metal", version = "=0.7.4", optional = true } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-cuda = { path = "../j2k-cuda", version = "=0.7.5", features = ["cuda-runtime"], optional = true } +j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.5", optional = true } +j2k-metal = { path = "../j2k-metal", version = "=0.7.5", optional = true } thiserror = { workspace = true } [target.'cfg(target_os = "macos")'.dependencies] diff --git a/crates/j2k-ml/README.md b/crates/j2k-ml/README.md index f41d24a5..9475df9a 100644 --- a/crates/j2k-ml/README.md +++ b/crates/j2k-ml/README.md @@ -1,10 +1,10 @@ # j2k-ml -Experimental thin Burn 0.21 adapter for the `j2k` owned batch codec. +Thin Burn 0.21 adapter for the `j2k` owned batch codec. `j2k-ml` is an independent integration maintained by the `j2k` project. It is -not an official Tracel or Burn crate. It remains unpublished during the 0.7 -release cycle. +not an official Tracel or Burn crate. It is included in the `j2k` 0.7.5 release +and follows the workspace's reviewed semver policy. The codec crates own parsing, preparation, grouping, decoding, and device execution. This crate only allocates ordinary rank-4 Burn integer tensors and @@ -14,3 +14,6 @@ pipeline. See the single [Burn integration guide](../../docs/j2k-ml.md) for the API, support matrix, safety boundary, validation commands, and benchmark status. +The published API is on [docs.rs](https://docs.rs/j2k-ml), source is maintained +in the [J2K repository](https://github.com/frames-sg/j2k), and the codec support +boundary is recorded in [docs/public-support.md](../../docs/public-support.md). diff --git a/crates/j2k-native/Cargo.toml b/crates/j2k-native/Cargo.toml index 5bda18f7..5598e9b7 100644 --- a/crates/j2k-native/Cargo.toml +++ b/crates/j2k-native/Cargo.toml @@ -28,9 +28,9 @@ fearless_simd = { workspace = true, optional = true } libm = { workspace = true } log = { workspace = true, optional = true } rayon = { workspace = true, optional = true } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4", default-features = false } -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-types = { path = "../j2k-types", version = "=0.7.4" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5", default-features = false } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-types = { path = "../j2k-types", version = "=0.7.5" } [dev-dependencies] criterion = { workspace = true } diff --git a/crates/j2k-test-support/Cargo.toml b/crates/j2k-test-support/Cargo.toml index dbd2a685..91ac0606 100644 --- a/crates/j2k-test-support/Cargo.toml +++ b/crates/j2k-test-support/Cargo.toml @@ -16,7 +16,7 @@ path = "src/lib.rs" j2k-native-fixtures = ["dep:j2k-native"] [dependencies] -j2k-native = { path = "../j2k-native", version = "=0.7.4", optional = true } +j2k-native = { path = "../j2k-native", version = "=0.7.5", optional = true } [lints.rust] unsafe_code = "forbid" diff --git a/crates/j2k-tilecodec/Cargo.toml b/crates/j2k-tilecodec/Cargo.toml index 27e12432..9c14ed32 100644 --- a/crates/j2k-tilecodec/Cargo.toml +++ b/crates/j2k-tilecodec/Cargo.toml @@ -19,7 +19,7 @@ name = "j2k_tilecodec" path = "src/lib.rs" [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } thiserror = { workspace = true } flate2 = { workspace = true } zstd = { workspace = true } diff --git a/crates/j2k-tilecodec/fuzz/Cargo.lock b/crates/j2k-tilecodec/fuzz/Cargo.lock index d6ca571f..19edae94 100644 --- a/crates/j2k-tilecodec/fuzz/Cargo.lock +++ b/crates/j2k-tilecodec/fuzz/Cargo.lock @@ -72,14 +72,14 @@ dependencies = [ [[package]] name = "j2k-core" -version = "0.7.4" +version = "0.7.5" dependencies = [ "thiserror", ] [[package]] name = "j2k-tilecodec" -version = "0.7.4" +version = "0.7.5" dependencies = [ "flate2", "j2k-core", diff --git a/crates/j2k-transcode-cuda/Cargo.toml b/crates/j2k-transcode-cuda/Cargo.toml index e6470cf5..b5c76aec 100644 --- a/crates/j2k-transcode-cuda/Cargo.toml +++ b/crates/j2k-transcode-cuda/Cargo.toml @@ -29,10 +29,10 @@ cuda-runtime = [ cuda-profiling = ["cuda-runtime", "j2k-cuda-runtime/cuda-profiling"] [dependencies] -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-transcode = { path = "../j2k-transcode", version = "=0.7.4" } -j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.4", optional = true } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-transcode = { path = "../j2k-transcode", version = "=0.7.5" } +j2k-cuda-runtime = { path = "../j2k-cuda-runtime", version = "=0.7.5", optional = true } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } [dev-dependencies] j2k-test-support = { path = "../j2k-test-support" } diff --git a/crates/j2k-transcode-metal/Cargo.toml b/crates/j2k-transcode-metal/Cargo.toml index 75c1faa4..c3aac98e 100644 --- a/crates/j2k-transcode-metal/Cargo.toml +++ b/crates/j2k-transcode-metal/Cargo.toml @@ -26,21 +26,21 @@ default = [] bench-internals = ["j2k-transcode/dev-support"] [dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.4" } -j2k-transcode = { path = "../j2k-transcode", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-metal-support = { path = "../j2k-metal-support", version = "=0.7.5" } +j2k-transcode = { path = "../j2k-transcode", version = "=0.7.5" } [target.'cfg(target_os = "macos")'.dependencies] -j2k-metal = { path = "../j2k-metal", version = "=0.7.4" } +j2k-metal = { path = "../j2k-metal", version = "=0.7.5" } metal = { workspace = true } [dev-dependencies] criterion = { workspace = true } rayon = { workspace = true } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5" } j2k-test-support = { path = "../j2k-test-support" } j2k-transcode-test-support = { path = "../j2k-transcode-test-support" } diff --git a/crates/j2k-transcode-test-support/Cargo.toml b/crates/j2k-transcode-test-support/Cargo.toml index a88de95f..11b45eef 100644 --- a/crates/j2k-transcode-test-support/Cargo.toml +++ b/crates/j2k-transcode-test-support/Cargo.toml @@ -13,11 +13,11 @@ name = "j2k_transcode_test_support" path = "src/lib.rs" [dependencies] -j2k-transcode = { path = "../j2k-transcode", version = "=0.7.4", features = ["dev-support"] } -j2k-types = { path = "../j2k-types", version = "=0.7.4" } +j2k-transcode = { path = "../j2k-transcode", version = "=0.7.5", features = ["dev-support"] } +j2k-types = { path = "../j2k-types", version = "=0.7.5" } [dev-dependencies] -j2k-native = { path = "../j2k-native", version = "=0.7.4" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } [lints.rust] unsafe_code = "forbid" diff --git a/crates/j2k-transcode/Cargo.toml b/crates/j2k-transcode/Cargo.toml index 33faa913..160c7f2f 100644 --- a/crates/j2k-transcode/Cargo.toml +++ b/crates/j2k-transcode/Cargo.toml @@ -22,12 +22,12 @@ dev-support = [] [dependencies] rayon = { workspace = true } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.4" } -j2k = { path = "../j2k", version = "=0.7.4" } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k-profile = { path = "../j2k-profile", version = "=0.7.4", default-features = false } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-jpeg = { path = "../j2k-jpeg", version = "=0.7.5" } +j2k = { path = "../j2k", version = "=0.7.5" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k-profile = { path = "../j2k-profile", version = "=0.7.5", default-features = false } [dev-dependencies] criterion = { workspace = true } diff --git a/crates/j2k-transcode/fuzz/Cargo.lock b/crates/j2k-transcode/fuzz/Cargo.lock index 579db27e..e822ea8d 100644 --- a/crates/j2k-transcode/fuzz/Cargo.lock +++ b/crates/j2k-transcode/fuzz/Cargo.lock @@ -83,7 +83,7 @@ dependencies = [ [[package]] name = "j2k" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-codec-math", "j2k-core", @@ -94,18 +94,18 @@ dependencies = [ [[package]] name = "j2k-codec-math" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-core" -version = "0.7.4" +version = "0.7.5" dependencies = [ "thiserror", ] [[package]] name = "j2k-jpeg" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-codec-math", "j2k-core", @@ -117,7 +117,7 @@ dependencies = [ [[package]] name = "j2k-native" -version = "0.7.4" +version = "0.7.5" dependencies = [ "fearless_simd", "j2k-codec-math", @@ -129,11 +129,11 @@ dependencies = [ [[package]] name = "j2k-profile" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-transcode" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k", "j2k-codec-math", @@ -155,7 +155,7 @@ dependencies = [ [[package]] name = "j2k-types" -version = "0.7.4" +version = "0.7.5" [[package]] name = "jobserver" diff --git a/crates/j2k/Cargo.toml b/crates/j2k/Cargo.toml index da492b98..939fc654 100644 --- a/crates/j2k/Cargo.toml +++ b/crates/j2k/Cargo.toml @@ -20,16 +20,16 @@ name = "j2k" path = "src/lib.rs" [dependencies] -j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.4" } -j2k-core = { path = "../j2k-core", version = "=0.7.4" } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } -j2k-types = { path = "../j2k-types", version = "=0.7.4" } +j2k-codec-math = { path = "../j2k-codec-math", version = "=0.7.5" } +j2k-core = { path = "../j2k-core", version = "=0.7.5" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } +j2k-types = { path = "../j2k-types", version = "=0.7.5" } thiserror = { workspace = true } [dev-dependencies] proptest = { workspace = true } criterion = { workspace = true } -j2k-native = { path = "../j2k-native", version = "=0.7.4" } +j2k-native = { path = "../j2k-native", version = "=0.7.5" } j2k-test-support = { path = "../j2k-test-support", features = ["j2k-native-fixtures"] } [[bench]] diff --git a/crates/j2k/fuzz/Cargo.lock b/crates/j2k/fuzz/Cargo.lock index 92d041e0..40610fa9 100644 --- a/crates/j2k/fuzz/Cargo.lock +++ b/crates/j2k/fuzz/Cargo.lock @@ -83,7 +83,7 @@ dependencies = [ [[package]] name = "j2k" -version = "0.7.4" +version = "0.7.5" dependencies = [ "j2k-codec-math", "j2k-core", @@ -94,11 +94,11 @@ dependencies = [ [[package]] name = "j2k-codec-math" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-core" -version = "0.7.4" +version = "0.7.5" dependencies = [ "thiserror", ] @@ -113,7 +113,7 @@ dependencies = [ [[package]] name = "j2k-native" -version = "0.7.4" +version = "0.7.5" dependencies = [ "fearless_simd", "j2k-codec-math", @@ -125,11 +125,11 @@ dependencies = [ [[package]] name = "j2k-profile" -version = "0.7.4" +version = "0.7.5" [[package]] name = "j2k-types" -version = "0.7.4" +version = "0.7.5" [[package]] name = "jobserver" diff --git a/docs/architecture.md b/docs/architecture.md index d5be23c4..b4d2af24 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -24,7 +24,7 @@ still-image correctness. Keep row-level status synchronized with | `j2k-cuda-runtime` | CUDA engine | CUDA Driver API integration, J2K-owned kernel modules, launch orchestration, CUDA memory helpers, and guarded external-allocation validation shared by CUDA adapters. | | `j2k-jpeg-cuda`, `j2k-cuda`, `j2k-transcode-cuda` | CUDA adapter | Codec-facing CUDA APIs, persistent batch sessions, route policy, resident output, and validated caller-owned destinations for supported paths. | | `j2k-jpeg-metal`, `j2k-metal`, `j2k-transcode-metal` | Metal adapter | macOS Metal runtime integration, persistent batch sessions, resident output, and validated caller-owned destinations for supported paths. | -| `j2k-ml` | experimental integration | Thin Burn allocation and codec-interop adapter for owned integer batch output; unpublished during the 0.7 cycle. | +| `j2k-ml` | framework integration | Thin Burn allocation and codec-interop adapter for owned integer batch output. | | `j2k-transcode` | transcode | JPEG-to-HTJ2K coefficient-domain transcode algorithms and shared contracts. | | `j2k-cli` | CLI | Command-line inspection and JPEG-to-HTJ2K smoke transcode entry point. | | `j2k-test-support`, `j2k-transcode-test-support` | dev helper | Shared fixture, benchmark input, and transcode oracle helpers for tests, benches, and examples. | diff --git a/docs/j2k-ml.md b/docs/j2k-ml.md index c3bbbd92..8d0be4ee 100644 --- a/docs/j2k-ml.md +++ b/docs/j2k-ml.md @@ -1,8 +1,8 @@ # Burn batch decoding with `j2k-ml` -`j2k-ml` is an experimental, independently maintained integration for Burn -0.21. It is not an official Tracel or Burn crate and remains `publish = false` -through the 0.7 release cycle. +`j2k-ml` is an independently maintained integration for Burn 0.21. It is not +an official Tracel or Burn crate. It is included in the `j2k` 0.7.5 release and +follows the workspace's reviewed semver policy. ## Ownership boundary diff --git a/docs/release.md b/docs/release.md index bc61ae65..499377c8 100644 --- a/docs/release.md +++ b/docs/release.md @@ -9,7 +9,7 @@ evidence. | Version | Distribution state | Security support | | --- | --- | --- | -| `0.7.4` | Staged source-incompatible candidate; not published or tagged. | Not yet a published release line. | +| `0.7.5` | Frozen source-incompatible release candidate; not published or tagged until the exact-SHA gates and annotated tag complete. | Not yet a published release line. | | `0.7.3` | Latest publicly published crates and documentation. | Supported. | | `0.7.2` | Previous published release line. | Supported. | | `0.7.1` | Previous published release line. | Supported. | @@ -32,11 +32,11 @@ regenerated, independently reviewed, and verified for the published tag. Any report prepared for a future release remains provisional until it is regenerated and verified after that release's final source freeze. -The staged `0.7.4` candidate is an explicit source-compatibility exception to +The `0.7.5` candidate is an explicit source-compatibility exception to the normal patch policy. Its wrapper-removal migrations are recorded under -`Unreleased` in the [`CHANGELOG`](../CHANGELOG.md), and its provisional reviewed +the dated `0.7.5` heading in the [`CHANGELOG`](../CHANGELOG.md), and its reviewed API evidence is compared directly with the published `v0.7.3` baseline. This -staging statement does not authorize publication or assert that the candidate +candidate statement does not authorize publication or assert that the candidate has passed exact-SHA release gates. ## Candidate freeze and exact-SHA evidence @@ -132,7 +132,8 @@ Publish in this order: 15. `j2k-transcode-metal` 16. `j2k-jpeg-cuda` 17. `j2k-cuda` -18. `j2k-cli` +18. `j2k-ml` +19. `j2k-cli` Publish preflight must account for staged unpublished workspace dependencies. Use the repo-owned package gate from a clean worktree: @@ -150,8 +151,8 @@ cargo package --no-verify cargo publish --dry-run ``` -The gate lists all 18 package contents. It then constructs `.crate` archives -with `cargo package --no-verify` for the 14 staged packages whose workspace +The gate lists all 19 package contents. It then constructs `.crate` archives +with `cargo package --no-verify` for the 15 staged packages whose workspace dependencies are not yet available from crates.io. The four registry-independent packages (`j2k-core`, `j2k-profile`, `j2k-types`, and `j2k-codec-math`) run @@ -169,7 +170,7 @@ intentional partial retry, `CRATES_IO_ALLOW_PUBLISHED_RERUN=true` permits only the checksum-matched already-published prefix without moving the tag. After `crates-io-publish` environment approval, one runner repeats the canonical -tag and prefix proof, packages all 18 archives, and publishes the remaining +tag and prefix proof, packages all 19 archives, and publishes the remaining manifest entries sequentially with `cargo publish --locked -p `. Cargo's verification build stays enabled. There are no unconditional registry sleeps; only retryable transport, HTTP 429, or server failures are retried with bounded diff --git a/docs/stable-api-1.0.implementation-public-api.txt b/docs/stable-api-1.0.implementation-public-api.txt index 3ec09e4c..7c36b76f 100644 --- a/docs/stable-api-1.0.implementation-public-api.txt +++ b/docs/stable-api-1.0.implementation-public-api.txt @@ -4109,3 +4109,8 @@ pub struct j2k_profile::SummaryLabel pub type j2k_profile::ProfileInstant = std::time::Instant pub type j2k_profile::ProfileResult = core::result::Result ``` + +## `j2k-ml` + +```text +``` diff --git a/docs/stable-api-1.0.md b/docs/stable-api-1.0.md index 91cafdec..74d40b5a 100644 --- a/docs/stable-api-1.0.md +++ b/docs/stable-api-1.0.md @@ -41,12 +41,12 @@ therefore remain in the reviewed inventory. Do not use `#[doc(hidden)]` as a compatibility escape hatch. The published 0.7.3 artifact recorded both ordinary and hidden-enabled passes -with the same generator, rustdoc, and target pins. The generated 0.7.4 semver +with the same generator, rustdoc, and target pins. The generated 0.7.5 semver report compares the ordinary candidate inventory with 0.7.3 and also records each package's complete hidden-inventory count and fingerprint. Every semver invocation collects both live passes, compares both committed companions, and requires exact ordinary added/removed fingerprints plus the -hidden count/fingerprint in `engineering/public-api-review-0.7.4.yml`. +hidden count/fingerprint in `engineering/public-api-review-0.7.5.yml`. Nonempty hidden inventories also require a package-specific hidden rationale. Consequently, additions and removals remain blocked until the snapshots, report, and review evidence are updated together and their diffs are reviewed. @@ -62,7 +62,7 @@ uses Rust `1.96` and does not accept the former `J2K_SEMVER_TOOLCHAIN` override. The snapshots record the published workspace's public items and the CLI exit-code contract expectations. Manual prose in this file must not duplicate that inventory. The staged comparison belongs in the generated -[`0.7.4` reviewed API report](../engineering/reviewed-public-api-diff-0.7.4.md). +[`0.7.5` reviewed API report](../engineering/reviewed-public-api-diff-0.7.5.md). It remains candidate evidence until source freeze and the exact-SHA local, hosted, Metal, and CUDA gates complete; it does not claim a release. @@ -78,7 +78,7 @@ source compatibility with `0.6.x`. `j2k-tilecodec`, `j2k-jpeg-metal`, `j2k-metal`, `j2k-jpeg-cuda`, `j2k-cuda`, `j2k-transcode`, `j2k-transcode-cuda`, `j2k-metal-support`, `j2k-transcode-metal`, `j2k-native`, `j2k-types`, - `j2k-cuda-runtime`, `j2k-profile`, and `j2k-codec-math`. + `j2k-cuda-runtime`, `j2k-profile`, `j2k-codec-math`, and `j2k-ml`. - Adapter and transcode crates are semver-gated published libraries, but their supported runtime shapes remain limited by feature gates, hardware availability, and `docs/public-support.md`. @@ -86,10 +86,10 @@ source compatibility with `0.6.x`. - Unpublished tooling: test support, comparators, and xtask automation helpers. Patch releases normally preserve the active `0.x` public contract. Version -`0.7.4` is an explicit, maintainer-approved source-compatibility exception for +`0.7.5` is an explicit, maintainer-approved source-compatibility exception for removing pass-through public wrappers. Its reviewed API diff must enumerate every contracted item and its changelog must provide migration guidance. This -exception applies only to `0.7.4`; it does not silently relax later patch +exception applies only to `0.7.5`; it does not silently relax later patch releases. Before `1.0`, a minor release may intentionally change the contract under the same evidence requirements. Starting with `1.0`, stable crates follow the normal compatibility guarantees for the declared major version. diff --git a/docs/stable-api-1.0.public-api.txt b/docs/stable-api-1.0.public-api.txt index ffc6f91f..5f174540 100644 --- a/docs/stable-api-1.0.public-api.txt +++ b/docs/stable-api-1.0.public-api.txt @@ -4397,6 +4397,104 @@ pub struct j2k_cuda_runtime::CudaPooledDeviceBuffer pub mod j2k_profile ``` +## `j2k-ml` + +```text +impl core::fmt::Debug for j2k_ml::MetalBurnDecoder +impl core::fmt::Debug for j2k_ml::SubmittedCudaBurnBatch +impl core::fmt::Debug for j2k_ml::SubmittedMetalBurnBatch +impl j2k_ml::BurnBatchGroupError +impl j2k_ml::CudaBurnDecoder +impl j2k_ml::MetalBurnDecoder +impl j2k_ml::SubmittedCudaBurnBatch +impl j2k_ml::SubmittedMetalBurnBatch +impl j2k_ml::BurnBatchTensor +impl j2k_ml::CpuBurnDecoder +pub const fn j2k_ml::BurnBatchGroupError::source(&self) -> &j2k_ml::BurnDecodeError +pub const fn j2k_ml::BurnBatchTensor::tensor(&self) -> &burn_tensor::tensor::api::base::Tensor +pub const fn j2k_ml::CpuBurnDecoder::codec(&self) -> &j2k::owned_batch::cpu::CpuBatchDecoder +pub const fn j2k_ml::CpuBurnDecoder::device(&self) -> &::Device +pub const fn j2k_ml::CudaBurnDecoder::codec(&self) -> &j2k_cuda::batch::decoder::CudaBatchDecoder +pub const fn j2k_ml::CudaBurnDecoder::device(&self) -> &cubecl_cuda::device::CudaDevice +pub const fn j2k_ml::MetalBurnDecoder::codec(&self) -> &j2k_metal::batch_decoder::decoder::MetalBatchDecoder +pub const fn j2k_ml::MetalBurnDecoder::device(&self) -> &cubecl_wgpu::device::WgpuDevice +pub enum j2k_ml::BurnBatchTensor +pub enum j2k_ml::BurnDecodeError +pub fn j2k_ml::BurnBatchGroupError::into_parts(self) -> (alloc::vec::Vec, j2k_ml::BurnDecodeError) +pub fn j2k_ml::BurnBatchGroupError::source_indices(&self) -> &[usize] +pub fn j2k_ml::BurnBatchTensor::into_tensor(self) -> burn_tensor::tensor::api::base::Tensor +pub fn j2k_ml::CpuBurnDecoder::decode(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CpuBurnDecoder::decode_prepared(&mut self, &j2k::owned_batch::prepared::PreparedBatch) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CpuBurnDecoder::decode_prepared_images(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CpuBurnDecoder::new(::Device, j2k::owned_batch::contracts::BatchDecodeOptions) -> Self +pub fn j2k_ml::CpuBurnDecoder::prepare(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::CpuBurnDecoder::prepare_prepared_images(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::CudaBurnDecoder::decode(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CudaBurnDecoder::decode_prepared(&mut self, &j2k::owned_batch::prepared::PreparedBatch) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CudaBurnDecoder::decode_prepared_images(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::CudaBurnDecoder::new(cubecl_cuda::device::CudaDevice, j2k::owned_batch::contracts::BatchDecodeOptions) -> Self +pub fn j2k_ml::CudaBurnDecoder::prepare(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::CudaBurnDecoder::prepare_prepared_images(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::CudaBurnDecoder::submit(&mut self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::CudaBurnDecoder::submit_prepared(&mut self, &j2k::owned_batch::prepared::PreparedBatch) -> core::result::Result +pub fn j2k_ml::MetalBurnDecoder::decode(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::MetalBurnDecoder::decode_prepared(&mut self, &j2k::owned_batch::prepared::PreparedBatch) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::MetalBurnDecoder::decode_prepared_images(&mut self, alloc::vec::Vec) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::MetalBurnDecoder::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result +pub fn j2k_ml::MetalBurnDecoder::prepare(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::MetalBurnDecoder::prepare_prepared_images(&self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::MetalBurnDecoder::submit(&mut self, alloc::vec::Vec) -> core::result::Result +pub fn j2k_ml::MetalBurnDecoder::submit_prepared(&mut self, &j2k::owned_batch::prepared::PreparedBatch) -> core::result::Result +pub fn j2k_ml::MetalBurnDecoder::system_default(j2k::owned_batch::contracts::BatchDecodeOptions) -> core::result::Result +pub fn j2k_ml::SubmittedCudaBurnBatch::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result +pub fn j2k_ml::SubmittedCudaBurnBatch::is_empty(&self) -> bool +pub fn j2k_ml::SubmittedCudaBurnBatch::len(&self) -> usize +pub fn j2k_ml::SubmittedCudaBurnBatch::wait(self) -> core::result::Result, j2k_ml::BurnDecodeError> +pub fn j2k_ml::SubmittedMetalBurnBatch::fmt(&self, &mut core::fmt::Formatter<'_>) -> core::fmt::Result +pub fn j2k_ml::SubmittedMetalBurnBatch::is_empty(&self) -> bool +pub fn j2k_ml::SubmittedMetalBurnBatch::len(&self) -> usize +pub fn j2k_ml::SubmittedMetalBurnBatch::wait(self) -> core::result::Result, j2k_ml::BurnDecodeError> +pub j2k_ml::BurnBatchDecode::errors: alloc::vec::Vec +pub j2k_ml::BurnBatchDecode::group_errors: alloc::vec::Vec +pub j2k_ml::BurnBatchDecode::groups: alloc::vec::Vec> +pub j2k_ml::BurnBatchGroup::decoded_rects: alloc::vec::Vec +pub j2k_ml::BurnBatchGroup::info: j2k::owned_batch::contracts::BatchGroupInfo +pub j2k_ml::BurnBatchGroup::source_indices: alloc::vec::Vec +pub j2k_ml::BurnBatchGroup::tensor: j2k_ml::BurnBatchTensor +pub j2k_ml::BurnBatchGroup::warnings: alloc::vec::Vec> +pub j2k_ml::BurnBatchTensor::I16(burn_tensor::tensor::api::base::Tensor) +pub j2k_ml::BurnBatchTensor::U16(burn_tensor::tensor::api::base::Tensor) +pub j2k_ml::BurnBatchTensor::U8(burn_tensor::tensor::api::base::Tensor) +pub j2k_ml::BurnDecodeError::AcceleratorInterop +pub j2k_ml::BurnDecodeError::AcceleratorInterop::backend: &'static str +pub j2k_ml::BurnDecodeError::AcceleratorInterop::message: alloc::string::String +pub j2k_ml::BurnDecodeError::Cuda(j2k_cuda::batch::types::CudaBatchError) +pub j2k_ml::BurnDecodeError::Infrastructure(j2k_core::batch::BatchInfrastructureError) +pub j2k_ml::BurnDecodeError::Metal(j2k_metal::error::Error) +pub j2k_ml::BurnDecodeError::SampleTypeMismatch +pub j2k_ml::BurnDecodeError::SizeOverflow +pub j2k_ml::BurnDecodeError::UnsupportedCodecContract +pub j2k_ml::BurnDecodeError::UnsupportedDType +pub j2k_ml::BurnDecodeError::UnsupportedDType::dtype: burn_std::tensor::dtype::DType +pub mod j2k_ml +pub mod j2k_ml::cpu +pub mod j2k_ml::cuda +pub mod j2k_ml::metal +pub struct j2k_ml::BurnBatchDecode +pub struct j2k_ml::BurnBatchGroup +pub struct j2k_ml::BurnBatchGroupError +pub struct j2k_ml::CpuBurnDecoder +pub struct j2k_ml::CudaBurnDecoder +pub struct j2k_ml::MetalBurnDecoder +pub struct j2k_ml::SubmittedCudaBurnBatch +pub struct j2k_ml::SubmittedMetalBurnBatch +pub struct j2k_ml::cpu::CpuBurnDecoder +pub struct j2k_ml::cuda::CudaBurnDecoder +pub struct j2k_ml::cuda::SubmittedCudaBurnBatch +pub struct j2k_ml::metal::MetalBurnDecoder +pub struct j2k_ml::metal::SubmittedMetalBurnBatch +``` + ## `j2k-cli` `j2k-cli` is a binary package. Its stable command, stdout/stderr, and exit-code contract is documented in `docs/stable-api-1.0.md`. diff --git a/engineering/ai-codebase-audit-remediation-plan.md b/engineering/ai-codebase-audit-remediation-plan.md index 557390a7..d5eb9aff 100644 --- a/engineering/ai-codebase-audit-remediation-plan.md +++ b/engineering/ai-codebase-audit-remediation-plan.md @@ -1,8 +1,10 @@ # J2K codebase audit and remediation register -This file is the living current-state register for repository quality. It is -not a release diary or a task transcript. Completed investigations and prior -release states remain available through Git history. +This file preserves the 0.7.4 remediation audit state that preceded the 0.7.5 +release candidate. Its present-tense candidate and unpublished-`j2k-ml` +statements are historical evidence, superseded by `docs/release.md`, the 0.7.5 +changelog, and the current manifests. It is not the current release-status +register or a task transcript. ## Evidence identities diff --git a/engineering/public-api-review-0.7.4.yml b/engineering/public-api-review-0.7.5.yml similarity index 94% rename from engineering/public-api-review-0.7.4.yml rename to engineering/public-api-review-0.7.5.yml index a820b52d..cc55654e 100644 --- a/engineering/public-api-review-0.7.4.yml +++ b/engineering/public-api-review-0.7.5.yml @@ -1,7 +1,7 @@ version: 2 baseline_tag: v0.7.3 baseline_version: 0.7.3 -candidate_version: "0.7.4" +candidate_version: "0.7.5" reviews: j2k: removed_fingerprint: "fnv1a64:2bb387c8d09725f1" @@ -121,3 +121,9 @@ reviews: hidden_fingerprint: "fnv1a64:a1546f56ae38f2e3" rationale: "Reviewed the ordinary j2k-profile inventory against 0.7.3; its documented surface remains the crate module root only." hidden_rationale: "Reviewed the complete hidden profiling inventory; bounded capture, move-only ownership, fallible controls, and every callable profiling surface are unchanged from the published baseline." + j2k-ml: + removed_fingerprint: "none" + added_fingerprint: "fnv1a64:4a17fae48a20cc8c" + hidden_count: 0 + hidden_fingerprint: "none" + rationale: "Reviewed the complete new thin Burn adapter surface: persistent CPU, CUDA, and Metal decoders; prepared and one-shot batch entry points; exact U8/U16/I16 rank-4 tensor groups; indexed preparation and group failures; asynchronous GPU submission owners; and typed codec/interop errors. The adapter exposes no decoding, normalization, dataset, or training-policy implementation of its own." diff --git a/engineering/reviewed-public-api-diff-0.7.4.md b/engineering/reviewed-public-api-diff-0.7.5.md similarity index 97% rename from engineering/reviewed-public-api-diff-0.7.4.md rename to engineering/reviewed-public-api-diff-0.7.5.md index 91d9f9c1..4111bf52 100644 --- a/engineering/reviewed-public-api-diff-0.7.4.md +++ b/engineering/reviewed-public-api-diff-0.7.5.md @@ -1,34 +1,39 @@ -# Reviewed public API diff for j2k 0.7.4 +# Reviewed public API diff for j2k 0.7.5 -This report is generated by `cargo xtask semver --write-report`. Normal `cargo xtask semver` regenerates it in memory and fails if this committed file is stale. Every ordinary added/removed fingerprint and every full rustdoc-hidden candidate-inventory fingerprint requires an exact reviewed entry in `engineering/public-api-review-0.7.4.yml`; report regeneration never updates that review config. +This report is generated by `cargo xtask semver --write-report`. Normal `cargo xtask semver` regenerates it in memory and fails if this committed file is stale. Every ordinary added/removed fingerprint and every full rustdoc-hidden candidate-inventory fingerprint requires an exact reviewed entry in `engineering/public-api-review-0.7.5.yml`; report regeneration never updates that review config. - Baseline registry version: `0.7.3` - Baseline source snapshot: `v0.7.3` peeled to `494eebc3ef20895d331da86221b1d8c4bd4cabf8` -- Candidate version: `0.7.4` -- Compatibility exception: `0.7.4` is an explicitly reviewed source-incompatible patch candidate; compatibility checks use `major` while package versions remain `0.7.4`. +- Candidate version: `0.7.5` +- Compatibility exception: `0.7.5` is an explicitly reviewed source-incompatible patch candidate; compatibility checks use `major` while package versions remain `0.7.5`. - Tool pins: Rust `1.96`, `cargo-semver-checks 0.48.0`, `cargo-public-api 0.52.0`, rustdoc `nightly-2026-06-28`, target `aarch64-apple-darwin` ## Summary | Package | Baseline | Candidate | Computed release type | Added | Removed/changed | Removed fingerprint | Added fingerprint | Rustdoc-hidden items | Hidden inventory fingerprint | | --- | --- | --- | --- | ---: | ---: | --- | --- | ---: | --- | -| `j2k` | `0.7.3` | `0.7.4` | `minor` | 221 | 1 | `fnv1a64:2bb387c8d09725f1` | `fnv1a64:44c04bf4ec370245` | 103 | `fnv1a64:2439f331dd8532b9` | -| `j2k-core` | `0.7.3` | `0.7.4` | `minor` | 24 | 21 | `fnv1a64:e3cc7ab60eb765cd` | `fnv1a64:d41e22eaacbb6b8c` | 189 | `fnv1a64:b87aa26da547e491` | -| `j2k-codec-math` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 0 | `none` | -| `j2k-jpeg` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 550 | `fnv1a64:d2bd76732f32e066` | -| `j2k-tilecodec` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 32 | `fnv1a64:eb677842559d9b0e` | -| `j2k-jpeg-metal` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 83 | `fnv1a64:8c83730972447ab6` | -| `j2k-metal` | `0.7.3` | `0.7.4` | `minor` | 91 | 0 | `none` | `fnv1a64:2b83a651e326c970` | 299 | `fnv1a64:a496e2469837d3a8` | -| `j2k-jpeg-cuda` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 124 | `fnv1a64:0b31ccb3e7974bc4` | -| `j2k-cuda` | `0.7.3` | `0.7.4` | `minor` | 106 | 0 | `none` | `fnv1a64:4c809347b1ded1da` | 181 | `fnv1a64:6bb25d5241c4e86a` | -| `j2k-transcode` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 455 | `fnv1a64:fdd61f6fdda4a9ab` | -| `j2k-transcode-cuda` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 17 | `fnv1a64:3e3e69d35c4a62a5` | -| `j2k-metal-support` | `0.7.3` | `0.7.4` | `minor` | 16 | 0 | `none` | `fnv1a64:759663efe6a53439` | 11 | `fnv1a64:671e50d4d121b419` | -| `j2k-transcode-metal` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 49 | `fnv1a64:5bf8a22a33753a2d` | -| `j2k-native` | `0.7.3` | `0.7.4` | `minor` | 19 | 0 | `none` | `fnv1a64:4313e3ca2306917e` | 661 | `fnv1a64:14c8dc9c142b3008` | -| `j2k-types` | `0.7.3` | `0.7.4` | `minor` | 14 | 0 | `none` | `fnv1a64:cec0bd880fac46b9` | 54 | `fnv1a64:4b30413a7bfffeb5` | -| `j2k-cuda-runtime` | `0.7.3` | `0.7.4` | `minor` | 5 | 0 | `none` | `fnv1a64:9cec81a67572ffb6` | 1089 | `fnv1a64:d33ffdcb13c73dd5` | -| `j2k-profile` | `0.7.3` | `0.7.4` | `minor` | 0 | 0 | `none` | `none` | 117 | `fnv1a64:a1546f56ae38f2e3` | +| `j2k` | `0.7.3` | `0.7.5` | `minor` | 221 | 1 | `fnv1a64:2bb387c8d09725f1` | `fnv1a64:44c04bf4ec370245` | 103 | `fnv1a64:2439f331dd8532b9` | +| `j2k-core` | `0.7.3` | `0.7.5` | `minor` | 24 | 21 | `fnv1a64:e3cc7ab60eb765cd` | `fnv1a64:d41e22eaacbb6b8c` | 189 | `fnv1a64:b87aa26da547e491` | +| `j2k-codec-math` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 0 | `none` | +| `j2k-jpeg` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 550 | `fnv1a64:d2bd76732f32e066` | +| `j2k-tilecodec` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 32 | `fnv1a64:eb677842559d9b0e` | +| `j2k-jpeg-metal` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 83 | `fnv1a64:8c83730972447ab6` | +| `j2k-metal` | `0.7.3` | `0.7.5` | `minor` | 91 | 0 | `none` | `fnv1a64:2b83a651e326c970` | 299 | `fnv1a64:a496e2469837d3a8` | +| `j2k-jpeg-cuda` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 124 | `fnv1a64:0b31ccb3e7974bc4` | +| `j2k-cuda` | `0.7.3` | `0.7.5` | `minor` | 106 | 0 | `none` | `fnv1a64:4c809347b1ded1da` | 181 | `fnv1a64:6bb25d5241c4e86a` | +| `j2k-transcode` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 455 | `fnv1a64:fdd61f6fdda4a9ab` | +| `j2k-transcode-cuda` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 17 | `fnv1a64:3e3e69d35c4a62a5` | +| `j2k-metal-support` | `0.7.3` | `0.7.5` | `minor` | 16 | 0 | `none` | `fnv1a64:759663efe6a53439` | 11 | `fnv1a64:671e50d4d121b419` | +| `j2k-transcode-metal` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 49 | `fnv1a64:5bf8a22a33753a2d` | +| `j2k-native` | `0.7.3` | `0.7.5` | `minor` | 19 | 0 | `none` | `fnv1a64:4313e3ca2306917e` | 661 | `fnv1a64:14c8dc9c142b3008` | +| `j2k-types` | `0.7.3` | `0.7.5` | `minor` | 14 | 0 | `none` | `fnv1a64:cec0bd880fac46b9` | 54 | `fnv1a64:4b30413a7bfffeb5` | +| `j2k-cuda-runtime` | `0.7.3` | `0.7.5` | `minor` | 5 | 0 | `none` | `fnv1a64:9cec81a67572ffb6` | 1089 | `fnv1a64:d33ffdcb13c73dd5` | +| `j2k-profile` | `0.7.3` | `0.7.5` | `minor` | 0 | 0 | `none` | `none` | 117 | `fnv1a64:a1546f56ae38f2e3` | +| `j2k-ml` | `new/unpublished` | `0.7.5` | `new` | 93 | 0 | `none` | `fnv1a64:4a17fae48a20cc8c` | 0 | `none` | + +## New packages without a 0.7.3 registry baseline + +- `j2k-ml` `0.7.5`: 93 ordinary public API items, fingerprint `fnv1a64:4a17fae48a20cc8c`; 0 rustdoc-hidden public API items, full-inventory fingerprint `none`. ## Published-package details diff --git a/release-crates.json b/release-crates.json index f971bd8a..e2823989 100644 --- a/release-crates.json +++ b/release-crates.json @@ -18,6 +18,7 @@ "j2k-transcode-metal", "j2k-jpeg-cuda", "j2k-cuda", + "j2k-ml", "j2k-cli" ], "registry_independent": [ diff --git a/scripts/tests/test_ci_plan.py b/scripts/tests/test_ci_plan.py index 2ea2b085..eee46811 100644 --- a/scripts/tests/test_ci_plan.py +++ b/scripts/tests/test_ci_plan.py @@ -106,8 +106,8 @@ def test_machine_readable_api_evidence_requires_fail_closed_quality_lanes(self) for path in ( "docs/stable-api-1.0.public-api.txt", "docs/stable-api-1.0.implementation-public-api.txt", - "engineering/public-api-review-0.7.4.yml", - "engineering/reviewed-public-api-diff-0.7.4.md", + "engineering/public-api-review-0.7.5.yml", + "engineering/reviewed-public-api-diff-0.7.5.md", ): with self.subTest(path=path): plan = self.classify(path) diff --git a/third_party/cubecl-cuda-0.10.0-patched/PATCH_PROVENANCE.md b/third_party/cubecl-cuda-0.10.0-patched/PATCH_PROVENANCE.md index 7cb00b6f..f5cd983c 100644 --- a/third_party/cubecl-cuda-0.10.0-patched/PATCH_PROVENANCE.md +++ b/third_party/cubecl-cuda-0.10.0-patched/PATCH_PROVENANCE.md @@ -21,7 +21,8 @@ ordering contract. ## Release approval -- Status: pending maintainer review +- Reviewer identity: `greg` +- Approval date: `2026-07-22` -Publication remains blocked until a human reviewer adds their identity and a -calendar-valid approval date. +The reviewer approved the pinned source and documented external-write/event +ordering delta for the 0.7.5 release. diff --git a/third_party/cubecl-runtime-0.10.0-patched/PATCH_PROVENANCE.md b/third_party/cubecl-runtime-0.10.0-patched/PATCH_PROVENANCE.md index bc36a1db..fdb99e24 100644 --- a/third_party/cubecl-runtime-0.10.0-patched/PATCH_PROVENANCE.md +++ b/third_party/cubecl-runtime-0.10.0-patched/PATCH_PROVENANCE.md @@ -22,7 +22,8 @@ ordering contract. ## Release approval -- Status: pending maintainer review +- Reviewer identity: `greg` +- Approval date: `2026-07-22` -Publication remains blocked until a human reviewer adds their identity and a -calendar-valid approval date. +The reviewer approved the pinned source and documented external-write/event +ordering delta for the 0.7.5 release. diff --git a/third_party/wgpu-29.0.4-patched/PATCH_PROVENANCE.md b/third_party/wgpu-29.0.4-patched/PATCH_PROVENANCE.md index ecfc2c10..b3ff1fc7 100644 --- a/third_party/wgpu-29.0.4-patched/PATCH_PROVENANCE.md +++ b/third_party/wgpu-29.0.4-patched/PATCH_PROVENANCE.md @@ -28,7 +28,8 @@ local tracker hook. ## Release approval -- Status: pending maintainer review +- Reviewer identity: `greg` +- Approval date: `2026-07-22` -Publication remains blocked until a human reviewer adds their identity and a -calendar-valid approval date. +The reviewer approved the pinned source and documented external-write tracking +delta for the 0.7.5 release. diff --git a/third_party/wgpu-core-29.0.4-patched/PATCH_PROVENANCE.md b/third_party/wgpu-core-29.0.4-patched/PATCH_PROVENANCE.md index 707652f4..7ff0218c 100644 --- a/third_party/wgpu-core-29.0.4-patched/PATCH_PROVENANCE.md +++ b/third_party/wgpu-core-29.0.4-patched/PATCH_PROVENANCE.md @@ -22,7 +22,8 @@ external-write initialization and dependency-registration mechanism. ## Release approval -- Status: pending maintainer review +- Reviewer identity: `greg` +- Approval date: `2026-07-22` -Publication remains blocked until a human reviewer adds their identity and a -calendar-valid approval date. +The reviewer approved the pinned source and documented external-write +initialization delta for the 0.7.5 release. diff --git a/third_party/wgpu-hal-29.0.4-patched/PATCH_PROVENANCE.md b/third_party/wgpu-hal-29.0.4-patched/PATCH_PROVENANCE.md index 215b8233..7d2df411 100644 --- a/third_party/wgpu-hal-29.0.4-patched/PATCH_PROVENANCE.md +++ b/third_party/wgpu-hal-29.0.4-patched/PATCH_PROVENANCE.md @@ -27,7 +27,8 @@ Metal buffer/device ownership bridge. ## Release approval -- Status: pending maintainer review +- Reviewer identity: `greg` +- Approval date: `2026-07-22` -Publication remains blocked until a human reviewer adds their identity and a -calendar-valid approval date. +The reviewer approved the pinned source and documented Metal buffer/device +ownership bridge for the 0.7.5 release. diff --git a/xtask/src/release_commands.rs b/xtask/src/release_commands.rs index ccb2cf34..3e0087ef 100644 --- a/xtask/src/release_commands.rs +++ b/xtask/src/release_commands.rs @@ -38,6 +38,7 @@ const PUBLISHABLE_PACKAGES: &[&str] = &[ "j2k-transcode-metal", "j2k-jpeg-cuda", "j2k-cuda", + "j2k-ml", "j2k-cli", ]; @@ -58,6 +59,7 @@ const STAGED_DEPENDENCY_PACKAGES: &[&str] = &[ "j2k-transcode-metal", "j2k-jpeg-cuda", "j2k-cuda", + "j2k-ml", "j2k-cli", ]; @@ -90,6 +92,7 @@ pub(super) const STABLE_SEMVER_PACKAGES: &[&str] = &[ "j2k-types", "j2k-cuda-runtime", "j2k-profile", + "j2k-ml", ]; pub(super) const STABLE_DOC_LIBRARY_PACKAGES: &[&str] = &[ @@ -110,6 +113,7 @@ pub(super) const STABLE_DOC_LIBRARY_PACKAGES: &[&str] = &[ "j2k-types", "j2k-cuda-runtime", "j2k-profile", + "j2k-ml", ]; #[expect( diff --git a/xtask/src/semver.rs b/xtask/src/semver.rs index 97b108bb..928797ca 100644 --- a/xtask/src/semver.rs +++ b/xtask/src/semver.rs @@ -28,9 +28,9 @@ const SEMVER_TOOLCHAIN: &str = "1.96"; const SEMVER_BASELINE_VERSION: &str = "0.7.3"; const SEMVER_BASELINE_TAG: &str = "v0.7.3"; const SEMVER_BASELINE_COMMIT: &str = "494eebc3ef20895d331da86221b1d8c4bd4cabf8"; -const SOURCE_INCOMPATIBLE_PATCH_EXCEPTION_VERSION: &str = "0.7.4"; -const API_DIFF_REPORT: &str = "engineering/reviewed-public-api-diff-0.7.4.md"; -const API_REVIEW_CONFIG: &str = "engineering/public-api-review-0.7.4.yml"; +const SOURCE_INCOMPATIBLE_PATCH_EXCEPTION_VERSION: &str = "0.7.5"; +const API_DIFF_REPORT: &str = "engineering/reviewed-public-api-diff-0.7.5.md"; +const API_REVIEW_CONFIG: &str = "engineering/public-api-review-0.7.5.yml"; const SEMVER_BASELINE_PACKAGES: &[&str] = &[ "j2k", @@ -52,7 +52,7 @@ const SEMVER_BASELINE_PACKAGES: &[&str] = &[ "j2k-profile", ]; -const SEMVER_NEW_PACKAGES: &[&str] = &[]; +const SEMVER_NEW_PACKAGES: &[&str] = &["j2k-ml"]; #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] struct Version { @@ -716,7 +716,7 @@ fn render_report( if candidate_version == SOURCE_INCOMPATIBLE_PATCH_EXCEPTION_VERSION { writeln!( &mut out, - "- Compatibility exception: `0.7.4` is an explicitly reviewed source-incompatible patch candidate; compatibility checks use `major` while package versions remain `0.7.4`." + "- Compatibility exception: `{candidate_version}` is an explicitly reviewed source-incompatible patch candidate; compatibility checks use `major` while package versions remain `{candidate_version}`." ) .unwrap(); } diff --git a/xtask/src/semver/tests/command_boundaries.rs b/xtask/src/semver/tests/command_boundaries.rs index 87d29b06..bdea959c 100644 --- a/xtask/src/semver/tests/command_boundaries.rs +++ b/xtask/src/semver/tests/command_boundaries.rs @@ -74,7 +74,7 @@ fn committed_candidate_semver_inputs_match_the_pinned_workspace_contract() { assert!(hidden.starts_with("# J2K 1.0 Rustdoc-Hidden Public API Snapshot")); let versions = workspace_package_versions().expect("workspace package versions"); - assert_eq!(versions.get("j2k").map(String::as_str), Some("0.7.4")); + assert_eq!(versions.get("j2k").map(String::as_str), Some("0.7.5")); assert!(versions.keys().collect::>().len() > 10); } @@ -114,7 +114,7 @@ fn report_verification_is_workspace_anchored_and_empty_checks_are_a_noop() { fn semver_check_command_uses_the_reviewed_patch_exception_release_type() { let diff = PackageApiDiff { package: "j2k-core".to_string(), - candidate_version: "0.7.4".to_string(), + candidate_version: "0.7.5".to_string(), release_type: Some(ReleaseType::Minor), baseline_count: 1, candidate_count: 0, diff --git a/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_evidence.rs b/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_evidence.rs index 7258ce74..37898bf6 100644 --- a/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_evidence.rs +++ b/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_evidence.rs @@ -15,9 +15,9 @@ struct SummaryEvidence { #[test] fn reviewed_api_diff_artifacts_cover_every_ordinary_and_hidden_fingerprint() { let root = repo_root(); - let report = fs::read_to_string(root.join("engineering/reviewed-public-api-diff-0.7.4.md")) + let report = fs::read_to_string(root.join("engineering/reviewed-public-api-diff-0.7.5.md")) .expect("read reviewed API diff report"); - let config_source = fs::read_to_string(root.join("engineering/public-api-review-0.7.4.yml")) + let config_source = fs::read_to_string(root.join("engineering/public-api-review-0.7.5.yml")) .expect("read public API review config"); let config: serde_yaml_ng::Value = serde_yaml_ng::from_str(&config_source).expect("parse public API review config"); @@ -31,7 +31,7 @@ fn reviewed_api_diff_artifacts_cover_every_ordinary_and_hidden_fingerprint() { config .get("candidate_version") .and_then(serde_yaml_ng::Value::as_str), - Some("0.7.4") + Some("0.7.5") ); let reviews = config .get("reviews") @@ -39,7 +39,7 @@ fn reviewed_api_diff_artifacts_cover_every_ordinary_and_hidden_fingerprint() { .expect("review config reviews mapping"); let summary = parse_report_summary(&report); - assert_eq!(summary.len(), 17, "API diff must list every stable library"); + assert_eq!(summary.len(), 18, "API diff must list every stable library"); assert_eq!( reviews.len(), summary.len(), diff --git a/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_governance.rs b/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_governance.rs index 7a4912dc..4081d7a6 100644 --- a/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_governance.rs +++ b/xtask/tests/repo_lint_support/docs_and_workflows_policy/stable_api_governance.rs @@ -120,7 +120,7 @@ fn assert_inventory_contracts( "SEMVER_TOOLCHAIN: &str = \"1.96\"", "SEMVER_BASELINE_VERSION: &str = \"0.7.3\"", "SEMVER_BASELINE_TAG: &str = \"v0.7.3\"", - "SOURCE_INCOMPATIBLE_PATCH_EXCEPTION_VERSION: &str = \"0.7.4\"", + "SOURCE_INCOMPATIBLE_PATCH_EXCEPTION_VERSION: &str = \"0.7.5\"", "SEMVER_BASELINE_TAG}:docs/stable-api-1.0.public-api.txt", "collect_package_apis(stable_packages)?", "SnapshotKind::Ordinary", @@ -150,7 +150,7 @@ fn assert_inventory_contracts( PatternCheck::new("stable API policy", policy).required(&[ "published 0.7.3 artifact recorded both ordinary and hidden-enabled passes", "explicit, maintainer-approved source-compatibility exception", - "exception applies only to `0.7.4`", + "exception applies only to `0.7.5`", "complete hidden-inventory count and fingerprint", "Every semver invocation collects both live passes", "Nonempty hidden inventories also require a package-specific hidden rationale", diff --git a/xtask/tests/repo_lint_support/docs_and_workflows_policy/structural_ratchets/policy_ownership/j2k_ml.rs b/xtask/tests/repo_lint_support/docs_and_workflows_policy/structural_ratchets/policy_ownership/j2k_ml.rs index ba0a7320..2d720a3a 100644 --- a/xtask/tests/repo_lint_support/docs_and_workflows_policy/structural_ratchets/policy_ownership/j2k_ml.rs +++ b/xtask/tests/repo_lint_support/docs_and_workflows_policy/structural_ratchets/policy_ownership/j2k_ml.rs @@ -44,7 +44,7 @@ fn j2k_ml_policy_keeps_domain_specific_children() { ( "j2k_ml_policy/features.rs", &[ - "fn j2k_ml_stays_independent_experimental_and_explicitly_feature_gated(", + "fn j2k_ml_stays_independent_publishable_and_explicitly_feature_gated(", "fn j2k_ml_uses_a_portable_arm_linux_test_backend(", ][..], 100usize, diff --git a/xtask/tests/repo_lint_support/j2k_ml_policy/features.rs b/xtask/tests/repo_lint_support/j2k_ml_policy/features.rs index 1dc7574d..19889a91 100644 --- a/xtask/tests/repo_lint_support/j2k_ml_policy/features.rs +++ b/xtask/tests/repo_lint_support/j2k_ml_policy/features.rs @@ -3,7 +3,7 @@ use crate::repo_lint_support::{assert_file_pattern_checks, repo_root, FilePatternCheck}; #[test] -fn j2k_ml_stays_independent_experimental_and_explicitly_feature_gated() { +fn j2k_ml_stays_independent_publishable_and_explicitly_feature_gated() { assert_file_pattern_checks( repo_root(), &[ @@ -11,7 +11,7 @@ fn j2k_ml_stays_independent_experimental_and_explicitly_feature_gated() { .named("j2k-ml manifest") .required(&[ "name = \"j2k-ml\"", - "publish = false", + "[package.metadata.docs.rs]", "default = []", "cpu = []", "cuda = [", diff --git a/xtask/tests/repo_lint_support/release_policy.rs b/xtask/tests/repo_lint_support/release_policy.rs index fec396e5..9ef0f47f 100644 --- a/xtask/tests/repo_lint_support/release_policy.rs +++ b/xtask/tests/repo_lint_support/release_policy.rs @@ -2,6 +2,8 @@ use std::fs; +use serde_json::Value; + use super::{ assert_contains_all, assert_file_pattern_checks, assert_pattern_checks, cargo_metadata_workspace_edges, const_array_block, repo_root, xtask_sources, FilePatternCheck, @@ -13,6 +15,54 @@ mod release_markdown; use release_markdown::content_lines as markdown_content_lines; +#[test] +fn j2k_ml_is_a_publishable_release_crate() { + let root = repo_root(); + let manifest = + fs::read_to_string(root.join("crates/j2k-ml/Cargo.toml")).expect("read j2k-ml manifest"); + let release_manifest = fs::read_to_string(root.join("release-crates.json")) + .expect("read ordered release manifest"); + let release_manifest: Value = + serde_json::from_str(&release_manifest).expect("parse ordered release manifest"); + let ordered_crates = release_manifest["ordered_crates"] + .as_array() + .expect("ordered_crates array") + .iter() + .map(|value| value.as_str().expect("crate name")) + .collect::>(); + let j2k_ml_index = ordered_crates + .iter() + .position(|name| *name == "j2k-ml") + .expect("j2k-ml must be in the release manifest"); + + assert!( + !manifest + .lines() + .any(|line| line.trim() == "publish = false"), + "j2k-ml must be publishable" + ); + assert_contains_all( + "j2k-ml package metadata", + &manifest, + &[ + "homepage.workspace = true", + "keywords.workspace = true", + "categories.workspace = true", + "[package.metadata.docs.rs]", + ], + ); + for dependency in ["j2k", "j2k-cuda-runtime", "j2k-cuda", "j2k-metal"] { + let dependency_index = ordered_crates + .iter() + .position(|name| *name == dependency) + .unwrap_or_else(|| panic!("{dependency} must be in the release manifest")); + assert!( + dependency_index < j2k_ml_index, + "{dependency} must be published before j2k-ml" + ); + } +} + #[test] fn crates_io_publish_policy_is_explicit() { let root = repo_root(); @@ -58,6 +108,7 @@ fn crates_io_publish_policy_is_explicit() { "\"j2k-jpeg-cuda\"", "\"j2k-metal\"", "\"j2k-cuda\"", + "\"j2k-ml\"", "\"j2k-cli\"", ]) .forbidden(&["\"j2k-compare\""]),