SRC-SHIELD: Scleroderma Renal Crisis Risk-Context Stratification Before Glucocorticoids or During Acute Hypertension and Kidney Injury
0
SRC-SHIELD is an executable Python skill for transparent scleroderma renal crisis risk-context stratification in systemic sclerosis. It weights diffuse cutaneous phenotype, early disease duration, anti-RNA polymerase III positivity, glucocorticoid exposure, new hypertension, creatinine rise, proteinuria, and microangiopathic features into a 0-100 concern score. The tool is designed to help clinicians avoid missing SRC before or during steroid escalation. Limitations: heuristic only, not validated, not a substitute for nephrology or emergency assessment. ORCID: 0000-0002-7888-3961. References: Moinzadeh P et al. J Rheumatol. 2019;47(2):241-248. DOI: 10.3899/jrheum.180582; Montrief T et al. J Community Hosp Intern Med Perspect. 2020;10(1):1-7. DOI: 10.1080/20009666.2019.1709340; Renal Disease and Systemic Sclerosis: an Update on Scleroderma Renal Crisis. Curr Treatm Opt Rheumatol. 2022. DOI: 10.1007/s12016-022-08945-x; Wielosz E et al. Adv Dermatol Allergol. 2020;37(6):909-914. DOI: 10.5114/ada.2020.102107.
SRC-SHIELD
Executable Code
#!/usr/bin/env python3
"""
SRC-SHIELD: transparent bedside risk-context stratification for
scleroderma renal crisis in systemic sclerosis.
Authors: Dr. Erick Zamora-Tehozol (ORCID: 0000-0002-7888-3961), DNAI, RheumaAI
License: MIT
"""
from __future__ import annotations
from dataclasses import dataclass, asdict
from typing import Dict, Any, List, Optional
@dataclass
class SRCInput:
label: str
subtype: str = "limited" # limited, diffuse
disease_years: float = 0.0
anti_rna_polymerase_iii: bool = False
anti_scl70: bool = False
tendon_friction_rubs: bool = False
prednisone_mg_day: float = 0.0
prednisone_days: float = 0.0
pulse_methylprednisolone: bool = False
new_hypertension: bool = False
sbp_increase_mm_hg: Optional[int] = None
creatinine_rise_pct: Optional[float] = None
proteinuria_g_day: Optional[float] = None
hematuria: bool = False
thrombocytopenia: bool = False
microangiopathic_hemolysis: bool = False
def clamp(x: float, lo: float = 0.0, hi: float = 100.0) -> float:
return max(lo, min(hi, x))
def score_src(p: SRCInput) -> Dict[str, Any]:
c: Dict[str, int] = {}
c["diffuse_subtype"] = 10 if p.subtype.lower() == "diffuse" else 0
c["early_disease"] = 10 if p.disease_years <= 4 else 4 if p.disease_years <= 7 else 0
c["anti_rna_pol_iii"] = 24 if p.anti_rna_polymerase_iii else 0
c["anti_scl70"] = 4 if p.anti_scl70 else 0
c["tendon_friction_rubs"] = 8 if p.tendon_friction_rubs else 0
if p.pulse_methylprednisolone:
c["glucocorticoids"] = 14
elif p.prednisone_mg_day >= 30:
c["glucocorticoids"] = 18
elif p.prednisone_mg_day >= 15:
c["glucocorticoids"] = 12
elif p.prednisone_mg_day >= 7.5:
c["glucocorticoids"] = 6
else:
c["glucocorticoids"] = 0
if p.prednisone_days >= 14:
c["steroid_duration"] = 4
elif p.prednisone_days >= 3:
c["steroid_duration"] = 2
else:
c["steroid_duration"] = 0
c["new_hypertension"] = 16 if p.new_hypertension else 0
if p.sbp_increase_mm_hg is not None:
if p.sbp_increase_mm_hg >= 40:
c["sbp_jump"] = 8
elif p.sbp_increase_mm_hg >= 20:
c["sbp_jump"] = 4
else:
c["sbp_jump"] = 0
else:
c["sbp_jump"] = 0
if p.creatinine_rise_pct is not None:
if p.creatinine_rise_pct >= 100:
c["creatinine_rise"] = 18
elif p.creatinine_rise_pct >= 50:
c["creatinine_rise"] = 12
elif p.creatinine_rise_pct >= 25:
c["creatinine_rise"] = 6
else:
c["creatinine_rise"] = 0
else:
c["creatinine_rise"] = 0
if p.proteinuria_g_day is not None:
if p.proteinuria_g_day >= 1.0:
c["proteinuria"] = 8
elif p.proteinuria_g_day >= 0.3:
c["proteinuria"] = 4
else:
c["proteinuria"] = 0
else:
c["proteinuria"] = 0
c["hematuria"] = 4 if p.hematuria else 0
c["thrombocytopenia"] = 6 if p.thrombocytopenia else 0
c["microangiopathic_hemolysis"] = 10 if p.microangiopathic_hemolysis else 0
raw = sum(c.values())
score = round(clamp(float(raw), 0, 100), 1)
red_flag = (
p.new_hypertension
and p.creatinine_rise_pct is not None
and p.creatinine_rise_pct >= 50
and (
p.anti_rna_polymerase_iii
or p.subtype.lower() == "diffuse"
or p.pulse_methylprednisolone
or p.prednisone_mg_day >= 15
)
)
if red_flag:
category = "CRITICAL SRC concern"
elif score >= 60:
category = "VERY HIGH SRC concern"
elif score >= 35:
category = "HIGH SRC concern"
elif score >= 15:
category = "INTERMEDIATE SRC concern"
else:
category = "LOW SRC concern"
if red_flag:
recommendation = (
"Treat this as possible scleroderma renal crisis now: urgent nephrology/rheumatology review, "
"repeat blood pressure and kidney testing immediately, and minimize further glucocorticoid exposure if feasible."
)
elif p.new_hypertension and p.creatinine_rise_pct is not None and p.creatinine_rise_pct >= 25:
recommendation = (
"SRC should be actively excluded; check creatinine trend, urine sediment, hemolysis labs, and blood pressure "
"promptly before assuming autoimmune flare alone."
)
elif score >= 60:
recommendation = (
"Very high-risk systemic sclerosis profile for SRC. Avoid avoidable glucocorticoid escalation, monitor blood pressure, "
"and obtain early renal surveillance."
)
elif score >= 35:
recommendation = (
"High-risk SRC context. Reassess steroid necessity, document baseline BP/creatinine/proteinuria, and intensify follow-up."
)
elif score >= 15:
recommendation = (
"Intermediate SRC context. Clarify antibody profile, disease duration, and renal baseline before escalation."
)
else:
recommendation = "No major SRC warning pattern detected; continue routine systemic sclerosis surveillance."
actions: List[str] = []
if p.anti_rna_polymerase_iii:
actions.append("Anti-RNA polymerase III is a major SRC signal")
if p.prednisone_mg_day >= 15 or p.pulse_methylprednisolone:
actions.append("Glucocorticoids can precipitate or unmask SRC in susceptible patients")
if p.new_hypertension:
actions.append("New hypertension in systemic sclerosis deserves immediate confirmation and trend review")
if p.creatinine_rise_pct is not None and p.creatinine_rise_pct >= 25:
actions.append("Acute kidney injury pattern should not be attributed to flare without renal evaluation")
if p.thrombocytopenia or p.microangiopathic_hemolysis:
actions.append("TMA features increase urgency and support SRC suspicion")
return {
"label": p.label,
"score": score,
"category": category,
"red_flag": red_flag,
"components": c,
"actions": actions,
"recommendation": recommendation,
"input": asdict(p),
}
def demo() -> List[Dict[str, Any]]:
cases = [
SRCInput(
label="Stable limited cutaneous SSc, no renal warning signs",
subtype="limited",
disease_years=8,
anti_rna_polymerase_iii=False,
prednisone_mg_day=5,
),
SRCInput(
label="Early diffuse SSc on moderate steroids with rising BP",
subtype="diffuse",
disease_years=2.0,
anti_rna_polymerase_iii=True,
prednisone_mg_day=20,
prednisone_days=10,
new_hypertension=True,
sbp_increase_mm_hg=28,
creatinine_rise_pct=30,
proteinuria_g_day=0.5,
),
SRCInput(
label="Diffuse SSc on pulse methylprednisolone with AKI, HTN, and TMA",
subtype="diffuse",
disease_years=1.5,
anti_rna_polymerase_iii=True,
tendon_friction_rubs=True,
pulse_methylprednisolone=True,
new_hypertension=True,
sbp_increase_mm_hg=55,
creatinine_rise_pct=120,
proteinuria_g_day=1.8,
hematuria=True,
thrombocytopenia=True,
microangiopathic_hemolysis=True,
),
]
return [score_src(c) for c in cases]
if __name__ == "__main__":
print("=" * 78)
print("SRC-SHIELD: Scleroderma Renal Crisis Risk-Context Stratification")
print("=" * 78)
for r in demo():
print(f"\n{r['label']}")
print(f" Score: {r['score']}")
print(f" Category: {r['category']}")
print(f" Recommendation: {r['recommendation']}")
if r['actions']:
print(" Actions:")
for a in r['actions']:
print(f" - {a}")
print("\nReferences:")
print(" 1. Moinzadeh P et al. J Rheumatol. 2019;47(2):241-248. DOI: 10.3899/jrheum.180582")
print(" 2. Montrief T et al. J Community Hosp Intern Med Perspect. 2020;10(1):1-7. DOI: 10.1080/20009666.2019.1709340")
print(" 3. Renal Disease and Systemic Sclerosis: an Update on Scleroderma Renal Crisis. Curr Treatm Opt Rheumatol. 2022. DOI: 10.1007/s12016-022-08945-x")
print(" 4. Wielosz E et al. Adv Dermatol Allergol. 2020;37(6):909-914. DOI: 10.5114/ada.2020.102107")
print("=" * 78)
Demo Output
Stable limited cutaneous SSc, no renal warning signs -> LOW SRC concern
Early diffuse SSc on moderate steroids with rising BP -> VERY HIGH SRC concern
Diffuse SSc on pulse methylprednisolone with AKI, HTN, and TMA -> CRITICAL SRC concernDiscussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.