CMV-GUARD: Cytomegalovirus Reactivation Risk Stratification During Remission-Induction Immunosuppression in Rheumatic and Autoimmune Disease
CMV-GUARD: Cytomegalovirus Reactivation Risk Stratification During Remission-Induction Immunosuppression in Rheumatic and Autoimmune Disease
Authors
Dr. Erick Zamora-Tehozol, DNAI, RheumaAI
ORCID: 0000-0002-7888-3961
Abstract
Cytomegalovirus (CMV) reactivation is an under-structured safety problem in rheumatology. It is well recognized in transplantation and hematology, but in autoimmune disease the operational question remains poorly standardized: which patients starting intensive immunosuppression are high enough risk that structured CMV surveillance should already be planned? We present CMV-GUARD, an agent-executable clinical decision-support skill that estimates CMV reactivation risk on a 0-100 scale during remission-induction therapy for rheumatic and autoimmune disease. The model integrates 11 domains: diagnosis group, rituximab exposure, cyclophosphamide exposure, glucocorticoid intensity, lymphopenia, serum IgG, albumin, CMV serostatus, prior CMV disease/viremia, additional immunosuppressants, and age. A Monte Carlo layer generates a 95% uncertainty interval. In demonstration scenarios, a low-intensity RA case scored 8.6 [LOW], an ANCA-associated vasculitis patient receiving rituximab plus prednisone 40 mg/day with lymphopenia and low IgG scored 52.1 [VERY HIGH], and an SLE patient on cyclophosphamide with severe lymphopenia, hypoalbuminemia, and prior CMV history scored 64.9 [VERY HIGH]. The tool addresses a real clinical gap: converting scattered opportunistic-infection literature into an explicit, auditable surveillance heuristic for autoimmune induction therapy.
Clinical Problem and Justification
CMV reactivation in autoimmune disease is clinically important because it often appears in the same patients already at risk for bacterial, fungal, and treatment-related complications. High-dose glucocorticoids, cyclophosphamide, rituximab, lymphopenia, hypogammaglobulinemia, and hypoalbuminemia recur across the literature as plausible or observed risk signals. Yet bedside practice still relies on fragmented rules such as “test if they look sick” or “maybe check CMV in vasculitis.” That is not sufficient for reproducible clinical workflows or auditable agent systems.
CMV-GUARD exists to solve a narrow problem: before and during remission induction, can we make CMV surveillance logic explicit enough that a clinician or reviewer can inspect the reasoning rather than inherit a black-box recommendation?
This is especially important in DeSci settings. Safety thresholds should be transparent, executable, and revisable.
Methods
Risk Architecture
CMV-GUARD uses 11 weighted domains:
- Diagnosis group (w=0.10)
AAV and SLE are weighted above uncomplicated RA because contemporary induction cohorts show more frequent CMV reactivation signals. - Rituximab exposure (w=0.12)
Captures B-cell depletion and the growing literature on CMV events during RTX-treated rheumatic disease. - Cyclophosphamide exposure (w=0.10)
Reflects classic remission-induction intensity. - Glucocorticoid intensity (w=0.16)
Combines dose and duration because steroid burden is repeatedly associated with CMV risk. - Lymphopenia (w=0.14)
Represents impaired cellular immune control. - Serum IgG (w=0.10)
Low IgG reflects broader immune depletion and appeared as a risk signal in recent AAV data. - Albumin (w=0.10)
Hypoalbuminemia is repeatedly associated with worse host vulnerability and CMV reactivation. - CMV serostatus (w=0.08)
Seropositivity is required for true reactivation risk. - Prior CMV disease or viremia (w=0.05)
Encodes known host susceptibility. - Additional immunosuppressants (w=0.03)
Models cumulative treatment burden. - Age (w=0.02)
Marks reduced physiologic reserve and immunosenescence.
Monte Carlo Uncertainty
Continuous inputs (steroid dose, duration, lymphocyte count, serum IgG, albumin, age) are perturbed across 5,000 simulations using Gaussian noise to generate a 95% uncertainty interval.
Output Categories
| Score | Category | Interpretation |
|---|---|---|
| <15 | LOW | Routine structured CMV surveillance usually not indicated on this profile alone |
| 15-29.9 | INTERMEDIATE | Consider baseline testing or symptom-triggered monitoring |
| 30-49.9 | HIGH | Structured surveillance should be strongly considered |
| >=50 | VERY HIGH | Structured surveillance is favored during induction |
Demo Output
Scenario 1 — Stable RA, low-intensity treatment
- Composite score: 8.6/100 [LOW]
- Interpretation: seropositivity alone is not enough to justify structured surveillance when treatment intensity and immune suppression are low.
Scenario 2 — AAV induction with rituximab + prednisone 40 mg/day
- Composite score: 52.1/100 [VERY HIGH]
- Interpretation: this phenotype combines diagnosis-level risk, steroid intensity, B-cell depletion, lymphopenia, low IgG, and hypoalbuminemia.
Scenario 3 — Severe SLE induction with cyclophosphamide and prior CMV
- Composite score: 64.9/100 [VERY HIGH]
- Interpretation: prior CMV history plus severe immune suppression should lower the threshold for deliberate virologic surveillance.
Why This Score Exists
CMV-GUARD is designed for three concrete use cases:
- Pre-treatment surveillance planning — identify patients in whom CMV monitoring should already be part of induction planning.
- Agent auditability — replace vague narrative advice with inspectable weighting logic.
- Future calibration — provide a transparent scaffold that can later be tuned against real-world cohorts.
Explicit Limitations
- This is an evidence-informed composite tool, not a prospectively derived or externally validated regression model.
- It does not diagnose active CMV disease.
- It does not replace pp65 antigenemia, CMV qPCR, ophthalmologic evaluation, colonoscopy, bronchoscopy, or infectious disease review when clinically indicated.
- It supports surveillance planning, not automatic antiviral prophylaxis.
- Some weights are extrapolated from cohort and review literature rather than pooled meta-analysis.
- Disease activity itself is incompletely modeled because the current version focuses on treatment intensity and immune depletion proxies.
- Thresholds should be recalibrated when larger autoimmune CMV datasets become available.
Executable Python Skill
#!/usr/bin/env python3
from __future__ import annotations
import random
from dataclasses import dataclass, field
from typing import List
@dataclass
class CMVPatient:
diagnosis_group: str = "other_aiird"
rituximab: bool = False
cyclophosphamide: bool = False
glucocorticoid_mg_day: float = 0.0
steroid_weeks: int = 0
lymphocytes_per_ul: int = 1500
serum_igg_mg_dl: int | None = None
albumin_g_dl: float = 4.0
cmv_igg_positive: bool = True
prior_cmv_disease_or_viremia: bool = False
additional_immunosuppressants: int = 0
age: int = 50
@dataclass
class CMVResult:
composite_score: float
risk_category: str
surveillance_recommendation: str
antiviral_comment: str
ci_lower: float
ci_upper: float
domains: List[dict]
notes: List[str] = field(default_factory=list)
WEIGHTS = {
"diagnosis": 0.10,
"rituximab": 0.12,
"cyclophosphamide": 0.10,
"steroids": 0.16,
"lymphopenia": 0.14,
"igg": 0.10,
"albumin": 0.10,
"serostatus": 0.08,
"history": 0.05,
"combo": 0.03,
"age": 0.02,
}
def score_diagnosis(group: str):
mapping = {
"aav": (70, "AAV"),
"sle": (58, "SLE"),
"iim": (52, "IIM"),
"ssc": (32, "SSc"),
"ra": (22, "RA"),
"other_aiird": (35, "Other AIIRD"),
}
return mapping.get(group, (35, group))
def score_rituximab(exposed: bool):
return (75, "Rituximab") if exposed else (0, "No rituximab")
def score_cyclophosphamide(exposed: bool):
return (70, "Cyclophosphamide") if exposed else (0, "No cyclophosphamide")
def score_steroids(mg_day: float, weeks: int):
if mg_day <= 0 or weeks <= 0:
return 0, "No steroids"
if mg_day < 10 or weeks < 2:
return 8, "Low-dose/brief steroids"
if mg_day < 20:
return 28, "Moderate steroids"
if mg_day < 30:
return 48, "Substantial steroids"
if mg_day >= 30 and weeks >= 4:
return 90, "Prednisone >=30 mg/day for >=4 weeks"
return 65, "Intensive steroid exposure"
def score_lymphopenia(lymphocytes: int):
if lymphocytes >= 1200:
return 0, f"lymphocytes={lymphocytes}"
if lymphocytes >= 800:
return 20, f"lymphocytes={lymphocytes}"
if lymphocytes >= 500:
return 48, f"lymphocytes={lymphocytes}"
return 82, f"lymphocytes={lymphocytes}"
def score_igg(igg: int | None):
if igg is None:
return 10, "IgG missing"
if igg >= 900:
return 0, f"IgG={igg}"
if igg >= 700:
return 18, f"IgG={igg}"
if igg >= 500:
return 42, f"IgG={igg}"
return 75, f"IgG={igg}"
def score_albumin(albumin: float):
if albumin >= 3.8:
return 0, f"albumin={albumin}"
if albumin >= 3.3:
return 24, f"albumin={albumin}"
if albumin >= 2.8:
return 52, f"albumin={albumin}"
return 82, f"albumin={albumin}"
def score_serostatus(cmv_igg_positive: bool):
return (55, "CMV IgG positive") if cmv_igg_positive else (0, "CMV IgG negative")
def score_history(prior: bool):
return (90, "Prior CMV history") if prior else (0, "No prior CMV history")
def score_combo(count: int):
return (0 if count <= 0 else 24 if count == 1 else 45 if count == 2 else 60), f"additional={count}"
def score_age(age: int):
if age < 50:
return 0, f"Age {age}"
if age < 65:
return 12, f"Age {age}"
if age < 75:
return 24, f"Age {age}"
return 36, f"Age {age}"
def compute_cmv_risk(patient: CMVPatient, n_simulations: int = 5000, seed: int = 42) -> CMVResult:
items = [
("diagnosis", score_diagnosis(patient.diagnosis_group)),
("rituximab", score_rituximab(patient.rituximab)),
("cyclophosphamide", score_cyclophosphamide(patient.cyclophosphamide)),
("steroids", score_steroids(patient.glucocorticoid_mg_day, patient.steroid_weeks)),
("lymphopenia", score_lymphopenia(patient.lymphocytes_per_ul)),
("igg", score_igg(patient.serum_igg_mg_dl)),
("albumin", score_albumin(patient.albumin_g_dl)),
("serostatus", score_serostatus(patient.cmv_igg_positive)),
("history", score_history(patient.prior_cmv_disease_or_viremia)),
("combo", score_combo(patient.additional_immunosuppressants)),
("age", score_age(patient.age)),
]
domains, composite = [], 0.0
for name, (score, detail) in items:
weighted = score * WEIGHTS[name]
composite += weighted
domains.append({"name": name, "score": round(score,1), "weight": WEIGHTS[name], "weighted": round(weighted,1), "detail": detail})
composite = round(min(composite, 100), 1)
rng = random.Random(seed)
sims = [max(0, min(100, composite + rng.gauss(0, 2.5))) for _ in range(n_simulations)]
sims.sort()
ci_lower = round(sims[int(0.025 * n_simulations)], 1)
ci_upper = round(sims[int(0.975 * n_simulations)], 1)
if composite < 15:
category = "LOW"
surveillance = "Routine structured surveillance usually not indicated."
elif composite < 30:
category = "INTERMEDIATE"
surveillance = "Consider baseline testing or symptom-triggered monitoring."
elif composite < 50:
category = "HIGH"
surveillance = "Structured surveillance should be strongly considered."
else:
category = "VERY HIGH"
surveillance = "Structured surveillance is favored during induction."
return CMVResult(composite, category, surveillance, "Supports surveillance planning, not automatic antiviral prophylaxis.", ci_lower, ci_upper, domains)
if __name__ == "__main__":
cases = [
CMVPatient(diagnosis_group="ra", glucocorticoid_mg_day=7.5, steroid_weeks=2, lymphocytes_per_ul=1500, serum_igg_mg_dl=980, albumin_g_dl=4.2, cmv_igg_positive=True, additional_immunosuppressants=1, age=48),
CMVPatient(diagnosis_group="aav", rituximab=True, glucocorticoid_mg_day=40, steroid_weeks=6, lymphocytes_per_ul=620, serum_igg_mg_dl=540, albumin_g_dl=3.1, cmv_igg_positive=True, additional_immunosuppressants=1, age=71),
CMVPatient(diagnosis_group="sle", cyclophosphamide=True, glucocorticoid_mg_day=32, steroid_weeks=8, lymphocytes_per_ul=420, serum_igg_mg_dl=460, albumin_g_dl=2.7, cmv_igg_positive=True, prior_cmv_disease_or_viremia=True, additional_immunosuppressants=2, age=63),
]
for case in cases:
print(compute_cmv_risk(case))References
- Yoshimura Y, et al. Risk factors associated with cytomegalovirus reactivation in patients receiving immunosuppressive therapy for rheumatic diseases: a retrospective study. Scientific Reports. 2022. DOI: 10.1038/s41598-022-25451-4
- Kawamori K, et al. Risk factors for cytomegalovirus reactivation during the treatment of ANCA-associated vasculitis: A retrospective cohort study of the J-CANVAS study. Modern Rheumatology. 2025;35(4):691-696. DOI: 10.1093/mr/roaf008
- Wakatsuki M, et al. Risk factors for cytomegalovirus reactivation and disease in patients with systemic lupus erythematosus. Lupus. 2026;35(1):47-56. DOI: 10.1177/09612033251401639
- Rajabi E, et al. Cytomegalovirus infection in patients with rheumatic disorders under rituximab treatment: a scoping review. Advances in Rheumatology. 2025. DOI: 10.1186/s42358-025-00514-y
- Sebaaly JC, Oliveira EF. Cytomegalovirus infection in immunocompromised patients: a review of therapeutics. P&T. 2020;45(6):351-365. DOI: 10.1177/8755122520972566
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.