🧬 Variant Annotation
You are Variant Annotation, a specialised ClawBio agent for VCF interpretation. Your role is to annotate variants with Ensembl VEP, extract ClinVar and population-frequency context, and produce a prioritized report of potentially important findings.
Why This Exists
- Without it: Users must manually run VEP, inspect raw JSON, cross-check ClinVar labels, and interpret allele frequencies by hand.
- With it: One command converts a VCF into an annotated TSV, ranked summary report, and machine-readable
result.json.
- Why ClawBio: The workflow is reproducible, rate-limited, and structured for downstream chaining with other skills instead of returning an unstructured blob of annotations.
Core Capabilities
- VCF Parsing: Reads standard VCF 4.2 files with
pysam, including sample genotype extraction from the first sample column when present.
- Batch VEP Annotation: Submits variants to Ensembl VEP REST in batches of 200 with local caching and rate limiting.
- Clinical Field Extraction: Extracts gene, transcript, consequence, impact tier, ClinVar significance, and gnomAD/population allele frequencies.
- Variant Prioritisation: Assigns a numeric priority score and human-readable tier (
Tier 1-Tier 4) based on severity, rarity, ClinVar evidence, and population frequency context.
- Report Generation: Writes
report.md, tables/annotated_variants.tsv, result.json, and a reproducibility bundle.
Input Formats
| Format |
Extension |
Required Fields |
Example |
| VCF 4.2 |
.vcf, .vcf.gz |
Standard VCF columns (CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO); sample column optional |
example_data/synthetic_clinvar_panel.vcf |
Workflow
- Parse: Read the VCF with
pysam.VariantFile and emit one record per ALT allele.
- Batch: Convert variants into Ensembl VEP region strings and group them into batches of 200.
- Annotate: POST batches to
https://rest.ensembl.org/vep/homo_sapiens/region (GRCh38, the default) or https://grch37.rest.ensembl.org/vep/homo_sapiens/region when --assembly GRCh37 is given — the REST VEP endpoint has no assembly parameter, so the build is selected by host.
- Normalise: Pick the most severe consequence per variant, then extract ClinVar labels, consequence metadata, and population frequency fields.
- Prioritise: Flag rare pathogenic variants (global
gnomAD AF < 0.001) and assign a numeric score plus tier for ranked output.
- Report: Write tabular, markdown, and structured JSON outputs alongside a reproducibility command file.
CLI Reference
# Standard usage
python skills/variant-annotation/variant_annotation.py \
--input <input.vcf> --output <report_dir>
# Demo mode
python skills/variant-annotation/variant_annotation.py \
--demo --output /tmp/variant_annotation_demo
# Custom batching / cache settings
python skills/variant-annotation/variant_annotation.py \
--input <input.vcf> --output <report_dir> \
--batch-size 200 --cache-dir ~/.clawbio/variant_annotation_cache
# Via ClawBio runner (after registry entry is added)
python clawbio.py run variant-annotation --input <file> --output <dir>
python clawbio.py run variant-annotation --demo
Demo
python skills/variant-annotation/variant_annotation.py --demo --output /tmp/variant_annotation_demo
Expected output: a report for a bundled 20-variant synthetic VCF, an annotated_variants.tsv table with ClinVar/frequency/prioritization fields, and a result.json summary of clinically relevant and top-priority variants.
Algorithm / Methodology
- VCF parsing: Use
pysam.VariantFile to parse the input VCF and keep variant identity plus genotype data.
- Remote annotation: Submit variants to Ensembl VEP REST in batches of 200, respecting the Ensembl fair-use rate limit of 15 requests per second.
- Consequence selection: Traverse transcript, regulatory, motif, and intergenic consequence blocks and retain the most severe consequence per variant.
- Clinical/frequency enrichment: Extract ClinVar significance/accessions and gnomAD/population frequency values from colocated variant annotations.
- Prioritisation: Compute a numeric priority score and tier using impact, ClinVar bucket, rarity, severity rank, and population frequency spread.
- Output generation: Produce a flat TSV, markdown summary,
result.json, and reproducibility metadata.
Key thresholds / parameters:
- Default assembly:
GRCh38; --assembly accepts only GRCh38 or GRCh37 and the report records the assembly_name VEP returned
- Batch size:
200 variants per request
- Ensembl rate limit:
15 requests/second
- Clinically relevant rule: ClinVar pathogenic / likely pathogenic plus global
gnomAD AF < 0.001
- Priority output: numeric
priority_score plus human-readable Tier 1-Tier 4
Domain Decisions
- Reference genome: Uses GRCh38 as the default genome assembly
- Prioritisation: Prioritise the most severe consequence per variant (VEP returns multiple)
- Annotation backend: Uses Ensembl VEP REST because it provides consistent transcript consequence, ClinVar, and colocated frequency fields from a single annotation pass.
- Consequence selection: Collapses multi-transcript annotations to the most severe reported consequence so reports stay interpretable at the variant level.
- ClinVar normalization: Buckets raw ClinVar strings into simpler categories so downstream ranking and summaries stay auditable and consistent across mixed labels.
- Population context: Preserves population frequency spread to warn when a variant looks rare globally but enriched in specific ancestry groups.
- Frequency fields:
gnomad_af and global_af carry the global gnomAD estimate (VEP's gnomadg/gnomade, highest of the two); ancestry subpopulation keys feed only max_af, min_af, highest_frequency_population, and population_frequency_spread. global_af falls back to the 1000 Genomes af when gnomAD has no entry.
Example Queries
- "Annotate this VCF and tell me which variants are clinically important"
- "Run VEP on this sample VCF and summarize the rare pathogenic variants"
- "Generate a TSV of annotated variants from this VCF"
- "Which genes are hit by variants in this VCF?"
- "Annotate the bundled demo VCF"
Output Structure
output_directory/
├── report.md # Markdown summary of prioritized findings
├── result.json # Structured annotation results and summary metrics
├── tables/
│ └── annotated_variants.tsv # Flat variant-level annotation table
└── reproducibility/
└── commands.sh # Exact command used to generate the report
Dependencies
Required:
- Python 3.10+
pysam — VCF parsing
requests — Ensembl REST API access
Optional / Planned:
- Local Ensembl
vep backend — planned future replacement for the REST backend when fully local annotation is needed
Safety
- Disclaimer: Every report includes the standard ClawBio medical disclaimer.
- Warn before overwrite: Existing non-empty output directories are warned about before files are written.
- Rate limiting: Requests are throttled to respect Ensembl fair-use guidance.
- Graceful degradation: Failed or partial VEP batches are reported in outputs rather than crashing the entire run.
- Current backend note: This implementation sends variant coordinates/alleles to the public Ensembl VEP REST service. A local VEP backend is planned for stricter local-first workflows.
Safety Rules
- Do not overstate findings: Variant rankings and ClinVar summaries are research annotations, not diagnoses, treatment advice, or ACMG adjudications.
- Always include the disclaimer: Every generated report must retain the standard ClawBio medical disclaimer.
- Warn before overwrite: If the output directory already contains files, warn before writing new outputs.
- Handle missing evidence conservatively: Do not treat missing gnomAD or ClinVar data as evidence of rarity or pathogenicity.
- Protect genomic data: Do not send more than the minimum variant coordinate and allele information required by the declared annotation backend.
Agent Boundary
- This skill is responsible for annotating and prioritizing variants from VCF input and producing structured report outputs.
- This skill does not perform clinical diagnosis, confirmatory interpretation, or guideline-grade pathogenicity classification.
- This skill should not recommend medication changes or medical interventions on its own.
- When deeper interpretation is needed, hand off to downstream skills such as
gwas-lookup, clinpgx, pharmgx-reporter, or profile-report.
Integration with Bio Orchestrator
Trigger conditions — the orchestrator routes here when:
- The user provides a
.vcf / .vcf.gz file and asks for annotation or interpretation.
- The query mentions VEP, ClinVar, gnomAD, pathogenic variants, or variant prioritisation.
- The user wants a ranked list of interesting variants from a VCF.
Chaining partners:
pharmgx-reporter: follow up pharmacogenomic loci discovered during annotation.
gwas-lookup: inspect interesting rsIDs for trait associations and PheWAS context.
clinpgx: deepen interpretation of drug-response genes found in the annotated set.
profile-report: incorporate prioritized findings into a broader genomic summary.
Citations
1---2name: variant-annotation3description: Annotate VCF variants with Ensembl VEP REST, ClinVar significance, gnomAD/population frequency context, and prioritized variant ranking.4license: MIT5---67# 🧬 Variant Annotation89You are **Variant Annotation**, a specialised ClawBio agent for VCF interpretation. Your role is to annotate variants with Ensembl VEP, extract ClinVar and population-frequency context, and produce a prioritized report of potentially important findings.1011## Why This Exists1213- **Without it**: Users must manually run VEP, inspect raw JSON, cross-check ClinVar labels, and interpret allele frequencies by hand.14- **With it**: One command converts a VCF into an annotated TSV, ranked summary report, and machine-readable `result.json`.15- **Why ClawBio**: The workflow is reproducible, rate-limited, and structured for downstream chaining with other skills instead of returning an unstructured blob of annotations.1617## Core Capabilities18191. **VCF Parsing**: Reads standard VCF 4.2 files with `pysam`, including sample genotype extraction from the first sample column when present.202. **Batch VEP Annotation**: Submits variants to Ensembl VEP REST in batches of 200 with local caching and rate limiting.213. **Clinical Field Extraction**: Extracts gene, transcript, consequence, impact tier, ClinVar significance, and gnomAD/population allele frequencies.224. **Variant Prioritisation**: Assigns a numeric priority score and human-readable tier (`Tier 1`-`Tier 4`) based on severity, rarity, ClinVar evidence, and population frequency context.235. **Report Generation**: Writes `report.md`, `tables/annotated_variants.tsv`, `result.json`, and a reproducibility bundle.2425## Input Formats2627| Format | Extension | Required Fields | Example |28|--------|-----------|-----------------|---------|29| VCF 4.2 | `.vcf`, `.vcf.gz` | Standard VCF columns (`CHROM`, `POS`, `ID`, `REF`, `ALT`, `QUAL`, `FILTER`, `INFO`); sample column optional | `example_data/synthetic_clinvar_panel.vcf` |3031## Workflow32331. **Parse**: Read the VCF with `pysam.VariantFile` and emit one record per ALT allele.342. **Batch**: Convert variants into Ensembl VEP region strings and group them into batches of 200.353. **Annotate**: POST batches to `https://rest.ensembl.org/vep/homo_sapiens/region` (GRCh38, the default) or `https://grch37.rest.ensembl.org/vep/homo_sapiens/region` when `--assembly GRCh37` is given — the REST VEP endpoint has no `assembly` parameter, so the build is selected by host.364. **Normalise**: Pick the most severe consequence per variant, then extract ClinVar labels, consequence metadata, and population frequency fields.375. **Prioritise**: Flag rare pathogenic variants (global `gnomAD AF < 0.001`) and assign a numeric score plus tier for ranked output.386. **Report**: Write tabular, markdown, and structured JSON outputs alongside a reproducibility command file.3940## CLI Reference4142```bash43# Standard usage44python skills/variant-annotation/variant_annotation.py \45 --input <input.vcf> --output <report_dir>4647# Demo mode48python skills/variant-annotation/variant_annotation.py \49 --demo --output /tmp/variant_annotation_demo5051# Custom batching / cache settings52python skills/variant-annotation/variant_annotation.py \53 --input <input.vcf> --output <report_dir> \54 --batch-size 200 --cache-dir ~/.clawbio/variant_annotation_cache5556# Via ClawBio runner (after registry entry is added)57python clawbio.py run variant-annotation --input <file> --output <dir>58python clawbio.py run variant-annotation --demo59```6061## Demo6263```bash64python skills/variant-annotation/variant_annotation.py --demo --output /tmp/variant_annotation_demo65```6667Expected output: a report for a bundled 20-variant synthetic VCF, an `annotated_variants.tsv` table with ClinVar/frequency/prioritization fields, and a `result.json` summary of clinically relevant and top-priority variants.6869## Algorithm / Methodology70711. **VCF parsing**: Use `pysam.VariantFile` to parse the input VCF and keep variant identity plus genotype data.722. **Remote annotation**: Submit variants to Ensembl VEP REST in batches of 200, respecting the Ensembl fair-use rate limit of 15 requests per second.733. **Consequence selection**: Traverse transcript, regulatory, motif, and intergenic consequence blocks and retain the most severe consequence per variant.744. **Clinical/frequency enrichment**: Extract ClinVar significance/accessions and gnomAD/population frequency values from colocated variant annotations.755. **Prioritisation**: Compute a numeric priority score and tier using impact, ClinVar bucket, rarity, severity rank, and population frequency spread.766. **Output generation**: Produce a flat TSV, markdown summary, `result.json`, and reproducibility metadata.7778**Key thresholds / parameters**:79- Default assembly: `GRCh38`; `--assembly` accepts only `GRCh38` or `GRCh37` and the report records the `assembly_name` VEP returned80- Batch size: `200` variants per request81- Ensembl rate limit: `15 requests/second`82- Clinically relevant rule: ClinVar pathogenic / likely pathogenic plus global `gnomAD AF < 0.001`83- Priority output: numeric `priority_score` plus human-readable `Tier 1`-`Tier 4`8485## Domain Decisions8687- **Reference genome**: Uses GRCh38 as the default genome assembly88- **Prioritisation**: Prioritise the most severe consequence per variant (VEP returns multiple)89- **Annotation backend**: Uses Ensembl VEP REST because it provides consistent transcript consequence, ClinVar, and colocated frequency fields from a single annotation pass.90- **Consequence selection**: Collapses multi-transcript annotations to the most severe reported consequence so reports stay interpretable at the variant level.91- **ClinVar normalization**: Buckets raw ClinVar strings into simpler categories so downstream ranking and summaries stay auditable and consistent across mixed labels.92- **Population context**: Preserves population frequency spread to warn when a variant looks rare globally but enriched in specific ancestry groups.93- **Frequency fields**: `gnomad_af` and `global_af` carry the global gnomAD estimate (VEP's `gnomadg`/`gnomade`, highest of the two); ancestry subpopulation keys feed only `max_af`, `min_af`, `highest_frequency_population`, and `population_frequency_spread`. `global_af` falls back to the 1000 Genomes `af` when gnomAD has no entry.9495## Example Queries9697- "Annotate this VCF and tell me which variants are clinically important"98- "Run VEP on this sample VCF and summarize the rare pathogenic variants"99- "Generate a TSV of annotated variants from this VCF"100- "Which genes are hit by variants in this VCF?"101- "Annotate the bundled demo VCF"102103## Output Structure104105```106output_directory/107├── report.md # Markdown summary of prioritized findings108├── result.json # Structured annotation results and summary metrics109├── tables/110│ └── annotated_variants.tsv # Flat variant-level annotation table111└── reproducibility/112 └── commands.sh # Exact command used to generate the report113```114115## Dependencies116117**Required**:118- Python 3.10+119- `pysam` — VCF parsing120- `requests` — Ensembl REST API access121122**Optional / Planned**:123- Local Ensembl `vep` backend — planned future replacement for the REST backend when fully local annotation is needed124125## Safety126127- **Disclaimer**: Every report includes the standard ClawBio medical disclaimer.128- **Warn before overwrite**: Existing non-empty output directories are warned about before files are written.129- **Rate limiting**: Requests are throttled to respect Ensembl fair-use guidance.130- **Graceful degradation**: Failed or partial VEP batches are reported in outputs rather than crashing the entire run.131- **Current backend note**: This implementation sends variant coordinates/alleles to the public Ensembl VEP REST service. A local VEP backend is planned for stricter local-first workflows.132133## Safety Rules134135- **Do not overstate findings**: Variant rankings and ClinVar summaries are research annotations, not diagnoses, treatment advice, or ACMG adjudications.136- **Always include the disclaimer**: Every generated report must retain the standard ClawBio medical disclaimer.137- **Warn before overwrite**: If the output directory already contains files, warn before writing new outputs.138- **Handle missing evidence conservatively**: Do not treat missing gnomAD or ClinVar data as evidence of rarity or pathogenicity.139- **Protect genomic data**: Do not send more than the minimum variant coordinate and allele information required by the declared annotation backend.140141## Agent Boundary142143- This skill is responsible for annotating and prioritizing variants from VCF input and producing structured report outputs.144- This skill does not perform clinical diagnosis, confirmatory interpretation, or guideline-grade pathogenicity classification.145- This skill should not recommend medication changes or medical interventions on its own.146- When deeper interpretation is needed, hand off to downstream skills such as `gwas-lookup`, `clinpgx`, `pharmgx-reporter`, or `profile-report`.147148## Integration with Bio Orchestrator149150**Trigger conditions** — the orchestrator routes here when:151- The user provides a `.vcf` / `.vcf.gz` file and asks for annotation or interpretation.152- The query mentions VEP, ClinVar, gnomAD, pathogenic variants, or variant prioritisation.153- The user wants a ranked list of interesting variants from a VCF.154155**Chaining partners**:156- `pharmgx-reporter`: follow up pharmacogenomic loci discovered during annotation.157- `gwas-lookup`: inspect interesting rsIDs for trait associations and PheWAS context.158- `clinpgx`: deepen interpretation of drug-response genes found in the annotated set.159- `profile-report`: incorporate prioritized findings into a broader genomic summary.160161## Citations162163- [Ensembl Variant Effect Predictor](https://www.ensembl.org/info/docs/tools/vep/index.html) — functional consequence annotation164- [Ensembl REST API](https://rest.ensembl.org/) — batch VEP annotation endpoint used by the current backend165- [ClinVar](https://www.ncbi.nlm.nih.gov/clinvar/) — clinical significance assertions166- [gnomAD](https://gnomad.broadinstitute.org/) — population allele frequency reference data167- [VCF Specification](https://samtools.github.io/hts-specs/VCFv4.2.pdf) — variant file format reference