agentsclimarketplace

Prisma tracking

Skill rhowardstone/Claude-Code-Scientist/.claude/skills/prisma-tracking

Transform Claude Code into a semi-autonomous, self-improving scientific researcher. Literature review, data acquisition, experimentation, synthesis, peer review

Install
npx -y skills add rhowardstone/Claude-Code-Scientist --skill prisma-tracking

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Track PRISMA 2020 flow for systematic literature reviews. Updates counts at each stage of literature acquisition. Generates compliant flow diagrams.

SKILL.md

5.0 KB, as published. Nobody here has run it

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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.