Install any skill in seconds. Free to start, no credit card required.
Get Started Free →End-to-end drug development pipeline from target identification to regulatory...
.claude/skills/brycewang-stanford-drug-development-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-16 | ✓→✗ | ▼ Worse | 80% | 0% |
A comprehensive skill covering the drug development pipeline from target identification through regulatory approval. Designed for pharmaceutical researchers, medicinal chemists, and clinical scientists conducting academic or industry research.
Target ID -> Hit Finding -> Lead Optimization -> Preclinical -> Phase I -> Phase II -> Phase III -> Regulatory Filing
(1-2 yr) (1-2 yr) (1-3 yr) (1-2 yr) (1 yr) (2 yr) (3 yr) (1-2 yr)
Total timeline: ~10-15 years | Success rate: ~5-10% from Phase I to approval
Estimated cost: $1.3B-$2.8B per approved drug (DiMasi et al., 2016)pythonimport pandas as pd from scipy import stats def differential_expression_analysis(expression_data: pd.DataFrame, disease_group: list[str], control_group: list[str], fdr_threshold: float = 0.05) -> pd.DataFrame: """ Identify differentially expressed genes as potential drug targets. Args: expression_data: Gene x Sample expression matrix disease_group: Sample IDs in disease condition control_group: Sample IDs in control condition fdr_threshold: False discovery rate threshold """ results = [] for gene in expression_data.index: disease_vals = expression_data.loc[gene, disease_group] control_vals = expression_data.loc[gene, control_group] t_stat, p_value = stats.ttest_ind(disease_vals, control_vals) fold_change = disease_vals.mean() / (control_vals.mean() + 1e-10) results.append({ 'gene': gene, 'fold_change': fold_change, 'log2_fc': np.log2(abs(fold_change) + 1e-10), 'p_value': p_value, 't_statistic': t_stat }) df = pd.DataFrame(results) # Benjamini-Hochberg FDR correction from statsmodels.stats.multitest import multipletests df['fdr'] = multipletests(df['p_value'], method='fdr_bh')[1] df['significant'] = df['fdr'] < fdr_threshold return df.sort_values('fdr')
A robust drug target should satisfy multiple criteria:
| Criterion | Method | Evidence Strength | |-----------|--------|------------------| | Genetic association | GWAS, Mendelian randomization | Strong | | Expression in disease tissue | RNA-seq, immunohistochemistry | Moderate | | Functional role | CRISPR knockout, siRNA | Strong | | Druggability | Structural analysis, binding pockets | Essential | | Safety (anti-target) | Phenotype of loss-of-function mutations | Essential |
Assess absorption, distribution, metabolism, excretion, and toxicity early:
pythondef lipinski_rule_of_five(molecular_weight: float, logp: float, hbd: int, hba: int) -> dict: """ Evaluate Lipinski's Rule of Five for oral bioavailability. Args: molecular_weight: Molecular weight in Da logp: Calculated LogP (lipophilicity) hbd: Number of hydrogen bond donors hba: Number of hydrogen bond acceptors """ violations = 0 details = [] if molecular_weight > 500: violations += 1 details.append(f"MW {molecular_weight} > 500") if logp > 5: violations += 1 details.append(f"LogP {logp} > 5") if hbd > 5: violations += 1 details.append(f"HBD {hbd} > 5") if hba > 10: violations += 1 details.append(f"HBA {hba} > 10") return { 'violations': violations, 'passes': violations <= 1, 'details': details, 'assessment': 'Likely orally bioavailable' if violations <= 1 else 'Poor oral bioavailability expected' }
pythonimport numpy as np from scipy.optimize import curve_fit def one_compartment_iv(t, dose, V, CL): """One-compartment IV bolus model.""" k_el = CL / V return (dose / V) * np.exp(-k_el * t) def compute_pk_parameters(time_points: np.ndarray, concentrations: np.ndarray, dose: float) -> dict: """ Fit one-compartment model and derive PK parameters. """ popt, pcov = curve_fit( lambda t, V, CL: one_compartment_iv(t, dose, V, CL), time_points, concentrations, p0=[10, 1], bounds=(0, [1000, 100]) ) V, CL = popt t_half = 0.693 * V / CL auc = dose / CL return { 'volume_of_distribution_L': round(V, 2), 'clearance_L_hr': round(CL, 2), 'half_life_hr': round(t_half, 2), 'AUC_mg_hr_L': round(auc, 2) }
| Phase | Primary Goal | Typical N | Key Endpoints | |-------|-------------|-----------|---------------| | Phase I | Safety, dose finding | 20-80 | MTD, DLT, PK | | Phase II | Efficacy signal | 100-300 | ORR, PFS, biomarkers | | Phase III | Confirmatory efficacy | 300-3000 | OS, PFS, PROs | | Phase IV | Post-marketing surveillance | 1000+ | ADRs, real-world effectiveness |
Always pre-register clinical trials on ClinicalTrials.gov and follow CONSORT guidelines for reporting. Use adaptive trial designs (e.g., Bayesian adaptive randomization, seamless Phase II/III) when appropriate to improve efficiency.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,144 | 36,401 | +177% | 1 | 1 | 0% | 2,494 | 3,941 | +58% | 0 | 0 | — |
case-08 | fail→fail | 15,701 | 12,604 | -20% | 1 | 1 | 0% | 2,673 | 3,895 | +46% | 0 | 0 | — |
case-02 | fail→fail | 17,079 | 18,031 | +6% | 1 | 1 | 0% | 3,500 | 5,263 | +50% | 0 | 0 | — |
case-03 | fail→pass | 19,351 | 16,703 | -14% | 1 | 1 | 0% | 3,954 | 4,905 | +24% | 0 | 0 | — |
case-04 | pass→pass | 11,040 | 11,325 | +3% | 1 | 1 | 0% | 1,911 | 3,799 | +99% | 0 | 0 | — |
case-05 | pass→pass | 14,506 | 20,302 | +40% | 1 | 1 | 0% | 2,294 | 4,748 | +107% | 0 | 0 | — |
case-06 | pass→pass | 16,101 | 15,184 | -6% | 1 | 1 | 0% | 2,804 | 4,064 | +45% | 0 | 0 | — |
case-07 | pass→pass | 14,291 | 7,603 | -47% | 1 | 1 | 0% | 2,391 | 2,739 | +15% | 0 | 0 | — |
case-09 | pass→pass | 16,356 | 4,067 | -75% | 1 | 1 | 0% | 2,267 | 2,356 | +4% | 0 | 0 | — |
case-10 | fail→fail | 13,175 | 12,180 | -8% | 1 | 1 | 0% | 1,805 | 3,221 | +78% | 0 | 0 | — |
case-11 | pass→pass | 17,122 | 17,081 | -0% | 1 | 1 | 0% | 2,580 | 3,797 | +47% | 0 | 0 | — |
case-12 | pass→pass | 8,511 | 6,719 | -21% | 1 | 1 | 0% | 1,307 | 2,709 | +107% | 0 | 0 | — |
case-13 | pass→pass | 4,502 | 5,401 | +20% | 1 | 1 | 0% | 705 | 2,489 | +253% | 0 | 0 | — |
case-14 | pass→pass | 6,565 | 7,752 | +18% | 1 | 1 | 0% | 1,293 | 3,105 | +140% | 0 | 0 | — |
case-15 | pass→pass | 10,688 | 9,229 | -14% | 1 | 1 | 0% | 1,872 | 3,367 | +80% | 0 | 0 | — |
case-16 | pass→fail | 12,799 | 14,176 | +11% | 1 | 1 | 0% | 2,222 | 4,001 | +80% | 0 | 0 | — |
case-17 | fail→fail | 16,561 | 20,088 | +21% | 1 | 1 | 0% | 2,974 | 5,235 | +76% | 0 | 0 | — |
case-18 | fail→pass | 17,556 | 21,478 | +22% | 1 | 1 | 0% | 2,888 | 5,167 | +79% | 0 | 0 | — |
case-19 | pass→pass | 7,015 | 6,633 | -5% | 1 | 1 | 0% | 1,075 | 2,723 | +153% | 0 | 0 | — |
case-20 | pass→pass | 7,556 | 8,347 | +10% | 1 | 1 | 0% | 1,132 | 2,985 | +164% | 0 | 0 | — |
case-21 | pass→pass | 19,015 | 28,274 | +49% | 1 | 1 | 0% | 2,718 | 6,237 | +129% | 0 | 0 | — |
case-22 | pass→pass | 19,831 | 19,918 | +0% | 1 | 1 | 0% | 3,051 | 4,570 | +50% | 0 | 0 | — |
case-23 | fail→pass | 12,717 | 9,350 | -26% | 1 | 1 | 0% | 2,350 | 3,268 | +39% | 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. 23 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is 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.