Claude-Code-Scientist prisma-tracking
Track PRISMA 2020 flow for systematic literature reviews. Updates counts at each stage of literature acquisition. Generates compliant flow diagrams.
install
source · Clone the upstream repo
git clone https://github.com/rhowardstone/Claude-Code-Scientist
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/rhowardstone/Claude-Code-Scientist "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/prisma-tracking" ~/.claude/skills/rhowardstone-claude-code-scientist-prisma-tracking && rm -rf "$T"
manifest:
.claude/skills/prisma-tracking/SKILL.mdsource content
PRISMA Flow Tracking
Track the PRISMA 2020 flow throughout literature acquisition.
PRISMA 2020 Stages
Identification ├── Records from databases (OpenAlex, PubMed, Semantic Scholar) ├── Records from citation searching └── Records from other sources Screening ├── Records after duplicates removed ├── Records screened └── Records excluded (with reasons) Eligibility ├── Reports sought for retrieval ├── Reports not retrieved (with reasons) ├── Reports assessed for eligibility └── Reports excluded (with reasons) Included ├── Studies included in review └── Reports of included studies
World Model Integration
Track in
$SESSION_DIR/world_model.json:
{ "prisma_flow": { "identification": { "databases": { "openalex": 250, "pubmed": 180, "semantic_scholar": 120 }, "citation_searching": 85, "other_sources": 15, "total_identified": 650 }, "screening": { "after_duplicates_removed": 420, "records_screened": 420, "records_excluded": 280, "exclusion_reasons": { "not_relevant_to_rqs": 150, "wrong_study_type": 80, "wrong_language": 30, "retracted": 20 } }, "eligibility": { "reports_sought": 140, "reports_not_retrieved": 25, "not_retrieved_reasons": { "paywalled": 15, "link_broken": 10 }, "reports_assessed": 115, "reports_excluded": 45, "exclusion_reasons": { "insufficient_data": 25, "duplicate_cohort": 12, "wrong_outcomes": 8 } }, "included": { "studies_in_review": 70, "reports_of_studies": 70 } } }
Update Functions
After each literature acquisition step, update PRISMA counts:
After Initial Search
prisma_flow["identification"]["databases"]["openalex"] = len(openalex_results) prisma_flow["identification"]["databases"]["pubmed"] = len(pubmed_results) prisma_flow["identification"]["total_identified"] = sum(all_results)
After Deduplication
prisma_flow["screening"]["after_duplicates_removed"] = len(unique_papers)
After Relevance Filtering
prisma_flow["screening"]["records_excluded"] = excluded_count prisma_flow["screening"]["exclusion_reasons"]["not_relevant_to_rqs"] = not_relevant
After Citation Expansion
prisma_flow["identification"]["citation_searching"] += new_from_citations
After Full-Text Retrieval
prisma_flow["eligibility"]["reports_sought"] = attempted prisma_flow["eligibility"]["reports_not_retrieved"] = failed
After Final Inclusion
prisma_flow["included"]["studies_in_review"] = final_count
Generate PRISMA Diagram
Use matplotlib to generate the flow diagram:
import matplotlib.pyplot as plt import matplotlib.patches as mpatches def generate_prisma_diagram(prisma_flow, output_path): fig, ax = plt.subplots(1, 1, figsize=(12, 16)) ax.set_xlim(0, 12) ax.set_ylim(0, 16) ax.axis('off') # Identification box id_box = mpatches.FancyBboxPatch((0.5, 13), 11, 2.5, boxstyle="round,pad=0.1", facecolor='lightblue', edgecolor='black') ax.add_patch(id_box) ax.text(6, 14.5, 'Identification', fontsize=14, fontweight='bold', ha='center') ax.text(6, 13.8, f"Records from databases (n={prisma_flow['identification']['total_identified']})", ha='center') # ... continue for Screening, Eligibility, Included plt.savefig(output_path.replace('.pdf', '.png'), dpi=300, bbox_inches='tight') plt.savefig(output_path, bbox_inches='tight')
Validation
Before synthesis, verify PRISMA flow is complete:
def validate_prisma(prisma_flow): errors = [] if prisma_flow["identification"]["total_identified"] == 0: errors.append("No papers identified - literature search not run") if prisma_flow["screening"]["after_duplicates_removed"] == 0: errors.append("Deduplication not tracked") if prisma_flow["included"]["studies_in_review"] == 0: errors.append("No studies included - check filtering") # Flow consistency if prisma_flow["screening"]["after_duplicates_removed"] > prisma_flow["identification"]["total_identified"]: errors.append("More papers after dedup than identified - impossible") return errors
Completion Checklist
- All identification sources logged with counts
- Duplicates removed count recorded
- Exclusion reasons documented at each stage
- Full-text retrieval attempts logged
- Final included count matches cited papers
- PRISMA diagram generated (PNG + PDF)
Track every paper. Document every exclusion. Generate compliant diagrams.