From 6c76e1babb0ab3064b01f78862bccd7efbc8f134 Mon Sep 17 00:00:00 2001 From: MuMDIA Date: Wed, 9 Sep 2026 18:39:39 +0200 Subject: [PATCH] release: 0.3.0 A minor release rather than a patch: the DeepLC floor moves to 4.4.0, so every environment must be rebuilt before upgrading. Contents: multi-head retention-time calibration (rt_im_train.multihead_calibration, off by default) and the DeepLC 4.4.0 floor it needs, plus the sha2 0.11 bump. - 0.3.0 in rust/mumdia/Cargo.toml (workspace), desktop/src-tauri/Cargo.toml and desktop/src-tauri/tauri.conf.json; both Cargo.lock files refreshed by a cargo check. - CHANGELOG.md: the [Unreleased] section becomes [0.3.0] - 2026-09-09 with a fresh empty one above, and the preamble states the environment rebuild. - docs/14 and bench/pb_eval.py quote the new version; sbom.cdx.json regenerated. Also fixes nine desktop test fixtures that used a fixed temporary directory and deleted it on entry, so two cargo test runs on one machine raced and one lost its files mid-test. Unique per process now, matching every other fixture in the workspace. This bit twice while preparing releases, including once during this one; two concurrent runs now both pass. Co-Authored-By: Claude Fable 5.1 --- CHANGELOG.md | 18 +++++++++++++++++ bench/pb_eval.py | 2 +- desktop/Cargo.lock | 2 +- desktop/src-tauri/Cargo.toml | 2 +- desktop/src-tauri/src/diann.rs | 13 ++++++++---- desktop/src-tauri/src/run.rs | 6 +++++- desktop/src-tauri/src/thermo.rs | 12 +++++++---- desktop/src-tauri/tauri.conf.json | 2 +- docs/14_build_test_deploy_gotchas.md | 2 +- rust/mumdia/Cargo.lock | 6 +++--- rust/mumdia/Cargo.toml | 2 +- sbom.cdx.json | 30 ++++++++++++++-------------- 12 files changed, 64 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 613fca59..b92199c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ All notable changes to MuMDIA are recorded here. The format follows `0.1.0` is the first tagged release of the Rust engine. The superseded Python implementation remains available at the tag `legacy-python-v1`. +`0.3.0` raises the DeepLC floor to 4.4.0, so every environment must be rebuilt +before upgrading. It also adds multi-head retention-time calibration, off by +default. + `0.2.0` is a minor rather than a patch release: it changes behaviour a user can see. The default MS2PIP model is `HCDch2`, configurations with out-of-range numeric values are refused at load instead of running, both TSV reports gain two @@ -23,6 +27,20 @@ than a number. Both are recorded in every run's `manifest.json`. ## [Unreleased] +### Fixed + +- Nine desktop test fixtures used a fixed temporary directory and deleted it on entry, so + two `cargo test` runs on one machine raced and one lost its files mid-test. They are + unique per process, like every other temporary fixture in the workspace (`docs/14`). Hit + twice while preparing releases; two concurrent runs now both pass. + +## [0.3.0] - 2026-09-09 + +Multi-head retention-time calibration and the DeepLC 4.4.0 floor it needs, plus +the sha2 0.11 bump. `rt_im_train.multihead_calibration` is off by default; +turning it on measured +4.8% stripped peptides on the HYE AIF benchmark and ++14.3% on HYE Astral, at an unchanged empirical decoy fraction. + ### Added - `rt_im_train.multihead_calibration` (default 0, off): calibrate the DeepLC base model diff --git a/bench/pb_eval.py b/bench/pb_eval.py index 90661cdb..30f356d3 100644 --- a/bench/pb_eval.py +++ b/bench/pb_eval.py @@ -41,7 +41,7 @@ def main() -> int: a = ap.parse_args() user_input = { - "software_version": "0.2.0", "search_engine": "MuMDIA", "search_engine_version": "0.2.0", + "software_version": "0.3.0", "search_engine": "MuMDIA", "search_engine_version": "0.3.0", "ident_fdr_psm": 0.01, "ident_fdr_peptide": 0.01, "ident_fdr_protein": 0.01, "enable_match_between_runs": True, "precursor_mass_tolerance": "20 ppm", "fragment_mass_tolerance": "20 ppm", "enzyme": "Trypsin", "allowed_miscleavages": 1, diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index 2d34033b..8eff7474 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -1899,7 +1899,7 @@ dependencies = [ [[package]] name = "mumdia-console" -version = "0.2.0" +version = "0.3.0" dependencies = [ "serde", "serde_json", diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 48a1753c..9ee1465d 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mumdia-console" -version = "0.2.0" +version = "0.3.0" edition = "2021" description = "Desktop interface for the MuMDIA DIA search engine" license = "Apache-2.0" diff --git a/desktop/src-tauri/src/diann.rs b/desktop/src-tauri/src/diann.rs index 870758a7..11874aef 100644 --- a/desktop/src-tauri/src/diann.rs +++ b/desktop/src-tauri/src/diann.rs @@ -1607,7 +1607,11 @@ mod tests { #[test] fn the_predicted_parquet_is_found_by_name_or_by_search() { - let dir = std::env::temp_dir().join("mumdia-diann-test-lib"); + // Unique per process, like every other temp fixture in the workspace: a fixed name + // plus the delete-on-entry below races a second `cargo test` on one machine + // (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases. + let dir = + std::env::temp_dir().join(format!("mumdia-diann-test-lib-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); @@ -1900,7 +1904,7 @@ mod tests { // `.speclib`; only an empirical one is Parquet. Without recognising the // `.speclib`, a successful prediction was reported as "DIA-NN finished but // wrote no Parquet library" and the user was left with a file nothing reads. - let dir = std::env::temp_dir().join("mumdia-diann-speclib"); + let dir = std::env::temp_dir().join(format!("mumdia-diann-speclib-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); @@ -2011,7 +2015,8 @@ mod tests { // search, and the engine then either rejected the library or accepted a // partial decoy population -- with no eviction and no way to force a rebuild. // The marker is written last, after both tables are complete. - let dir = std::env::temp_dir().join("mumdia-diann-halfcache"); + let dir = + std::env::temp_dir().join(format!("mumdia-diann-halfcache-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); @@ -2104,7 +2109,7 @@ mod tests { // `pop()` returned `lib_precursors_targets.parquet` and MuMDIA's own schema // table was imported as the DIA-NN library, reporting success on a library // that did not match the FASTA. - let dir = std::env::temp_dir().join("mumdia-diann-anchor"); + let dir = std::env::temp_dir().join(format!("mumdia-diann-anchor-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); diff --git a/desktop/src-tauri/src/run.rs b/desktop/src-tauri/src/run.rs index 991d582a..bd2b71e1 100644 --- a/desktop/src-tauri/src/run.rs +++ b/desktop/src-tauri/src/run.rs @@ -1530,7 +1530,11 @@ mod multifile_tests { // the results screen blank after every experiment. And the counts it does // yield are experiment-wide: the grouped q columns are grouped across the whole // experiment, so a per-file reading of them is diluted by ~1/n_runs. - let dir = std::env::temp_dir().join("mumdia-results-experiment"); + // Unique per process, like every other temp fixture in the workspace: a fixed name + // plus the delete-on-entry below races a second `cargo test` on one machine + // (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases. + let dir = + std::env::temp_dir().join(format!("mumdia-results-experiment-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); diff --git a/desktop/src-tauri/src/thermo.rs b/desktop/src-tauri/src/thermo.rs index 91866645..534ab4a3 100644 --- a/desktop/src-tauri/src/thermo.rs +++ b/desktop/src-tauri/src/thermo.rs @@ -789,7 +789,10 @@ mod tests { // The collision. A Waters `.raw` directory sent to ThermoRawFileParser fails // with something unhelpful, and the interface would have offered the wrong // Install button. - let d = std::env::temp_dir().join("mumdia-thermo-waters"); + // Unique per process, like every other temp fixture in the workspace: a fixed name + // plus the delete-on-entry below races a second `cargo test` on one machine + // (docs/14). Hit twice during the 0.2.0 and 0.3.0 releases. + let d = std::env::temp_dir().join(format!("mumdia-thermo-waters-{}", std::process::id())); let _ = std::fs::remove_dir_all(&d); std::fs::create_dir_all(d.join("waters.raw")).unwrap(); let p = d.join("waters.raw"); @@ -802,7 +805,7 @@ mod tests { #[test] fn a_d_directory_is_labelled_by_its_contents() { - let d = std::env::temp_dir().join("mumdia-thermo-dlabel"); + let d = std::env::temp_dir().join(format!("mumdia-thermo-dlabel-{}", std::process::id())); let _ = std::fs::remove_dir_all(&d); let tims = d.join("tims.d"); std::fs::create_dir_all(&tims).unwrap(); @@ -825,7 +828,8 @@ mod tests { fn a_zip_entry_that_escapes_the_target_is_refused() { // A zip is untrusted input even from a trusted publisher. Without the // `enclosed_name` check this entry would be written outside the target. - let dir = std::env::temp_dir().join("mumdia-thermo-traversal"); + let dir = + std::env::temp_dir().join(format!("mumdia-thermo-traversal-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); let archive = dir.join("evil.zip"); @@ -858,7 +862,7 @@ mod tests { #[test] fn a_normal_zip_round_trips_with_its_directory_structure() { - let dir = std::env::temp_dir().join("mumdia-thermo-unzip"); + let dir = std::env::temp_dir().join(format!("mumdia-thermo-unzip-{}", std::process::id())); let _ = std::fs::remove_dir_all(&dir); std::fs::create_dir_all(&dir).unwrap(); let archive = dir.join("ok.zip"); diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 2e17cf1b..69c22696 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "MuMDIA", - "version": "0.2.0", + "version": "0.3.0", "identifier": "be.ugent.compomics.mumdia.console", "build": { "frontendDist": "../ui" diff --git a/docs/14_build_test_deploy_gotchas.md b/docs/14_build_test_deploy_gotchas.md index eb9dccc0..2211325a 100644 --- a/docs/14_build_test_deploy_gotchas.md +++ b/docs/14_build_test_deploy_gotchas.md @@ -106,7 +106,7 @@ mzML, FASTA, and library Parquets remain user data and must be mounted. **Build configuration.** The workspace declares three members (`Cargo.toml:3`) sharing one `[workspace.package]` (`Cargo.toml:5-23`): version -`0.2.0`, `edition = "2021"`, `rust-version = "1.96"`, license `Apache-2.0`, plus +`0.3.0`, `edition = "2021"`, `rust-version = "1.96"`, license `Apache-2.0`, plus the crates.io metadata (description, repository, homepage, keywords, categories) and `publish = false`. The declared MSRV deliberately tracks `rust-toolchain.toml` (channel `1.96.1`), which is the only Rust version CI diff --git a/rust/mumdia/Cargo.lock b/rust/mumdia/Cargo.lock index 8e40dde9..4212c8df 100644 --- a/rust/mumdia/Cargo.lock +++ b/rust/mumdia/Cargo.lock @@ -999,7 +999,7 @@ checksum = "c505b3e17ed6b70a7ed2e67fbb2c560ee327353556120d6e72f5232b6880d536" [[package]] name = "mumdia" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "arrow", @@ -1021,7 +1021,7 @@ dependencies = [ [[package]] name = "mumdia-core" -version = "0.2.0" +version = "0.3.0" dependencies = [ "serde", "serde_json", @@ -1031,7 +1031,7 @@ dependencies = [ [[package]] name = "mumdia-io" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "arrow", diff --git a/rust/mumdia/Cargo.toml b/rust/mumdia/Cargo.toml index 98a69206..5e81ec53 100644 --- a/rust/mumdia/Cargo.toml +++ b/rust/mumdia/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/mumdia-core", "crates/mumdia-io", "crates/mumdia"] [workspace.package] -version = "0.2.0" +version = "0.3.0" edition = "2021" # Tracks rust-toolchain.toml, which is the only Rust version CI builds and tests. # A lower floor may well work, but claiming one we do not verify is a guess; lower diff --git a/sbom.cdx.json b/sbom.cdx.json index 9fee251c..64585ac5 100644 --- a/sbom.cdx.json +++ b/sbom.cdx.json @@ -5,16 +5,16 @@ "metadata": { "component": { "type": "application", - "bom-ref": "pkg:cargo/mumdia@0.2.0", + "bom-ref": "pkg:cargo/mumdia@0.3.0", "name": "mumdia", - "version": "0.2.0", + "version": "0.3.0", "description": "Clean-room Rust DIA proteomics search engine", "licenses": [ { "expression": "Apache-2.0" } ], - "purl": "pkg:cargo/mumdia@0.2.0" + "purl": "pkg:cargo/mumdia@0.3.0" }, "tools": [ { @@ -1905,10 +1905,10 @@ }, { "type": "library", - "bom-ref": "pkg:cargo/mumdia-core@0.2.0", + "bom-ref": "pkg:cargo/mumdia-core@0.3.0", "name": "mumdia-core", - "version": "0.2.0", - "purl": "pkg:cargo/mumdia-core@0.2.0", + "version": "0.3.0", + "purl": "pkg:cargo/mumdia-core@0.3.0", "description": "Typed configuration, mass model, artifact schemas, and run manifest for MuMDIA", "licenses": [ { @@ -1924,10 +1924,10 @@ }, { "type": "library", - "bom-ref": "pkg:cargo/mumdia-io@0.2.0", + "bom-ref": "pkg:cargo/mumdia-io@0.3.0", "name": "mumdia-io", - "version": "0.2.0", - "purl": "pkg:cargo/mumdia-io@0.2.0", + "version": "0.3.0", + "purl": "pkg:cargo/mumdia-io@0.3.0", "description": "Parquet/JSON artifact layer, content hashing, and logging for MuMDIA", "licenses": [ { @@ -4126,7 +4126,7 @@ ] }, { - "ref": "pkg:cargo/mumdia-core@0.2.0", + "ref": "pkg:cargo/mumdia-core@0.3.0", "dependsOn": [ "pkg:cargo/serde@1.0.228", "pkg:cargo/serde_json@1.0.150", @@ -4135,12 +4135,12 @@ ] }, { - "ref": "pkg:cargo/mumdia-io@0.2.0", + "ref": "pkg:cargo/mumdia-io@0.3.0", "dependsOn": [ "pkg:cargo/anyhow@1.0.103", "pkg:cargo/arrow@59.0.0", "pkg:cargo/blake3@1.8.5", - "pkg:cargo/mumdia-core@0.2.0", + "pkg:cargo/mumdia-core@0.3.0", "pkg:cargo/parquet@59.0.0", "pkg:cargo/serde@1.0.228", "pkg:cargo/serde_json@1.0.150", @@ -4150,15 +4150,15 @@ ] }, { - "ref": "pkg:cargo/mumdia@0.2.0", + "ref": "pkg:cargo/mumdia@0.3.0", "dependsOn": [ "pkg:cargo/anyhow@1.0.103", "pkg:cargo/arrow@59.0.0", "pkg:cargo/blake3@1.8.5", "pkg:cargo/clap@4.6.1", "pkg:cargo/mimalloc@0.1.52", - "pkg:cargo/mumdia-core@0.2.0", - "pkg:cargo/mumdia-io@0.2.0", + "pkg:cargo/mumdia-core@0.3.0", + "pkg:cargo/mumdia-io@0.3.0", "pkg:cargo/mzdata@0.65.5", "pkg:cargo/parquet@59.0.0", "pkg:cargo/rayon@1.12.0",