[2026-06-16] sim | GLP-1 un-bundled from metformin → separate weight lever
The metformin treatment was labeled “Metformin / GLP-1” with one lever (HbA1c absShift −0.8). GLP-1 RAs’ dominant aging-relevant effect is weight loss, not glycemia, so they were conflated. Split: metformin relabeled to its glycemic-only scope (HbA1c −0.8 unchanged; UKPDS-era monotherapy; TAME not read out); new glp1 treatment as a weight lever.
glp1 modeled as a BMI absShift −3.0 (~−10% body weight at baseline BMI ~30 / ref height 1.7 m; SELECT ~9–10% Lincoff 2023, STEP-1 ~14.9% Wilding 2021). Treatments attach to mediators (calorieBalance is an input), so applied directly on BMI at the trial-observed steady-state magnitude; flows through the wired BMI cascade (→SBP→CVD, →CVD residual, →allcause J-curve, →HbA1c so glycemia EMERGES from weight, →restingHR).
UI is data-driven (B.treatments), so “GLP-1 RA (semaglutide)” appears in the timeline pharmacotherapy dropdown automatically.
Design note: model/bodycomp-dexa-sarcopenia-design.md (Codex gpt-5.5/high reviewed; Rev 2). Built to (a) model the GLP-1 sarcopenia paradox, (b) add DEXA inputs, (c) de-age-peg the sarcopenia node — one coherent build, since DEXA-anchored lean mass is the observable the 2026-06-11 disabled-frailty restructure was waiting for.
New leanMassIndex mediator (ALMI, kg/m²): flat young-healthy baseline (M 8.5 / F 6.4, sd 1.1), DEXA-anchorable (offsettable). The age-decline is EMERGENT (no age-pegging) via a new state node + stateAugment, mirroring HbA1c/beta-cell-decline.
New muscle-balance state node (signed, bounded [−2.5,+1.5]): catabolic terms read chronic-inflammation + stem-cell-exhaustion node burdens (inflammaging + satellite-cell-exhaustion); anabolic term reads physicalActivity (training builds/preserves muscle — the integrated dynamic, not an instantaneous algebraic edge). Augments leanMassIndex (sex coeff M 0.62 / F 0.42 → ~−10% ALMI by age 85, population mean staying above EWGSOP2 cutoffs 7.0/5.5).
leanMassIndex → falls (mediatorLogLinear, β −0.4244) MIGRATED off the retired age-sigmoid sarcopenia→falls node edge (Yeung 2019 OR 1.89, re-expressed per kg/m²). The sarcopenia hallmark node is now DISPLAY-ONLY (keeps incoming couplings; no mortality edge).
GLP-1 multi-effect: BMI −3.0 + leanMassIndex −0.30 (Locatelli 2024 ~10% lean fraction of the ~8.7 kg loss). Net ΔLE (baseline male): BMI-only +1.089 → +1.068 with the muscle penalty → +1.177 after the CV residual + infection edge — the paradox is visible.
Engine additions (all behavior-preserving; the prior 305 tests passed unchanged before any param edit): multi-target treatment.effects[]; optional floor/cap clamp on state-node accumulation; {input:id} deviation driver (input→state bridge); treatment→cause hazard path (causeEffects).
DEXA UI:leanMassIndex added to LAB_FIELDS + MED_SCALE/MED_COLOR + bundle ANALYTE_MED_MAP/UNIT_CONV (ALMI keys); NODE_INFO description cards for leanMassIndex + muscle-balance.
Rejected a generic leanMassIndex→allcause multiplier (the unprincipled move that sank the old betaByCause). Decomposed sarcopenia mortality into SPECIFIC mechanistic causes instead.
Deliberately EXCLUDED (documented non-modeling): →cardiovascular (the fitness axis, already in activityFitness — double-count) and →cancer (reverse causation / cachexia). Cause-agnostic physiologic-reserve slice stays in the residual until a real multi-driver reserve node exists (dormant frailty edge-kind).
De-double-counted activity→falls: the infection edge exposed that physicalActivity drives mortality through both the VO₂max-fitness all-cause channel AND the muscle channel. Fitness has NO fall-prevention mechanism (falls = strength/balance), so activityFitness now carries excludeCauses:["falls"] — a new engine per-cause opt-out divides the whole-bracket fitness mult back out of falls (×1 at baseline ⇒ invariant). Infection keeps BOTH channels (distinct mechanisms: pulmonary/immune vs respiratory-mechanics/aspiration).
[2026-06-16] sim | graph-node-validator pass over the bodycomp placeholders
Validated the 6 placeholder effect sizes against literature. Promoted to calibrated:leanMassIndex→falls β −0.4244 (Yeung 2019, doi:10.1002/jcsm.12411, PMID 30993881, prospective OR 1.89) and the GLP-1 leanMassIndex −0.30 (Locatelli 2024, doi:10.2337/dci23-0100, PMID 38687506 — arithmetic verified end-to-end).
Validator transcription error CAUGHT + corrected: it wrote the Yeung DOI as 10.1093/ageing/afz035 (Age & Ageing); PubMed efetch confirms PMID 30993881 → 10.1002/jcsm.12411 (J Cachexia Sarcopenia Muscle). Fixed. (All other validator-added PMIDs — SELECT 37952131, SELECT-adiposity-mediation 41138739, aspiration-pneumonia 27858956, biliary-sepsis 38253616, COVID-sarcopenia 37344057 — verified real + on-topic.)
Two substantive gaps surfaced (left placeholder, not fixed — each needs a dedicated pass):
muscle-balance decline-rate under-calibration — emergent ALMI decline is ~0.28–0.36%/yr vs the often-cited 1–2%/yr; the total ~10% by 85 is right for the population MEAN (mean must stay above the sarcopenia cutoff), so the literal per-year figure (raw leg-muscle mass in already-declining individuals) over-reads. Separately, the activity→falls muscle channel under-carries the exercise benefit (~5.6% at 2× guideline vs RCT ~20–30%) — a c_pa magnitude gap.
GLP-1 CV residual double-count — SELECT adiposity-mediation (PMID 41138739) finds ~67% of the MACE benefit weight-INDEPENDENT, but the model’s BMI→CVD cascade is calibrated to OBSERVATIONAL BMI→CHD (Lu 2014), which already delivers the full ~20% for a −3 BMI drop. So a separate weight-independent term over-credits CV unless the BMI cascade is first discounted for drug-induced (vs lifelong) weight loss. The 0.05 placeholder is documented as conservative-but-structurally-conflicted; resolving needs a BMI-cascade mediation decomposition.
Second Codex (gpt-5.5/high, resumed session) pass on the validator’s gap #2. Codex confirmed the causeEffects cardiovascular pctReduction 0.05double-counts: the observational BMI→CVD cascade (Lu 2014) already delivers ~16–20% CV reduction for the −3 BMI lever (engine-measured, ages 50–80) ≈ the SELECT total MACE RRR alone; SELECT adiposity-mediation (PMID 41138739) says only ~33% is weight-mediated, so the observational cascade over-credits drug-induced weight loss (cf. Look AHEAD null).
Codex endorsed a trialMediationReplacement (swap the treatment’s observational weight-mediated CV slice for the trial-decomposed value; net totalHR^dose / m_obs, dose-scaled ⇒ ×1 at baseline) as the higher-value, general fix — but scoped narrowly (treatment-specific params; rejected a global weight-loss discount and rejected recalibrating the whole BMI→CVD edge).
Implementation finding: computing m_obs non-fragilely is a real architecture lift — the treatment’s ΔBMI reaches CVD through ≥4 entangled paths (direct BMI→CVD residual, BMI→SBP→CVD, BMI→allcause J-curve bracket, BMI→HbA1c→CVD); a 2-path closed form gives ~10% vs the measured ~20% (wrong). Needs counterfactual-evaluation infra.
Done (no-regret, correct under both options): REMOVED the double-counting pctReduction 0.05 (Codex’s #1 priority). GLP-1 net ΔLE +1.177 → +1.020 (CV now rides the BMI cascade alone). Interim shape caveat documented: GLP-1’s CV benefit is now implicitly ~fully weight-mediated (latent contamination until a 2nd weight-loss CV agent is added). General engine capabilities (multi-target effects, treatment→causecauseEffects) stay built + tested (dormant; synthetic test added). trialMediationReplacement + counterfactual m_obs DEFERRED.
Validator transcription fix applied this session: Yeung 2019 DOI corrected 10.1093/ageing/afz035 → 10.1002/jcsm.12411 (verified vs PMID 30993881). tests 320/320; baseline LE unchanged; leak-gate clean (#1/#3).