Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Construct rigorous systematic search strategies for literature reviews
.claude/skills/brycewang-stanford-systematic-search-strategy/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 77% | 0% |
| case-15 | ✓→✓ | = Same ✓ | 131% | 0% |
| case-16 | ✓→✓ | = Same ✓ | 167% | 0% |
| case-14 | ✓→✓ | = Same ✓ | 102% | 0% |
A skill for designing and executing comprehensive, reproducible literature search strategies for systematic reviews, scoping reviews, and meta-analyses. Follows PRISMA 2020 guidelines and Cochrane Handbook best practices.
Structure your research question using PICO (or variants):
P - Population / Problem: Who or what is being studied?
I - Intervention / Exposure: What is the treatment or exposure?
C - Comparison: What is the alternative?
O - Outcome: What is being measured?
Variants:
PICOS: adds Study design
SPIDER: Sample, Phenomenon of Interest, Design, Evaluation, Research type
PCC: Population, Concept, Context (for scoping reviews)pythondef pico_to_search_blocks(pico: dict) -> dict: """ Convert a PICO question into search concept blocks. Args: pico: Dict with keys 'population', 'intervention', 'comparison', 'outcome' Each value is a list of synonyms/related terms Returns: Search blocks ready for Boolean combination """ blocks = {} for component, terms in pico.items(): # Expand each term with common variants expanded = [] for term in terms: expanded.append(f'"{term}"') # Add truncation variants if len(term) > 5: expanded.append(f'{term.rstrip("s")}*') # basic stemming blocks[component] = expanded # Build final query: AND between blocks, OR within blocks query_parts = [] for component, terms in blocks.items(): block = ' OR '.join(terms) query_parts.append(f'({block})') final_query = ' AND '.join(query_parts) return { 'blocks': blocks, 'combined_query': final_query, 'n_concepts': len(blocks) } # Example: RQ: "Does mindfulness meditation reduce anxiety in college students?" pico = { 'population': ['college students', 'university students', 'undergraduate students', 'higher education students'], 'intervention': ['mindfulness', 'mindfulness meditation', 'mindfulness-based stress reduction', 'MBSR', 'mindfulness-based cognitive therapy', 'MBCT'], 'outcome': ['anxiety', 'anxiety disorder', 'generalized anxiety', 'test anxiety', 'anxiety symptoms', 'state anxiety', 'trait anxiety'] } result = pico_to_search_blocks(pico) print(result['combined_query'])
pythondef adapt_search_for_database(base_query: str, database: str) -> str: """ Adapt a base search string for different database syntaxes. """ adaptations = { 'pubmed': { 'truncation': '*', 'phrase': '"..."', 'proximity': None, # PubMed doesn't support proximity 'field_tags': {'title': '[ti]', 'abstract': '[tiab]', 'mesh': '[MeSH]'}, 'notes': 'Add MeSH terms for each concept block' }, 'web_of_science': { 'truncation': '*', 'phrase': '"..."', 'proximity': 'NEAR/N', 'field_tags': {'title': 'TI=', 'topic': 'TS=', 'author': 'AU='}, 'notes': 'Use TS= for topic search (title+abstract+keywords)' }, 'scopus': { 'truncation': '*', 'phrase': '"..."', 'proximity': 'W/N', 'field_tags': {'title': 'TITLE()', 'title_abs': 'TITLE-ABS-KEY()', 'author': 'AUTH()'}, 'notes': 'Use TITLE-ABS-KEY() for comprehensive searching' }, 'psycinfo': { 'truncation': '*', 'phrase': '"..."', 'proximity': 'Nn', 'field_tags': {'title': 'TI', 'abstract': 'AB', 'thesaurus': 'DE'}, 'notes': 'Use DE field for PsycINFO thesaurus terms' } } db = adaptations.get(database.lower(), {}) adapted = base_query # Start with base query return { 'database': database, 'query': adapted, 'syntax_notes': db.get('notes', ''), 'truncation': db.get('truncation', '*'), 'field_tags': db.get('field_tags', {}) }
Document every search completely:
yamlsearch_documentation: date_searched: "2026-03-09" databases: - name: "PubMed/MEDLINE" interface: "PubMed.gov" date_coverage: "1966-present" search_string: | (("college students"[tiab] OR "university students"[tiab]) AND ("mindfulness"[tiab] OR "MBSR"[tiab]) AND ("anxiety"[tiab] OR "anxiety disorders"[MeSH])) results_count: 342 filters_applied: "English language; 2010-2026" - name: "Web of Science" interface: "Clarivate" date_coverage: "1900-present" search_string: | TS=("college student*" OR "university student*") AND TS=(mindfulness OR MBSR OR MBCT) AND TS=(anxiety) results_count: 287 filters_applied: "Article or Review; English; 2010-2026" grey_literature: - "ProQuest Dissertations (N=45)" - "Google Scholar first 200 results" - "OpenGrey (N=12)" - "Hand-searched reference lists of included studies" total_before_dedup: 686 total_after_dedup: 493 deduplication_tool: "Covidence"
pythondef prisma_flow(records: dict) -> str: """Generate PRISMA 2020 flow diagram data.""" flow = f""" IDENTIFICATION Records from databases: {records['from_databases']} Records from other sources: {records['from_other']} Duplicates removed: {records['duplicates']} Records after dedup: {records['from_databases'] + records['from_other'] - records['duplicates']} SCREENING Title/abstract screened: {records['screened']} Excluded at title/abstract: {records['excluded_screening']} Full-text assessed: {records['fulltext_assessed']} Excluded at full-text: {records['excluded_fulltext']} Reasons: {records.get('exclusion_reasons', 'See table')} INCLUDED Studies in qualitative synthesis: {records['included_qualitative']} Studies in meta-analysis: {records.get('included_meta', 'N/A')} """ return flow
After initial search execution:
Document every modification to the search strategy with rationale to maintain transparency and reproducibility.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-15 | pass→pass | 14,294 | 22,349 | +56% | 1 | 1 | 0% | 2,320 | 5,351 | +131% | 0 | 0 | — |
case-16 | pass→pass | 8,703 | 8,506 | -2% | 1 | 1 | 0% | 1,183 | 3,156 | +167% | 0 | 0 | — |
case-14 | pass→pass | 17,770 | 21,287 | +20% | 1 | 1 | 0% | 2,427 | 4,913 | +102% | 0 | 0 | — |
case-01 | fail→fail | 27,171 | 29,446 | +8% | 1 | 1 | 0% | 5,411 | 5,316 | -2% | 0 | 0 | — |
case-02 | fail→fail | 26,634 | 28,472 | +7% | 1 | 1 | 0% | 3,794 | 6,239 | +64% | 0 | 0 | — |
case-03 | pass→pass | 12,165 | 10,949 | -10% | 1 | 1 | 0% | 1,873 | 3,463 | +85% | 0 | 0 | — |
case-04 | fail→pass | 14,583 | 14,051 | -4% | 1 | 1 | 0% | 2,332 | 4,209 | +80% | 0 | 0 | — |
case-05 | pass→pass | 3,277 | 2,974 | -9% | 1 | 1 | 0% | 568 | 2,327 | +310% | 0 | 0 | — |
case-06 | pass→pass | 7,551 | 26,243 | +248% | 1 | 1 | 0% | 1,372 | 2,840 | +107% | 0 | 0 | — |
case-07 | pass→pass | 3,279 | 3,186 | -3% | 1 | 1 | 0% | 559 | 2,272 | +306% | 0 | 0 | — |
case-08 | pass→pass | 4,854 | 6,658 | +37% | 1 | 1 | 0% | 814 | 2,792 | +243% | 0 | 0 | — |
case-09 | fail→fail | 9,663 | 14,274 | +48% | 1 | 1 | 0% | 1,727 | 4,034 | +134% | 0 | 0 | — |
case-10 | fail→fail | 12,342 | 13,911 | +13% | 1 | 1 | 0% | 1,968 | 3,996 | +103% | 0 | 0 | — |
case-11 | pass→pass | 5,327 | 3,525 | -34% | 1 | 1 | 0% | 833 | 2,508 | +201% | 0 | 0 | — |
case-12 | pass→pass | 4,142 | 4,565 | +10% | 1 | 1 | 0% | 613 | 2,471 | +303% | 0 | 0 | — |
case-13 | pass→pass | 12,388 | 13,686 | +10% | 1 | 1 | 0% | 1,804 | 4,101 | +127% | 0 | 0 | — |
case-17 | fail→pass | 15,800 | 14,108 | -11% | 1 | 1 | 0% | 2,423 | 4,288 | +77% | 0 | 0 | — |
case-18 | pass→pass | 10,996 | 12,323 | +12% | 1 | 1 | 0% | 1,591 | 3,826 | +140% | 0 | 0 | — |
case-19 | pass→pass | 14,068 | 12,181 | -13% | 1 | 1 | 0% | 2,056 | 4,168 | +103% | 0 | 0 | — |
case-20 | pass→pass | 17,483 | 16,137 | -8% | 1 | 1 | 0% | 2,635 | 4,685 | +78% | 0 | 0 | — |
case-21 | pass→pass | 15,561 | 22,830 | +47% | 1 | 1 | 0% | 2,994 | 5,849 | +95% | 0 | 0 | — |
case-22 | pass→pass | 17,255 | 17,489 | +1% | 1 | 1 | 0% | 2,413 | 4,568 | +89% | 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 +9 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.
Other measured skills in the registry, with their headline benchmark lift.