All five outputs are written and validated. Here is what I did and found.

## Pipeline

**Trimming (cutadapt 5.2).** RPF: 3′ adapter `AGATCGG…`, `--discard-untrimmed` (a footprint always reads through), then for the 20 libraries with `umi_5p=4, umi_3p=5` a second pass cut 4 nt/5 nt and moved the two UMI pieces into the read name. RNA: paired adapter trim (the simulated R2 carries the same adapter prefix).

**Contaminant screen.** bowtie2 vs `contaminants.fa`, unaligned reads kept. rRNA/tRNA/small-RNA share is **42–64 % of RPF** libraries and **1.8–4.0 % of RNA** libraries.

**Alignment / quantification.** RPF → bowtie2 `--norc` against `panel_pc_transcripts.fa` (99.8 % aligned). RNA → salmon (`-l ISR`) against `panel_all_transcripts.fa`; **gene mRNA = sum of TPM over protein-coding isoforms only**. That is a judgement call and it matters: non-coding-isoform share varies strongly across lines for many genes, and aggregating all isoforms pushed the slope distribution left (median β 0.76, fat spurious buffered tail) versus a clean mode at 0.9–1.0 with coding-only aggregation. A separate bowtie2 pass against all transcripts was used for genotyping so that reads from non-coding isoforms are not forced onto the variant-bearing transcript.

**Duplicates.** UMI libraries deduplicated on (UMI, transcript, position, length): 14–30 %. Non-UMI libraries: position-based duplicate rate 32–46 % reported but **not** removed (indistinguishable from independent fragments). The two columns are therefore not directly comparable — noted here because it is a real caveat.

**P-sites.** Per library and per read length, offset = −(mode of the 5′-end position relative to the start codon), cross-checked against the dominant reading frame in CDS bodies. Retained lengths = those with a dominant frame ≥ 0.5 and enough reads: **26–33 (36-cycle libraries), 26–34 (50-cycle), 28–37 for the two MNase libraries**, with offsets 11–13 (RNase I) and 13–16 (MNase). In-frame share 0.754–0.759 everywhere. Counting window = CDS minus first 15 and last 5 codons.

**Library identity and purity.** 2 100 coding variants; genotypes (0/0.5/1) inferred jointly for the 20 lines by an EM over all 80 libraries, then each library fitted with a binomial mixture that also carries a symmetric error rate and an alt-allele-loss term (alt reads are systematically under-recovered, ~5–13 %), with forward selection of sources (LR > 20). All 40 RPF libraries were assigned; the assignment gives exactly 20 distinct lines in each replicate group. **32 of 40 RPF libraries are mixtures: one foreign line at 11–25 %; 8 are pure.** RNA libraries are ~0–5.6 % foreign, mostly diffuse.

**Unmixing.** Within each assay × replicate group the 20 × 20 mixture matrix was inverted to recover pure per-line profiles before normalisation. Validation: the footprint profile of a line loaded on its contaminant's mRNA with coefficient 0.081 (median) before unmixing and −0.005 after; the loading on its own mRNA rose from 0.34 to 0.44.

**β estimation.** Per gene, a maximum-likelihood errors-in-variables model with a structural x, known per-gene measurement-error variances on both axes (from replicate differences, variance-scale shrinkage toward an expression trend) and an equation-error term for genuine TE variation. β from the likelihood profile, `se` from the profile ±0.5-unit interval, `z` = signed root likelihood ratio against β = 1. Simulation checks: unbiased, ~3 % false-positive rate at β = 1.

## Results

- Analysis set **1 179 genes**; median β **0.808**; 201 genes with z < −1.96 versus 30 with z > +1.96, i.e. a clear asymmetric buffering signal.
- Among precisely estimated genes the mode sits at 0.9–1.0 (unbuffered bulk) with a distinct group at β ≈ 0 (complete buffering) — the top of `buffered_genes.tsv` is that group (rank 1 β = 0.006, z = −7.11; rank 100 z = −2.74; median β of the top 100 = 0.40).
- Reported error variances are for the replicate-averaged per-cell-line values actually used in the regression (medians over analysis genes): RNA 0.0727, RPF 0.0273 log2². Per-library values are twice these. RNA noise is ~12× Poisson, i.e. real library-level dispersion, not a quantification artefact (a count-based check gave 0.051 vs salmon's 0.059 per library).

## Uncertainties / caveats

- Median β is 0.81 rather than 1. Most of that is a genuine buffered subpopulation, but a residual attenuation of a few percent cannot be excluded: replicate differences only measure error that is independent between the two replicates, so any measurement error shared by both replicates of a line would still attenuate β.
- Ranking stability: perturbing the mRNA error variance by ±15 %, or ranking on the Wald statistic instead, changes 16–25 of the 100 genes. The top ~40 are stable.
- RNA foreign fractions (~3 %) sit near the method's noise floor; some components reappear in the matching RPF library (consistent with culture-level contamination) and some do not (library-level). I would not defend individual RNA sources below ~0.02; the 11–25 % RPF sources are solid and reproduce across both replicates of each line.
- The two MNase libraries (CL01 and CL07, replicate 2) were handled with their own retained lengths and offsets, but any residual nuclease-specific gene bias adds noise to those two lines.
- `cds_reads` is post-deduplication for UMI libraries; one panel gene (ENSG00000277858) received zero TPM from salmon and drops out (it fails the filters regardless).
- Nothing was approximated or skipped: all 80 libraries went through the full pipeline.
