Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create portable bioinformatics pipelines with Workflow Description Language (WDL) using Cromwell or miniwdl execution engines. Use when running GATK best practices pipelines, working with Terra/AnVIL platforms, or building workflows for cloud execution on Google Cloud or AWS.
.claude/skills/bio-workflow-management-wdl-workflows/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 143% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 85% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 131% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 222% | 0% |
<!--
#
#
-->
wdlversion 1.0 task fastqc { input { File fastq Int threads = 2 } command <<< fastqc -t ~{threads} ~{fastq} >>> output { File html = glob("*_fastqc.html")[0] File zip = glob("*_fastqc.zip")[0] } runtime { docker: "biocontainers/fastqc:v0.11.9" cpu: threads memory: "4 GB" } }
wdlversion 1.0 workflow rnaseq { input { File fastq_1 File fastq_2 File salmon_index } call fastp { input: reads_1 = fastq_1, reads_2 = fastq_2 } call salmon_quant { input: reads_1 = fastp.trimmed_1, reads_2 = fastp.trimmed_2, index = salmon_index } output { File quant_sf = salmon_quant.quant_file } }
wdlversion 1.0 task bwa_mem { input { File reference File reference_index File reads_1 File reads_2 String sample_id Int threads = 8 } Int disk_size = ceil(size(reference, "GB") + size(reads_1, "GB") * 3) + 20 command <<< bwa mem -t ~{threads} -R "@RG\tID:~{sample_id}\tSM:~{sample_id}" \ ~{reference} ~{reads_1} ~{reads_2} | \ samtools sort -@ ~{threads} -o ~{sample_id}.sorted.bam samtools index ~{sample_id}.sorted.bam >>> output { File bam = "~{sample_id}.sorted.bam" File bai = "~{sample_id}.sorted.bam.bai" } runtime { docker: "biocontainers/bwa:v0.7.17" cpu: threads memory: "16 GB" disks: "local-disk " + disk_size + " HDD" } }
wdlversion 1.0 workflow process_samples { input { Array[File] fastq_files File reference } scatter (fastq in fastq_files) { call align { input: fastq = fastq, reference = reference } } output { Array[File] bam_files = align.bam } }
wdlversion 1.0 struct SampleFastqs { String sample_id File fastq_1 File fastq_2 } workflow paired_alignment { input { Array[SampleFastqs] samples File reference } scatter (sample in samples) { call align { input: sample_id = sample.sample_id, reads_1 = sample.fastq_1, reads_2 = sample.fastq_2, reference = reference } } output { Array[File] bams = align.bam } }
wdlversion 1.0 workflow conditional_qc { input { File fastq Boolean run_qc = true } if (run_qc) { call fastqc { input: fastq = fastq } } output { File? qc_report = fastqc.html } }
wdlversion 1.0 struct ReferenceData { File fasta File fasta_index File dict File? known_sites } workflow variant_calling { input { ReferenceData reference Array[File] bam_files } scatter (bam in bam_files) { call haplotype_caller { input: bam = bam, ref_fasta = reference.fasta, ref_index = reference.fasta_index, ref_dict = reference.dict } } }
json{ "rnaseq.fastq_1": "data/sample1_R1.fq.gz", "rnaseq.fastq_2": "data/sample1_R2.fq.gz", "rnaseq.salmon_index": "ref/salmon_index", "rnaseq.threads": 8 }
json{ "process_samples.samples": [ { "sample_id": "sample1", "fastq_1": "data/sample1_R1.fq.gz", "fastq_2": "data/sample1_R2.fq.gz" }, { "sample_id": "sample2", "fastq_1": "data/sample2_R1.fq.gz", "fastq_2": "data/sample2_R2.fq.gz" } ], "process_samples.reference": "ref/genome.fa" }
wdlversion 1.0 import "qc.wdl" as qc import "align.wdl" as align workflow main_pipeline { input { File fastq_1 File fastq_2 File reference } call qc.quality_control { input: reads_1 = fastq_1, reads_2 = fastq_2 } call align.alignment { input: reads_1 = quality_control.trimmed_1, reads_2 = quality_control.trimmed_2, reference = reference } }
wdlruntime { docker: "ubuntu:20.04" cpu: 4 memory: "8 GB" disks: "local-disk 100 HDD" preemptible: 3 maxRetries: 2 zones: "us-central1-a us-central1-b" bootDiskSizeGb: 15 }
wdlversion 1.0 task process { input { String sample_id Int memory_gb = 8 Array[File] input_files } Int memory_mb = memory_gb * 1000 String output_name = sample_id + ".processed.bam" command <<< # Access array elements process_tool \ --memory ~{memory_mb} \ --inputs ~{sep=' ' input_files} \ --output ~{output_name} >>> output { File result = output_name } }
wdlversion 1.0 task align { input { File reads_1 File reads_2 File reference } # Calculate disk: input files + 3x for outputs + buffer Int disk_gb = ceil(size(reads_1, "GB") + size(reads_2, "GB") + size(reference, "GB") * 2) + 50 command <<< bwa mem ~{reference} ~{reads_1} ~{reads_2} > aligned.sam >>> runtime { disks: "local-disk " + disk_gb + " SSD" } }
wdlversion 1.0 workflow rnaseq_pipeline { input { Array[String] sample_ids Array[File] fastq_1_files Array[File] fastq_2_files File salmon_index Int threads = 8 } scatter (idx in range(length(sample_ids))) { call fastp { input: sample_id = sample_ids[idx], reads_1 = fastq_1_files[idx], reads_2 = fastq_2_files[idx], threads = threads } call salmon_quant { input: sample_id = sample_ids[idx], reads_1 = fastp.trimmed_1, reads_2 = fastp.trimmed_2, index = salmon_index, threads = threads } } output { Array[File] quant_files = salmon_quant.quant_sf Array[File] fastp_reports = fastp.json_report } } task fastp { input { String sample_id File reads_1 File reads_2 Int threads = 4 } command <<< fastp -i ~{reads_1} -I ~{reads_2} \ -o ~{sample_id}_trimmed_R1.fq.gz \ -O ~{sample_id}_trimmed_R2.fq.gz \ --json ~{sample_id}_fastp.json \ --thread ~{threads} >>> output { File trimmed_1 = "~{sample_id}_trimmed_R1.fq.gz" File trimmed_2 = "~{sample_id}_trimmed_R2.fq.gz" File json_report = "~{sample_id}_fastp.json" } runtime { docker: "quay.io/biocontainers/fastp:0.23.4--hadf994f_2" cpu: threads memory: "4 GB" } } task salmon_quant { input { String sample_id File reads_1 File reads_2 File index Int threads = 8 } command <<< salmon quant -i ~{index} -l A \ -1 ~{reads_1} -2 ~{reads_2} \ -o ~{sample_id}_salmon \ --threads ~{threads} --validateMappings >>> output { File quant_sf = "~{sample_id}_salmon/quant.sf" File quant_dir = "~{sample_id}_salmon" } runtime { docker: "quay.io/biocontainers/salmon:1.10.0--h7e5ed60_0" cpu: threads memory: "16 GB" } }
bash# Validate WDL syntax womtool validate workflow.wdl # Generate inputs template womtool inputs workflow.wdl > inputs.json # Run with Cromwell (local) java -jar cromwell.jar run workflow.wdl -i inputs.json # Run with miniwdl (simpler local runner) miniwdl run workflow.wdl -i inputs.json # Run on Terra # Upload WDL and inputs.json to Terra workspace
| Engine | Use Case | |--------|----------| | Cromwell | Full-featured, Google Cloud, AWS, HPC | | miniwdl | Lightweight local execution | | Terra | Cloud platform with Cromwell backend | | AnVIL | NIH cloud platform (Terra-based) | | dxWDL | DNAnexus platform |
<!-- AUTHOR_SIGNATURE: 9a7f3c2e-MD-BABU-MIA-2026-MSSM-SECURE -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | pass→pass | 9,436 | 8,475 | -10% | 1 | 1 | 0% | 1,883 | 4,575 | +143% | 0 | 0 | — |
case-20 | pass→pass | 10,605 | 7,675 | -28% | 1 | 1 | 0% | 2,257 | 4,175 | +85% | 0 | 0 | — |
case-01 | fail→pass | 13,876 | 11,399 | -18% | 1 | 1 | 0% | 2,842 | 5,480 | +93% | 0 | 0 | — |
case-02 | pass→pass | 10,518 | 7,619 | -28% | 1 | 1 | 0% | 1,970 | 4,555 | +131% | 0 | 0 | — |
case-03 | pass→pass | 6,584 | 5,038 | -23% | 1 | 1 | 0% | 1,234 | 3,969 | +222% | 0 | 0 | — |
case-04 | pass→pass | 10,229 | 7,118 | -30% | 1 | 1 | 0% | 2,080 | 4,494 | +116% | 0 | 0 | — |
case-05 | pass→pass | 7,732 | 8,375 | +8% | 1 | 1 | 0% | 1,601 | 4,686 | +193% | 0 | 0 | — |
case-06 | pass→pass | 9,204 | 4,435 | -52% | 1 | 1 | 0% | 1,772 | 3,855 | +118% | 0 | 0 | — |
case-07 | pass→pass | 11,539 | 6,063 | -47% | 1 | 1 | 0% | 2,153 | 4,146 | +93% | 0 | 0 | — |
case-08 | pass→pass | 8,797 | 2,123 | -76% | 1 | 1 | 0% | 1,420 | 3,371 | +137% | 0 | 0 | — |
case-10 | pass→pass | 8,432 | 6,929 | -18% | 1 | 1 | 0% | 1,715 | 4,567 | +166% | 0 | 0 | — |
case-11 | pass→pass | 8,735 | 8,107 | -7% | 1 | 1 | 0% | 1,986 | 4,846 | +144% | 0 | 0 | — |
case-12 | pass→pass | 9,781 | 6,219 | -36% | 1 | 1 | 0% | 1,698 | 4,226 | +149% | 0 | 0 | — |
case-13 | pass→pass | 8,806 | 7,701 | -13% | 1 | 1 | 0% | 1,885 | 4,696 | +149% | 0 | 0 | — |
case-14 | pass→pass | 8,439 | 3,836 | -55% | 1 | 1 | 0% | 1,499 | 3,667 | +145% | 0 | 0 | — |
case-15 | pass→pass | 8,569 | 6,171 | -28% | 1 | 1 | 0% | 1,569 | 4,135 | +164% | 0 | 0 | — |
case-16 | pass→pass | 7,229 | 4,918 | -32% | 1 | 1 | 0% | 1,447 | 3,819 | +164% | 0 | 0 | — |
case-17 | pass→pass | 12,598 | 9,849 | -22% | 1 | 1 | 0% | 2,204 | 4,821 | +119% | 0 | 0 | — |
case-18 | pass→pass | 9,507 | 6,585 | -31% | 1 | 1 | 0% | 1,754 | 4,218 | +140% | 0 | 0 | — |
case-19 | pass→pass | 10,148 | 7,276 | -28% | 1 | 1 | 0% | 1,906 | 4,350 | +128% | 0 | 0 | — |
case-21 | pass→pass | 7,735 | 3,760 | -51% | 1 | 1 | 0% | 1,578 | 3,729 | +136% | 0 | 0 | — |
case-22 | pass→pass | 9,309 | 7,168 | -23% | 1 | 1 | 0% | 1,983 | 4,374 | +121% | 0 | 0 | — |
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. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/27/2026 | +5% |
Other measured skills in the registry, with their headline benchmark lift.