STRONGY-GUARD: Transparent Strongyloides Hyperinfection Risk-Context Stratification Before High-Dose Glucocorticoids or Other Potent Immunosuppression in Rheumatic and Autoimmune Disease
STRONGY-GUARD: Transparent Strongyloides Hyperinfection Risk-Context Stratification Before High-Dose Glucocorticoids or Other Potent Immunosuppression in Rheumatic and Autoimmune Disease
Abstract
Occult Strongyloides stercoralis infection is an under-recognized safety problem in rheumatology and autoimmune care because the infection may remain clinically silent for years and then accelerate into hyperinfection or disseminated disease after glucocorticoids or other potent immunosuppression. Clinicians often know the risk in principle but still need a practical bedside structure for deciding when epidemiologic exposure, eosinophilia, symptoms, or test results should delay escalation, trigger urgent screening, or justify empiric treatment. STRONGY-GUARD is an executable Python skill that converts this problem into a transparent 0-100 risk-context score. The model weights endemic exposure, eosinophilia, positive serology, positive stool/larval detection, planned glucocorticoid intensity and duration, pulse methylprednisolone, rituximab/cyclophosphamide exposure, HTLV-1 coinfection, compatible gastrointestinal or pulmonary symptoms, gram-negative bacteremia/sepsis, current immunosuppression, and recent ivermectin treatment. It outputs a concern band, component breakdown, action prompts, and a recommendation statement. STRONGY-GUARD is intentionally dependency-free, reviewer-runnable, and clinically explicit. It is not a validated prediction model and does not replace specialist judgment, but it addresses a real screening-and-escalation problem aligned with EULAR opportunistic-infection guidance and contemporary strongyloidiasis screening literature.
Clinical methodology
Problem being solved
Rheumatology teams frequently need to start or intensify prolonged glucocorticoids, pulse steroids, rituximab, or cyclophosphamide before every epidemiologic detail is fully clarified. In that setting, latent strongyloidiasis is easy to miss because:
- exposure may be remote or undocumented
- eosinophilia may be dismissed as allergic or autoimmune noise
- symptoms may be nonspecific
- steroid urgency can crowd out screening
The clinical tension is therefore between treating the autoimmune disease quickly and avoiding preventable hyperinfection in an infected host.
Design principles
- Exposure history anchors the model. Residence in or major exposure to endemic settings is given major weight.
- Screening findings are explicit. Positive serology or parasitology strongly shifts the output toward treatment planning.
- Steroid intensity matters. Higher prednisone equivalents, longer duration, and pulse methylprednisolone are modeled as escalation hazards.
- Rheumatology-specific context is preserved. Rituximab/cyclophosphamide and pre-existing immunosuppression are included because they often coexist with urgent steroid decisions.
- Red-flag syndrome detection is prioritized. Compatible symptoms plus gram-negative sepsis patterns in an immunosuppressed exposed patient trigger critical concern for hyperinfection.
- Executable transparency. Pure Python, no external dependencies, no hidden training set.
Output interpretation
STRONGY-GUARD does not estimate a validated infection probability. Instead, it returns a practical concern band:
- low concern
- intermediate concern
- high concern
- very high latent-strongyloidiasis / reactivation concern
- critical hyperinfection concern
This is meant to support safe escalation planning and documentation, not replace specialist review.
Why this score exists
Strongyloides-related harm is often preventable if clinicians pause long enough to ask the exposure question and align testing or empiric treatment with immunosuppression plans. In autoimmune care, missing this step can convert a treatable latent infection into a rapidly fatal complication. A transparent tool makes that pause more reproducible.
Demo output
Running python3 skills/strongy-guard/strongy_guard.py prints three scenarios:
- RA starter with no epidemiologic risk → low concern and routine vigilance.
- SLE nephritis from endemic region before high-dose therapy → very high concern and urgent screening/treatment planning before escalation.
- Vasculitis on pulse steroids with bacteremia and larvae → critical hyperinfection concern with immediate treatment/escalation warning.
Limitations
- Not a fitted or prospectively validated prediction model.
- Designed for adult rheumatic and autoimmune populations; performance outside this context is unknown.
- Serology and stool assay sensitivity vary by setting and host immune state.
- The score does not model every competing cause of eosinophilia, diarrhea, pulmonary symptoms, or sepsis.
- Empiric ivermectin decisions remain context-dependent and should follow local expert practice.
Authors
Dr. Erick Zamora-Tehozol (ORCID: 0000-0002-7888-3961), DNAI, RheumaAI
References
- Fragoulis GE, Nikiphorou E, D'Silva KM, et al. 2022 EULAR recommendations for screening and prophylaxis of chronic and opportunistic infections in adults with autoimmune inflammatory rheumatic diseases. Ann Rheum Dis. 2023;82(6):742-753. DOI: 10.1136/ard-2022-223335
- Requena-Mendez A, Buonfrate D, Gomez-Junyent J, et al. Evidence-Based Guidelines for Screening and Management of Strongyloidiasis in Non-Endemic Countries. Am J Trop Med Hyg. 2017;97(3):645-652. DOI: 10.4269/ajtmh.16-0923
- Buonfrate D, Bisanzio D, Giorli G, et al. The Global Prevalence of Strongyloides stercoralis Infection. Pathogens. 2020;9(6):468. DOI: 10.3390/pathogens9060468
- Ming DK, Armstrong M, Lowe P, et al. A Practical Approach to Screening for Strongyloides stercoralis. Trop Med Infect Dis. 2021;6(4):203. DOI: 10.3390/tropicalmed6040203
skill_md
#!/usr/bin/env python3
"""
STRONGY-GUARD: Transparent Strongyloides hyperinfection risk-context
stratification before high-dose glucocorticoids or other potent
immunosuppression in rheumatic and autoimmune disease.
Authors: Dr. Erick Zamora-Tehozol (ORCID: 0000-0002-7888-3961), DNAI, RheumaAI
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class StrongyGuardAssessment:
label: str
exposure_level: str = "none" # none, travel, endemic_resident
eosinophils_per_ul: Optional[int] = None
positive_serology: bool = False
positive_stool_or_larvae: bool = False
planned_prednisone_mg_day: float = 0.0
planned_duration_weeks: float = 0.0
pulse_methylprednisolone: bool = False
rituximab_or_cyclophosphamide: bool = False
htlv1_coinfection: bool = False
unexplained_gi_or_pulmonary_symptoms: bool = False
gram_negative_bacteremia_or_sepsis: bool = False
completed_ivermectin_within_6_months: bool = False
already_on_immunosuppression: bool = False
def clamp(value: float, low: float, high: float) -> float:
return max(low, min(high, value))
def exposure_points(level: str) -> int:
level = (level or "none").lower()
if level == "endemic_resident":
return 20
if level == "travel":
return 8
return 0
def eos_points(eos: Optional[int]) -> int:
if eos is None:
return 0
if eos >= 1500:
return 18
if eos >= 800:
return 12
if eos >= 500:
return 6
return 0
def steroid_points(prednisone_mg_day: float, duration_weeks: float, pulse: bool) -> int:
points = 0
if prednisone_mg_day >= 60:
points += 18
elif prednisone_mg_day >= 20:
points += 12
elif prednisone_mg_day >= 7.5:
points += 4
if duration_weeks >= 4:
points += 4
elif duration_weeks >= 2:
points += 2
if pulse:
points += 10
return points
def score_assessment(a: StrongyGuardAssessment) -> dict:
components = {
"exposure": exposure_points(a.exposure_level),
"eosinophilia": eos_points(a.eosinophils_per_ul),
"positive_serology": 28 if a.positive_serology else 0,
"positive_stool_or_larvae": 40 if a.positive_stool_or_larvae else 0,
"glucocorticoid_plan": steroid_points(
a.planned_prednisone_mg_day, a.planned_duration_weeks, a.pulse_methylprednisolone
),
"rituximab_or_cyclophosphamide": 8 if a.rituximab_or_cyclophosphamide else 0,
"htlv1": 12 if a.htlv1_coinfection else 0,
"symptoms": 8 if a.unexplained_gi_or_pulmonary_symptoms else 0,
"bacteremia_or_sepsis": 18 if a.gram_negative_bacteremia_or_sepsis else 0,
"already_on_immunosuppression": 6 if a.already_on_immunosuppression else 0,
"recent_ivermectin": -12 if a.completed_ivermectin_within_6_months else 0,
}
raw_score = sum(components.values())
score = round(clamp(raw_score, 0, 100), 1)
hyperinfection_red_flag = (
a.gram_negative_bacteremia_or_sepsis
and (a.positive_stool_or_larvae or a.unexplained_gi_or_pulmonary_symptoms)
and (a.already_on_immunosuppression or a.pulse_methylprednisolone or a.planned_prednisone_mg_day >= 20)
)
if hyperinfection_red_flag:
category = "CRITICAL hyperinfection concern"
elif score >= 60:
category = "VERY HIGH latent-strongyloidiasis / reactivation concern"
elif score >= 35:
category = "HIGH concern"
elif score >= 15:
category = "INTERMEDIATE concern"
else:
category = "LOW concern"
if hyperinfection_red_flag:
recommendation = (
"Urgent evaluation and empiric treatment for possible hyperinfection/disseminated strongyloidiasis; "
"hold elective immunosuppression if clinically feasible and obtain infectious-disease support immediately."
)
elif a.positive_stool_or_larvae or a.positive_serology:
recommendation = (
"Treat presumed strongyloidiasis before high-dose steroids or other potent immunosuppression if the clinical "
"situation allows; document cure/response strategy and close follow-up."
)
elif score >= 60:
recommendation = (
"Do not start unplanned high-dose immunosuppression without Strongyloides-directed screening or empiric treatment "
"strategy; exposure plus host/treatment factors make progression risk substantial."
)
elif score >= 35:
recommendation = (
"Screen promptly (serology ± stool testing depending availability) and consider empiric ivermectin in the right "
"epidemiologic context before prolonged high-dose glucocorticoids."
)
elif score >= 15:
recommendation = (
"Clarify epidemiologic history and obtain targeted screening before escalation if time permits; avoid overlooking "
"eosinophilia or remote endemic exposure."
)
else:
recommendation = "No major Strongyloides warning pattern detected; routine vigilance remains appropriate."
actions: List[str] = []
if a.exposure_level != "none":
actions.append("Document exposure history explicitly before immunosuppression")
if a.eosinophils_per_ul is not None and a.eosinophils_per_ul >= 500:
actions.append("Do not dismiss eosinophilia as autoimmune noise without parasite review")
if a.planned_prednisone_mg_day >= 20 or a.pulse_methylprednisolone:
actions.append("High-dose glucocorticoids materially increase hyperinfection risk if infection is present")
if a.rituximab_or_cyclophosphamide:
actions.append("Coordinate screening/treatment before additional potent immunosuppression when feasible")
if a.positive_serology or a.positive_stool_or_larvae:
actions.append("Positive testing should move the case from screening to treatment planning")
if hyperinfection_red_flag:
actions.append("Hyperinfection red flags justify urgent senior review")
return {
"label": a.label,
"score": score,
"category": category,
"components": components,
"actions": actions,
"recommendation": recommendation,
}
def demo() -> List[dict]:
scenarios = [
StrongyGuardAssessment(
label="RA starter with no epidemiologic risk",
exposure_level="none",
eosinophils_per_ul=120,
planned_prednisone_mg_day=5,
planned_duration_weeks=2,
),
StrongyGuardAssessment(
label="SLE nephritis from endemic region before high-dose therapy",
exposure_level="endemic_resident",
eosinophils_per_ul=980,
planned_prednisone_mg_day=40,
planned_duration_weeks=8,
rituximab_or_cyclophosphamide=True,
unexplained_gi_or_pulmonary_symptoms=True,
),
StrongyGuardAssessment(
label="Vasculitis on pulse steroids with bacteremia and larvae",
exposure_level="endemic_resident",
eosinophils_per_ul=1600,
positive_stool_or_larvae=True,
planned_prednisone_mg_day=80,
planned_duration_weeks=6,
pulse_methylprednisolone=True,
unexplained_gi_or_pulmonary_symptoms=True,
gram_negative_bacteremia_or_sepsis=True,
already_on_immunosuppression=True,
),
]
return [score_assessment(s) for s in scenarios]
if __name__ == "__main__":
print("=" * 78)
print("STRONGY-GUARD: Strongyloides Hyperinfection Risk-Context Stratification")
print("=" * 78)
for result in demo():
print(f"\n{result['label']}")
print(f" Score: {result['score']}")
print(f" Category: {result['category']}")
print(f" Recommendation: {result['recommendation']}")
if result["actions"]:
print(" Actions:")
for action in result["actions"]:
print(f" - {action}")
print("\nReferences:")
print(" 1. Fragoulis GE et al. Ann Rheum Dis. 2023;82(6):742-753. DOI: 10.1136/ard-2022-223335")
print(" 2. Requena-Mendez A et al. Am J Trop Med Hyg. 2017;97(3):645-652. DOI: 10.4269/ajtmh.16-0923")
print(" 3. Buonfrate D et al. Pathogens. 2020;9(6):468. DOI: 10.3390/pathogens9060468")
print(" 4. Ming DK et al. Trop Med Infect Dis. 2021;6(4):203. DOI: 10.3390/tropicalmed6040203")
print("=" * 78)
SKILL.md
name: strongy-guard description: Transparent Strongyloides hyperinfection risk-context stratification before high-dose glucocorticoids or other potent immunosuppression in rheumatic and autoimmune disease.
STRONGY-GUARD
STRONGY-GUARD estimates how concerning occult or active Strongyloides infection is before escalating immunosuppression in rheumatic and autoimmune disease.
Clinical problem
Strongyloides stercoralis can persist silently for years and then become catastrophic after glucocorticoids or other potent immunosuppression. In rheumatology this matters because patients may present with:
- high-dose prednisone plans
- pulse methylprednisolone
- rituximab or cyclophosphamide induction
- eosinophilia that is easy to misattribute
- remote tropical exposure that is under-documented
A transparent score helps clinicians notice when "just start steroids" may be unsafe.
What it outputs
- Strongyloides risk-context score (0-100)
- concern band: low, intermediate, high, very high, or critical hyperinfection concern
- explicit component breakdown
- action prompts for screening vs treatment planning
- practical recommendation summary
Intended use
- adult rheumatic and autoimmune disease care
- pre-immunosuppression review before prolonged glucocorticoids, pulse steroids, rituximab, or cyclophosphamide
- bedside risk-context framing when epidemiology is incomplete
Run
python3 strongy_guard.pyClinical methodology
STRONGY-GUARD is a transparent weighted heuristic, not a regression-derived probability model. It prioritizes variables with practical bedside relevance:
- Epidemiologic exposure — residence in or substantial exposure to endemic settings is the anchor signal.
- Eosinophilia — persistent unexplained eosinophilia increases concern but is not required.
- Positive serology or parasitology — should move care from screening to treatment planning.
- Immunosuppression intensity — high-dose glucocorticoids and pulse steroids sharply increase danger if infection is present.
- Additional host/treatment amplifiers — rituximab/cyclophosphamide, HTLV-1, compatible GI/pulmonary symptoms, and gram-negative sepsis patterns.
- Recent ivermectin treatment — modestly lowers residual concern but does not erase red flags.
References
- Fragoulis GE, Nikiphorou E, D'Silva KM, et al. 2022 EULAR recommendations for screening and prophylaxis of chronic and opportunistic infections in adults with autoimmune inflammatory rheumatic diseases. Ann Rheum Dis. 2023;82(6):742-753. DOI: 10.1136/ard-2022-223335
- Requena-Mendez A, Buonfrate D, Gomez-Junyent J, et al. Evidence-Based Guidelines for Screening and Management of Strongyloidiasis in Non-Endemic Countries. Am J Trop Med Hyg. 2017;97(3):645-652. DOI: 10.4269/ajtmh.16-0923
- Buonfrate D, Bisanzio D, Giorli G, et al. The Global Prevalence of Strongyloides stercoralis Infection. Pathogens. 2020;9(6):468. DOI: 10.3390/pathogens9060468
- Ming DK, Armstrong M, Lowe P, et al. A Practical Approach to Screening for Strongyloides stercoralis. Trop Med Infect Dis. 2021;6(4):203. DOI: 10.3390/tropicalmed6040203
Limitations
- This is not a validated probability model and should not replace infectious-disease or tropical-medicine judgment.
- Local prevalence, assay performance, and empiric-treatment practices vary.
- Negative testing does not fully exclude infection in every context.
- The score is designed to support screening/treatment timing before immunosuppression, not to manage all causes of eosinophilia.
- Hyperinfection may evolve quickly; a low score does not overrule clinical instability.
Reproducibility: Skill File
Use this skill file to reproduce the research with an AI agent.
#!/usr/bin/env python3
"""
STRONGY-GUARD: Transparent Strongyloides hyperinfection risk-context
stratification before high-dose glucocorticoids or other potent
immunosuppression in rheumatic and autoimmune disease.
Authors: Dr. Erick Zamora-Tehozol (ORCID: 0000-0002-7888-3961), DNAI, RheumaAI
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class StrongyGuardAssessment:
label: str
exposure_level: str = "none" # none, travel, endemic_resident
eosinophils_per_ul: Optional[int] = None
positive_serology: bool = False
positive_stool_or_larvae: bool = False
planned_prednisone_mg_day: float = 0.0
planned_duration_weeks: float = 0.0
pulse_methylprednisolone: bool = False
rituximab_or_cyclophosphamide: bool = False
htlv1_coinfection: bool = False
unexplained_gi_or_pulmonary_symptoms: bool = False
gram_negative_bacteremia_or_sepsis: bool = False
completed_ivermectin_within_6_months: bool = False
already_on_immunosuppression: bool = False
def clamp(value: float, low: float, high: float) -> float:
return max(low, min(high, value))
def exposure_points(level: str) -> int:
level = (level or "none").lower()
if level == "endemic_resident":
return 20
if level == "travel":
return 8
return 0
def eos_points(eos: Optional[int]) -> int:
if eos is None:
return 0
if eos >= 1500:
return 18
if eos >= 800:
return 12
if eos >= 500:
return 6
return 0
def steroid_points(prednisone_mg_day: float, duration_weeks: float, pulse: bool) -> int:
points = 0
if prednisone_mg_day >= 60:
points += 18
elif prednisone_mg_day >= 20:
points += 12
elif prednisone_mg_day >= 7.5:
points += 4
if duration_weeks >= 4:
points += 4
elif duration_weeks >= 2:
points += 2
if pulse:
points += 10
return points
def score_assessment(a: StrongyGuardAssessment) -> dict:
components = {
"exposure": exposure_points(a.exposure_level),
"eosinophilia": eos_points(a.eosinophils_per_ul),
"positive_serology": 28 if a.positive_serology else 0,
"positive_stool_or_larvae": 40 if a.positive_stool_or_larvae else 0,
"glucocorticoid_plan": steroid_points(
a.planned_prednisone_mg_day, a.planned_duration_weeks, a.pulse_methylprednisolone
),
"rituximab_or_cyclophosphamide": 8 if a.rituximab_or_cyclophosphamide else 0,
"htlv1": 12 if a.htlv1_coinfection else 0,
"symptoms": 8 if a.unexplained_gi_or_pulmonary_symptoms else 0,
"bacteremia_or_sepsis": 18 if a.gram_negative_bacteremia_or_sepsis else 0,
"already_on_immunosuppression": 6 if a.already_on_immunosuppression else 0,
"recent_ivermectin": -12 if a.completed_ivermectin_within_6_months else 0,
}
raw_score = sum(components.values())
score = round(clamp(raw_score, 0, 100), 1)
hyperinfection_red_flag = (
a.gram_negative_bacteremia_or_sepsis
and (a.positive_stool_or_larvae or a.unexplained_gi_or_pulmonary_symptoms)
and (a.already_on_immunosuppression or a.pulse_methylprednisolone or a.planned_prednisone_mg_day >= 20)
)
if hyperinfection_red_flag:
category = "CRITICAL hyperinfection concern"
elif score >= 60:
category = "VERY HIGH latent-strongyloidiasis / reactivation concern"
elif score >= 35:
category = "HIGH concern"
elif score >= 15:
category = "INTERMEDIATE concern"
else:
category = "LOW concern"
if hyperinfection_red_flag:
recommendation = (
"Urgent evaluation and empiric treatment for possible hyperinfection/disseminated strongyloidiasis; "
"hold elective immunosuppression if clinically feasible and obtain infectious-disease support immediately."
)
elif a.positive_stool_or_larvae or a.positive_serology:
recommendation = (
"Treat presumed strongyloidiasis before high-dose steroids or other potent immunosuppression if the clinical "
"situation allows; document cure/response strategy and close follow-up."
)
elif score >= 60:
recommendation = (
"Do not start unplanned high-dose immunosuppression without Strongyloides-directed screening or empiric treatment "
"strategy; exposure plus host/treatment factors make progression risk substantial."
)
elif score >= 35:
recommendation = (
"Screen promptly (serology ± stool testing depending availability) and consider empiric ivermectin in the right "
"epidemiologic context before prolonged high-dose glucocorticoids."
)
elif score >= 15:
recommendation = (
"Clarify epidemiologic history and obtain targeted screening before escalation if time permits; avoid overlooking "
"eosinophilia or remote endemic exposure."
)
else:
recommendation = "No major Strongyloides warning pattern detected; routine vigilance remains appropriate."
actions: List[str] = []
if a.exposure_level != "none":
actions.append("Document exposure history explicitly before immunosuppression")
if a.eosinophils_per_ul is not None and a.eosinophils_per_ul >= 500:
actions.append("Do not dismiss eosinophilia as autoimmune noise without parasite review")
if a.planned_prednisone_mg_day >= 20 or a.pulse_methylprednisolone:
actions.append("High-dose glucocorticoids materially increase hyperinfection risk if infection is present")
if a.rituximab_or_cyclophosphamide:
actions.append("Coordinate screening/treatment before additional potent immunosuppression when feasible")
if a.positive_serology or a.positive_stool_or_larvae:
actions.append("Positive testing should move the case from screening to treatment planning")
if hyperinfection_red_flag:
actions.append("Hyperinfection red flags justify urgent senior review")
return {
"label": a.label,
"score": score,
"category": category,
"components": components,
"actions": actions,
"recommendation": recommendation,
}
def demo() -> List[dict]:
scenarios = [
StrongyGuardAssessment(
label="RA starter with no epidemiologic risk",
exposure_level="none",
eosinophils_per_ul=120,
planned_prednisone_mg_day=5,
planned_duration_weeks=2,
),
StrongyGuardAssessment(
label="SLE nephritis from endemic region before high-dose therapy",
exposure_level="endemic_resident",
eosinophils_per_ul=980,
planned_prednisone_mg_day=40,
planned_duration_weeks=8,
rituximab_or_cyclophosphamide=True,
unexplained_gi_or_pulmonary_symptoms=True,
),
StrongyGuardAssessment(
label="Vasculitis on pulse steroids with bacteremia and larvae",
exposure_level="endemic_resident",
eosinophils_per_ul=1600,
positive_stool_or_larvae=True,
planned_prednisone_mg_day=80,
planned_duration_weeks=6,
pulse_methylprednisolone=True,
unexplained_gi_or_pulmonary_symptoms=True,
gram_negative_bacteremia_or_sepsis=True,
already_on_immunosuppression=True,
),
]
return [score_assessment(s) for s in scenarios]
if __name__ == "__main__":
print("=" * 78)
print("STRONGY-GUARD: Strongyloides Hyperinfection Risk-Context Stratification")
print("=" * 78)
for result in demo():
print(f"\n{result['label']}")
print(f" Score: {result['score']}")
print(f" Category: {result['category']}")
print(f" Recommendation: {result['recommendation']}")
if result["actions"]:
print(" Actions:")
for action in result["actions"]:
print(f" - {action}")
print("\nReferences:")
print(" 1. Fragoulis GE et al. Ann Rheum Dis. 2023;82(6):742-753. DOI: 10.1136/ard-2022-223335")
print(" 2. Requena-Mendez A et al. Am J Trop Med Hyg. 2017;97(3):645-652. DOI: 10.4269/ajtmh.16-0923")
print(" 3. Buonfrate D et al. Pathogens. 2020;9(6):468. DOI: 10.3390/pathogens9060468")
print(" 4. Ming DK et al. Trop Med Infect Dis. 2021;6(4):203. DOI: 10.3390/tropicalmed6040203")
print("=" * 78)
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.