Cookbook 373: Offline Clinical Gastroenterology & Critical Care Acute Pancreatitis Revised Atlanta Severity Staging, BISAP / Modified Marshall Organ Failure Engine, WATERFALL-Guided Resuscitation & Necrotizing Step-Up Approach Titrator

Executive Clinical Overview

Acute Pancreatitis is among the leading gastrointestinal causes of emergency department admission and acute hospital inpatient stays worldwide. While approximately 80% to 85% of cases present as self-limited interstitial edematous pancreatitis that resolves within a week with conservative supportive care, the remaining 15% to 20% develop moderately severe or severe acute pancreatitis (SAP). Severe disease is marked by systemic inflammatory response syndrome (SIRS), multi-organ dysfunction syndrome (MODS), and acute peripancreatic or parenchymal necrosis, carrying a clinical mortality rate of 15% to 30%—surging beyond 40% when infected pancreatic necrosis develops.

Over the past decade, major prospective multicenter randomized trials—most notably the WATERFALL Trial (New England Journal of Medicine, 2022) and the PANTER Trial (Dutch Pancreatitis Study Group)—have overturned long-standing clinical dogmas in acute pancreatitis:

  1. Fluid Resuscitation Shift: Aggressive “hyper-hydration” (> 20 mL/kg boluses or > 3 mL/kg/h infusions) has been definitively proven to cause fluid overload and respiratory failure without improving clinical outcomes. Modern consensus dictates moderated goal-directed fluid resuscitation using Lactated Ringer’s (LR) rather than 0.9% Normal Saline (which induces hyperchloremic metabolic acidosis and triggers premature acinar zymogen activation).
  2. Prophylactic Antibiotics Prohibition: Routine prophylactic antibiotics for sterile necrotizing pancreatitis are strictly contraindicated; they fail to prevent infection, increase fungal superinfections, and breed multi-drug-resistant pathogens.
  3. The Minimally Invasive “Step-Up” Approach: Open surgical necrosectomy has been supplanted by a sequential step-up pathway: commencing with targeted intravenous carbapenems, proceeding to image-guided percutaneous catheter drainage (PCD) or endoscopic transluminal drainage (ETD), and escalating only when necessary to video-assisted retroperitoneal debridement (VARD) or direct endoscopic necrosectomy.
  4. Early Enteral Nutrition: Prolonged fasting (nil per os / NPO) is obsolete. Early oral re-feeding with a low-fat solid or liquid diet within 24 hours—or enteral tube feeding (nasogastric or nasojejunal) if oral intake is impaired—preserves intestinal mucosal barrier integrity, prevents bacterial translocation, and reduces infectious complications.
+---------------------------------------------------------------------------------------------------------+
|                  ACUTE PANCREATITIS DIAGNOSIS, STAGING & RESUSCITATION PIPELINE                         |
+---------------------------------------------------------------------------------------------------------+
| 1. REVISED ATLANTA DIAGNOSTIC GATING (Requires >= 2 of 3 Criteria)                                      |
|    - [A] Severe epigastric abdominal pain radiating to back                                             |
|    - [B] Serum Lipase or Amylase >= 3x Upper Limit of Normal (ULN)                                      |
|    - [C] Cross-sectional imaging (CECT, MRI, or abdominal US) characteristic of pancreatitis            |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 2. EARLY PROGNOSTICATION & ORGAN FAILURE STAGING                                                         |
|    - BISAP Score (0 - 5 Points): BUN > 25 mg/dL, Impaired Mental Status, SIRS >= 2, Age > 60, Pleural Eff|
|      * Score >= 3: High risk for mortality (5-10x) and persistent organ failure; Neuro/Surgical ICU Gating|
|    - Modified Marshall Score: Evaluates Respiratory (PaO2/FiO2), Renal (Cr), Cardiovascular (SBP/Drugs) |
|      * Score >= 2 in any organ system defines organ failure.                                            |
|      * Transient (< 48h) = Moderately Severe | Persistent (> 48h) = Severe Acute Pancreatitis (SAP)     |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 3. WATERFALL MODERATED BALANCED CRYSTALLOID RESUSCITATION                                               |
|    - Solution: Lactated Ringer's (LR) mandated; avoid 0.9% NaCl (prevents hyperchloremic acidosis)      |
|    - Hypovolemic: 10 mL/kg LR bolus over 2h, then 1.5 mL/kg/h maintenance.                              |
|    - Normovolemic: 1.5 mL/kg/h LR maintenance (NO bolus).                                               |
|    - Re-evaluate at 12, 24, 48h: Target MAP >= 65 mmHg, UOP >= 0.5 mL/kg/h, Hct 35-44%, BUN trend.    |
|    - Stop / De-escalate Sentinel: Signs of fluid overload (pulmonary crackles, hypoxia, elevated JVP).   |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 4. ENTERAL NUTRITION GATING                                                                             |
|    - Mild Disease: Early oral low-fat solid or liquid diet within 24h once pain and nausea improve.     |
|    - Severe Disease: Enteral tube feeding (NG or NJ) initiated within 72h if oral intake not tolerated. |
|    - TPN reserved strictly as last resort if enteral access impossible or ileus refractory > 5-7 days.  |
+---------------------------------------------------------------------------------------------------------+
                                                     |
                                                     v
+---------------------------------------------------------------------------------------------------------+
| 5. ACUTE NECROTIZING PANCREATITIS: PANTER STEP-UP PROTOCOL                                              |
|    - Sterile Necrosis: PROHIBIT prophylactic antibiotics. Conservative medical management.             |
|    - Infected Necrosis (Gas on CECT or clinical deterioration with leukocytosis/fever > 7-14 days):     |
|      * Step 1: Pancreatic-penetrating IV antibiotics (Meropenem 1g IV q8h or Imipenem 500mg IV q6h).   |
|      * Step 2: Percutaneous Catheter Drainage (PCD) or Endoscopic Transmural Drainage (ETD).            |
|      * Step 3: Minimally Invasive Necrosectomy (VARD or Endoscopic) only if no clinical improvement     |
|        after 72h of drainage. Delay necrosectomy until >= 4 weeks (walled-off necrosis / WON).         |
+---------------------------------------------------------------------------------------------------------+

Diagnostic Criteria & Severity Stratification

1. Revised Atlanta Diagnostic Criteria (2 of 3 Required)

To confirm acute pancreatitis, a patient must meet at least two of the following three objective criteria:

  1. Clinical: Acute onset of persistent, severe epigastric abdominal pain, classically radiating through to the back.
  2. Biochemical: Serum lipase or amylase elevation greater than or equal to $3\times$ the upper limit of normal (ULN). (Lipase is superior to amylase due to higher sensitivity, prolonged elevation, and specificity).
  3. Radiological: Characteristic cross-sectional abdominal imaging findings (Contrast-Enhanced Computed Tomography [CECT], Magnetic Resonance Imaging [MRI], or transabdominal ultrasonography). Note: CECT performed within the first 48-72 hours often underestimates the extent of pancreatic necrosis; immediate CECT is indicated primarily when diagnostic uncertainty exists.

2. Revised Atlanta Severity Classification


Early Prognostic Scoring: BISAP & Modified Marshall Systems

Bedside Index for Severity in Acute Pancreatitis (BISAP Score, 0 - 5 Points)

Calculated within the first 24 hours of hospital admission to identify patients at elevated risk for in-hospital mortality and pancreatic necrosis:

Letter Criteria Points
B BUN $> 25\text{ mg/dL}$ ($8.9\text{ mmol/L}$) $1$
I Impaired mental status (Glasgow Coma Scale $< 15$ or disorientation) $1$
S SIRS criteria met ($\ge 2$ of: Temp $< 36^\circ\text{C}$ or $> 38^\circ\text{C}$, HR $> 90$, RR $> 20$, WBC $< 4$k or $> 12$k) $1$
A Age $> 60\text{ years}$ $1$
P Pleural effusion on chest radiograph or cross-sectional imaging $1$

Clinical Interpretation:

Modified Marshall Scoring System for Organ Failure

Evaluates organ failure across three discrete physiological systems. An organ system score of $\ge 2$ defines organ failure:

Score Respiratory: $PaO_2 / FiO_2$ (mmHg) Renal: Serum Creatinine (mg/dL) Cardiovascular: Systolic BP (mmHg) / Pressors
0 $> 400$ $\le 1.4$ $> 90$, no inotropes
1 $301 - 400$ $1.5 - 1.8$ $< 90$, responsive to fluids
2 $201 - 300$ $1.9 - 3.6$ $< 90$, non-responsive to fluids
3 $101 - 200$ $3.7 - 4.9$ $< 90$, Dopamine $\le 5$ or any Dobutamine
4 $\le 101$ $\ge 5.0$ $< 90$, Dopamine $> 5$ or Norepinephrine

Resuscitation: The WATERFALL Consensus Protocol

The landmark multicenter randomized WATERFALL trial demonstrated that aggressive fluid resuscitation ($20\text{ mL/kg}$ bolus followed by $3\text{ mL/kg/h}$) resulted in a $20.5\%$ rate of fluid overload compared to $6.3\%$ in the moderated group, with zero difference in clinical improvement.

\[\text{Moderated Resuscitation} = \begin{cases} \text{Hypovolemic:} & 10\text{ mL/kg LR bolus over } 2\text{h} \longrightarrow 1.5\text{ mL/kg/h LR} \\ \text{Normovolemic:} & \text{No bolus} \longrightarrow 1.5\text{ mL/kg/h LR} \end{cases}\]

Resuscitation Endpoints & Safety Sentinels (Re-evaluated at 12, 24, 48 hours)


Acute Necrotizing Pancreatitis: The Step-Up Approach

Pancreatic and peripancreatic necrosis occurs in up to 20% of acute pancreatitis patients and is categorized into:

                         SUSPECTED INFECTED PANCREATIC NECROSIS
             (Extraluminal gas on CECT or clinical sepsis > 7-14 days)
                                         |
                                         v
        +------------------------------------------------------------------+
        | STEP 1: Targeted Intravenous Antibiotics (Carbapenem)            |
        | Meropenem 1g IV q8h or Imipenem 500mg IV q6h.                    |
        | * Prophylactic antibiotics in sterile necrosis are PROHIBITED.   |
        +------------------------------------------------------------------+
                                         |
                       Clinical improvement within 72h?
                       /                               \
                     YES                                NO
                     /                                   \
        +----------------------------+     +-------------------------------+
        | Continue IV antibiotics    |     | STEP 2: Catheter Drainage     |
        | Complete 10-14 day course  |     | Percutaneous (PCD) or         |
        +----------------------------+     | Endoscopic Transmural (ETD)   |
                                           +-------------------------------+
                                                           |
                                         Clinical improvement within 72h?
                                         /                               \
                                       YES                                NO
                                       /                                   \
                          +------------------------+      +------------------------+
                          | Upsize / irrigate PCD  |      | STEP 3: Necrosectomy   |
                          | Resolves in > 35-50%   |      | VARD or Endoscopic     |
                          | without surgery!       |      | Necrosectomy           |
                          +------------------------+      +------------------------+

Production Python Implementation

"""
OpenPHR Cookbook 373: Offline Clinical Gastroenterology & Critical Care
Acute Pancreatitis Revised Atlanta Severity Staging, BISAP / Modified Marshall Engine,
WATERFALL-Guided Resuscitation & Necrotizing Step-Up Approach Titrator.

Compliant with:
- American College of Gastroenterology (ACG) Guidelines: Management of Acute Pancreatitis (2024)
- American Gastroenterological Association (AGA) Institute Clinical Practice Update
- International Association of Pancreatology (IAP) / American Pancreatic Association (APA) Guidelines
- Revised Atlanta Classification of Acute Pancreatitis
- The WATERFALL Multicenter Randomized Controlled Trial (NEJM 2022)
"""

import sys
from typing import Dict, List, Optional, Tuple, Any
from dataclasses import dataclass, field

@dataclass
class AtlantaDiagnosticInput:
    has_epigastric_pain: bool
    lipase_u_l: float
    lipase_upper_limit_normal: float
    amylase_u_l: float
    amylase_upper_limit_normal: float
    cross_sectional_imaging_positive: bool

@dataclass
class BISAPInput:
    bun_mg_dl: float
    gcs_score: int
    temperature_c: float
    heart_rate_bpm: int
    respiratory_rate_bpm: int
    wbc_k_ul: float
    age_years: int
    pleural_effusion_present: bool

@dataclass
class MarshallInput:
    pao2_fio2_ratio: float                  # mmHg (e.g. 350.0)
    serum_creatinine_mg_dl: float          # mg/dL (e.g. 2.1)
    systolic_bp_mmhg: float                # mmHg (e.g. 85.0)
    bp_responsive_to_iv_fluid: bool        # Responsive to 500-1000 mL fluid
    on_inotropic_support: bool = False
    inotropic_agent: str = "none"           # "none", "dopamine_low", "dopamine_high", "norepinephrine", "dobutamine"
    duration_hours: float = 0.0             # Duration of organ failure in hours

@dataclass
class ResuscitationContext:
    weight_kg: float
    is_hypovolemic: bool                    # SBP < 90, HR > 100, BUN/Cr > 20, or dry mucosa
    has_fluid_overload_signs: bool          # Basilar crackles, jugular distension, new O2 requirement
    hematocrit_percent: float               # % (normal 36-46)
    map_mmhg: float
    urine_output_ml_hr: float
    hours_since_admission: float

@dataclass
class NecrosisContext:
    pancreatic_necrosis_present: bool
    necrosis_extent_percent: float          # < 30%, 30-50%, > 50%
    gas_in_collection_on_ct: bool           # Pathognomonic for infection
    unexplained_sepsis_fever: bool          # Persistent leukocytosis/fever > 7-14 days
    days_since_symptom_onset: float
    current_drainage_in_place: bool = False
    hours_on_current_drainage: float = 0.0
    clinical_improving_on_drainage: bool = False

class AcutePancreatitisEngine:
    """
    Comprehensive Decision Support Engine for Acute Pancreatitis & Severe Necrotizing Pancreatitis.
    """

    @staticmethod
    def verify_atlanta_diagnosis(d: AtlantaDiagnosticInput) -> Dict[str, Any]:
        """
        Validates Revised Atlanta 2-of-3 diagnostic criteria.
        """
        criteria_met = []
        lipase_ratio = d.lipase_u_l / d.lipase_upper_limit_normal if d.lipase_upper_limit_normal > 0 else 0.0
        amylase_ratio = d.amylase_u_l / d.amylase_upper_limit_normal if d.amylase_upper_limit_normal > 0 else 0.0
        
        # Criterion 1: Characteristic pain
        if d.has_epigastric_pain:
            criteria_met.append("Characteristic epigastric abdominal pain radiating to back")

        # Criterion 2: Enzymes >= 3x ULN
        enzyme_positive = (lipase_ratio >= 3.0) or (amylase_ratio >= 3.0)
        if enzyme_positive:
            enz_str = f"Lipase {d.lipase_u_l:.1f} U/L ({lipase_ratio:.1f}x ULN)" if lipase_ratio >= 3.0 else f"Amylase {d.amylase_u_l:.1f} U/L ({amylase_ratio:.1f}x ULN)"
            criteria_met.append(f"Serum pancreatic enzymes >= 3x ULN: {enz_str}")

        # Criterion 3: Cross-sectional imaging
        if d.cross_sectional_imaging_positive:
            criteria_met.append("Characteristic cross-sectional imaging features (CECT/MRI/US)")

        is_confirmed = len(criteria_met) >= 2

        return {
            "diagnosis_confirmed": is_confirmed,
            "criteria_count": len(criteria_met),
            "criteria_met": criteria_met,
            "lipase_elevation_fold": round(lipase_ratio, 2),
            "imaging_required_for_diagnosis": len(criteria_met) < 2 and not d.cross_sectional_imaging_positive
        }

    @staticmethod
    def calculate_bisap_score(b: BISAPInput) -> Dict[str, Any]:
        """
        Calculates Bedside Index for Severity in Acute Pancreatitis (BISAP Score, 0-5).
        """
        points = 0
        breakdown = {}

        # 1. BUN > 25 mg/dL
        bun_pt = 1 if b.bun_mg_dl > 25.0 else 0
        points += bun_pt
        breakdown["BUN > 25 mg/dL"] = bun_pt

        # 2. Impaired mental status (GCS < 15)
        gcs_pt = 1 if b.gcs_score < 15 else 0
        points += gcs_pt
        breakdown["Impaired Mental Status (GCS < 15)"] = gcs_pt

        # 3. SIRS Criteria (>= 2 required)
        sirs_count = 0
        if b.temperature_c < 36.0 or b.temperature_c > 38.0: sirs_count += 1
        if b.heart_rate_bpm > 90: sirs_count += 1
        if b.respiratory_rate_bpm > 20: sirs_count += 1
        if b.wbc_k_ul < 4.0 or b.wbc_k_ul > 12.0: sirs_count += 1

        sirs_pt = 1 if sirs_count >= 2 else 0
        points += sirs_pt
        breakdown[f"SIRS Criteria (Met {sirs_count}/4)"] = sirs_pt

        # 4. Age > 60 years
        age_pt = 1 if b.age_years > 60 else 0
        points += age_pt
        breakdown["Age > 60"] = age_pt

        # 5. Pleural Effusion
        pe_pt = 1 if b.pleural_effusion_present else 0
        points += pe_pt
        breakdown["Pleural Effusion on Imaging"] = pe_pt

        # Mortality & triage risk
        if points >= 3:
            mortality_risk = "High Risk (5% - 20% in-hospital mortality; high probability of necrotizing disease & persistent organ failure)"
            triage_level = "ICU / Step-Down Intermediate Care Unit Gating Required"
        else:
            mortality_risk = "Low Risk (< 2% in-hospital mortality)"
            triage_level = "General Medical Ward with Serial Vital Sign Monitoring"

        return {
            "bisap_score": points,
            "max_score": 5,
            "mortality_risk": mortality_risk,
            "triage_recommendation": triage_level,
            "breakdown": breakdown
        }

    @staticmethod
    def evaluate_modified_marshall(m: MarshallInput) -> Dict[str, Any]:
        """
        Evaluates Modified Marshall Score for Respiratory, Renal, and Cardiovascular Systems.
        """
        # 1. Respiratory (PaO2 / FiO2)
        if m.pao2_fio2_ratio > 400.0: resp_score = 0
        elif m.pao2_fio2_ratio > 300.0: resp_score = 1
        elif m.pao2_fio2_ratio > 200.0: resp_score = 2
        elif m.pao2_fio2_ratio > 101.0: resp_score = 3
        else: resp_score = 4

        # 2. Renal (Creatinine mg/dL)
        cr = m.serum_creatinine_mg_dl
        if cr <= 1.4: renal_score = 0
        elif cr <= 1.8: renal_score = 1
        elif cr <= 3.6: renal_score = 2
        elif cr <= 4.9: renal_score = 3
        else: renal_score = 4

        # 3. Cardiovascular (SBP & Pressors)
        sbp = m.systolic_bp_mmhg
        agent = m.inotropic_agent.lower()
        if not m.on_inotropic_support and sbp >= 90.0: cv_score = 0
        elif not m.on_inotropic_support and sbp < 90.0 and m.bp_responsive_to_iv_fluid: cv_score = 1
        elif not m.on_inotropic_support and sbp < 90.0 and not m.bp_responsive_to_iv_fluid: cv_score = 2
        elif "dopamine_low" in agent or "dobutamine" in agent: cv_score = 3
        elif "dopamine_high" in agent or "norepinephrine" in agent: cv_score = 4
        else: cv_score = 2 if sbp < 90.0 else 0

        max_organ_score = max(resp_score, renal_score, cv_score)
        organ_failure_present = max_organ_score >= 2

        # Atlanta Severity Classification
        if not organ_failure_present:
            severity = "Mild (if no local complications) or Moderately Severe (if local/systemic complications present)"
            organ_failure_type = "None"
        elif m.duration_hours < 48.0:
            severity = "Moderately Severe Acute Pancreatitis (Transient Organ Failure < 48 Hours)"
            organ_failure_type = "Transient (< 48h)"
        else:
            severity = "Severe Acute Pancreatitis (Persistent Organ Failure >= 48 Hours)"
            organ_failure_type = "Persistent (>= 48h)"

        return {
            "respiratory_marshall_score": resp_score,
            "renal_marshall_score": renal_score,
            "cardiovascular_marshall_score": cv_score,
            "max_marshall_score": max_organ_score,
            "organ_failure_present": organ_failure_present,
            "organ_failure_duration_hours": m.duration_hours,
            "organ_failure_type": organ_failure_type,
            "atlanta_severity_classification": severity
        }

    @staticmethod
    def calculate_waterfall_resuscitation(ctx: ResuscitationContext) -> Dict[str, Any]:
        """
        Determines moderated Lactated Ringer's resuscitation per the WATERFALL Trial (NEJM 2022).
        """
        w = ctx.weight_kg

        # Safety stop for fluid overload
        if ctx.has_fluid_overload_signs:
            return {
                "fluid_strategy": "RESTRICTED / DIURETIC RESCUE",
                "recommended_crystalloid": "Lactated Ringer's (LR)",
                "bolus_order": "PROHIBITED: Evidence of fluid overload (pulmonary crackles, hypoxia, or elevated JVP).",
                "maintenance_rate_ml_hr": round(0.5 * w, 1),
                "rationale": "CRITICAL SENTINEL: Over-resuscitation risk detected. WATERFALL demonstrated 3x higher fluid overload with aggressive hydration. Reduce infusion rate and consider Furosemide rescue.",
                "monitoring_targets": {
                    "map_target_mmhg": ">= 65 mmHg",
                    "urine_output_target": "0.5 - 1.0 mL/kg/h",
                    "hematocrit_target": "35% - 44%"
                }
            }

        # Moderated hydration pathway
        if ctx.is_hypovolemic:
            bolus_volume_ml = round(10.0 * w, 0)
            maintenance_ml_hr = round(1.5 * w, 1)
            strategy = "MODERATED HYPOVOLEMIC PROTOCOL"
            bolus_text = f"10 mL/kg LR bolus ({bolus_volume_ml:.0f} mL) infused over 2 hours."
            rationale = "Hypovolemia detected. Deliver initial 10 mL/kg LR bolus, followed by 1.5 mL/kg/h maintenance. Re-assess hemodynamics and hematocrit at 12 and 24 hours."
        else:
            bolus_volume_ml = 0.0
            maintenance_ml_hr = round(1.5 * w, 1)
            strategy = "MODERATED NORMOVOLEMIC PROTOCOL"
            bolus_text = "NO BOLUS REQUIRED: Patient is normovolemic without signs of hemoconcentration or shock."
            rationale = "Normovolemia confirmed. Administer maintenance LR at 1.5 mL/kg/h directly. Bolusing normovolemic patients increases pulmonary edema risk without clinical benefit."

        uop_per_kg = ctx.urine_output_ml_hr / w if w > 0 else 0.0

        return {
            "fluid_strategy": strategy,
            "recommended_crystalloid": "Lactated Ringer's (LR) - Superior to 0.9% Normal Saline",
            "bolus_order": bolus_text,
            "maintenance_rate_ml_hr": maintenance_ml_hr,
            "current_uop_ml_kg_hr": round(uop_per_kg, 2),
            "rationale": rationale,
            "monitoring_targets": {
                "map_target_mmhg": ">= 65 mmHg",
                "uop_target": ">= 0.5 mL/kg/h",
                "hematocrit_target": "35% - 44% (Hemoconcentration > 44% indicates inadequate volume; < 35% warrants cautious titration)"
            }
        }

    @staticmethod
    def evaluate_necrotizing_step_up(nec: NecrosisContext) -> Dict[str, Any]:
        """
        Gates the Step-Up Approach for Acute Necrotizing Pancreatitis (PANTER Trial & IAP/APA Guidelines).
        """
        if not nec.pancreatic_necrosis_present:
            return {
                "necrosis_status": "Interstitial Edematous Pancreatitis (No Necrosis)",
                "step_up_action": "Standard supportive care; no drainage or necrosectomy indicated.",
                "antibiotic_mandate": "PROHIBITED: Routine prophylactic antibiotics are contraindicated in interstitial pancreatitis."
            }

        # Determine infection status
        is_infected = nec.gas_in_collection_on_ct or (nec.unexplained_sepsis_fever and nec.days_since_symptom_onset >= 7.0)

        if not is_infected:
            return {
                "necrosis_status": f"Sterile Pancreatic Necrosis ({nec.necrosis_extent_percent:.0f}% involvement)",
                "step_up_action": "CONSERVATIVE MEDICAL MANAGEMENT: Maintain enteral nutrition and serial monitoring.",
                "antibiotic_mandate": "STRICTLY PROHIBITED: Prophylactic antibiotics in sterile necrotizing pancreatitis do not prevent infection and increase fungal/MDR colonization.",
                "drainage_indicated": False,
                "necrosectomy_indicated": False
            }

        # Infected necrosis step-up sequencing
        if not nec.current_drainage_in_place:
            step = "STEP 1 & STEP 2: Initiate Pancreatic-Penetrating Antibiotics & Primary Catheter Drainage"
            antibiotic_order = "Meropenem 1g IV q8h (or Imipenem 500mg IV q6h); high penetration into necrotic pancreatic parenchyma."
            intervention_order = "Urgent Percutaneous Catheter Drainage (PCD) or Endoscopic Transmural Drainage (ETD) targeting necrotic collection."
            rationale = "Infected necrosis confirmed. Begin IV carbapenem therapy and establish primary percutaneous or endoscopic drainage. PANTER trial demonstrates > 35% of patients recover with catheter drainage alone without requiring necrosectomy."
            necrosectomy_order = "DEFERRED: Allow 72 hours post-catheter drainage to evaluate clinical response."
        else:
            if nec.clinical_improving_on_drainage:
                step = "STEP 2 MAINTENANCE: Continue Catheter Drainage & Antibiotic Therapy"
                antibiotic_order = "Continue targeted IV antibiotics based on drained fluid culture and susceptibility."
                intervention_order = "Serial catheter flushing, up-sizing, or exchange as collections liquefy."
                rationale = "Positive clinical response to catheter drainage (declining fevers, improved leukocytosis, resolving organ failure). Avoid operative necrosectomy."
                necrosectomy_order = "NOT INDICATED AT THIS TIME"
            elif nec.hours_on_current_drainage >= 72.0:
                step = "STEP 3 ESCALATION: Minimally Invasive Necrosectomy"
                antibiotic_order = "Continue broad-spectrum IV antibiotics."
                intervention_order = "Video-Assisted Retroperitoneal Debridement (VARD) or Direct Endoscopic Necrosectomy (DEN)."
                rationale = "Refractory sepsis and lack of clinical improvement after >= 72 hours of optimal catheter drainage. Escalate to minimally invasive necrosectomy. Delay open surgical necrosectomy until collections wall off (>= 4 weeks)."
                necrosectomy_order = "MINIMALLY INVASIVE SURGICAL / ENDOSCOPIC NECROSECTOMY MANDATED"
            else:
                step = "STEP 2 MONITORING: Awaiting 72-Hour Catheter Drainage Efficacy Window"
                antibiotic_order = "Maintain IV carbapenem therapy."
                intervention_order = f"Monitor drainage output ({nec.hours_on_current_drainage:.0f}h on drainage)."
                rationale = "Re-assess at 72-hour mark post-drainage placement before escalating to surgical debridement."
                necrosectomy_order = "DEFERRED PENDING 72-HOUR RE-EVALUATION"

        return {
            "necrosis_status": "Infected Pancreatic Necrosis (IPN)",
            "step_up_phase": step,
            "antibiotic_order": antibiotic_order,
            "drainage_order": intervention_order,
            "necrosectomy_recommendation": necrosectomy_order,
            "clinical_rationale": rationale
        }

# ==============================================================================
# CLI TEST HARNESS & VERIFICATION GATES
# ==============================================================================

def run_clinical_verification_suite():
    print("================================================================================")
    print("OpenPHR Cookbook 373: Acute Pancreatitis & Necrotizing Engine Verification Suite")
    print("================================================================================")

    # Case 1: Severe Acute Necrotizing Pancreatitis with Persistent Organ Failure
    atlanta_case1 = AtlantaDiagnosticInput(
        has_epigastric_pain=True,
        lipase_u_l=1240.0,
        lipase_upper_limit_normal=60.0,         # 20.7x ULN -> Criterion 2
        amylase_u_l=420.0,
        amylase_upper_limit_normal=100.0,       # 4.2x ULN
        cross_sectional_imaging_positive=True   # Criterion 3
    )

    bisap_case1 = BISAPInput(
        bun_mg_dl=34.0,                         # BUN > 25 -> 1
        gcs_score=14,                           # GCS < 15 -> 1
        temperature_c=38.6,                     # SIRS: Temp -> 1
        heart_rate_bpm=118,                     # SIRS: HR -> 1 (SIRS met -> 1)
        respiratory_rate_bpm=24,
        wbc_k_ul=17.2,
        age_years=67,                           # Age > 60 -> 1
        pleural_effusion_present=True           # Pleural effusion -> 1
    )                                           # Total BISAP = 5

    marshall_case1 = MarshallInput(
        pao2_fio2_ratio=180.0,                  # Marshall Resp = 3 (<200) -> Organ Failure
        serum_creatinine_mg_dl=2.4,             # Marshall Renal = 2 (1.9-3.6) -> Organ Failure
        systolic_bp_mmhg=82.0,                  # Cardiovascular
        bp_responsive_to_iv_fluid=False,        # Non-responsive -> CV = 2
        on_inotropic_support=True,
        inotropic_agent="norepinephrine",       # CV = 4
        duration_hours=54.0                     # > 48h -> Persistent Organ Failure!
    )

    resusc_case1 = ResuscitationContext(
        weight_kg=80.0,
        is_hypovolemic=True,
        has_fluid_overload_signs=False,
        hematocrit_percent=47.2,                # Severe hemoconcentration
        map_mmhg=58.0,
        urine_output_ml_hr=22.0,                # Oliguria (< 0.5 mL/kg/h)
        hours_since_admission=14.0
    )

    necrosis_case1 = NecrosisContext(
        pancreatic_necrosis_present=True,
        necrosis_extent_percent=45.0,
        gas_in_collection_on_ct=True,           # Confirmed infected necrosis!
        unexplained_sepsis_fever=True,
        days_since_symptom_onset=12.0,
        current_drainage_in_place=False
    )

    # 1. Atlanta Diagnostic Gating
    diag_res = AcutePancreatitisEngine.verify_atlanta_diagnosis(atlanta_case1)
    print(f"[*] Atlanta Diagnosis Confirmed: {diag_res['diagnosis_confirmed']} "
          f"({diag_res['criteria_count']}/3 criteria met, Lipase {diag_res['lipase_elevation_fold']}x ULN)")
    assert diag_res['diagnosis_confirmed'] is True, "Assertion Failure: Case 1 must confirm acute pancreatitis."

    # 2. BISAP Score
    bisap_res = AcutePancreatitisEngine.calculate_bisap_score(bisap_case1)
    print(f"[*] BISAP Score: {bisap_res['bisap_score']} / {bisap_res['max_score']} -> {bisap_res['triage_recommendation']}")
    assert bisap_res['bisap_score'] == 5, f"Assertion Failure: Expected BISAP 5, got {bisap_res['bisap_score']}"

    # 3. Modified Marshall & Atlanta Severity
    marshall_res = AcutePancreatitisEngine.evaluate_modified_marshall(marshall_case1)
    print(f"[*] Marshall Scores - Resp: {marshall_res['respiratory_marshall_score']}, "
          f"Renal: {marshall_res['renal_marshall_score']}, CV: {marshall_res['cardiovascular_marshall_score']}")
    print(f"[*] Organ Failure: {marshall_res['organ_failure_present']} ({marshall_res['organ_failure_type']})")
    print(f"[*] Atlanta Staging: {marshall_res['atlanta_severity_classification']}")
    assert marshall_res['organ_failure_present'] is True, "Assertion Failure: Case 1 must have organ failure."
    assert "Severe" in marshall_res['atlanta_severity_classification'], "Assertion Failure: Case 1 must be Severe Acute Pancreatitis."

    # 4. WATERFALL Moderated Resuscitation
    resusc_res = AcutePancreatitisEngine.calculate_waterfall_resuscitation(resusc_case1)
    print(f"[*] Resuscitation Protocol: {resusc_res['fluid_strategy']}")
    print(f"[*] Bolus: {resusc_res['bolus_order']}")
    print(f"[*] Maintenance: {resusc_res['maintenance_rate_ml_hr']} mL/hr of {resusc_res['recommended_crystalloid']}")
    assert "MODERATED HYPOVOLEMIC" in resusc_res['fluid_strategy'], "Assertion Failure: Case 1 must use moderated hypovolemic strategy."
    assert resusc_res['maintenance_rate_ml_hr'] == 120.0, f"Expected 120 mL/hr, got {resusc_res['maintenance_rate_ml_hr']}"

    # 5. Necrotizing Step-Up Gating
    nec_res = AcutePancreatitisEngine.evaluate_necrotizing_step_up(necrosis_case1)
    print(f"[*] Necrosis Status: {nec_res['necrosis_status']}")
    print(f"[*] Step-Up Action: {nec_res['step_up_phase']}")
    print(f"[*] Antibiotic: {nec_res['antibiotic_order']}")
    print(f"[*] Drainage: {nec_res['drainage_order']}")
    assert "Infected" in nec_res['necrosis_status'], "Assertion Failure: Gas on CT must confirm infected necrosis."
    assert "STEP 1 & STEP 2" in nec_res['step_up_phase'], "Assertion Failure: Initial infected necrosis requires Step 1 & 2."

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

if __name__ == "__main__":
    run_clinical_verification_suite()

Clinical Validation & Automated Test Output

Executing the self-verifying test suite produces the following verified telemetry:

$ python acute_pancreatitis_engine.py
================================================================================
OpenPHR Cookbook 373: Acute Pancreatitis & Necrotizing Engine Verification Suite
================================================================================
[*] Atlanta Diagnosis Confirmed: True (3/3 criteria met, Lipase 20.67x ULN)
[*] BISAP Score: 5 / 5 -> ICU / Step-Down Intermediate Care Unit Gating Required
[*] Marshall Scores - Resp: 3, Renal: 2, CV: 4
[*] Organ Failure: True (Persistent (>= 48h))
[*] Atlanta Staging: Severe Acute Pancreatitis (Persistent Organ Failure >= 48 Hours)
[*] Resuscitation Protocol: MODERATED HYPOVOLEMIC PROTOCOL
[*] Bolus: 10 mL/kg LR bolus (800 mL) infused over 2 hours.
[*] Maintenance: 120.0 mL/hr of Lactated Ringer's (LR) - Superior to 0.9% Normal Saline
[*] Necrosis Status: Infected Pancreatic Necrosis (IPN)
[*] Step-Up Action: STEP 1 & STEP 2: Initiate Pancreatic-Penetrating Antibiotics & Primary Catheter Drainage
[*] Antibiotic: Meropenem 1g IV q8h (or Imipenem 500mg IV q6h); high penetration into necrotic pancreatic parenchyma.
[*] Drainage: Urgent Percutaneous Catheter Drainage (PCD) or Endoscopic Transmural Drainage (ETD) targeting necrotic collection.

>>> ALL VERIFICATION GATES PASSED (100% CLINICAL CONCORDANCE) <<<

References & Clinical Consensus

  1. Tenner S, et al.: American College of Gastroenterology Guidelines: Management of Acute Pancreatitis. Am J Gastroenterol 2024; 119(3): 419-437.
  2. de-Madaria E, et al.: Aggressive or moderate fluid resuscitation in acute pancreatitis (WATERFALL). N Engl J Med 2022; 387(11): 989-998.
  3. van Santvoort HC, et al. (Dutch Pancreatitis Study Group): A step-up approach or open necrosectomy for necrotizing pancreatitis (PANTER). N Engl J Med 2010; 362(16): 1491-1502.
  4. Banks PA, et al.: Classification of acute pancreatitis–2012: revision of the Atlanta classification and definitions by international consensus. Gut 2013; 62(1): 102-111.
  5. Wu BU, et al.: The early prediction of mortality in acute pancreatitis: a large population-based study (BISAP). Gut 2008; 57(12): 1698-1703.
  6. IAP/APA Guidelines Working Group: IAP/APA evidence-based guidelines for the management of acute pancreatitis. Pancreatology 2013; 13(4 Suppl 2): e1-15.