Agent skill

Reporting Adverse Events

by maziyarpanahi in maziyarpanahi/openmed

Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome.

Apache-2.0Auto-check passedDevelopment

Install Reporting Adverse Events

skills CLI
$ npx skills add maziyarpanahi/openmed --skill reporting-adverse-events -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install maziyarpanahi/openmed reporting-adverse-events --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/reporting-adverse-events .claude/skills/reporting-adverse-events && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
reporting-adverse-events
GitHub stars
5.5k
Token cost
~2.2k tokens
SKILL.md length
757 words
Files
1
Skills in repo
74
Repo updated
First seen
Licence
Apache-2.0

At a glance

Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome.

  • Works in 7 steps: De-identify first. Run… → Extract drugs and reactions with the two… → Characterize each drug as suspect (1),… → …
  • The user needs to build an individual case safety report (ICSR)
  • SKILL.md covers When to use, Quick start, E2B(R3) seriousness and… and Workflow, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Reporting Adverse Events is an agent skill from maziyarpanahi/openmed. Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome. Use when the user needs to build an individual case safety report (ICSR), populate a FAERS submission, map a narrative to E2B(R3) data elements, classify seriousness (death, life-threatening, hospitalization, disability, congenital anomaly), or assign reaction outcomes. Trigger keywords: adverse event, ADR, ICSR, FAERS, E2B, E2B(R3), suspect…

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Architecture decision records. The repository describes itself as: Local-first healthcare AI: clinical NER and HIPAA PII de-identification on hardware you control. 2,200+ medical models, 35 model-backed PII languages, and Python, MLX, Android… The licence is Apache-2.0.

When your agent uses it

  • The user needs to build an individual case safety report (ICSR)
  • Populate a FAERS submission
  • Map a narrative to E2B(R
  • Classify seriousness (death

Example prompts

  • “Use the reporting-adverse-events skill to structure adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields —…”
  • “/reporting-adverse-events”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. De-identify first. Run openmed.deidentify(narrative, policy=...) and
  2. Extract drugs and reactions with the two analyze_text calls above.
  3. Characterize each drug as suspect (1), concomitant (2), or
  4. Code reactions to MedDRA. Map each verbatim reaction term to a MedDRA
  5. Determine seriousness. Scan the narrative for the six criteria; set
  6. Assign reaction outcome from the value set above.
  7. Hand the structured draft to a qualified safety reviewer for causality

What it can do on your machine

Read from SKILL.md and the folder at commit 34d7b8c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • fda.gov
    • ich.org
    • meddra.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Reporting Adverse Events loads about 2.2k tokens when it runs. Until then it costs about 213 tokens; SKILL.md has 757 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~213
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from maziyarpanahi/openmed at commit 34d7b8c, republished under its Apache-2.0 licence (© maziyarpanahi). 757 words, ~2,219 tokens.

Download SKILL.mdSave it as .claude/skills/reporting-adverse-events/SKILL.md (or your agent's skills folder).
name
reporting-adverse-events
description
Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome. Use when the user needs to build an individual case safety report (ICSR), populate a FAERS submission, map a narrative to E2B(R3) data elements, classify seriousness (death, life-threatening, hospitalization, disability, congenital anomaly), or assign reaction outcomes. Trigger keywords: adverse event, ADR, ICSR, FAERS, E2B, E2B(R3), suspect drug, seriousness, MedDRA, reaction outcome, pharmacovigilance case. Pairs after OpenMed NER: consume Pharmaceutical/Chemical and Disease entities from openmed.analyze_text. MedDRA is licensed and user-supplied — never bundled. De-identify the narrative with openmed.deidentify before any external submission.
license
Apache-2.0
metadata.project
OpenMed
metadata.category
safety-pharmacovigilance
metadata.pairs
after
metadata.version
1.0

Reporting adverse events into FAERS / ICH E2B(R3)

A pharmacovigilance case starts as free-text narrative ("68 yo on warfarin developed GI bleed, hospitalized"). To make it reportable you must structure it into the ICH E2B(R3) data elements that the FDA's FAERS (and EMA's EudraVigilance) expect: a suspect drug, one or more reactions coded to MedDRA Preferred Terms, seriousness criteria, and a reaction outcome.

OpenMed extracts the drug and condition spans on-device; this skill turns those spans plus the narrative into the E2B(R3) skeleton. The reaction coding step needs MedDRA, which is licensed by the MSSO and user-supplied — it is never bundled with OpenMed and must be loaded from the user's own subscription.

When to use

  • A narrative names a drug and an adverse reaction and you need an ICSR (Individual Case Safety Report) shell with the right E2B(R3) fields.
  • You must classify seriousness (E2B sections C.1.7 / E.i.3) — death, life-threatening, hospitalization/prolongation, disability, congenital anomaly, or "other medically important condition".
  • You need to characterize each drug as suspect / concomitant / interacting (the drugcharacterization axis FAERS uses).
  • You are pre-filling a 3500A / FAERS electronic submission or staging cases for a safety database.

This skill produces a structured draft for human safety review — it does not file reports or perform causality assessment autonomously.

Quick start

python
import openmed

narrative = (
    "68-year-old patient on warfarin 5 mg daily developed a gastrointestinal "
    "hemorrhage and was hospitalized. Warfarin was discontinued; the patient "
    "recovered."
)

# 1) Extract drug spans (Pharmaceutical category) on-device.
drugs = openmed.analyze_text(
    narrative,
    model_name="pharma_detection_superclinical",
    output_format="dict",
)["entities"]

# 2) Extract condition / reaction spans (Disease category).
conditions = openmed.analyze_text(
    narrative,
    model_name="disease_detection_superclinical",
    output_format="dict",
)["entities"]

# 3) Assemble an E2B(R3)-shaped ICSR skeleton (reaction PTs filled later via MedDRA).
icsr = {
    "patient": {"age": None, "sex": None},          # from de-identified demographics
    "drugs": [
        {
            "name": e["text"],
            "drugcharacterization": 1,              # 1=suspect 2=concomitant 3=interacting
            "action": None,                          # e.g. drug withdrawn / dose reduced
        }
        for e in drugs
    ],
    "reactions": [
        {
            "verbatim": e["text"],                   # narrative term, pre-MedDRA
            "meddra_pt": None,                       # coded with user's MedDRA dict
            "outcome": None,                         # E2B reaction outcome code
        }
        for e in conditions
    ],
    "seriousness": {
        "serious": None, "death": False, "lifeThreatening": False,
        "hospitalization": True, "disability": False, "congenitalAnomaly": False,
        "otherMedicallyImportant": False,
    },
}

E2B(R3) seriousness and outcome value sets

Seriousness is a set of boolean criteria (E2B E.i.3.2). A case is serious if any criterion is true:

CriterionE2B elementFAERS field
DeathE.i.3.2aseriousnessdeath
Life-threateningE.i.3.2bseriousnesslifethreatening
Hospitalization / prolongedE.i.3.2cseriousnesshospitalization
Disability / incapacityE.i.3.2dseriousnessdisabling
Congenital anomalyE.i.3.2eseriousnesscongenitalanomali
Other medically importantE.i.3.2fseriousnessother

Reaction outcome (E2B E.i.7) is a coded value: 1 recovered/resolved, 2 recovering/resolving, 3 not recovered/not resolved, 4 recovered with sequelae, 5 fatal, 6 unknown.

Drug characterization (E2B G.k.1): 1 suspect, 2 concomitant, 3 interacting.

Workflow

  1. De-identify first. Run openmed.deidentify(narrative, policy=...) and work from result.deidentified_text. Patient name, MRN, and dates must be removed/shifted before the case leaves your environment.
  2. Extract drugs and reactions with the two analyze_text calls above. Keep each entity's start/end offsets for traceability.
  3. Characterize each drug as suspect (1), concomitant (2), or interacting (3). The drug that temporally precedes the reaction and was acted upon (withdrawn/reduced) is usually the suspect.
  4. Code reactions to MedDRA. Map each verbatim reaction term to a MedDRA Preferred Term (PT) and its System Organ Class using the user's licensed MedDRA dictionary (see "Edge cases"). Never invent PTs.
  5. Determine seriousness. Scan the narrative for the six criteria; set serious=True if any is met. "Hospitalized", "admitted", "ICU" → C.1.7c.
  6. Assign reaction outcome from the value set above.
  7. Hand the structured draft to a qualified safety reviewer for causality (e.g. WHO-UMC or Naranjo), expectedness, and final submission.
Show full SKILL.md (309 more words)Show less

Hand-off to / from OpenMed

OpenMed's analyze_text returns a dict; result["entities"] is a list whose items carry text, label, confidence, start, end. Consume them:

  • From extracting-clinical-entities: Pharmaceutical entities → icsr["drugs"]; Disease entities → icsr["reactions"]. Keep offsets so each E2B field is traceable to the source span.
  • From normalizing-rxnorm: optionally attach an RxCUI to each suspect drug for product identification (E2B G.k.2.2) before coding.
  • De-identify with deidentifying-clinical-text (openmed.deidentify) before the case is exported or transmitted to any safety database.
  • To detecting-pv-signals: aggregated, coded cases feed disproportionality analysis. To querying-openfda-labels: confirm the reaction is/ isn't a labeled event (expectedness).

Edge cases & gotchas

  • MedDRA is licensed — never bundle it. MedDRA is distributed by the MSSO under subscription; OpenMed ships none of it. Load PTs/LLTs from the user's own MedDRA release (the version is itself a reportable field, E2B C.1.x). Verbatim reaction text stays in the case until a coder maps it.
  • One reaction term ≠ one PT. "GI bleed" maps to the PT Gastrointestinal haemorrhage; keep the verbatim term alongside the coded PT for the audit trail. Multi-word reactions span several OpenMed tokens — reassemble by offset.
  • Suspect vs concomitant matters. Disproportionality and labeling decisions hinge on drugcharacterization. Do not default every drug to suspect.
  • Seriousness is OR, not a severity scale. A mild rash that caused hospitalization is serious; a severe headache that resolved at home may not be. Classify by the six regulatory criteria, not by clinical severity words.
  • Causality is out of scope here. This skill structures the case; it does not assert the drug caused the event. Leave causality to the reviewer.
  • Local-first. NER and de-identification run on-device. Only de-identified, structured case data should reach an external safety database, and only under the appropriate regulatory agreement.

Standards & references

© maziyarpanahi, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/reporting-adverse-events of maziyarpanahi/openmed.

Open the folder on GitHubat commit 34d7b8c

Compare with similar skills

Reporting Adverse Events next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Reporting Adverse Events compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Reporting Adverse Events this skillmaziyarpanahi/openmed5.5k—~2.2kAutomated safety check: PassApache-2.0
PR Design DocOpenHands/OpenHands91k—~2.4kAutomated safety check: PassMIT
Cto AdvisorIbrahim-3d/orchestrator-supaconductor3814 repos~2.4kAutomated safety check: PassMIT
Domain Modelingbrim-borium/spotify_sdk1667 repos~806Automated safety check: PassApache-2.0
Architecture DecisionDonchitos/Claude-Code-Game-Studios26k—~1.7kAutomated safety check: PassMIT
Improve Codebase Architectureywwynm/EverythingDone14415 repos~1.3kAutomated safety check: PassGPL-3.0

Similar skills

  • PR Design Doc

    OpenHands/OpenHands

    For a non-trivial pull request, write a self-contained HTML design doc under the temporary .pr/ directory and link a visibility-appropriate preview in the PR description, so maintainers grasp the…

    91k GitHub stars~2.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Cto Advisor

    Ibrahim-3d/orchestrator-supaconductor

    Technical leadership guidance for engineering teams, architecture decisions, and technology strategy.

    381 GitHub starsUsed in 4 repos~2.4k tokens
    DevelopmentAuto-check passed
  • Domain Modeling

    brim-borium/spotify_sdk

    Build and sharpen a project's domain model. An agent skill from brim-borium/spotify_sdk.

    166 GitHub starsUsed in 7 repos~806 tokens
    DevelopmentAuto-check passed
  • Architecture Decision

    Donchitos/Claude-Code-Game-Studios

    Create an ADR documenting a technical decision: context, alternatives considered, consequences.

    26k GitHub stars~1.7k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Improve Codebase Architecture

    ywwynm/EverythingDone

    Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/.

    144 GitHub starsUsed in 15 repos~1.3k tokens
    DevelopmentAuto-check passed
  • Design Doc Mermaid

    SpillwaveSolutions/design-doc-mermaid

    Create Mermaid diagrams (flowchart, sequence, class, ER, state, C4, architecture) from text or source code.

    176 GitHub starsUsed in 1 repo~5.6k tokens
    DevelopmentAuto-check passed

More from maziyarpanahi/openmed

All 74 skills in this repo
  • Checks OpenMed de-identified clinical text against the 18 HIPAA Safe Harbor identifier categories and reports gaps and residual re-identification risk.

    5.5k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • OpenMed Model Card Writer

    maziyarpanahi/openmed

    Fills in a model card for an OpenMed clinical NER or de-identification model from its evaluation reports: intended use, metrics, subgroups and limitations.

    5.5k GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Walks a data pipeline against the HIPAA Privacy and Security Rule checklist and produces a gap report before it processes patient data.

    5.5k GitHub stars~2k tokensUpdated today
    Auto-check passed
  • ICD-10 Coding Assistant

    maziyarpanahi/openmed

    Suggests candidate ICD-10-CM diagnosis and ICD-10-PCS procedure codes for clinical text extracted by OpenMed, with rationale for a certified coder to review.

    5.5k GitHub stars~2k tokensUpdated today
    Auto-check passed
  • OpenMed ETL to OMOP CDM

    maziyarpanahi/openmed

    Maps OpenMed-extracted, terminology-coded conditions, drugs and measurements into OMOP CDM v5.4 tables for OHDSI and ATLAS analytics.

    5.5k GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Extracting SDOH and Z-Codes

    maziyarpanahi/openmed

    Finds social risks such as housing instability or food insecurity in clinical notes and proposes matching ICD-10-CM Z-codes for a coder to confirm.

    5.5k GitHub stars~1.9k tokensUpdated today
    Auto-check passed

Categories

Questions about Reporting Adverse Events

What does Reporting Adverse Events do?

Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome. Reporting Adverse Events is an agent skill from maziyarpanahi/openmed. Structures adverse-event mentions that OpenMed extracts into FAERS / ICH E2B(R3) reportable fields — suspect drug, reaction (MedDRA PT), seriousness criteria, and outcome.

When should I use Reporting Adverse Events?

Reporting Adverse Events fits situations like: the user needs to build an individual case safety report (ICSR); populate a FAERS submission; map a narrative to E2B(R; classify seriousness (death.

How do I install Reporting Adverse Events in Claude Code?

Run `npx skills add maziyarpanahi/openmed --skill reporting-adverse-events -a claude-code`. Or copy the skill folder (skills/reporting-adverse-events in maziyarpanahi/openmed) into .claude/skills/reporting-adverse-events in your project. Claude Code loads it when a task matches its description.

How do I install Reporting Adverse Events in Codex?

Run `npx skills add maziyarpanahi/openmed --skill reporting-adverse-events -a codex`. Or copy the skill folder (skills/reporting-adverse-events in maziyarpanahi/openmed) into .agents/skills/reporting-adverse-events in your project. Codex loads it when a task matches its description.

Can I use Reporting Adverse Events in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add maziyarpanahi/openmed --skill reporting-adverse-events -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/reporting-adverse-events, .gemini/skills/reporting-adverse-events, .github/skills/reporting-adverse-events and .opencode/skills/reporting-adverse-events in your project.

What does Reporting Adverse Events need to run?

SKILL.md names no scripts, command-line tools or credentials: Reporting Adverse Events is instructions for the agent only. Our summary lists: Python 3.

Does Reporting Adverse Events access the network?

SKILL.md names 3 domains. As links in the text: fda.gov, ich.org and meddra.org. This is read from the text; nothing was executed.

Is Reporting Adverse Events safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Reporting Adverse Events use?

Reporting Adverse Events is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Reporting Adverse Events use?

About 2.2k tokens (SKILL.md is roughly 8.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Reporting Adverse Events?

Skills that share tags, products or a category with Reporting Adverse Events: PR Design Doc (OpenHands/OpenHands, 91k stars), Cto Advisor (Ibrahim-3d/orchestrator-supaconductor, 381 stars), Domain Modeling (brim-borium/spotify_sdk, 166 stars) and Architecture Decision (Donchitos/Claude-Code-Game-Studios, 26k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Reporting Adverse Events?

maziyarpanahi (a GitHub user) maintains it in maziyarpanahi/openmed, which has 5,506 GitHub stars. The repository holds 74 skills in this directory. The repository was last updated on October 11, 2026.

Source: maziyarpanahi/openmed on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.