Skip to contents

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 via gh (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

  1. sigminer’s lag vs SigProfiler is on three axes, not cosmetics: compute kernel (R NMF package call chain), decision science (K arbitration, refit selection, QC sentries), and catalog currency (bundled COSMIC v3.4 vs upstream default v3.6).
  2. 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).
  3. The kernel axis has an upstream answer already staged: sigminer issue #478 (OPEN) names omicverse/rust-NMF — bit-equivalent to R NMF brunet/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 entry vignettes/articles/roadmap.qmd:99-102), so the cross-check tooling exists to certify such a swap.
  4. 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).
  5. 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 (pinned ff61b0f mirror bundle, ROADMAP vignettes/articles/roadmap.qmd:165) as the working precedent.
  6. 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.
  7. 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

  1. 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.

  2. 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).

  3. 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)

  1. 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).
  2. 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).
  3. 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.
  4. 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_compare nulls for the gates that matter; re-open if the primary sources become attested.
  5. No deep-learning or HDP extraction paths (already ❌/⏳ in CAPABILITY-MATRIX engine matrix vignettes/articles/capability-matrix.qmd:78; corpus concurrence vignettes/articles/research-00-executive-summary.qmd:25 “no credible winner”).
  6. No vendoring of COSMIC numeric matrices into any repo (D3; mirror-pinned provenance only).
  7. 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).
  8. 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

  1. 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.
  2. sigprofiler_import still advertises type='refit' (R/sigprofiler.R:240 roxygen) although the interop’s own NEWS deprecates the upstream refit_denovo_signatures option (#470) — the import surface and the deprecation narrative disagree; needs source-truth re-verification, not doc-truth.
  3. msuiter’s positioning (“sigminer keeps CN/SV as differentiators”, ROADMAP non-goal deferral vignettes/articles/roadmap.qmd:252) sits against vignettes/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.