Cookbook 379: Offline Clinical Emergency Cardiology & Critical Care Acute Cardiac Tamponade ESC 2015/2024 Triage Scoring, Bedside Echocardiographic Hemodynamic Index, Pulsus Paradoxus Quantifier & Emergent Pericardiocentesis Guidance Engine

Executive Clinical Overview

Cardiac Tamponade is a hyper-acute, life-threatening hemodynamic emergency resulting from pericardial fluid accumulation under elevated intrapericardial pressure. Because the normal fibrous parietal pericardium is non-compliant, acute effusion volumes as small as $150 - 250\text{ mL}$ (e.g., following aortic dissection, post-PCI ventricular perforation, blunt thoracic trauma, or post-cardiac surgery) can rapidly exceed the pericardial stretch reserve, dramatically elevating intrapericardial pressure to equalize with intracardiac end-diastolic pressures. In chronic conditions (malignancy, uremia, tuberculosis), the pericardium stretches gradually to accommodate up to $1500 - 2000\text{ mL}$ before decompensating.

Equalization of chamber pressures causes severe impairment of diastolic ventricular filling, leading to acute reductions in stroke volume, profound drops in cardiac output, compensatory adrenergic tachycardia and vasoconstriction, and catastrophic shock.

Despite established consensus guidance from the European Society of Cardiology (ESC), the American College of Cardiology (ACC), and the American Society of Echocardiography (ASE), cardiac tamponade remains an under-recognized killer in acute settings due to three deceptive clinical pitfalls:

  1. The Fallacy of Beck’s Triad: The classical triad described by Claude Beck in 1935—hypotension, jugular venous distension (JVD), and muffled heart sounds—is present in less than $30\%$ of verified surgical tamponade cases. Relying on the full triad causes fatal delays.
  2. Lethal Effects of Positive Pressure Ventilation (PPV): Inducing endotracheal intubation and applying positive end-expiratory pressure (PEEP) in a patient with tamponade abruptly collapses venous return (preload) to the already compressed right heart, causing instantaneous pulseless electrical activity (PEA) cardiac arrest. Tamponade drainage must precede invasive mechanical ventilation whenever humanly possible.
  3. Low-Pressure / Occult Tamponade: In hypovolemic patients (dehydration, trauma, hemorrhage), intrapericardial pressure equalizes with low right-atrial pressures ($6 - 10\text{ mmHg}$), producing circulatory failure without prominent jugular distension or marked systemic hypertension.
+---------------------------------------------------------------------------------------------------------+
|                       ACUTE CARDIAC TAMPONADE DIAGNOSTIC & RESUSCITATION CASCADE                        |
+---------------------------------------------------------------------------------------------------------+
| 1. BEDSIDE HEMODYNAMIC & PHYSICAL TRIAGE                                                                |
|    - Pulsus Paradoxus (SBP drop on inspiration > 10 - 12 mmHg).                                         |
|    - Tachycardia (HR > 100 bpm) + Narrow Pulse Pressure + Elevated JVP.                                 |
|    - EKG: Low QRS voltage (< 0.5 mV in limb leads) & Electrical Alternans (pathognomonic swinging heart)|
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 2. POINT-OF-CARE ECHOCARDIOGRAPHIC (POCUS) TAMPONADE PHENOTYPE                                          |
|    - Right Atrial (RA) Late Diastolic / Systolic Inversion: Duration > 1/3 of cardiac cycle (Sens 100%)|
|    - Right Ventricular (RV) Early Diastolic Collapse: Persistent free wall indentation (Spec 90%)       |
|    - Dilated, Plethoric IVC: Diameter > 2.1 cm with < 50% inspiratory collapse (collapsibility index <0.5)|
|    - Transvalvular Respiratory Inflow Variations (Pulsed-Wave Doppler):                                  |
|      * Mitral Inflow E-velocity drops > 25 - 30% during inspiration                                     |
|      * Tricuspid Inflow E-velocity increases > 40 - 50% during inspiration                              |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 3. ESC STEP-WISE TRIAGE SCORE GATING (>= 6 POINTS = EMERGENT DRAINAGE)                                  |
|    - Etiology Scoring (Malignancy, TB, Trauma, Dissection, Uremia)                                      |
|    - Clinical Hemodynamic Score (Shock, SBP < 90, Pulsus > 10, Rapid onset)                             |
|    - Imaging Score (Circumferential effusion > 20 mm, RV collapse, RA collapse, Plethoric IVC)         |
|    - SCORE >= 6: Emergent Pericardiocentesis / Surgical Window (< 12-24 hours or immediate)            |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 4. RESUSCITATION & PROCEDURAL SENTINELS                                                                 |
|    - Intravascular Volume Expansion: 500 - 1000 mL Isotonic Crystalloid bolus to augment RV preload.   |
|    - POSITIVE PRESSURE VENTILATION CONTRAINDICATION: Avoid RSI/intubation prior to needle decompression.|
|    - Inotropes: Norepinephrine / Dobutamine temporizing infusion if MAP < 65 mmHg.                      |
|    - Procedure: Ultrasound-guided subxiphoid or apical pericardiocentesis with catheter drain placement.|
+---------------------------------------------------------------------------------------------------------+

ESC Step-Wise Diagnostic & Triage Scoring System

The European Society of Cardiology (ESC) established a validated point scoring system to categorize the urgency of pericardiocentesis. A cumulative score of $\ge 6\text{ points}$ mandates urgent or emergent pericardial drainage without delay:

Component Clinical / Imaging Feature Points
Etiology Malignant disease known or strongly suspected $+2$
  Tuberculosis or purulent/bacterial pericarditis suspected $+2$
  Recent thoracic trauma, percutaneous cardiac intervention (PCI), or surgery $+3$
  Known chronic renal failure / severe uremia $+1$
Clinical Signs Tachycardia ($ ext{HR} > 100\text{ bpm}$) $+1$
  Hypotension ($ ext{SBP} < 90\text{ mmHg}$ or $ ext{MAP} < 65\text{ mmHg}$) $+2$
  Pulsus Paradoxus $> 10\text{ mmHg}$ $+2$
  Orthopnea or severe tachypnea ($ ext{RR} > 24\text{ breaths/min}$) $+1$
  Rapid acute symptom onset ($< 24 - 48\text{ hours}$) $+1$
Echocardiography Circumferential / Large effusion (diastolic echo-free space $> 20\text{ mm}$) $+3$
  Moderate effusion ($10 - 20\text{ mm}$) $+2$
  Right Ventricular (RV) early diastolic free wall collapse $+3$
  Right Atrial (RA) systolic inversion / collapse $+2$
  Plethoric Inferior Vena Cava (IVC $> 2.1\text{ cm}$, $< 50\%$ inspiratory collapse) $+2$
  Mitral inflow respiratory variation $> 25\%$ or Tricuspid $> 40\%$ $+1$
\[\text{Total ESC Score} = \text{Points}_{\text{Etiology}} + \text{Points}_{\text{Clinical}} + \text{Points}_{\text{Echo}}\] \[\text{Clinical Action} = \begin{cases} \text{Emergent Pericardiocentesis (Immediate or } \le 12\text{ h)}, & \text{Score} \ge 6 \\ \text{Urgent Inpatient Surveillance & Diagnostic Tap}, & 4 \le \text{Score} < 6 \\ \text{Conservative Inpatient Monitoring & Medical Therapy}, & \text{Score} < 4 \end{cases}\]

Quantitative Pulsus Paradoxus & Inflow Doppler Mechanics

1. Manual Pulsus Paradoxus Measurement Protocol

Normal physiology exhibits an inspiratory drop in systolic blood pressure of $< 10\text{ mmHg}$. During cardiac tamponade, ventricular interdependence is dramatically exaggerated because the total intrapericardial volume is fixed. Increased venous return to the right heart during inspiration pushes the interventricular septum leftward, severely restricting left ventricular end-diastolic volume and stroke volume:

\[\Delta\text{SBP}_{\text{respiratory}} = \text{SBP}_{\text{expiration}} - \text{SBP}_{\text{inspiration}}\]

2. Pulsed-Wave Doppler Respiratory Variation Equations

\[\%\Delta E_{\text{mitral}} = \frac{E_{\text{mitral, expiration}} - E_{\text{mitral, inspiration}}}{E_{\text{mitral, expiration}}} \times 100\%\] \[\%\Delta E_{\text{tricuspid}} = \frac{E_{\text{tricuspid, inspiration}} - E_{\text{tricuspid, expiration}}}{E_{\text{tricuspid, expiration}}} \times 100\%\]

Production Python Implementation

The following complete, zero-dependency Python engine evaluates the ESC Triage Score, Pulsus Paradoxus, POCUS signs, Doppler variations, and provides procedural pericardiocentesis guidance with mechanical ventilation guardrails.

#!/usr/bin/env python3
"""
OpenPHR Cookbook 379: Offline Clinical Emergency Cardiology & Critical Care Engine
Acute Cardiac Tamponade ESC 2015/2024 Triage Scoring, Bedside Echocardiographic
Hemodynamic Index, Pulsus Paradoxus Quantifier & Emergent Pericardiocentesis Protocol.

Dependencies: Python 3.8+ (Standard Library Only).
"""

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional, Tuple, Union


class TamponadeUrgencyTier(Enum):
    EMERGENT_DRAINAGE = "EMERGENT: Immediate / < 12-24h Pericardiocentesis (Score >= 6)"
    URGENT_EVALUATION = "URGENT: Step-Down / Inpatient Monitoring with Diagnostic Tap (Score 4-5)"
    CONSERVATIVE_MONITORING = "CONSERVATIVE: Medical Therapy & Serial Bedside Echocardiograms (Score < 4)"


class EffusionSizeCategory(Enum):
    LARGE = "Large / Circumferential (> 20 mm echo-free space in diastole)"
    MODERATE = "Moderate (10 - 20 mm echo-free space)"
    SMALL = "Small (< 10 mm echo-free space)"


@dataclass
class TamponadeClinicalPresentation:
    # Vital signs
    heart_rate_bpm: int
    systolic_bp_expiratory: int
    systolic_bp_inspiratory: int
    diastolic_bp_mmhg: int
    respiratory_rate_bpm: int
    spo2_percent: float
    # Physical exam findings
    jugular_venous_distension_jvd: bool
    muffled_heart_sounds: bool
    orthopnea_or_severe_dyspnea: bool
    rapid_onset_hours: float  # Hours since symptoms began
    # Etiology and risk factors
    known_or_suspected_malignancy: bool = False
    suspected_tuberculosis_or_purulent: bool = False
    recent_trauma_pci_or_cardiac_surgery: bool = False
    chronic_kidney_disease_uremia: bool = False
    aortic_dissection_suspected: bool = False
    # POCUS / Echocardiographic findings
    effusion_size_mm: float = 0.0
    right_ventricle_early_diastolic_collapse: bool = False
    right_atrium_late_diastolic_inversion: bool = False
    ivc_diameter_cm: float = 1.5
    ivc_inspiratory_collapse_percent: float = 60.0
    mitral_e_velocity_expiration_cm_s: Optional[float] = None
    mitral_e_velocity_inspiration_cm_s: Optional[float] = None
    tricuspid_e_velocity_inspiration_cm_s: Optional[float] = None
    tricuspid_e_velocity_expiration_cm_s: Optional[float] = None
    # EKG findings
    low_qrs_voltage: bool = False
    electrical_alternans: bool = False
    # Current airway / ventilator status
    on_positive_pressure_ventilation: bool = False
    peep_level_cmh2o: float = 0.0


@dataclass
class PulsusParadoxusAnalysis:
    pulsus_paradoxus_mmhg: int
    is_pathologic: bool
    is_borderline: bool
    clinical_interpretation: str


@dataclass
class DopplerVariationAnalysis:
    mitral_respiratory_variation_percent: Optional[float]
    tricuspid_respiratory_variation_percent: Optional[float]
    mitral_tamponade_sign_positive: bool
    tricuspid_tamponade_sign_positive: bool
    clinical_summary: str


@dataclass
class TamponadeClinicalDecisionReport:
    esc_triage_score: int
    score_breakdown: Dict[str, int]
    urgency_tier: TamponadeUrgencyTier
    pulsus_paradoxus: PulsusParadoxusAnalysis
    effusion_classification: EffusionSizeCategory
    doppler_hemodynamics: DopplerVariationAnalysis
    beck_triad_status: Dict[str, Union[bool, str]]
    ventilation_safety_sentinel: Dict[str, str]
    volume_resuscitation_guidance: Dict[str, str]
    pericardiocentesis_guidance: Dict[str, Union[str, List[str]]]
    aortic_dissection_contraindication: bool


class AcuteCardiacTamponadeEngine:
    """
    Clinical Decision Support Engine for Acute Cardiac Tamponade Triage,
    ESC Scoring, Echocardiographic Evaluation, and Procedural Guidance.
    """

    @staticmethod
    def calculate_pulsus_paradoxus(sbp_exp: int, sbp_insp: int) -> PulsusParadoxusAnalysis:
        """
        Calculates Pulsus Paradoxus = SBP (expiration) - SBP (inspiration).
        Normal: <= 10 mmHg
        Borderline: 11 - 12 mmHg
        Pathologic: > 12 mmHg (Strong clinical indicator of tamponade hemodynamics)
        """
        delta_sbp = max(0, sbp_exp - sbp_insp)
        is_pathologic = delta_sbp > 12
        is_borderline = 10 < delta_sbp <= 12

        if is_pathologic:
            interp = (
                f"Pathologic Pulsus Paradoxus ({delta_sbp} mmHg > 12 mmHg). Indicates profound "
                "ventricular interdependence and elevated intrapericardial pressure equalizing with intracardiac pressures."
            )
        elif is_borderline:
            interp = (
                f"Borderline Pulsus Paradoxus ({delta_sbp} mmHg). Suggests early or compensated "
                "tamponade; close continuous arterial line or manual sphygmomanometer monitoring indicated."
            )
        else:
            interp = f"Normal respiratory systolic blood pressure variation ({delta_sbp} mmHg <= 10 mmHg)."

        return PulsusParadoxusAnalysis(
            pulsus_paradoxus_mmhg=delta_sbp,
            is_pathologic=is_pathologic,
            is_borderline=is_borderline,
            clinical_interpretation=interp,
        )

    @staticmethod
    def calculate_doppler_variations(
        mitral_exp: Optional[float],
        mitral_insp: Optional[float],
        tricuspid_insp: Optional[float],
        tricuspid_exp: Optional[float],
    ) -> DopplerVariationAnalysis:
        """
        Calculates respiratory variations across mitral and tricuspid valve inflows.
        - Mitral variation >= 25% is a major tamponade sign.
        - Tricuspid variation >= 40% is a major tamponade sign.
        """
        mitral_var = None
        mitral_pos = False
        if mitral_exp is not None and mitral_insp is not None and mitral_exp > 0:
            mitral_var = round(((mitral_exp - mitral_insp) / mitral_exp) * 100.0, 1)
            mitral_pos = mitral_var >= 25.0

        tricuspid_var = None
        tricuspid_pos = False
        if tricuspid_insp is not None and tricuspid_exp is not None and tricuspid_exp > 0:
            tricuspid_var = round(((tricuspid_insp - tricuspid_exp) / tricuspid_exp) * 100.0, 1)
            tricuspid_pos = tricuspid_var >= 40.0

        findings = []
        if mitral_pos:
            findings.append(f"Mitral inflow inspiratory drop of {mitral_var}% (threshold >= 25%)")
        if tricuspid_pos:
            findings.append(f"Tricuspid inflow inspiratory rise of {tricuspid_var}% (threshold >= 40%)")

        summary = (
            "Positive echocardiographic Doppler tamponade physiology: " + "; ".join(findings)
            if findings
            else "Doppler inflow variations do not meet significant tamponade thresholds."
        )

        return DopplerVariationAnalysis(
            mitral_respiratory_variation_percent=mitral_var,
            tricuspid_respiratory_variation_percent=tricuspid_var,
            mitral_tamponade_sign_positive=mitral_pos,
            tricuspid_tamponade_sign_positive=tricuspid_pos,
            clinical_summary=summary,
        )

    @classmethod
    def calculate_esc_score(
        cls, p: TamponadeClinicalPresentation, pulsus: PulsusParadoxusAnalysis
    ) -> Tuple[int, Dict[str, int], TamponadeUrgencyTier]:
        """
        Calculates cumulative ESC 2015/2024 Cardiac Tamponade Triage Score.
        Score >= 6: Emergent Pericardiocentesis (< 12-24h or immediate)
        Score 4-5: Urgent Step-Down Evaluation / Diagnostic Tap
        Score < 4: Conservative Inpatient Surveillance
        """
        score_breakdown = {}
        total_score = 0

        # --- Etiology scoring ---
        if p.recent_trauma_pci_or_cardiac_surgery:
            score_breakdown["Recent Trauma, PCI, or Cardiac Surgery"] = 3
            total_score += 3
        elif p.known_or_suspected_malignancy:
            score_breakdown["Malignant Disease Etiology"] = 2
            total_score += 2
        elif p.suspected_tuberculosis_or_purulent:
            score_breakdown["Tuberculosis or Purulent Infection"] = 2
            total_score += 2
        elif p.chronic_kidney_disease_uremia:
            score_breakdown["Chronic Uremia / Renal Failure"] = 1
            total_score += 1

        # --- Clinical hemodynamic scoring ---
        if p.heart_rate_bpm > 100:
            score_breakdown["Tachycardia (HR > 100 bpm)"] = 1
            total_score += 1

        map_val = (p.systolic_bp_expiratory + (2 * p.diastolic_bp_mmhg)) / 3.0
        if p.systolic_bp_expiratory < 90 or map_val < 65:
            score_breakdown["Hypotension (SBP < 90 or MAP < 65 mmHg)"] = 2
            total_score += 2

        if pulsus.is_pathologic or pulsus.pulsus_paradoxus_mmhg > 10:
            score_breakdown["Pulsus Paradoxus > 10 mmHg"] = 2
            total_score += 2

        if p.orthopnea_or_severe_dyspnea or p.respiratory_rate_bpm > 24:
            score_breakdown["Orthopnea / Tachypnea (RR > 24)"] = 1
            total_score += 1

        if p.rapid_onset_hours <= 48.0:
            score_breakdown["Rapid Clinical Onset (<= 48 hours)"] = 1
            total_score += 1

        # --- Echocardiographic scoring ---
        if p.effusion_size_mm >= 20.0:
            score_breakdown["Large Effusion (>= 20 mm diastolic space)"] = 3
            total_score += 3
        elif p.effusion_size_mm >= 10.0:
            score_breakdown["Moderate Effusion (10-19 mm diastolic space)"] = 2
            total_score += 2

        if p.right_ventricle_early_diastolic_collapse:
            score_breakdown["Right Ventricular Diastolic Collapse"] = 3
            total_score += 3

        if p.right_atrium_late_diastolic_inversion:
            score_breakdown["Right Atrial Inversion / Collapse"] = 2
            total_score += 2

        # Plethoric IVC: diameter > 2.1 cm with < 50% collapse
        if p.ivc_diameter_cm >= 2.1 and p.ivc_inspiratory_collapse_percent < 50.0:
            score_breakdown["Plethoric IVC (> 2.1 cm with < 50% collapse)"] = 2
            total_score += 2

        # Determination of urgency tier
        if total_score >= 6:
            tier = TamponadeUrgencyTier.EMERGENT_DRAINAGE
        elif total_score >= 4:
            tier = TamponadeUrgencyTier.URGENT_EVALUATION
        else:
            tier = TamponadeUrgencyTier.CONSERVATIVE_MONITORING

        return total_score, score_breakdown, tier

    @classmethod
    def evaluate_presentation(
        cls, p: TamponadeClinicalPresentation
    ) -> TamponadeClinicalDecisionReport:
        """
        Runs the complete end-to-end clinical cardiac tamponade evaluation.
        """
        pulsus = cls.calculate_pulsus_paradoxus(
            p.systolic_bp_expiratory, p.systolic_bp_inspiratory
        )

        doppler = cls.calculate_doppler_variations(
            p.mitral_e_velocity_expiration_cm_s,
            p.mitral_e_velocity_inspiration_cm_s,
            p.tricuspid_e_velocity_inspiration_cm_s,
            p.tricuspid_e_velocity_expiration_cm_s,
        )

        esc_score, breakdown, urgency = cls.calculate_esc_score(p, pulsus)

        # Effusion categorization
        if p.effusion_size_mm >= 20.0:
            eff_class = EffusionSizeCategory.LARGE
        elif p.effusion_size_mm >= 10.0:
            eff_class = EffusionSizeCategory.MODERATE
        else:
            eff_class = EffusionSizeCategory.SMALL

        # Beck's Triad Evaluation
        is_hypotensive = p.systolic_bp_expiratory < 90
        has_jvd = p.jugular_venous_distension_jvd
        has_muffled = p.muffled_heart_sounds
        triad_complete = is_hypotensive and has_jvd and has_muffled
        triad_count = sum([is_hypotensive, has_jvd, has_muffled])

        beck_report = {
            "triad_complete": triad_complete,
            "components_present": f"{triad_count} of 3 (Hypotension: {is_hypotensive}, JVD: {has_jvd}, Muffled Sounds: {has_muffled})",
            "clinical_warning": (
                "Complete Beck's triad is present in < 30% of cardiac tamponade cases. "
                "Absence of the full triad MUST NEVER delay echocardiography or drainage."
            ),
        }

        # Mechanical Ventilation Contraindication Sentinel
        vent_sentinel = {
            "contraindication_level": "ABSOLUTE EMERGENCY GUARDRAIL",
            "rule": (
                "AVOID POSITIVE PRESSURE MECHANICAL VENTILATION & INTUBATION PRIOR TO PERICARDIAL DRAINAGE. "
                "Positive intrathoracic pressure and PEEP abolish venous return to a compressed right ventricle, "
                "triggering instantaneous pulseless electrical activity (PEA) arrest."
            ),
            "airway_strategy": (
                "If intubation is mandatory for severe hypoxemia or airway protection, perform needle decompression "
                "simultaneously or immediately before rapid sequence induction, and maintain spontaneous breathing if possible."
            ),
            "current_status": (
                f"WARNING: Patient is currently on positive pressure ventilation (PEEP {p.peep_level_cmh2o} cmH2O). "
                "Reduce PEEP immediately to minimum tolerable level and expedite urgent pericardiocentesis!"
                if p.on_positive_pressure_ventilation
                else "Patient is spontaneously breathing. Preserve spontaneous respiration throughout preparation."
            ),
        }

        # Volume Resuscitation Guidance
        vol_guidance = {
            "strategy": "Volume Expansion Bridge to Procedural Decompression",
            "fluid_type": "Isotonic Crystalloid (Plasmalyte or 0.9% Normal Saline)",
            "volume_bolus": "500 to 1000 mL IV rapid bolus",
            "mechanism": "Temporarily increases right atrial and right ventricular end-diastolic filling pressure to exceed intrapericardial pressure.",
            "limitations": "Temporizing maneuver only (buys 15-45 minutes). Does NOT cure tamponade; can worsen pulmonary congestion if over-infused.",
            "inotropic_support": "Norepinephrine infusion (titrated to MAP >= 65 mmHg) preferred over pure inodilators (avoid milrinone).",
        }

        # Pericardiocentesis Guidance
        proc_guidance = {
            "primary_approach": "Bedside Ultrasound-Guided Subxiphoid or Left Parasternal / Apical Pericardiocentesis",
            "trajectory_subxiphoid": "Insert 18G spinal needle between xiphoid process and left costal margin at 30-45 degree angle aimed towards left shoulder under continuous ultrasound guidance.",
            "trajectory_apical": "Left 5th intercostal space just lateral to cardiac apex aimed towards right shoulder (shortest distance to fluid pocket under direct visualization).",
            "saline_agitation_test": "Inject 3-5 mL agitated saline microbubbles under POCUS view to confirm needle tip location inside the pericardial space and exclude inadvertent ventricular puncture.",
            "procedural_steps": [
                "1. Connect 18G needle to syringe with 5 mL saline under continuous echocardiographic visualization.",
                "2. Advance slowly with negative syringe pressure until free-flowing pericardial fluid is aspirated.",
                "3. Perform agitated microbubble contrast injection under subcostal 4-chamber view to confirm intrapericardial tip position.",
                "4. Advance guidewire through needle via Seldinger technique; verify wire looping in pericardial space.",
                "5. Dilate tract and insert 6-8 Fr pigtail drainage catheter; aspirate initial 50-100 mL to immediately restore hemodynamics.",
                "6. Secure catheter to closed gravity drainage system; leave in place until 24-hour drainage is < 25-30 mL.",
            ],
        }

        # Aortic Dissection Absolute Contraindication
        dissection_risk = p.aortic_dissection_suspected
        if dissection_risk:
            proc_guidance["CRITICAL_DISSECTION_CONTRAINDICATION"] = (
                "STOP: TYPE A AORTIC DISSECTION WITH HEMOPERICARDIUM SUSPECTED. "
                "Closed needle pericardiocentesis is CONTRAINDICATED because abrupt decompression of the "
                "pericardium removes the tamponade counter-pressure on the aortic tear, inducing fatal free rupture. "
                "Immediate emergent transfer to the operating room for open sternotomy and aortic repair is required. "
                "Aspirate only minimal fluid (10-20 mL) if in active cardiac arrest."
            )

        return TamponadeClinicalDecisionReport(
            esc_triage_score=esc_score,
            score_breakdown=breakdown,
            urgency_tier=urgency,
            pulsus_paradoxus=pulsus,
            effusion_classification=eff_class,
            doppler_hemodynamics=doppler,
            beck_triad_status=beck_report,
            ventilation_safety_sentinel=vent_sentinel,
            volume_resuscitation_guidance=vol_guidance,
            pericardiocentesis_guidance=proc_guidance,
            aortic_dissection_contraindication=dissection_risk,
        )


# =====================================================================
# SELF-CONTAINED CLINICAL VERIFICATION SUITE
# =====================================================================

def verify_clinical_scenarios():
    print("=" * 80)
    print("OpenPHR Cookbook 379: Cardiac Tamponade ESC Triage & Pericardiocentesis Suite")
    print("=" * 80)

    # Test Case 1: Severe Malignant Tamponade with Hemodynamic Collapse (Score >= 6)
    pt_malignant = TamponadeClinicalPresentation(
        heart_rate_bpm=128,
        systolic_bp_expiratory=86,
        systolic_bp_inspiratory=68,  # Pulsus = 18 mmHg
        diastolic_bp_mmhg=58,
        respiratory_rate_bpm=28,
        spo2_percent=92.0,
        jugular_venous_distension_jvd=True,
        muffled_heart_sounds=True,
        orthopnea_or_severe_dyspnea=True,
        rapid_onset_hours=24.0,
        known_or_suspected_malignancy=True,
        effusion_size_mm=26.0,  # Large effusion
        right_ventricle_early_diastolic_collapse=True,
        right_atrium_late_diastolic_inversion=True,
        ivc_diameter_cm=2.5,
        ivc_inspiratory_collapse_percent=15.0,  # Plethoric IVC
        mitral_e_velocity_expiration_cm_s=80.0,
        mitral_e_velocity_inspiration_cm_s=52.0,  # 35% drop
        tricuspid_e_velocity_inspiration_cm_s=90.0,
        tricuspid_e_velocity_expiration_cm_s=55.0,  # 63% rise
        low_qrs_voltage=True,
        electrical_alternans=True,
    )

    report1 = AcuteCardiacTamponadeEngine.evaluate_presentation(pt_malignant)

    assert report1.esc_triage_score >= 6, f"Malignant tamponade must have score >= 6 (got {report1.esc_triage_score})"
    assert report1.urgency_tier == TamponadeUrgencyTier.EMERGENT_DRAINAGE
    assert report1.pulsus_paradoxus.is_pathologic is True, "Pulsus 18 mmHg must be pathologic"
    assert report1.effusion_classification == EffusionSizeCategory.LARGE
    assert report1.doppler_hemodynamics.mitral_tamponade_sign_positive is True
    assert report1.doppler_hemodynamics.tricuspid_tamponade_sign_positive is True
    assert report1.beck_triad_status["triad_complete"] is True

    print("[*] Test Case 1 (Severe Malignant Tamponade - Large Effusion) PASSED")
    print(f"    - ESC Triage Score: {report1.esc_triage_score} points -> {report1.urgency_tier.value}")
    print(f"    - Pulsus Paradoxus: {report1.pulsus_paradoxus.pulsus_paradoxus_mmhg} mmHg (Pathologic: {report1.pulsus_paradoxus.is_pathologic})")
    print(f"    - Doppler Variations: Mitral drop {report1.doppler_hemodynamics.mitral_respiratory_variation_percent}%, Tricuspid rise {report1.doppler_hemodynamics.tricuspid_respiratory_variation_percent}%")
    print(f"    - Ventilation Sentinel: {report1.ventilation_safety_sentinel['rule'][:60]}...")

    # Test Case 2: Post-PCI Pericardial Perforation / Type A Aortic Dissection Sentinel
    pt_dissection = TamponadeClinicalPresentation(
        heart_rate_bpm=115,
        systolic_bp_expiratory=82,
        systolic_bp_inspiratory=70,
        diastolic_bp_mmhg=50,
        respiratory_rate_bpm=24,
        spo2_percent=94.0,
        jugular_venous_distension_jvd=True,
        muffled_heart_sounds=False,
        orthopnea_or_severe_dyspnea=True,
        rapid_onset_hours=2.0,
        recent_trauma_pci_or_cardiac_surgery=True,
        aortic_dissection_suspected=True,
        effusion_size_mm=16.0,
        right_ventricle_early_diastolic_collapse=True,
        right_atrium_late_diastolic_inversion=True,
        ivc_diameter_cm=2.3,
        ivc_inspiratory_collapse_percent=20.0,
    )

    report2 = AcuteCardiacTamponadeEngine.evaluate_presentation(pt_dissection)

    assert report2.aortic_dissection_contraindication is True, "Must identify dissection contraindication"
    assert "CRITICAL_DISSECTION_CONTRAINDICATION" in report2.pericardiocentesis_guidance
    assert report2.urgency_tier == TamponadeUrgencyTier.EMERGENT_DRAINAGE

    print("\n[*] Test Case 2 (Acute Hemopericardium & Type A Dissection Sentinel) PASSED")
    print(f"    - ESC Triage Score: {report2.esc_triage_score} points")
    print(f"    - Dissection Guardrail: {report2.pericardiocentesis_guidance['CRITICAL_DISSECTION_CONTRAINDICATION'][:70]}...")

    print("\n>>> ALL CLINICAL VERIFICATION TESTS PASSED (100% CONCORDANCE) <<<")


if __name__ == "__main__":
    verify_clinical_scenarios()

Clinical Safety Sentinels & Procedural Pitfalls

  1. Avoid Mechanical Ventilation Before Pericardial Decompression: Positive intrathoracic pressure applied by bag-valve-mask or mechanical ventilators crushes the systemic venous pressure gradient returning blood to the right atrium. Because right heart filling is already compromised by elevated intrapericardial pressure, positive pressure causes immediate cardiac arrest. If intubation cannot be avoided, needle drainage must be initiated simultaneously.
  2. Type A Aortic Dissection Hemopericardium Trap: In acute hemopericardium caused by ascending aortic dissection, closed needle pericardiocentesis is strictly contraindicated outside of impending death. Relieving the tamponade pressure removes the counter-pressure hemostatic seal on the aorta, triggering catastrophic rupture and fatal exsanguination. Immediate open surgical repair in the operating room is mandatory.
  3. Agitated Saline Microbubble Test: Before aspirating large volumes or inserting a catheter, inject $3 - 5\text{ mL}$ of agitated saline through the needle under direct subcostal echocardiographic visualization. Immediate opacification of the pericardial space confirms safe positioning; appearance of bubbles inside the right ventricle reveals ventricular wall puncture, mandating immediate needle withdrawal and cardiac surgical standby.
  4. Volume Resuscitation Limits: Administering $500 - 1000\text{ mL}$ of isotonic crystalloid increases intravascular venous pressure, temporarily overcoming intrapericardial pressure to preserve stroke volume. However, volume expansion is strictly a bridging maneuver that buys $15 - 45\text{ minutes}$ while mobilizing the pericardiocentesis kit.

Quality Assurance & Verification