Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Write competitive research proposals with clear objectives and budgets
.claude/skills/brycewang-stanford-grant-writing-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 94% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 103% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 91% | 0% |
A skill for preparing competitive research grant proposals. Covers proposal structure, writing strategies, budget preparation, and common evaluation criteria used by major funding agencies (NSF, NIH, ERC, NSFC).
Most funding agencies require these core components:
1. Cover Page / Project Summary (1 page)
- Title (concise, descriptive, no jargon)
- PI name, institution, co-PIs
- Total budget and duration
- Abstract (250 words)
- Keywords (5-8)
2. Project Description / Research Plan (10-15 pages typically)
a. Introduction and Background
b. Specific Aims / Research Questions
c. Research Design and Methods
d. Timeline and Milestones
e. Expected Outcomes and Significance
f. Broader Impacts (NSF) / Societal Relevance
3. Literature Cited / References
4. Budget and Budget Justification
5. Biographical Sketches / CVs
6. Data Management Plan
7. Facilities and Equipment
8. Supplementary Materials (letters of support, etc.)The specific aims page is the most important page of any NIH-style proposal. Reviewers often form their opinion based on this page alone.
pythondef specific_aims_template(project_info: dict) -> str: """ Generate a specific aims page structure. Args: project_info: Dict with 'problem', 'gap', 'approach', 'aims', 'impact' """ template = f""" SPECIFIC AIMS [Opening paragraph: The big picture problem] {project_info['problem']} [Gap paragraph: What is unknown/unsolved] {project_info['gap']} [Approach paragraph: What will you do and why] {project_info['approach']} The long-term goal of this research is [long-term vision]. The objective of this proposal is [specific objective]. The central hypothesis is [testable hypothesis], based on [preliminary data / rationale]. The following specific aims will test this hypothesis: Aim 1: {project_info['aims'][0]['title']} {project_info['aims'][0]['description']} Hypothesis: {project_info['aims'][0]['hypothesis']} Aim 2: {project_info['aims'][1]['title']} {project_info['aims'][1]['description']} Hypothesis: {project_info['aims'][1]['hypothesis']} [Impact paragraph] {project_info['impact']} """ return template
pythondef create_budget(personnel: list[dict], equipment: list[dict], travel: list[dict], other: list[dict], indirect_rate: float = 0.55, years: int = 3) -> dict: """ Create a research budget with indirect costs. Args: personnel: List of {'role', 'salary', 'effort_pct', 'fringe_rate'} equipment: List of {'item', 'cost'} travel: List of {'purpose', 'cost_per_year'} other: List of {'item', 'cost_per_year'} indirect_rate: F&A rate (decimal) years: Project duration in years """ budget = {'years': {}} for year in range(1, years + 1): year_budget = {'categories': {}} # Personnel (with annual salary increases of 3%) personnel_total = 0 for person in personnel: salary = person['salary'] * (1.03 ** (year - 1)) cost = salary * person['effort_pct'] / 100 fringe = cost * person['fringe_rate'] personnel_total += cost + fringe year_budget['categories']['personnel'] = round(personnel_total) # Equipment (Year 1 only for major items) equip_total = sum(e['cost'] for e in equipment) if year == 1 else 0 year_budget['categories']['equipment'] = equip_total # Travel travel_total = sum(t['cost_per_year'] for t in travel) year_budget['categories']['travel'] = travel_total # Other direct costs other_total = sum(o['cost_per_year'] for o in other) year_budget['categories']['other'] = other_total # Modified total direct costs (MTDC excludes equipment >$5000) mtdc = personnel_total + travel_total + other_total if equip_total < 5000: mtdc += equip_total # Indirect costs indirect = mtdc * indirect_rate year_budget['categories']['indirect'] = round(indirect) year_budget['direct_total'] = round( personnel_total + equip_total + travel_total + other_total ) year_budget['total'] = round( year_budget['direct_total'] + indirect ) budget['years'][year] = year_budget budget['grand_total'] = sum(y['total'] for y in budget['years'].values()) return budget # Example budget budget = create_budget( personnel=[ {'role': 'PI', 'salary': 120000, 'effort_pct': 20, 'fringe_rate': 0.30}, {'role': 'Postdoc', 'salary': 56000, 'effort_pct': 100, 'fringe_rate': 0.25}, {'role': 'PhD Student', 'salary': 34000, 'effort_pct': 50, 'fringe_rate': 0.10} ], equipment=[{'item': 'GPU server', 'cost': 15000}], travel=[{'purpose': 'Conference attendance', 'cost_per_year': 3000}], other=[ {'item': 'Publication charges', 'cost_per_year': 2000}, {'item': 'Cloud computing', 'cost_per_year': 5000} ], indirect_rate=0.55, years=3 )
| Criterion | Weight | Key Questions | |-----------|--------|---------------| | Intellectual Merit | ~50% | Does it advance knowledge? Is the approach sound? | | Broader Impacts | ~50% | Societal benefit? Education? Diversity? Infrastructure? |
| Criterion | Key Questions | |-----------|---------------| | Significance | Does it address an important problem? | | Investigator(s) | Are PI and team qualified? | | Innovation | Novel approaches or concepts? | | Approach | Is the strategy well-reasoned and feasible? | | Environment | Does the institution support the work? |
pythondef create_project_timeline(aims: list[dict], total_months: int = 36) -> list[dict]: """Create a project timeline for a grant proposal.""" timeline = [] for aim in aims: for task in aim['tasks']: timeline.append({ 'aim': aim['name'], 'task': task['name'], 'start_month': task['start'], 'end_month': task['end'], 'milestone': task.get('milestone', ''), 'deliverable': task.get('deliverable', '') }) return timeline
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | pass→pass | 16,683 | 12,331 | -26% | 1 | 1 | 0% | 2,270 | 4,332 | +91% | 0 | 0 | — |
case-01 | fail→fail | 18,190 | 35,628 | +96% | 1 | 1 | 0% | 2,934 | 4,542 | +55% | 0 | 0 | — |
case-02 | pass→pass | 11,503 | 10,194 | -11% | 1 | 1 | 0% | 1,880 | 3,891 | +107% | 0 | 0 | — |
case-03 | fail→pass | 9,671 | 10,757 | +11% | 1 | 1 | 0% | 1,877 | 3,647 | +94% | 0 | 0 | — |
case-05 | pass→pass | 6,425 | 5,887 | -8% | 1 | 1 | 0% | 1,183 | 3,103 | +162% | 0 | 0 | — |
case-06 | fail→pass | 16,459 | 8,537 | -48% | 1 | 1 | 0% | 2,366 | 3,323 | +40% | 0 | 0 | — |
case-07 | pass→pass | 16,885 | 12,557 | -26% | 1 | 1 | 0% | 2,622 | 3,960 | +51% | 0 | 0 | — |
case-08 | fail→fail | 8,465 | 7,329 | -13% | 1 | 1 | 0% | 2,200 | 3,670 | +67% | 0 | 0 | — |
case-09 | fail→pass | 21,788 | 16,874 | -23% | 1 | 1 | 0% | 3,038 | 4,805 | +58% | 0 | 0 | — |
case-10 | pass→pass | 10,204 | 12,484 | +22% | 1 | 1 | 0% | 1,557 | 3,637 | +134% | 0 | 0 | — |
case-11 | pass→pass | 14,651 | 12,717 | -13% | 1 | 1 | 0% | 2,084 | 3,681 | +77% | 0 | 0 | — |
case-12 | fail→pass | 16,455 | 20,963 | +27% | 1 | 1 | 0% | 2,439 | 4,945 | +103% | 0 | 0 | — |
case-13 | pass→pass | 8,626 | 9,117 | +6% | 1 | 1 | 0% | 1,402 | 3,434 | +145% | 0 | 0 | — |
case-14 | pass→pass | 10,441 | 12,406 | +19% | 1 | 1 | 0% | 1,667 | 3,816 | +129% | 0 | 0 | — |
case-15 | fail→fail | 12,561 | 7,853 | -37% | 1 | 1 | 0% | 2,191 | 3,428 | +56% | 0 | 0 | — |
case-16 | pass→pass | 3,247 | 3,272 | +1% | 1 | 1 | 0% | 491 | 2,471 | +403% | 0 | 0 | — |
case-17 | pass→pass | 7,070 | 5,111 | -28% | 1 | 1 | 0% | 1,099 | 2,753 | +151% | 0 | 0 | — |
case-18 | pass→pass | 17,055 | 22,276 | +31% | 1 | 1 | 0% | 2,202 | 4,310 | +96% | 0 | 0 | — |
case-19 | pass→pass | 14,006 | 18,359 | +31% | 1 | 1 | 0% | 2,323 | 4,537 | +95% | 0 | 0 | — |
case-20 | pass→pass | 24,205 | 26,913 | +11% | 1 | 1 | 0% | 3,521 | 6,035 | +71% | 0 | 0 | — |
case-21 | pass→pass | 21,536 | 20,760 | -4% | 1 | 1 | 0% | 3,625 | 5,507 | +52% | 0 | 0 | — |
case-22 | pass→pass | 17,438 | 17,388 | -0% | 1 | 1 | 0% | 3,085 | 5,007 | +62% | 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 +18 percentage points is the difference between those two pass rates over the 22 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.