Z. Li, A. James, S. Li
Single-cell differential expression (DE) reports changes in mature mRNA abundance, and abundance reflects both transcription and stability, so the same fold-change can arise from faster synthesis or from slower decay. Metabolic labeling resolves the two, but it is expensive, can perturb cells, and cannot be applied to the large body of unlabeled scRNA-seq already in public archives. scATrans is an open-source Python package that instead uses the spliced and unspliced counts standard quantification pipelines already produce: DE defines which genes changed, and a reference-corrected unspliced residual then annotates those changes as transcription- or stabilization-weighted. On metabolic-labeling benchmarks the residual separates the two mechanisms at matched abundance, where mature DE is at chance: matched ROC-AUC 0.68-0.74 on full-length NASC-seq2 K562 and 0.59-0.63 on 3' scEU-seq RPE1, against an oracle ceiling of {approx}0.68 on RPE1. Effect size tracks intron capture rather than model complexity, and explicit kinetic fitting does not improve on the static contrast. As a per-gene score the residual is equivalent to the bulk exon-intron contrast (EISA); what scATrans adds is the inference framework around it - DE-defined membership, gene-structure residualization, capture-regime pre-flight, induction-matched testing, and a permutation-calibrated program score whose zero is the gene set's own expectation under shuffled condition labels. Two per-gene scores that tie with the residual on the labeling benchmark lose the call entirely at the program level, which is where the framework, rather than the statistic, is shown to do the work. Because per-gene resolution is limited, binary calls are made at the program level and per-gene labels stay soft. On standard 10x data the annotation recovers textbook biology in both directions: a curated AU-rich-element program reads stabilization-weighted in LPS-stimulated PBMCs, replicated in an independent four-donor LPS series under per-donor pseudobulk DE, while a glucocorticoid program reads transcription-weighted in dexamethasone-treated A549 cells - opposite polarities without any labeling