Install any skill in seconds. Free to start, no credit card required.
Get Started Free →FASTQ quality control and adapter/quality-trimming decisions with local NGS tools — run FastQC on raw reads, summarize a project with MultiQC, interpret per-base sequence quality, per-base N content, adapter content, overrepresented sequences, sequence duplication and GC content, and decide whether (and how) to trim with fastp / Cutadapt before downstream analysis. seqkit for read counts/stats/subsampling. Use when someone asks "run QC on my FASTQs", "are my reads good quality?", "do I need to t
.claude/skills/tooluniverse-fastq-qc/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
Run quality control on raw sequencing reads, interpret the report, and make an evidence-based decision about whether to trim — using real local command-line tools (FastQC, MultiQC, fastp, Cutadapt, seqkit).
This skill drives real binaries. It must never fabricate QC numbers.
PATH. If a required tool is missing, emit the install plan and STOP. Do not estimate, guess, or describe hypothetical QC results.
Only trim after inspecting adapter content / per-base quality, and only when the user has confirmed --mode trim.
--workdir.The input directory is read-only. Trimmed reads are written as NEW files.
install plan" is the correct answer — not a made-up PASS/FAIL table.
Use this skill when the user wants to:
.fastq, .fq, .gz) filesDo NOT use this skill for (route elsewhere):
tooluniverse-rnaseq-deseq2tooluniverse-sequence-analysistooluniverse-variant-analysistooluniverse-single-cellBefore running, confirm with the user (ask if unstated):
paired-end (e.g. *_R1.fastq.gz / *_R2.fastq.gz).
by fastp; amplicon/primer sequences usually need explicit Cutadapt removal.
is requested (needs a reference; see Limitations).
--workdir SEPARATE from the input folder.Already-trimmed reads should NOT be trimmed again; UMIs must be handled before trimming or you corrupt the UMI.
The bundled script preflights for you, but the decision logic is:
pythonimport shutil for tool in ("fastqc", "fastp", "seqkit"): print(tool, shutil.which(tool) or "MISSING")
command -v fastqc / shutil.which("fastqc") returning nothing means the tool is absent. If a required tool (FastQC for QC; FastQC+fastp for trim) is missing, emit:
mamba install -c bioconda -c conda-forge fastqc fastp seqkit multiqc
# or
conda install -c bioconda -c conda-forge fastqc fastp seqkit multiqcand stop. Do not proceed to fabricate output.
| Tool | Role | Install (bioconda) | |-----------|----------------------------------------------------------------|--------------------| | FastQC | Per-file raw read QC; produces the module PASS/WARN/FAIL report | fastqc | | MultiQC | Aggregates many FastQC (and fastp) reports into one summary | multiqc | | fastp | All-in-one QC + adapter + quality trimming (fast, auto-detect) | fastp | | Cutadapt | Explicit, precise adapter/primer removal (amplicons, custom) | cutadapt | | seqkit | Read counts, length/GC stats, subsampling | seqkit |
Rule of thumb: FastQC to diagnose, fastp to fix general adapter/quality, Cutadapt to fix a known primer/adapter precisely, seqkit to count/stat.
scripts/run_fastq_qc.py does the preflight + run-if-available + plan-if-missing flow, with workspace isolation built in.
bash# QC only (default) — never modifies reads python scripts/run_fastq_qc.py \ --fastq reads/sample_R1.fastq.gz reads/sample_R2.fastq.gz \ --workdir /tmp/fastq_qc_run # QC + trim (explicit) — fastp writes NEW trimmed files into --workdir python scripts/run_fastq_qc.py \ --fastq reads/sample_R1.fastq.gz reads/sample_R2.fastq.gz \ --workdir /tmp/fastq_qc_run \ --mode trim
Behavior:
tool is missing it prints the install plan and exits 0 — no fabricated QC.
--workdir.--mode trim, runs fastp writing *.trimmed.fastq.gz into--workdir/trimmed/ — raw inputs are never touched.
--workdir equals an input directory (overwrite guard).For a project-level summary after FastQC, run MultiQC over the workdir:
bashmultiqc /tmp/fastq_qc_run -o /tmp/fastq_qc_run/multiqc
This table is the core value-add. Map each FastQC module to what PASS/WARN/FAIL means and what to actually do. (See references/fastqc_interpretation.md for the long form with thresholds and worked cases.)
| FastQC module | Typical PASS | WARN / FAIL means | Suggested action | |------------------------------|---------------------------|----------------------------------------------------------------|------------------| | Per base sequence quality | All positions Q>=28 | 3' tail drops below Q20-Q28 (common, esp. R2) | Quality-trim 3' (fastp -q/sliding window). Proceed if only the last few bases dip. | | Per base N content | Near 0% N | Spike of N at a position = sequencer/base-call problem | Investigate: cycle-specific issue; consider hard-trim that position or re-sequence. | | Adapter content | Flat, no adapter ramp | Rising adapter % toward 3' end = read-through into adapter | Trim adapters (fastp auto-detect, or Cutadapt with the known adapter). | | Overrepresented sequences | None / <0.1% | A sequence is a large fraction: adapter, primer-dimer, rRNA, or low-complexity | Investigate the hit (BLAST it). If adapter/primer -> trim. If biology (rRNA/highly-expressed) -> proceed. | | Sequence Duplication Levels | Low (diverse library) | High duplication = PCR over-amplification OR expected (amplicon/RNA-seq) | Investigate, usually proceed. Do NOT dedup blindly — expected high in amplicon/targeted/RNA-seq. Mark-duplicates belongs post-alignment, not here. | | Per sequence GC content | Single peak at expected GC| Bimodal / shifted peak = contamination or mixed species | Investigate contamination (needs a reference screen; see Limitations). Not fixed by trimming. | | Per base sequence content | Flat after first ~10 bp | Bias in first bases (random-hexamer priming) or adapter | Random-priming bias: usually proceed (expected in RNA-seq). Persistent bias at 3' -> adapter -> trim. | | Sequence Length Distribution | Single length (raw) | Multiple lengths AFTER trimming is normal; before trimming may indicate mixed input | Usually proceed; only a concern on supposedly-raw uniform-length data. |
Decision summary for "do I need to trim?"
biology (rRNA, abundant transcript) -> no, proceed.
--mode qc): FastQC + seqkit -> read the report.--mode trim (fastp) or Cutadapt for preciseprimer removal; re-run FastQC on the trimmed output to confirm the fix.
commands run. Never report numbers a tool did not actually produce.
installed (bioconda). This is not a cloud service; with no tools installed the skill can only emit an install plan, not QC results.
single-pass and memory-light but still I/O-bound. Use seqkit sample to subsample for a quick look on huge files.
anomalies and "is this the right organism" need a reference index (e.g. FastQ Screen + bowtie2 indexes, or Kraken2) — extra setup beyond this skill's bundled tools.
decision (Picard/samtools markdup); FastQC duplication is diagnostic only.
corrupts UMIs.
references/fastqc_interpretation.md — full module-by-module thresholds + casesreferences/tools_and_install.md — install commands, tool flags, command recipesreferences/trimming_decisions.md — when/how to trim (fastp vs Cutadapt), pitfalls| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +22 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.