Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyzes genetic variant effects on gene expression (RNA-seq), chromatin accessibility (DNASE), histone marks (ChIP), and transcription factors using the AlphaGenome API. Use when the user asks about non-coding variant effects, pathogenicity, clinical significance, disease associations, functional effects, gene expression changes, splicing disruption, or regulatory effects in promoters and enhancers. Also use for resolving biological terms to tissue/cell-type ontologies (UBERON/CL) or analyzing
.claude/skills/mkurman-alphagenome-single-variant-analysis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 176% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 82% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 96% | 0% |
uv: Read the uv skill and follow its Setup instructions to ensureuv is installed and on PATH.
this skill directory then (1) prominently notify the user to check the terms at https://deepmind.google.com/science/alphagenome/, then (2) create the file recording the notification text and timestamp.
.env file: Make sure the .env file exists in your home directory.Create one if it does not exist.
ALPHAGENOME_API_KEY: This skill requires an API key to function.You must ask the user for an API key if this skill looks relevant to their request and you do not have one in .env. The user can sign up at https://deepmind.google.com/science/alphagenome/. Do NOT ask the user to paste their key into the chat (this would leak the key into the agent's context). Instead, explain that a key is necessary to use AlphaGenome and give the user this command substituting ENV_FILE with the resolved literal path to the .env file:
bash printf "Enter AlphaGenome API key (typing hidden): " && read -s key && echo && echo "ALPHAGENOME_API_KEY=$key" >> "ENV_FILE" && echo "Saved."
The scripts load credentials automatically via dotenv. NEVER read, print, or inspect the .env file or its variables (e.g. no cat, grep, echo, printenv, or os.environ.get on keys). Credentials must stay out of the agent's context.
When running in sandbox, dotenv.load_dotenv() will be a no-op, and instead the sandbox will read credentials and inject them directly.
python3 or python3 -c directly. The system Python does notnecessarily have pandas, numpy, and other key dependencies. ALWAYS use uv run to run ALL Python code — including scripts, ad-hoc analysis files, and one-liners. Do not attempt to pip install or create new venvs — uv manages an isolated environment automatically.
for gene/transcript lookup. Use lookup_gene_info.py with the local GTF. If it fails, fix the environment/paths, do not switch to external APIs.
ALPHAGENOME_API_KEY must be set before runningany script (in sandbox, credentials are injected automatically).
output.
docs/report-templates.mdfor generating analysis reports, and ensure to include the table of top hits from the discovery scan.
All scripts must be executed using uv run, which manages an isolated virtual environment with the correct dependencies via uv.
bashuv run <script_name> [args...]
For ad-hoc scripts (e.g., inline analysis code saved to a temp file), pass the full path instead of a short name:
bashuv run --project $SKILL_DIR /tmp/my_analysis.py --arg1 val1
> !NOTE] The first invocation resolves and installs dependencies (~10s). > Subsequent runs use the cached environment and start instantly. The cache > lives in ~/.cache/uv/.
tidy_scores and metadata often use gene_name (notgene_symbol) and output_type (not modality). Always inspect df.columns before filtering.
USH2A) break the whole_gene view.Use --view detail or manual regional windows instead.
plot_components.Sashimi does NOT accept astrand argument directly. Filter input tracks instead.
ontology_curie. Checktrack.metadata.columns before filtering.
exec: "python": executable file not found occurs,ensure you are using uv run instead of bare python/python3.
integer type is not available". This occurs when using boolean masks with .iloc on integer-indexed DataFrames in newer pandas versions. Fix: Convert boolean masks to integer indices using np.flatnonzero(mask).
Capitalized column names (Feature, Start, End, Strand) unlike standard GTF files. Always check df.columns if getting KeyErrors.
score_variant ontology filtering: score_variant does NOT acceptontology_terms as an argument. You must filter the returned AnnData objects manually by inspecting adata.var columns. In contrast, predict_variant DOES accept ontology_terms directly.
zoom to include the flanking exons rather than relying on junction overlap alone.
Junction objects from prediction may be simpleIntervals. Use junction_data.get_junctions_to_plot(predictions=..., name=...) to retrieve objects with the .k (abundance/score) attribute.
uv Not Found: If exec: uv: not found, follow the installationinstructions in Prerequisites.
uv fails with 401 Unauthorizedfor a private registry, set UV_INDEX_URL=https://pypi.org/simple before running the script.
patterns
guide, score magnitude rules, ISM, and checklist.
scripts/visualize_variant_effects.py— Single-variant visualization template (Ref/Alt comparisons, Splicing).
visibility:
(Structural Context).
significant splicing junction (e.g., exon skipping events that span multiple exons).
junctions are fully visible. Lesson: Simple fixed windows (e.g., 2kb) or nearest-exon logic often fail for skipping events. Always use the observed junction data to drive zoom levels.
examples/splicing/ — Splicing analysis examplesexamples/model_limitation_RNU4ATAC/— ncRNA structure limitation case study
examples/polyadenylation_HBA2/ — 3'UTR / Polyadenylation case study
examples/regulatory/ — Regulatory variantexamples
examples/negative_result_GATA4/ —Negative results (mathematical artefact)
examples/negative_result_TGFB3/ —Negative results (proxies)
scripts/lookup_gene_info.py — Gene &transcript lookup
scripts/resolve_ontology_terms.py —Ontology term resolution (UBERON/CL IDs)
Use score_variant across differential scorers only to discover unexpected tissue effects.
pythonfrom alphagenome.models import dna_client from alphagenome.models import variant_scorers from alphagenome.data import genome import os import pandas as pd # Setup API Key and Client dna_model = dna_client.create(api_key=os.environ.get('ALPHAGENOME_API_KEY'), address='dns:///gdmscience.googleapis.com:443') # Define Variant (example) variant_str = "chr2:1234:A>C" chrom, pos_str, ref_alt = variant_str.split(':') ref, alt = ref_alt.split('>') pos = int(pos_str) # Use supported sequence length (e.g., 2**20 for optimal performance) SEQ_LENGTH = 2**20 interval = genome.Interval(chrom, pos - SEQ_LENGTH // 2, pos + SEQ_LENGTH // 2) variant = genome.Variant(chrom, pos, ref, alt) scorers = [ variant_scorers.RECOMMENDED_VARIANT_SCORERS[m] for m in variant_scorers.RECOMMENDED_VARIANT_SCORERS if "ACTIVE" not in m and "CAGE" not in m and "PROCAP" not in m ] print(f"Scoring variant {variant_str}...") scores_list = dna_model.score_variant(interval=interval, variant=variant, variant_scorers=scorers) # Process and Display Results all_dfs = [] for score_adata in scores_list: df = variant_scorers.tidy_scores([score_adata], match_gene_strand=True) if df is not None: all_dfs.append(df) if all_dfs: df = pd.concat(all_dfs) significant = df[df['quantile_score'].abs() > 0.995] ranked = significant.sort_values('raw_score', key=abs, ascending=False) print("Top Significant Hits:") print(ranked[['biosample_name', 'gene_name', 'output_type', 'quantile_score', 'raw_score']])
python# Define keywords based on disease context disease_keywords = ["liver", "hepatocyte"] # Filter for any match mask = df['biosample_name'].str.contains('|'.join(disease_keywords), case=False, na=False) relevant_hits = df[mask].sort_values('raw_score', key=abs, ascending=False) print(f"\n--- Extended Analysis (Keywords: {disease_keywords}) ---") print(relevant_hits.head(20)[['biosample_name', 'output_type', 'raw_score', 'quantile_score']])
Variant Analysis Progress:
- [ ] Step 0: Review Golden Examples (MANDATORY)
- [ ] Step 1: Create Output Folder and Setup
- [ ] Step 2: Parse User Query & Research
- [ ] Step 3: Resolve Tissues & Modalities
- [ ] Step 4: Visualize & Save Plots
- [ ] Step 5: Analyze Predictions (view plots, no code). MANDATORY: Read [interpretation-guide.md](docs/interpretation-guide.md) before interpreting results.
- [ ] Step 6: Write Report, save it as `report.md` (MANDATORY)
- [ ] Step 7: Self-Critique (view `report.md` to verify links & claims)
- [ ] Step 8: Make artifact out of `report.md`If multiple variants are specified, spawn sub-agents to run each variant analysis and then synthesize each report.md into a single report.
| Script | Purpose | | --------------------------- | ---------------------------------------------- | | lookup_gene_info | Comprehensive gene and transcript lookup using | : : GTF data : | resolve_ontology_terms | Biological terms → UBERON/CL/EFO IDs | | visualize_variant_effects | REF/ALT visualization (expression, regulatory, | : : splicing) : | analyze_ism | In-Silico Mutagenesis SeqLogo generation | | interpret_splicing | Quantitative splicing analysis (delta scores, | : : junctions) : | visualize_genome_tracks | Genomic track visualization for a region |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 27,671 | 7,144 | -74% | 1 | 1 | 0% | 5,127 | 3,698 | -28% | 0 | 0 | — |
case-02 | fail→fail | 26,621 | 7,002 | -74% | 1 | 1 | 0% | 5,146 | 3,476 | -32% | 0 | 0 | — |
case-03 | fail→fail | 23,784 | 7,186 | -70% | 1 | 1 | 0% | 4,153 | 3,578 | -14% | 0 | 0 | — |
case-04 | fail→pass | 10,026 | 11,750 | +17% | 1 | 1 | 0% | 1,774 | 4,779 | +169% | 0 | 0 | — |
case-05 | fail→fail | 18,513 | 11,213 | -39% | 1 | 1 | 0% | 3,005 | 3,674 | +22% | 0 | 0 | — |
case-06 | fail→fail | 17,484 | 10,979 | -37% | 1 | 1 | 0% | 2,773 | 3,469 | +25% | 0 | 0 | — |
case-07 | fail→pass | 9,047 | 6,622 | -27% | 1 | 1 | 0% | 1,554 | 4,296 | +176% | 0 | 0 | — |
case-08 | pass→fail | 10,738 | 9,902 | -8% | 1 | 1 | 0% | 1,947 | 3,761 | +93% | 0 | 0 | — |
case-09 | fail→pass | 14,618 | 9,220 | -37% | 1 | 1 | 0% | 2,479 | 3,900 | +57% | 0 | 0 | — |
case-10 | fail→pass | 12,107 | 4,212 | -65% | 1 | 1 | 0% | 2,117 | 3,853 | +82% | 0 | 0 | — |
case-11 | pass→pass | 12,055 | 4,025 | -67% | 1 | 1 | 0% | 1,865 | 3,791 | +103% | 0 | 0 | — |
case-12 | fail→pass | 14,363 | 7,219 | -50% | 1 | 1 | 0% | 2,292 | 4,495 | +96% | 0 | 0 | — |
case-13 | fail→pass | 13,082 | 7,779 | -41% | 1 | 1 | 0% | 2,152 | 3,728 | +73% | 0 | 0 | — |
case-14 | fail→pass | 15,649 | 6,375 | -59% | 1 | 1 | 0% | 2,526 | 4,230 | +67% | 0 | 0 | — |
case-15 | pass→pass | 15,651 | 9,589 | -39% | 1 | 1 | 0% | 2,357 | 4,742 | +101% | 0 | 0 | — |
case-16 | fail→pass | 18,288 | 5,975 | -67% | 1 | 1 | 0% | 2,659 | 4,127 | +55% | 0 | 0 | — |
case-17 | fail→pass | 10,203 | 5,365 | -47% | 1 | 1 | 0% | 1,749 | 4,091 | +134% | 0 | 0 | — |
case-18 | fail→pass | 11,776 | 11,761 | -0% | 1 | 1 | 0% | 1,722 | 4,157 | +141% | 0 | 0 | — |
case-19 | pass→pass | 19,252 | 12,470 | -35% | 1 | 1 | 0% | 3,126 | 4,444 | +42% | 0 | 0 | — |
case-20 | fail→pass | 12,367 | 10,620 | -14% | 1 | 1 | 0% | 2,068 | 4,204 | +103% | 0 | 0 | — |
case-21 | fail→pass | 11,373 | 9,613 | -15% | 1 | 1 | 0% | 1,607 | 4,592 | +186% | 0 | 0 | — |
case-22 | fail→pass | 11,636 | 5,465 | -53% | 1 | 1 | 0% | 1,856 | 4,025 | +117% | 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, and 16 counted toward the lift figure. The other 6 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 +55 percentage points is the difference between those two pass rates over the 16 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
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.
Other measured skills in the registry, with their headline benchmark lift.