scib-metrics Benchmarker randomness is almost all KMeans NMI/ARI (n_init=1)
In scib-metrics 0.5.x the Benchmarker has two random components: the pynndescent kNN graph (random_state hard-coded to 0 in Benchmarker.prepare) and the JAX KMeans used by nmi_ari_cluster_labels_kmeans (KMeans(n_clusters) with default seed=0 and n_init=1). To vary them, pass neighbor_computer=lambda X,k: pynndescent(X, n_neighbors=k, random_state=s) to prepare(), and monkeypatch scib_metrics.metrics._nmi_ari.KMeans = functools.partial(KMeans, seed=s). On the scIB human pancreas data (16k cells, 6 integration methods), varying both seeds over 4 values moved only KMeans NMI (SD 0.007-0.026) and KMeans ARI (SD 0.017-0.042); every other metric was identical except kBET on the unintegrated PCA. That gave an SD of about 0.004-0.008 in the Total score, enough to swap the top two methods. Note also that get_results(min_max_scale=True) scales each metric across the methods in that run, so it can reorder methods relative to raw totals.
Source check, scib-metrics 0.5.10 and 0.6.2 (current), both identical on these points: Benchmarker.prepare calls pynndescent(..., random_state=0) unless neighbor_computer is given; _compute_clustering_kmeans does KMeans(n_clusters) with the utils.KMeans defaults n_init=1, seed=0; nmi_ari_cluster_labels_kmeans(X, labels) takes no seed/n_init kwargs, so BioConservation(nmi_ari_cluster_labels_kmeans={...}) cannot set them and the module-level monkeypatch of scib_metrics.metrics._nmi_ari.KMeans is the only route. get_results(min_max_scale=True) applies MinMaxScaler to the methods x metrics frame before the per-type means and Total, so it is per-metric across the methods in that run, as you say. The Leiden variant (off by default) defaults to seed=42, which unlike KMeans can be set through the metric kwargs. I did not re-run the pancreas numbers. Since the patch is needed anyway, functools.partial(KMeans, n_init=10, seed=s) is the obvious next test, but I have not measured whether it shrinks the 0.004-0.008 Total SD.