09 · sigminer v3 parity plan — closing the SigProfiler result-performance gap via msuiter asset integration
Source:vignettes/articles/research-09-sigminer-v3-parity-plan.qmd
Doc nature: research/devlog lane for msuiter issue #1 (“sigminer v3 implementation, domain progress, and best-algorithm integration”; ask: raise sigminer’s result performance to SigProfiler parity). Verified date: 2026-10-13. Method: read-only inventory of the local read-only sigminer checkout (master @
196471a5, DESCRIPTION Version 2.3.3), upstream reads viagh(issues #478/#470/#472/#479/#456/#455/#460, releases; SigProfilerExtractor CHANGELOG), msuiter bench at main @5f0ea42(msuiter-side line pins re-anchored at this rev, post #20/#21 English corpus passes), literature via arxiv/biorxiv fetches available in this environment. Protocol: zero fabricated numbers; every claim carries a pointer that was actually opened; unavailable sources are declared, not papered over (per the verify-by-command protocol).
1. Executive verdict
- sigminer’s lag vs SigProfiler is on three axes, not cosmetics: compute kernel (R
NMFpackage call chain), decision science (K arbitration, refit selection, QC sentries), and catalog currency (bundled COSMIC v3.4 vs upstream default v3.6). - Headline measured gap: on msuiter’s own pinned-hardware M7 table, sigminer CRAN 2.3.1 extraction ran 830-1609 s wall vs SigProfiler 36-40 s on identical harness cells (20-45x), CPU-seconds 1089-2197 vs ~86 — compute-bound, consistent with the NMF kernel being the bottleneck (
bench/results/docker_m7_degraded_20261010-202330/timings_sharded_master.csv). - The kernel axis has an upstream answer already staged: sigminer issue #478 (OPEN) names
omicverse/rust-NMF— bit-equivalent to RNMFbrunet/lee/offset/nsNMF, 76-280x with NNDSVD init (gh repo view omicverse/rust-NMF). msuiter independently validated its own KL kernel against R NMF brunet at ‖ΔW‖F/‖W‖F ~ 1e-15 (ROADMAP M1s entryvignettes/articles/roadmap.qmd:99-102), so the cross-check tooling exists to certify such a swap. - The quality axis is subtler than the speed axis: the
bp_*chain is functional but ships no CV-calibrated K arbitration (NMF cophenetic/silhouette family), no likelihood/LRT refit selection (QP/NNLS/SA only), no artifact/contamination sentries, no GMM normalization — all present in SigProfiler’s stack and all already delivered, certified, and calibrated inside msuiter (M2/M3a/M3b/M4). - The catalog axis is a data/licensing gap, not an algorithm gap: D3 law keeps COSMIC numeric matrices out of every repo; the field-standard solution is pinning provenance to the BSD-2 SigProfilerAssignment mirror (
vignettes/articles/research-05-standards-data.qmd:24,34-37), with msuiter’s refdb v1 (pinnedff61b0fmirror bundle, ROADMAPvignettes/articles/roadmap.qmd:165) as the working precedent. - Integration plan: seven phases, one issue-tracked PR per phase, landing across
ShixiangWang/sigminer(P0-P3, P5),msuiter(P4, P6 as engine-registry/bench PRs), and the campaign (P7, hardware-owned). Parity is defined as an acceptance gate, not a wish: regenerating the 42-cell M7 table with sigminer arms within 2x wall-clock of the sigprofiler arm and no TP-only judgment regression. - Explicit non-goals (section 6): no GPU NMF, no deep-learning/HDP extraction, no CN/SV refit migration into msuiter, no pre-measured speed claims, no unverified-paper QC machinery.
2. sigminer v3 implementation inventory (local checkout, read-only)
Root: the local read-only sigminer checkout, branch master @ 196471a5, DESCRIPTION:4 Version 2.3.3 (post-CRAN-2.3.1: #479 multi-core fix, #461 tibble fix, refit deprecation — NEWS.md “sigminer 2.3.3” section).
| Area | Files (R/ unless noted) | What is actually implemented |
|---|---|---|
| Extraction (rank survey) | sig_estimate.R |
Rank survey via NMF::nmfEstimateRank; summary measures cophenetic/rss/residuals/dispersion/evar/silhouette/sparseness (sig_estimate.R:23,349,360); method default 'brunet' (KL multiplicative updates) (sig_estimate.R:33); foreach backend registered to escape the NMF built-in 2-core cap (sig_estimate.R:75-76, NEWS #479) |
| Extraction (solve) | sig_extract.R |
NMF::nmf(nrun=10 default) consensus extraction (sig_extract.R:32,79); optional optimize=TRUE QP refit of denovo signatures (sig_extract.R:8,105-121) |
| Extraction (best practice) | best_practice.R |
bp_extract_signatures (:214) with bootstrap-catalog filtering (bt_catalog_list, filter_nmf, RTOL 0.1% per :79), custom survey scoring bp_get_stats/bp_get_rank_score (:861,:868); iter variant bp_extract_signatures_iter (:630); this — not sig_extract — is the attested benchmarkable surface (m7 adapter header, bench/m7/adapters/run_sigminer.R:12-19: five older “documented” names exist 0/5 in the witnessed NAMESPACE) |
| Extraction (BayesNMF) |
bayesianNMF.R, sig_auto_extract.R
|
Tan-Fevotte ARD beta-divergence kernels BayesNMF.L1W.L2H/L1KL/L2KL (bayesianNMF.R:52,95,139), PCAWG-lineage two-step attribution (:185-232); exposed via sig_auto_extract methods “L1W.L2H”,“L1KL”,“L2KL” (sig_auto_extract.R:11) |
| Refit | sig_fit.R |
methods QP (default), NNLS (nnls pkg), SA (GenSA simulated annealing), QP/SA ported from SignatureEstimation (sig_fit.R:7-8,166); decompose_NNLS/QP/SA (:452,:506,:578); zero-exposure auto_reduce (:461,531,602) |
| Refit stability |
sig_fit_bootstrap.R, sig_fit_bootstrap_batch.R
|
per-sample bootstraps with report_bootstrap_p_value; R-level parallelism (future) |
| Catalogs |
get_sig_db.R, inst/extdata/*.rds
|
latest_version <- "v3.4" (get_sig_db.R:123); bundled SBS/DBS/ID/TSB (SBS_signatures.rds etc.), CN (CNS_signatures_TCGA176/PCAWG176/USARC.rds), RS (RS_signatures_*.rds), SV (toy_sv.rds); COSMIC v3.4-era CN/SV/RNA-SBS added at 2.3.0 (NEWS.md “sigminer 2.3.0”) |
| Channels |
sig_tally.R, generate_matrices.R, get_sv.R, read_copynumber.R, helper_derive_cn_features.R, CN-mutex-classification-method.R
|
SBS96 + Wang/COSMIC modes, DBS/ID/TSB; CN40/CN48 + Tao mutex classification; SV32-style features; pLOH/Aneuploidy scores (get_pLOH_score.R, get_Aneuploidy_score.R) |
| Hypermutation | handle_hyper_mutation.R |
Tukey-fence hypermutation split-into-halves trick (Kim-2016 lineage), not GMM stratification, no exclusion + forced refit |
| Similarity |
get_sig_similarity.R, cosine.R, src/calc_cosine.cpp
|
cosine only — match.arg(choices = c("cosine")) (get_sig_similarity.R:153) |
| SigProfiler interop | sigprofiler.R |
sigprofiler_extract() shells python SigProfilerExtractor via reticulate, pinned sigprofiler_version = "1.1.3" (sigprofiler.R:67); refit deprecated/ignored (:71-75, issue #470); quote_opt does not escape backslashes (:204-226); sigprofiler_import(type='refit') still advertised (R/sigprofiler.R:240) |
| Conversions | sig_convert.R |
exome/genome opportunity conversion |
| Native code | src/ |
calc_cosine.cpp, get_intersect_size.cpp only — no NMF kernel in-house |
3. Attested gap table vs SigProfiler
SigProfiler side of each row was read from the upstream AlexandrovLab/sigProfiler (= SigProfilerSuite/SigProfilerExtractor) CHANGELOG (working tree, HEAD covers releases through 1.5.0, 2026-09-28), the repo releases (gh release list: v1.4.0 latest tag 2026-06-18), and the fact-checked msuiter research corpus (the fact-checked corpus vignettes/articles/research-00-executive-summary.qmd + vignettes/articles/research-05-standards-data.qmd, itself audited in vignettes/articles/research-08-fact-check-audit.qmd). “Class” is the section-4 taxonomy.
| # | Dimension | sigminer 2.3.3 evidence | SigProfiler evidence | Gap | Class | msuiter asset that closes it |
|---|---|---|---|---|---|---|
| G1 | Extraction wall-time at cohort scale | 830/1102/1609 s (N=100/1k/10k, main arm) timings_sharded_master.csv
|
40.4/38.1/36.1 s same cells, same file | 20-45x; CPU-bound (1089-2197 vs ~86 cpu_s) | a+c | KL-NMF Rust kernel with validated R-NMF cross-check (U-M1s-14, vignettes/articles/roadmap.qmd:99-102, tools/kl-crosscheck); engine registry (register_ms_engine) |
| G2 | Kernel defect class: KL-MU zero-lock | inherits R-NMF brunet (random-init default masks it); no lower-bound hardening | upstream fixed at 1.5.0: 1e-16 floor on W/H/W-H — zeros from NNDSVD init froze, runs converged early at worse solutions (CHANGELOG 1.5.0 Fixed) | latent correctness landmine for any init change | a | msuiter engine applies epsilon policy in division only (ARCH sec.7 item 4, vignettes/articles/architecture.qmd:303) + zero-frozen regression tests; requirement imported into P1 gate |
| G3 | K selection | NMF-family cophenetic/rss/silhouette (sig_estimate.R:23,360); custom score in bp survey (best_practice.R:861-868) |
mean-cosine-between-replicates + stability + Hungarian consensus + reference ranking (vignettes/articles/research-00-executive-summary.qmd:19, read of full stack); SUITOR entry-wise CV is the calibrated reference (vignettes/articles/research-08-fact-check-audit.qmd:29, PLoS CB 18(4):e1009309 2022) |
no CV-calibrated arbiter; no stability veto | a |
ms_select_k arbitration rule (CV argmin → stability veto → diagnostics, CAPABILITY-MATRIX L-C “K-selection” row = ✅ M2) |
| G4 | Refit objective | QP/NNLS/SA (sig_fit.R:166); LS-family only |
assignment NNLS w/ penalty forwarding + collapse_to_SBS96 (CHANGELOG 1.5.0); benchmark leaders are likelihood-based: MuSiCal SBS-first, PASA DBS/ID-first (vignettes/articles/research-00-executive-summary.qmd:30-31, Medo 2024 Nat Commun + Jiang 2025 Brief Bioinform bbaf042) |
no likelihood-refit, no LRT forward selection | a |
ms_fit(method="likelihood"|"lrt") ✅ v0.2 (CAPABILITY-MATRIX L-D), PASA semantics pinned by mSigAct v3.0.3-branch (vignettes/articles/research-08-fact-check-audit.qmd:25) |
| G5 | Presence/stability inference | bootstrap p-values only (report_bootstrap_p_value) |
assignment QC + decomposition plots; no calibrated CIs either (Medo open question, vignettes/articles/research-00-executive-summary.qmd:33-36) |
no calibrated presence test | a |
ms_test_presence (NB chi2_1 LRT + BH) with 198-cell calibration matrix all-in-window (ROADMAP M3a/M3b rows vignettes/articles/roadmap.qmd:152,177) |
| G6 | Sample QC / artifact sentries | none: grep for amber/red-list/artifact/pseudo-signature over R/ = zero hits; only handle_hyper_mutation.R (Tukey split) |
GMM normalization cutoff seeded/reproducible (CHANGELOG 1.5.0); curated artifact/QC practice is SigProfiler-stack identity (the SignatureAnalyzer/QC lineage row, vignettes/articles/capability-matrix.qmd:42; viz/QC sections of vignettes/articles/research-05-standards-data.qmd) |
no QC gate before extraction | a |
ms_qc_report first version delivered (CAPABILITY-MATRIX L-A row, U-M4-02b, vignettes/articles/roadmap.qmd:203): burden distribution + gt/ct mechanism sentries + 19-name COSMIC artifact roster share |
| G7 | Reproducibility discipline | seed parameter on bp entry point (m7 adapter header bench/m7/adapters/run_sigminer.R:24-27); no derived-stream discipline, thread-count invariance unproven |
Seeds.txt one-root-seed, all RNGs derived (CHANGELOG 1.5.0 Seeds fix) | reruns and thread changes can drift results | a | self-built PCG64 + SplitMix64 stream law, cross-version golden + KAT, thread-invariance identical() tests (ROADMAP M0/M1s entries vignettes/articles/roadmap.qmd:65,85-88) |
| G8 | Catalog currency |
latest_version <- "v3.4" (get_sig_db.R:123); v3.4 bundled since 2.3.0 (NEWS.md) |
default COSMIC reference 3.6 since 1.5.0 (CHANGELOG); mirror ships v1→v3.6 incl. CN/RNA-SBS (vignettes/articles/research-05-standards-data.qmd:24) |
one full catalog generation behind | b | refdb governance: commit-pinned + manifest + fail-closed (ARCH sec.6 item 2, vignettes/articles/architecture.qmd:290-294), refdb v1 precedent (vignettes/articles/roadmap.qmd:165) |
| G9 | Genome builds | T2T added 2.3.0 (NEWS.md); mm9/mm10 in get_sig_db.R:133-135; mm39 OPEN as issue #459 |
rn7/mm39 added at Extractor 1.2.3 (CHANGELOG) | mouse builds lag | b | 2bit reader path + build-independent relabel policy (ARCH sec.6, vignettes/articles/architecture.qmd:292) |
| G10 | Interop bridge health | pin 1.1.3 (sigprofiler.R:67) vs upstream tags v1.4.0 + working-tree 1.5.0; Windows backslash path SyntaxError (issue #470 traceback; quote_opt unescaped :204-226); conda fragility (issue #470 body); sigprofiler_import(type='refit') still advertised while upstream removed refit_denovo_signatures (NEWS 2.3.3) — contract to re-verify |
n/a | the parity bridge itself is stale/brittle | a | bench/m7 containerization pattern (bench/m7/adapters/Dockerfile.sigprofiler, entry-protocol adapters) as the CI-able alternative to reticulate/conda |
| G11 | GPU path | none | GPU replicates with per-replicate resampling/init generators (CHANGELOG 1.5.0 GPU fix) | hardware tier | c | campaign owns hardware (sec. 5 P7); msuiter policy = fixed-host CPU bench |
| G12 | CN/SV refit domain | sigminer-only capability (CN/SV via NMF + bundled CN/RS catalogs, sec. 2) | SigProfilerAssignment already bundles CN/RNA-SBS reference matrices (vignettes/articles/research-05-standards-data.qmd:24) and Extractor emits SV_Matrices (CHANGELOG 1.5.0) |
sigminer’s moat is narrower than msuiter docs assume; keep it in sigminer, do not fork it into msuiter (CN/SV fit is a hard v1.x non-goal, vignettes/articles/roadmap.qmd:252) |
b | none needed — governance action: G3 quarterly landscape review should log this drift |
4. Gap taxonomy
Algorithmic-integration gaps — closeable by porting/adapting an msuiter-certified component or a certified upstream kernel: G1(kernel side), G2, G3, G4, G5, G6, G7, G10, and the compute part of G11’s absence. These are code, tests, and gates.
Data/catalog gaps — content and provenance, no algorithm: G8 (COSMIC v3.4→v3.6), G9 (mm39/rn7), G11/G12 catalog halves (v3.6-era CN/SV/RNA-SBS matrices). Constraint honored: per D3 (G0 protocol, memory “G0 protocol frozen”; ROADMAP G0 row
vignettes/articles/roadmap.qmd:188), COSMIC numeric matrices never enter any repo; the compliant shape is provenance-pinned acquisition from the BSD-2 SigProfilerAssignment mirror (vignettes/articles/research-05-standards-data.qmd:34-37) with offline, fixture-tested updaters — exactly what msuiter refdb v1 already ships (vignettes/articles/roadmap.qmd:165).Campaign-hardware gaps: pinned/clock-controlled host runs, the 42-cell regeneration at scale, the bootstrap campaign (RB-10, operator-gated), and the G0 primary run blocked on the author’s COSMIC v3.6 file (
G0_CATALOG_PATH,vignettes/articles/roadmap.qmd:188). Not schedulable as code; each is a campaign action with an owner.
5. Phased integration plan — one phase, one issue, one PR
Governance law respected (msuiter project law: all development is implemented and landed through PRs) — every phase below is an issue-tracked PR in exactly one repo; sigminer-side phases land in ShixiangWang/sigminer, msuiter-side in WangLabCSU/msuiter. Effort is single-dev-with-agents, honest units.
| Phase | Lands in (PR) | Levers | Acceptance gate | Effort |
|---|---|---|---|---|
| P0 Interop hygiene | sigminer | R/sigprofiler.R |
version-pin matrix CI over {1.2.x, 1.4.0, ≥1.5} against the official image (bench pattern, not conda); Windows-path unit test reproducing the #470 SyntaxError trace; import/export round-trip on fixtures; re-verify type='refit' against upstream output tree and fix or deprecate the branch |
2-3 d |
| P1 Kernel swap (closes #478) | sigminer (backend wiring + issue), after an msuiter kernel-extension PR; optional coordination issue on omicverse/rust-NMF (yardstick use only) |
Extend the certified Apache-2.0 src/rust/engine KL-MU kernel (U-M1s-14) and expose it to sigminer as backend="rust" behind a Suggests-gated isolated-process boundary (system(cmds)+reticulate precedent R/sigprofiler.R:96,199; [AS-BUILT 2026-10-19] the Suggests entry was REVERTED – CRAN-unresolvable at lockfile time; the shipped gate is a runtime-gated optional dependency, section 7 AS-BUILT note + section 9); external GPL rust-NMF declined — ruling recorded in sec. 7 (P1-kickoff resolution; clean-room policy vignettes/articles/architecture.qmd:304, license mines vignettes/articles/research-00-executive-summary.qmd:50) |
bit-equivalence vs R NMF::nmf(brunet) ‖ΔW‖F/‖W‖F < 1e-10 fixed-platform, one-shot, mirroring tools/kl-crosscheck (ROADMAP entry vignettes/articles/roadmap.qmd:99-102); zero-lock hardening incl. NNDSVD-init regression (G2); thread-count invariance identical(); on the P6 table, sigminer arm wall-clock ≤ 2x sigprofiler arm |
2-3 w |
| P2 K arbitration + seed law | sigminer | port ms_select_k semantics (CV argmin → stability veto → diagnostics) behind the bp survey; single-root-seed derived streams |
K agreement with msuiter arbiter on the three-tier calibration cells; ≥ baseline 2.3.3 on Hungarian-matched P/R/F1 in evaluation cells (bench/scoring protocol, TP-only per PI ruling D1/D2); byte-identical rerun from one seed | 1-2 w |
| P3 Refit upgrade | sigminer | clean-room method="likelihood" (MuSiCal semantics) + method="lrt" (PASA/mSigAct branch semantics) added to sig_fit; parallel bootstrap route |
presence-test null calibration inside the judgment window (reuse the 198-cell M3b calibration protocol, vignettes/articles/roadmap.qmd:177); no regression on flat-signature cells (SBS5/40 underestimation is the known failure mode, vignettes/articles/research-00-executive-summary.qmd:30); bootstrap speed claim is MEASURED-then-stated — closes the UNMEASURED row vignettes/articles/performance.qmd:68-81 / vignettes/articles/architecture.qmd:321 honestly |
3-4 w |
| P4 QC sentries | msuiter first (adapter/report PR), optional sigminer backport issue |
ms_qc_report surfaces (burden distribution, gt/ct mechanism sentries, artifact-roster exposure share) |
injected-artifact fixtures: sentry recall = 1, documented false-positive ceiling; report carries provenance checklist | 1 w |
| P5 Catalog currency | sigminer |
get_sig_db mirror + updater to v3.6 (+ mm39, closes #459) |
every numeric file = sha256 pin against the pinned SigProfilerAssignment mirror rev; zero COSMIC numerics committed (D3); updater fully offline-fixture-tested (refdb pattern, ARCH sec.6 item 2) | 1-2 w |
| P6 Evidence loop | msuiter (bench/ PRs only, per “competitor containers bench-only”) |
new sigminer arms (rust vs R backend, pre/post each phase) through the m7 harness; GO-05 anchor probe + CI-noise anchor gate + floor gate govern comparability (ROADMAP M7 entry vignettes/articles/roadmap.qmd:230; devlog 2026-10-11 amendments) |
42-cell regeneration all-ok, zero cached, host/hw_profile stamped (U-M7-04 B1a writer); parity = sigminer arms ≤ 2x sigprofiler wall AND no TP-only-judgment regression; measured table is the release-attestation artifact for sigminer v3 |
2 w |
| P7 Campaign (not a PR) | campaign | G0 primary run (blocked on author G0_CATALOG_PATH), RB-10 bootstrap shot, clock-pinned host |
each produces a path:line-sealed devlog entry, per house law | operator-gated |
Sequencing: P0/P5 are independent quick wins and can start now; P1 → P6-regen is the parity spine; P2/P3 gate on P1 (they benchmark the fast kernel); P4 is orthogonal. If a phase’s gate fails, that phase stops at its PR — it does not block the others.
6. What NOT to do (YAGNI cuts)
- Do not rewrite the extraction pipeline in R for speed; the kernel swap is the answer, pipeline rewrites re-open the witnessed-NAMESPACE can of worms (m7 adapter header lesson,
bench/m7/adapters/run_sigminer.R:12-19). - Do not add GPU NMF to sigminer v3 — the campaign is CPU-pinned, maintenance cost is real, and the 2x gate is reachable without it (revisit at a G3 review only if the 2x gate fails on CPU).
- Do not move CN/SV work toward msuiter — hard v1.x non-goal (
vignettes/articles/roadmap.qmd:252); keep CN/SV development where the witnessed users are (sigminer), and simply log the SigProfiler CN/SV catch-up drift (G12) for the quarterly review. - Do not adopt substSignature-/SigLDA-style QC as new machinery in this window: those papers were not verifiable in this environment’s academic databases (section 7) and cosine-similarity QC is already superseded by the calibrated
ms_comparenulls for the gates that matter; re-open if the primary sources become attested. - No deep-learning or HDP extraction paths (already ❌/⏳ in CAPABILITY-MATRIX engine matrix
vignettes/articles/capability-matrix.qmd:78; corpus concurrencevignettes/articles/research-00-executive-summary.qmd:25“no credible winner”). - No vendoring of COSMIC numeric matrices into any repo (D3; mirror-pinned provenance only).
- No speed claims in NEWS/README before the P6 measured table lands — zero-fabrication policy as modeled by
vignettes/articles/performance.qmd(“a figure there would be fabricated” — the quoted phrase drifted out of the file at the RB-10 campaign commit 3ed0914 (#24, 2026-10-14), after this plan’s verified date; the standing law is the opening clause “no independently retyped numbers … do not trust the rendering”,vignettes/articles/performance.qmd:3-9). - Do not chase mSigSDK/mSigPortal — zero registry hits, existence unattested (
vignettes/articles/research-07-algorithm-zoo.qmd:17).
7. Verification log and declared blind spots
Opened and relied on: sigminer local tree (all cited files); gh issue view 478 (body = rust-NMF URL only), 470 (full traceback + owner comment), 472, 479, 456, 455, 460, open-issue list (8 open incl. #456 “v3 plan & roadmap”); gh release list sigminer (2.3.3 latest, 2026-09-26) and SigProfilerExtractor (v1.4.0 2026-06-18) + CHANGELOG through working-tree 1.5.0; gh repo view omicverse/rust-NMF (bit-equivalence and 76-280x claims, README verbatim); PASA paper page via WebFetch (Jiang/Wu/Rozen 2024, bioRxiv 10.1101/2024.05.20.594967 — “no approach achieved both high precision and recall”); arxiv listing (Egendal 2024 NNMF-autoencoder line arxiv.org/abs/2405.07879v1, VAE-MS 2602.22239v1, NB-NMF model-selection 2206.03257v2 — corroborate the algorithm-zoo rows of vignettes/articles/research-01-extraction-methods.qmd and vignettes/articles/research-07-algorithm-zoo.qmd); m7 timings CSV and adapter; msuiter docs as path-cited.
Blind spots (declared, not papered): the task-brief-named “Koslicki–Strauß KL-NMF benchmarks 2024” was not found in this environment’s scholar databases (openalex/pubmed/arxiv/crossref returned 0 or noise); the brief’s substSignature/SigLDA references likewise unattested here; sigminer issue #456’s cited Nature article (s41467-024-03711-6) returned 404 and StarSignDNA’s bioRxiv page (issue #460) 403. Where a claim depended on benchmarking literature, the doc cites instead the fact-checked msuiter corpus rows (vignettes/articles/research-00-executive-summary.qmd:30-31 → Medo 2024 Nat Commun 12-tool, Jiang 2025 Brief Bioinform bbaf042 13-tool) whose adjudication is itself audited in vignettes/articles/research-08-fact-check-audit.qmd. rust-NMF’s GPL status is taken from vignettes/articles/research-00-executive-summary.qmd:50 and must be re-confirmed at P1 kickoff before any code flow decision. RESOLVED at P1 kickoff (2026-10-14), controller ruling: re-confirmation done against primary sources — github.com/omicverse/rust-NMF LICENSE states verbatim that the port is “distributed under the same license” as the GPL(>=2) R NMF package and Cargo.toml carries license = "GPL-2.0-or-later"; the crate ships only as the pyo3 wheel nmf-rs (absent from crates.io) and carries no consensus-nrun layer. Ruling: P1 proceeds by extending msuiter’s certified Apache-2.0 src/rust/engine KL-MU kernel (U-M1s-14 PASS, vignettes/articles/roadmap.qmd:99-102) and exposing it to sigminer across the Suggests-gated isolated-process boundary (system(cmds) + reticulate precedent R/sigprofiler.R:96,199) — no external GPL kernel is linked into either package (sigminer MIT, msuiter Apache-2.0; clean-room policy vignettes/articles/architecture.qmd:304). rust-NMF is repositioned as an independent yardstick: its published bit-equivalence pytest fixtures corroborate achievability of the 1e-10 gate, while its 76-280x speed claims stay UNMEASURED until P6 re-measures them (zero-fabrication law, vignettes/articles/performance.qmd:3-9). Open proviso carried into the P1 PRs: the arm’s-length doctrine licensing the isolated-process route for GPL components requires legal sign-off quoting the FSF FAQ verbatim (could not be fetched in the scouting window); evidence dossier retained in the lane’s scratch bank.
AS-BUILT note (2026-10-19; sigminer PR #482 history, squashed commit e2c655c4 “fix(p1): declare msuiter as a runtime-gated optional dependency, not Suggests”): the two “Suggests-gated” formulations above (section 5 P1 row; the P1-kickoff ruling in this section) record the as-planned route and must be read against the as-built truth: the sigminer-side Suggests entry was REVERTED (CRAN-unresolvable) and the boundary is gated by an optional runtime-gated install route instead. Root cause, verbatim from the commit: “sigminer CI installs deps::.(including Suggests) from the CRAN mirror at pkg.lock creation, so the GitHub-only msuiter entry hard-failed setup on all five arms ("Can’t find package called msuiter"). Enforcement is the requireNamespace gate in .require_msuiter(), which now carries the install route (WangLabCSU/msuiter; not on CRAN) in its reticulate-idiom message.” The as-built code (sigminer origin/master R/rust_backend.R):
.opt_ns_loadable <- function(name) {
requireNamespace(name, quietly = TRUE)
}
.require_msuiter <- function() {
if (!.opt_ns_loadable("msuiter")) {
stop("Package 'msuiter' is required for the rust backend. It is not on ",
"CRAN; install it from https://github.com/WangLabCSU/msuiter, e.g. ",
"pak::pkg_install(\"WangLabCSU/msuiter\").", domain = NA)
}
invisible(TRUE)
}The .opt_ns_loadable indirection is load-bearing: the house static checker flags an undecleared requireNamespace() of a package absent from DESCRIPTION (a gate-warning failure) and Suggests is unavailable as the declaration site (the e2c655c4 root cause above), so the probe goes through a wrapper the checker cannot constant-fold. The isolated-process boundary itself (the system(cmds) bridge to the certified msuiter KL-MU kernel) shipped as ruled; only the dependency-declaration mechanism moved. Provenance: sigminer local ground-truth tree, origin/master R/rust_backend.R; banked in the lane’s scratch bank.
8. Contradictions worth the controller’s attention
- The m7 table measures sigminer CRAN 2.3.1 (
bench/m7/adapters/run_sigminer.R:2“SigMiner 2.3.1 cell runner”), while local master is 2.3.3 with the #479 multi-core fix — so the measured 20-45x gap includes a defect already fixed; P6 regeneration will attribute how much. -
sigprofiler_importstill advertisestype='refit'(R/sigprofiler.R:240roxygen) although the interop’s own NEWS deprecates the upstreamrefit_denovo_signaturesoption (#470) — the import surface and the deprecation narrative disagree; needs source-truth re-verification, not doc-truth. - msuiter’s positioning (“sigminer keeps CN/SV as differentiators”, ROADMAP non-goal deferral
vignettes/articles/roadmap.qmd:252) sits againstvignettes/articles/research-05-standards-data.qmd:24+ Extractor 1.5.0 showing SigProfiler already distributes CN/RNA-SBS references and SV matrices — a quiet narrowing of the moat the quarterly G3 review should adjudicate.
9. P-1 release-gate evidence table — first-measurement-only annotation (2026-10-19)
The P-1 gate (“on the P6 table, sigminer arm wall-clock <= 2x sigprofiler arm”, section 5) was adjudicated MEASURED-FALSE by the sealed P6 campaign verdict, committed at bench/results/p6_regen_20261016-011928/result.md:6: “FAIL — 18 offending class(es)” spanning ratios 22.166 .. 67.102. The P7-F forensics (five-gate ledger, “P7-F FINAL REPORT CROSS-CHECK” + “CONTROLLER TWIN RESULT” sections) established that two families of committed rows are FIRST-MEASUREMENT-ONLY — citable as the campaign’s own sealed record, not as defensible external figures. The annotation below governs every future citation of this table; the committed campaign bytes stay unedited (sealed-evidence immutability law, V2).
| evidence | value | provenance | status |
|---|---|---|---|
worst committed row: sigminer_post_v3_rust__comp_flat_triple__N10000
|
wall 1318.56 s / cpu 1301.013 s | bench/results/p6_regen_20261016-011928/timings_sharded_master.csv:97 |
FIRST-MEASUREMENT-ONLY |
shared denominator: sigprofiler__comp_flat_triple__N10000
|
wall 19.65 s / cpu 48.128 s | bench/results/p6_regen_20261016-011928/timings_sharded_master.csv:79 |
uncontested |
| first-measurement worst-class ratio | 1318.56 / 19.65 = 67.102 | sealed in result.md:6 + gate_ledgers/p6_seal_report.json
|
sealed record; not the citable figure |
| verbatim campaign re-run of the worst cell (protocol-identical driver argv, isolated cachedir) | wall 688.16 s / cpu 678.347 s (cell timing.json cpu_seconds 678.347224, exit 0; shard row column-identical to the committed master law) |
five-gate ledger, P7-F cross-check (PR-10 artifacts read own-hands) + controller twin 687.16/677.381 (fifth measure, 0.15 % wall / 0.14 % cpu agreement; byte-twin input match 4/4) | byte-attested |
| 20-cell inflation cluster | master/witness ratio 1.5 .. 2.0, ALL inside the comp_* competitive arms (comp_flat_triple / comp_strong_flat / one clock_only), max 1.97; main__ cells clean at ~1.0 |
five-gate ledger, P7-F full-witness census (126 committed witness pairs) | FIRST-MEASUREMENT-ONLY |
| co-tenancy outlier |
sigminer_post_p1_rust__comp_strong_flat__N1000 wall 9293.22 / cpu 1388.44 (ratio 0.149); the arm is not depended on by the P-1/P-2 gates |
five-gate ledger, S1d adjudication addendum | mid-campaign rig event, excluded |
| defensible worst-class citation (supersedes 67.102) | 688.16 / 19.65 = 35.0x | five-gate ledger, P7-F ruling V1 | citable |
Verdict UNHARMED. Under every reading — sealed campaign-rig 22.166 .. 67.102, calibration-rig ~35.7, post-correction defensible 35.0x — every class sits far past the <= 2x parity gate (section 5, P6 row “parity = sigminer arms <= 2x sigprofiler wall”), so the P-1 MEASURED-FALSE adjudication stands exactly as sealed: the controller five-gate wording is “P-1 MEASURED-FALSE verdict stands under EVERY reading … all classes >> 2x on both” and ruling V1 keeps all 18 classes “≥ ~35x-class past the gate under reproducible bytes”. Closing the remaining ~35x gap is Phase-2/Phase-3 engine scope (the ~170 s pipeline-floor finding, five-gate structural section), not a docs correction — and no speed claim is made here beyond the already-filed MEASURED verdicts (zero-fabrication law, vignettes/articles/performance.qmd:3-9). The inflation mechanism (leading hypothesis, banked to the Phase-2 real-status-channel work: silent kernel death + silent retry with discarded exit status) remains UNPROVEN in-lane; the annotation states the measurement-localized facts only. Synthetic-only law holds throughout the campaign and this table: all inputs are the frozen G0 simulator’s output (master seed 20260928, committed Seeds.txt); zero COSMIC numerics are inlined here or in the campaign bytes (D3). Banked in the lane’s scratch bank.