# DESeq Desk > A bulk RNA-seq differential-expression desk at https://deseq-desk.skillsafe.ai/. Load a gene-by-sample counts matrix and a sample sheet (or generate a synthetic experiment with a known truth); the browser runs the pydeseq2 0.5.4 pipeline on it for free - size factors, dispersions, Wald tests, Cook's and independent filtering, Benjamini-Hochberg adjusted p-values, optional LFC shrinkage - and flags what makes a result hard to trust. A metered run (model gpt-terra) then reviews what the result supports, or writes a pydeseq2 script that reproduces it and runs follow-up checks. Derived from the agent skill @k-dense-ai/pydeseq2 (k-dense-ai/scientific-agent-skills). ## What the free lane computes (in the browser, nothing uploaded) - Reads CSV/TSV counts (first column the gene id; featureCounts output with its annotation columns skipped and BAM-path column names matched to the sheet's ids; htseq-count/STAR summary rows left out; samples in rows or columns, recognised from the sample ids) and a sample sheet (first column the sample id), and lines them up as the skill's run_deseq2_analysis.py does: the intersection in the counts' order, samples missing the condition dropped, genes with fewer than min_counts (default 10) reads in total removed. Non-integer or negative counts are refused, as pydeseq2 refuses them. - Design ~condition or ~batch + condition with a chosen reference level; median-of-ratios size factors; method-of-moments start, gene-wise dispersion MLE with the Cox-Reid term, the parametric trend a0 + a1/mean (gamma GLM with pydeseq2's 1e-4 / 15 outlier loop, mean fallback), the log-normal prior width (MAD squared minus trigamma((m-p)/2), floor 0.25), MAP dispersions, dispersion outliers kept at their gene-wise value; the negative binomial GLM by IRLS; Cook's distances with trimmed-mean replacement and refit in cells with 7+ replicates; the Wald test; Cook's filtering; independent filtering (pydeseq2's lowess rule over 50 baseMean quantiles) and BH adjustment; optional shrinkage of the tested coefficient with pydeseq2's adaptive Cauchy prior. - The optimiser is a JavaScript port of scipy's L-BFGS-B, the routine pydeseq2 calls (bit-exact against scipy on 123 test problems). Against pydeseq2 0.5.4 on 120 random experiments (49,206 genes): size factors and baseMean to 1e-15, 99.4% of gene-wise dispersions to 1e-6, the significant-gene count identical in 119 of 120, 96.2% of p-values within 1%. The rest trace to genes whose dispersion search starts at pydeseq2's 1e-8 floor, where rounding decides where its line search stops. - Page diagnostics: replication and residual degrees of freedom, size-factor spread, samples left out, Cook's outliers, dispersion outliers, the p-value histogram's shape, filtering share, and for synthetic data true and false positives. - Exports: deseq2_results.csv and significant_genes.csv in pydeseq2's results_df layout, normalised counts, report JSON (with the facts), Markdown summary, the skill's run_deseq2_analysis.py command line, and for synthetic data counts.csv / samples.csv. ## The metered lanes (task field) - review: verdict (sound / caveated / unreliable, never looser than the browser's read unless the flags behind it are dismissed), a reading of every metric, what the result shows, changes to try, the user's claims judged against the facts, a methods paragraph stating the exact design, contrast, filter and alpha, and what the result cannot show. - script: follow-up fixes and one pydeseq2 script that reads the same files, filters genes at the same count, builds DeseqDataSet and DeseqStats with every browser setting as a literal, shrinks exactly when the browser did, checks an EXPECTED dict of browser values with math.isclose, then applies the fixes. Input: {task, title, context, facts (JSON string built by the page), question?, decision? (script only)}. The model never sees the counts, never states what a gene does, and is told never to compute a new number; the page reconciles every reply against the browser's facts. API: https://deseq-desk.skillsafe.ai/api.html ## Limits Categorical designs with one condition factor and an optional batch factor; Wald tests only (no likelihood-ratio test); median-of-ratios size factors only (a matrix in which every gene has a zero is refused, where pydeseq2 would switch to iterative size factors); up to 6 million matrix cells. A statistical call is not a biological explanation. ## Source Agent skill: https://skillsafe.ai/skill/@k-dense-ai/pydeseq2 (repository https://github.com/k-dense-ai/scientific-agent-skills, skills/pydeseq2). PyDESeq2: https://github.com/scverse/PyDESeq2 (Muzellec et al. 2023, Bioinformatics, doi:10.1093/bioinformatics/btad547). DESeq2: Love, Huber and Anders 2014, Genome Biology, doi:10.1186/s13059-014-0550-8. No pydeseq2 code or data is included; see https://deseq-desk.skillsafe.ai/NOTICE.txt