This release expands the published robustness panel from 21 to 26 encoders and rebuilds the
documentation site around the per-sample CRoMa distribution. Five new tile-encoder families
(Mascaret, Phaet and the three-member RudolfV 2 teacher/student family) were extracted across
PathoROB and republished with auditable provenance, a fifth whole-slide encoder joined the slide
panel, and the croma console script that 0.1.0 and 0.2.0 installed is gone — the library is used
through its Python API.
Removed
- BREAKING: the
cromaconsole script. It was a thin argparse wrapper over the same API
functions, and nothing internal depended on it.src/croma/cli.py, its documentation page and its
[project.scripts]entry point are removed. Every subcommand has a direct replacement:
croma ri/croma mari/croma cromaareRI.compute/MaRI.compute/CRoMa.compute,
croma expand-embeddingsiscroma.expand_features_to_manifest, and
croma build-embedding-manifestiscroma.alignment.build_embedding_source_manifest. The one
thing the CLI did for you is loading the.npy— callnumpy.loadyourself. (#144)
Added
- Mascaret and Phaet as tile encoders, served through one shared Waiv backend at immutable
checkpoint revisions with the released 224 px preprocessing and checkpoint-native output
normalization. (#135) - The RudolfV 2 family — teacher plus two distilled students — at immutable revisions, with a
shared native-square backend that pools CLS with the mean of the patch tokens after excluding all
eight register tokens. (#136) - PRISM2, a fifth whole-slide encoder. It tops both slide benchmarks, making the two
PRISM-family encoders the only biology-dominant slide models, and shows essentially no downstream
degradation. With five encoders the shared median-k no longer collapses, so the slide panel's
k* exception is now justified by composition sensitivity rather than by n = 4. (#144) --image-path-mapfor extraction: an access-only mapping that preserves canonical manifest
identity and resolves a mirror only when embeddings actually need computing. (#138)- A
:results-value:role in the docs. Run-derived numbers in prose are now computed from
committedresults/at build time, and an unknown function, model or column fails the
warnings-as-errors build. It immediately caught three drifted hand-typed numbers. (#142)
Changed
- The public panel is now 25 pathology encoders plus the DINOv2-B control, recomputed end to end
on Camelyon, TCGA-4×4 and Tolkach-ESCA under the sparse shared-median-k protocol. For the
original 21 models every comparable numeric field moved exactly zero. TCGA-2×2 stays local and
supplementary. (#139, #141) - Downstream nIPD validation covers the five new encoders, under the unchanged 20-repeat
protocol and frozen splits. All 36 expanded-panel tile correlations stay positive and significant;
no sign or significance-threshold changes. (#140) - Each cohort cell in the aggregate table now reads
CRoMa/LTM₁₀ rather than the margin alone,
so the table shows the two axes its own caption ranks on. Every published value is unchanged — the
CSV only gains columns. (#125) - The documentation site is consolidated around the distribution explorer, redesigned as
master–detail: an always-visible overview of all 26 encoders above a detail view with a range
brush and a compare-with overlay. The three cohort pages fold into one results page with stable
anchors, and the static ridgeline figures are retired — the explorer is the overview now. (#142) - Model tables, exposure markers and family styling are driven from machine-readable provenance,
including parent/fine-tune and teacher/student relationships and a conservative Charité/CHA
exposure caveat. (#137) - Embedding publication is crash-safe and identity-checked. Matrices and provenance sidecars are
one artifact contract; resume validates checkpoint revision, extraction contract, precision,
manifest, batch size, dtype and shape; and provenance is folded into the embedding fingerprint so
a metric cache cannot reuse a stale matrix. An interrupted extraction can no longer be mistaken
for a complete one. (#134)
Fixed
- RI and MaRI tail statistics reached the aggregate CSV as NaN. The benchmark computed finite
per-samplemedian_value,q_alphaandltm_alphabut dropped them when serializing summaries
and reading cached payloads. (#139) - The explorer's range brush never worked —
pointerdowntriggered a full re-render, destroying
the SVG that held the pointer capture, so every drag collapsed to a single-bin click. (#142) - Package-only releases no longer fail CI. A test required the committed results provenance to
name the currently installed version, which compares historical producer metadata against the
current runtime. The artifact-list and checksum guarantees are unchanged. (#123)