# Stage 2 — SBML Model Extension Report (v1.3 → v2.0)

**Pipeline stage:** 2 of 14
**Date:** 2 May 2026
**Author:** IQANOVA AI-QSP Master Pipeline v2.0

---

## 2.1 v1.3 baseline structure (the model we extended from)

| Field | Adult | Paediatric |
|---|---|---|
| Species | 9 | 9 |
| Parameters | 35 | 35 |
| Rate rules | 9 | 9 |
| Assignment rules | 0 | 0 |
| Events (doses) | 27 | 27 |
| libSBML serious errors | 0 | 0 |
| libSBML warnings (unit consistency) | 189 | 189 |

### Identified deficiencies in v1.3

| Deficiency | Evidence | v2.0 fix |
|---|---|---|
| Spleen volume overshoots target by >50 percentage points | Adult fit: predicted −91.5%, target −39.4% (residual −52.1) | Replaced fixed resolution rate with ASM-activity-gated kinetics and a pre-specified maximum-resolution asymptote (`spleen_resolution_max_frac`) |
| LysoSM saturates at −100% (clipping artefact) | Adult fit: predicted −99.96%, target −77.7% | Made plasma LysoSM generation substrate-dependent so it falls naturally as `SM_lysosome` decreases |
| Plasma ceramide moves in the wrong direction in paediatric simulations | ASCEND-Peds target −57%, predicted +1.9% | Coupled plasma ceramide steady state to tissue burden average so net ceramide reduction tracks burden resolution |
| No anti-drug-antibody (ADA) layer | n/a in v1.3 | Added `ADA_titre` species and rate rule; ADA reduces functional `Olipudase_effective` via `ADA_neutralisation_potency`; ADA reduces plasma olipudase clearance kinetics |
| No paediatric height-Z catch-up dynamics | `PED-HEIGHTZ-W104` target marked NOT_MODELLED in v1.3 | Added logistic catch-up rate rule (`k_height_catchup` → `height_z_asymptote`) for paediatric; inert in adult |
| 189 unit-consistency warnings | v1.3 had no UnitDefinitions; no `timeUnits` or `substanceUnits` declared | Declared `day`, `per_day`, `substance_unit` UnitDefinitions; assigned units to all parameters and species |

---

## 2.2 v2.0 model architecture

### Five-layer architecture

| Layer | Species |
|---|---|
| **Drug PK** | `Olipudase_plasma`, `Olipudase_tissue`, `Olipudase_lysosome` |
| **Anti-drug response** | `ADA_titre` (+ derived `Olipudase_effective`) |
| **Substrate** | `SM_lysosome` |
| **Plasma biomarkers** | `LysoSM_plasma`, `Ceramide_plasma` |
| **Tissue burden** | `SM_spleen_burden`, `SM_liver_burden`, `SM_lung_burden` |
| **Paediatric clinical** | `height_z` |

### State variables, observables, and assignment rules

| Type | ID | Role |
|---|---|---|
| Observable (assignment rule) | `Olipudase_effective` | Functional lysosomal enzyme available to hydrolyse SM, after ADA neutralisation |
| Observable (assignment rule) | `ASM_active_fraction` | Total ASM activity = residual endogenous + olipudase contribution (saturating Hill-1) |
| Observable (assignment rule) | `spleen_volume_pct_change` | % change from baseline MN |
| Observable (assignment rule) | `liver_volume_pct_change` | % change from baseline MN |
| Observable (assignment rule) | `LysoSM_percent_change` | % change from baseline plasma concentration |
| Observable (assignment rule) | `Ceramide_percent_change` | % change from baseline plasma concentration |
| Observable (assignment rule) | `DLCO_percent_change` | DLCO % change vs baseline (saturating function of lung-burden reduction) |
| Observable (assignment rule) | `platelet_percent_change` | Platelet % change vs baseline (saturating function of spleen-burden reduction) |
| Observable (assignment rule) | `height_z_change` | Height Z-score increment from baseline (paediatric only) |

### ODE system (rate rules) — see Stage 12 equations document for full LaTeX

```
d/dt Olipudase_plasma   = k_TP·Olipudase_tissue – k_PT·Olipudase_plasma – k_clr·Olipudase_plasma – k_ADA_pot·ADA·Olipudase_plasma + Σ doses
d/dt Olipudase_tissue   = k_PT·Olipudase_plasma – k_TP·Olipudase_tissue – k_TL·Olipudase_tissue
d/dt Olipudase_lysosome = k_TL·Olipudase_tissue – k_lys·Olipudase_lysosome
d/dt ADA_titre          = k_ADA_gen·Olipudase_plasma – k_ADA_clr·ADA_titre
d/dt SM_lysosome        = k_SM_in – ASM_active·kcat·SM/(Km+SM)
d/dt LysoSM_plasma      = k_LSM_gen·SM_lysosome – k_LSM_clr·LysoSM_plasma
d/dt Ceramide_plasma    = k_cer_gen·(ASM·kcat·SM/(Km+SM)) + cpl·(burden_avg/burden0)·Ceramide0·0.05 – k_cer_clr·Ceramide_plasma
d/dt SM_spleen_burden   = – k_spl_res·ASM_active·(SM_spleen_burden – (1 – sf_max)·baseline_spleen)
d/dt SM_liver_burden    = – k_liv_res·ASM_active·(SM_liver_burden – (1 – lf_max)·baseline_liver)
d/dt SM_lung_burden     = – k_lung_res·ASM_active·(SM_lung_burden – (1 – uf_max)·baseline_lung)
d/dt height_z           = k_h_catch·(z_asymptote – height_z)
```

### Dose schedule (events)

27 fortnightly events at days 0, 14, 28, …, 364 — each adds `dose_amount` (=90 normalised internal units, equivalent to 3 mg/kg × 30 kg-equivalent) to `Olipudase_plasma`. Schedule is identical for adult and paediatric models; weight-based dosing is encoded by the `dose_amount` parameter.

---

## 2.3 v2.0 build summary (libSBML structural validation)

| Field | Adult | Paediatric |
|---|---|---|
| Read errors | **0** | **0** |
| Serious consistency errors | **0** | **0** |
| Unit-consistency warnings | 43 | 43 |
| Unit definitions | 3 (day, per_day, substance_unit) | 3 |
| Compartments | 1 (system) | 1 |
| Species | 11 | 11 |
| Parameters | 53 (44 fixed + 9 observable) | 53 |
| Rate rules | 11 | 11 |
| Assignment rules | 9 | 9 |
| Events | 27 | 27 |

**Net change vs v1.3:**

| Δ Species | Δ Parameters | Δ Rate rules | Δ Assignment rules | Δ Warnings |
|---|---|---|---|---|
| +2 (ADA_titre, height_z) | +18 | +2 | +9 | −146 (189 → 43) |

### Status of credibility gate G1 (zero serious libSBML errors)
**✅ PASS** for both adult and paediatric models.

---

## 2.4 Files produced

| File | Path | Size |
|---|---|---|
| Adult SBML model | `stage02_sbml/ASMD_Xenpozyme_QSP_v2_0_adult.xml` | ~32 KB |
| Paediatric SBML model | `stage02_sbml/ASMD_Xenpozyme_QSP_v2_0_paediatric.xml` | ~32 KB |
| Builder script | `stage02_sbml/build_v2_sbml.py` | ~13 KB |
| Build summary | `stage02_sbml/ASMD_Xenpozyme_QSP_v2_0_build_summary.json` | ~3 KB |

**Gate to Stage 3: OPEN.**
