SSc-COMPASS: Multimodal Systemic Sclerosis Risk Stratification Skill
SSc-COMPASS — Multimodal Systemic Sclerosis Risk Stratification
Abstract
SSc-COMPASS is a transparent multimodal risk-layering skill for systemic sclerosis that integrates cutaneous subtype, serology, capillaroscopy, pulmonary physiology, thoracic imaging burden, and cardiopulmonary screening markers to identify patients at increased risk of interstitial lung disease progression, vasculopathic complications, and pulmonary hypertension flags. The objective is not to replace specialist judgement or formal prognostic modeling, but to provide an auditable triage-oriented framework for longitudinal surveillance in systemic sclerosis.
Clinical Rationale
Systemic sclerosis is clinically heterogeneous and organ risk does not emerge from a single variable. In routine care, pulmonary decline, vasculopathy, and cardiopulmonary complications are often inferred from partially connected signals. This skill formalises a transparent multimodal integration approach so that clinicians and researchers can inspect how different domains contribute to a risk-layering output.
Methodology
Weighted heuristic model across three organ-risk domains:
- ILD progression risk: integrates cutaneous subtype, anti-Scl70, FVC, DLCO, HRCT fibrosis burden, disease duration
- Vasculopathy risk: integrates digital ulcers, capillaroscopy pattern (Cutolo classification), anti-centromere, DLCO
- PAH flag risk: integrates echocardiographic sPAP, NT-proBNP, DLCO, anti-centromere
Each domain is normalised to [0,1]. Global trajectory classification uses weighted composite (ILD 45%, vasculopathy 30%, PAH 25%).
Limitations
- Heuristic weighted model; not externally validated on a derivation cohort
- Weights are literature-informed but not fitted to real patient data
- Not a substitute for HRCT, echocardiography, right-heart catheterisation, or specialist judgement
- Intended for transparent risk layering and triage support only
References
- van den Hoogen F, et al. 2013 classification criteria for systemic sclerosis: an ACR/EULAR collaborative initiative. Ann Rheum Dis. 2013;72(11):1747-1755. DOI: 10.1136/annrheumdis-2013-204424
- Distler O, et al. Nintedanib for Systemic Sclerosis-Associated Interstitial Lung Disease. N Engl J Med. 2019;380(26):2518-2528. DOI: 10.1056/NEJMoa1903076
- Cutolo M, et al. Nailfold capillaroscopy and classification criteria for systemic sclerosis. Clin Exp Rheumatol. 2014;32(6 Suppl 86):S-200-6. PMID: 25506993
- Coghlan JG, et al. Evidence-based detection of pulmonary arterial hypertension in systemic sclerosis: the DETECT study. Ann Rheum Dis. 2014;73(7):1340-1349. DOI: 10.1136/annrheumdis-2013-203301
- Hoffmann-Vold AM, et al. Progressive ILD in SSc in the EUSTAR database. Ann Rheum Dis. 2021;80(2):219-227. DOI: 10.1136/annrheumdis-2020-217455
Executable Code
#!/usr/bin/env python3
"""
SSc-COMPASS — Multimodal Systemic Sclerosis Risk Stratification
Executable standalone skill for transparent organ-risk layering in systemic sclerosis.
This is a heuristic clinical research aid, not a diagnostic device.
Authors: Zamora-Tehozol EA (ORCID:0000-0002-7888-3961), DNAI
License: MIT
References:
- van den Hoogen F, et al. 2013 classification criteria for systemic sclerosis: an ACR/EULAR collaborative initiative. Ann Rheum Dis. 2013;72(11):1747-55. DOI:10.1136/annrheumdis-2013-204424
- Distler O, et al. Nintedanib for Systemic Sclerosis-Associated Interstitial Lung Disease. N Engl J Med. 2019;380(26):2518-2528. DOI:10.1056/NEJMoa1903076
- Cutolo M, et al. Nailfold capillaroscopy and classification criteria for systemic sclerosis. Clin Exp Rheumatol. 2014;32(6 Suppl 86):S-200-6. PMID:25506993
- Coghlan JG, et al. Evidence-based detection of pulmonary arterial hypertension in systemic sclerosis: the DETECT study. Ann Rheum Dis. 2014;73(7):1340-9. DOI:10.1136/annrheumdis-2013-203301
- Hoffmann-Vold AM, et al. Progressive interstitial lung disease in patients with systemic sclerosis-associated interstitial lung disease in the EUSTAR database. Ann Rheum Dis. 2021;80(2):219-227. DOI:10.1136/annrheumdis-2020-217455
"""
from dataclasses import dataclass, asdict
from typing import Dict, Any
import json
@dataclass
class SScPatient:
subtype: str # limited, diffuse
disease_years: float
anti_scl70: bool
anticentromere: bool
anti_rna_pol3: bool
mrss: int
digital_ulcers: bool
capillaroscopy_pattern: str # early, active, late, unknown
fvc_pct: float
dlco_pct: float
hrct_fibrosis_pct: float
ntprobnp: float
echo_sphp: float
def clamp(x, lo=0.0, hi=1.0):
return max(lo, min(hi, x))
def score_ild_progression(p: SScPatient) -> float:
score = 0.0
if p.subtype == "diffuse": score += 1.2
if p.anti_scl70: score += 1.6
if p.fvc_pct < 70: score += 1.5
elif p.fvc_pct < 80: score += 0.8
if p.dlco_pct < 55: score += 1.4
elif p.dlco_pct < 70: score += 0.7
if p.hrct_fibrosis_pct >= 20: score += 1.8
elif p.hrct_fibrosis_pct >= 10: score += 1.0
if p.disease_years <= 5: score += 0.8
return clamp(score / 7.5)
def score_vasculopathy(p: SScPatient) -> float:
score = 0.0
if p.digital_ulcers: score += 1.8
if p.capillaroscopy_pattern == "late": score += 1.7
elif p.capillaroscopy_pattern == "active": score += 1.0
elif p.capillaroscopy_pattern == "early": score += 0.4
if p.anticentromere: score += 0.8
if p.dlco_pct < 60: score += 0.8
return clamp(score / 5.1)
def score_pah_flag(p: SScPatient) -> float:
score = 0.0
if p.echo_sphp >= 50: score += 2.0
elif p.echo_sphp >= 40: score += 1.2
if p.ntprobnp >= 300: score += 1.4
elif p.ntprobnp >= 125: score += 0.7
if p.dlco_pct < 50: score += 1.1
if p.anticentromere: score += 0.6
return clamp(score / 5.1)
def classify_trajectory(ild: float, vasc: float, pah: float) -> str:
global_risk = 0.45 * ild + 0.30 * vasc + 0.25 * pah
if global_risk >= 0.70:
return "high-surveillance / progressive-risk"
if global_risk >= 0.45:
return "intermediate-risk / close-follow-up"
return "lower-risk / stable-pattern"
def interpret_band(x: float) -> str:
if x >= 0.70:
return "high"
if x >= 0.45:
return "intermediate"
return "lower"
def run_ssc_compass(p: SScPatient) -> Dict[str, Any]:
ild = score_ild_progression(p)
vasc = score_vasculopathy(p)
pah = score_pah_flag(p)
trajectory = classify_trajectory(ild, vasc, pah)
return {
"input": asdict(p),
"ild_progression_risk": round(ild, 3),
"ild_band": interpret_band(ild),
"vasculopathy_risk": round(vasc, 3),
"vasculopathy_band": interpret_band(vasc),
"pah_flag_risk": round(pah, 3),
"pah_band": interpret_band(pah),
"trajectory": trajectory,
"limitations": [
"Heuristic weighted model; not externally validated.",
"Not a substitute for HRCT, echocardiography, right-heart catheterisation, or specialist judgement.",
"Weights are literature-informed but not fitted to a real derivation cohort.",
"Intended for transparent risk layering and triage support only."
]
}
if __name__ == "__main__":
demo = SScPatient(
subtype="diffuse",
disease_years=2.5,
anti_scl70=True,
anticentromere=False,
anti_rna_pol3=False,
mrss=18,
digital_ulcers=True,
capillaroscopy_pattern="late",
fvc_pct=68,
dlco_pct=49,
hrct_fibrosis_pct=24,
ntprobnp=342,
echo_sphp=46,
)
result = run_ssc_compass(demo)
print("=" * 70)
print("SSc-COMPASS — Multimodal Systemic Sclerosis Risk Stratification")
print("Authors: Zamora-Tehozol EA (ORCID:0000-0002-7888-3961), DNAI")
print("=" * 70)
print(json.dumps(result, indent=2))
Demo Output
======================================================================
SSc-COMPASS — Multimodal Systemic Sclerosis Risk Stratification
Authors: Zamora-Tehozol EA (ORCID:0000-0002-7888-3961), DNAI
======================================================================
{
"input": {
"subtype": "diffuse",
"disease_years": 2.5,
"anti_scl70": true,
"anticentromere": false,
"anti_rna_pol3": false,
"mrss": 18,
"digital_ulcers": true,
"capillaroscopy_pattern": "late",
"fvc_pct": 68,
"dlco_pct": 49,
"hrct_fibrosis_pct": 24,
"ntprobnp": 342,
"echo_sphp": 46
},
"ild_progression_risk": 1.0,
"ild_band": "high",
"vasculopathy_risk": 0.843,
"vasculopathy_band": "high",
"pah_flag_risk": 0.725,
"pah_band": "high",
"trajectory": "high-surveillance / progressive-risk",
"limitations": [
"Heuristic weighted model; not externally validated.",
"Not a substitute for HRCT, echocardiography, right-heart catheterisation, or specialist judgement.",
"Weights are literature-informed but not fitted to a real derivation cohort.",
"Intended for transparent risk layering and triage support only."
]
}
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.