---
title: "ELVN-001"
subtitle: "Updated ENABLE Phase 1 Data, Competitive Positioning, and the CML Pipeline"
author: "CML Therapeutics Analysis"
date: today
format:
html:
theme: journal
toc: true
toc-depth: 3
toc-location: right
number-sections: true
code-fold: true
code-tools: true
code-summary: "Show code"
smooth-scroll: true
highlight-style: github
fig-width: 10
fig-height: 6
fig-dpi: 150
page-layout: full
execute:
echo: true
warning: false
message: false
engine: knitr
---
```{r}
#| label: setup-r
#| include: false
library(tidyverse)
library(gt)
library(scales)
library(reticulate)
# NOTE on engines: this document mixes R (knitr) and Python (via reticulate).
# Python chunks need numpy/pandas/matplotlib available to the reticulate Python.
# If rendering locally and Python isn't found, set e.g.:
# reticulate::use_python("/usr/bin/python3", required = TRUE)
# or point RETICULATE_PYTHON at an environment with matplotlib installed.
theme_cml <- theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 16, color = "#1a1a2e"),
plot.subtitle = element_text(size = 12, color = "#555555", margin = margin(b = 15)),
plot.caption = element_text(face = "italic", color = "#888888", size = 9, hjust = 0),
axis.title = element_text(face = "bold", size = 11),
axis.text = element_text(size = 10),
legend.position = "bottom",
legend.title = element_text(face = "bold", size = 10),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
strip.text = element_text(face = "bold", size = 11),
plot.margin = margin(15, 15, 15, 15)
)
theme_set(theme_cml)
# Shared palette (mirrored in Python chunks)
elvn_color <- "#2E86AB" # ELVN-001 (established)
elvn_new <- "#E67E22" # EHA 2026 highlight (amber)
tern_color <- "#7B2D8E" # TERN-701 / MK-4208
olver_col <- "#16A085" # olverembatinib
tgrx_col <- "#C0392B" # TGRX-678
asc_col <- "#27AE60" # asciminib (approved reference)
neutral <- "#95A5A6"
new_fill <- "#FDEBD0" # light amber table fill for EHA 2026 data
gt_cml_theme <- function(gt_tbl) {
gt_tbl %>%
tab_options(
table.font.size = px(13),
heading.title.font.size = px(18),
heading.subtitle.font.size = px(13),
heading.align = "left",
heading.border.bottom.color = "#2C3E50",
heading.border.bottom.width = px(2),
column_labels.font.weight = "bold",
column_labels.border.bottom.color = "#2C3E50",
column_labels.border.bottom.width = px(2),
table_body.hlines.color = "#E0E0E0",
table.border.top.color = "#2C3E50",
table.border.top.width = px(2),
table.border.bottom.color = "#2C3E50",
table.border.bottom.width = px(2),
source_notes.font.size = px(10),
footnotes.font.size = px(10),
table.width = pct(100)
)
}
```
```{python}
#| label: setup-py
#| include: false
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
# Mirror the R palette so figures look like one document
PAL = {
"elvn": "#2E86AB",
"elvn_new": "#E67E22",
"tern": "#7B2D8E",
"olver": "#16A085",
"tgrx": "#C0392B",
"asc": "#27AE60",
"neutral": "#95A5A6",
"ink": "#1a1a2e",
"grid": "#E5E7EB",
}
mpl.rcParams.update({
"figure.dpi": 150,
"savefig.dpi": 150,
"font.size": 12,
"axes.titlesize": 16,
"axes.titleweight": "bold",
"axes.labelsize": 11,
"axes.labelweight": "bold",
"axes.edgecolor": "#888888",
"axes.linewidth": 0.8,
"axes.spines.top": False,
"axes.spines.right": False,
"axes.grid": True,
"grid.color": PAL["grid"],
"grid.linewidth": 0.7,
"xtick.color": "#444444",
"ytick.color": "#444444",
})
def style_axes(ax):
ax.set_axisbelow(True)
ax.tick_params(length=0)
return ax
```
::: {.callout-note appearance="minimal"}
## Document Overview
This analysis integrates **Enliven's EHA 2026 update on ELVN-001** β the June 11, 2026 investor deck and management call β for the treatment of chronic myeloid leukemia (CML). ELVN-001 (ENABLE Phase 1, data cutoff **March 10, 2026**) is placed against the current treatment paradigm and the competitive pipeline: the allosteric STAMP inhibitors **TERN-701 / MK-4208** (CARDINAL) and **TGRX-678**, and the third-generation ATP-competitive inhibitor **olverembatinib** (POLARIS-2).
π EHA 2026 ELVN-001 data are flagged in **amber** throughout. Illustrations are built in both **R (ggplot2 / gt)** and **Python (matplotlib)**. All cross-trial comparisons are confounded by population, follow-up, and definitions; no head-to-head trials exist. This is a clinical/competitive analysis, not investment advice.
:::
# π What's New β and a Key Correction {#sec-whatsnew}
::: callout-important
## The dose-maturity story, corrected
The prior version of this document framed the shift from "60/120 mg looks better" (Jan 2026) to "80 mg QD selected" as the 80 mg cohort *out-performing* on merit. **That was wrong, and management was explicit about why.**
- The **80 mg QD dose was selected on PK/PD grounds** β at 60, 80, and 120 mg there was *no appreciable difference* in safety or efficacy, and 80 and 120 mg both achieve **\>99% target coverage**. 80 mg is the **optimal biological dose (OBD)**; the MTD is 80 mg **BID** (3Γ the OBD).
- The January readout showed 60/120 mg numerically higher **because that cohort was less mature**, while the 80 mg cohort was fully mature. By EHA 2026 the **60/120 mg cohort matured downward** and the **80 mg cohort (now expanding) is less mature and read upward to 48% achieved MMR**. Management guides that, at full maturity, achieved MMR at 80 mg will likely settle **"in the 40% range, plus or minus."**
- Takeaway: **there is no dose-response signal** across 60β120 mg QD; the apparent differences are data-maturity artifacts. See @sec-dose-response.
:::
```{r}
#| label: whats-new-summary
#| code-fold: true
#| code-summary: "EHA 2026 headline data (cutoff 10 Mar 2026)"
whatsnew <- tibble(
Metric = c("Total enrollment (Phase 1)", "80 mg QD Phase 1b (N)",
"Median duration of exposure", "Ongoing on study",
"Recommended Phase 3 dose (OBD)", "MTD",
"80 mg QD β Overall MMR @24 wks", "80 mg QD β Achieved MMR @24 wks",
"80 mg QD β DMR @24 wks", "AE discontinuation (all pts)",
"ENABLE-2 comparator", "ENABLE-2 / 1L IST timing", "Cash runway"),
Value = c("161 (158 individual pts)", "49 (62 in safety set)",
"35 weeks (>1/3 on therapy >1 yr)", "76% (82% at 80 mg QD)",
"80 mg QD (FDA-aligned)", "80 mg BID",
"61% (17/28)", "48% (10/21)",
"30% (8/27)", "6.2%",
"Physician's choice ATP-competitive TKI (excl. asciminib & ponatinib)",
"Both initiating 2H 2026; EoP2 meeting Q3 2026", "$452M into 1H 2029")
)
whatsnew %>%
gt() %>%
tab_header(title = md("π **ELVN-001 EHA 2026 β Headline Update**"),
subtitle = "ENABLE Phase 1 Β· data cutoff 10 March 2026") %>%
cols_label(Metric = "", Value = md("**EHA 2026**")) %>%
tab_style(style = list(cell_text(weight = "bold"), cell_fill(color = "#F8F9FA")),
locations = cells_body(columns = Metric)) %>%
tab_style(style = list(cell_fill(color = new_fill), cell_text(weight = "bold")),
locations = cells_body(columns = Value)) %>%
cols_width(Metric ~ px(360), Value ~ px(440)) %>%
tab_source_note(md("*Source: Enliven EHA 2026 company presentation & call, 11 June 2026.*")) %>%
gt_cml_theme()
```
------------------------------------------------------------------------
# ELVN-001: ENABLE Phase 1 (EHA 2026) {#sec-elvn}
## Trial Design and Status
```{r}
#| label: design
#| code-fold: true
#| code-summary: "ENABLE design (updated)"
design <- tibble(
Parameter = c("Trial / NCT", "Phase", "Phase 1a (escalation)",
"Phase 1b expansion cohorts", "Optimal biological dose (OBD)",
"MTD", "Eligibility", "Comparator (Phase 3)", "Data cutoff"),
Details = c("ENABLE / NCT05304377", "1a/1b (ongoing)",
"10β120 mg QD, 60β120 mg BID (N up to ~80)",
"60 mg QD (N=20), 80 mg QD (N=20+40 expansion), 120 mg QD (N=21)",
"80 mg QD β selected on safety/tolerability, anti-CML activity, PK/PD modeling",
"80 mg BID (2 DLTs at 120 mg BID: Gr3 hallucination, Gr3 myalgia)",
"Chronic-phase CML; failed/intolerant/not a candidate for available therapies; typical or atypical transcripts",
"Physician's choice ATP-competitive TKI β excludes asciminib & ponatinib",
"10 March 2026")
)
design %>%
gt() %>%
tab_header(title = md("**ENABLE Phase 1 β Design & Status**"),
subtitle = "π EHA 2026") %>%
tab_style(style = list(cell_fill(color = "#EBF5FB"), cell_text(weight = "bold")),
locations = cells_body(columns = Parameter)) %>%
tab_style(style = list(cell_fill(color = new_fill), cell_text(weight = "bold")),
locations = cells_body(columns = Details,
rows = Parameter %in% c("Optimal biological dose (OBD)", "Comparator (Phase 3)"))) %>%
cols_width(Parameter ~ px(230), Details ~ px(560)) %>%
gt_cml_theme()
```
## Patient Population β Heavily Pretreated
::: callout-note
A difficult-to-treat population by design (eligibility required no remaining standard option). Across all 161 patients: median **4** prior lines (range 1β10), **70%** with **β₯3 prior unique TKIs**, **62%** prior **asciminib**, **37%** prior **ponatinib** (72% prior asciminib and/or ponatinib), and **\>35% in 5th line or later**. Most prior-asciminib patients received it late-line and **65% (24/37 evaluable) discontinued asciminib for lack of efficacy** (i.e., asciminib-resistant). **8%** had mutations associated with allosteric-inhibitor resistance overall, rising to **11% in Phase 1b**; **7%** carried T315I.
:::
```{r}
#| label: demographics
#| code-fold: true
#| code-summary: "Baseline characteristics (all vs 80 mg QD)"
demo <- tribble(
~Characteristic, ~`All (N=161)`, ~`80 mg QD (N=49)`,
"Median age, yr", "59", "57",
"Typical transcript (e13a2/e14a2)", "93%", "96%",
"Baseline mutation (Sanger)", "24%", "10%",
" T315I", "7%", "n/a",
" Allosteric-resistance mutation", "8%", "4%",
"Median prior lines of TKI (range)", "4 (1β10)", "3 (1β9)",
"β₯3 prior unique TKIs", "70%", "β",
"β₯5 prior unique TKIs", "23%", "14%",
"Prior asciminib", "62%", "55%",
"Prior ponatinib", "37%", "27%",
"DC'd last TKI for lack of efficacy", "61%", "51%",
"DC'd last TKI for intolerance", "32%", "41%"
)
demo %>%
gt() %>%
tab_header(title = md("**ENABLE Baseline Characteristics**"),
subtitle = "π EHA 2026 Β· cutoff 10 Mar 2026") %>%
tab_style(style = cell_text(weight = "bold"),
locations = cells_body(columns = Characteristic)) %>%
tab_style(style = cell_fill(color = new_fill),
locations = cells_body(columns = `All (N=161)`,
rows = Characteristic %in% c("β₯3 prior unique TKIs", "Prior asciminib"))) %>%
gt_cml_theme()
```
## Efficacy by 24 Weeks (Phase 1b)
```{r}
#| label: efficacy-table
#| code-fold: true
#| code-summary: "Key efficacy milestones"
eff <- tribble(
~Endpoint, ~`Total Ph1b (N=90)`, ~`80 mg QD (N=49)`,
"Median exposure (weeks)", "28.0", "16.1",
"Overall MMR (β€0.1%)", "54% (37/69)", "61% (17/28)",
"MMR achieved", "40% (21/53)", "48% (10/21)",
"MMR maintained", "100% (16/16)", "100% (7/7)",
"MR2 achieved (β€1%)", "58% (19/33)", "69% (9/13)",
"DMR achieved (β€0.01%)", "22% (14/64)", "30% (8/27)"
)
eff %>%
gt() %>%
tab_header(title = md("**ELVN-001 Efficacy Milestones by Week 24**"),
subtitle = "π EHA 2026 Β· typical transcripts, MMR-evaluable") %>%
cols_label(`80 mg QD (N=49)` = md("π **80 mg QD** *(Phase 3 dose)*")) %>%
tab_style(style = cell_text(weight = "bold"), locations = cells_body(columns = Endpoint)) %>%
tab_style(style = list(cell_fill(color = new_fill), cell_text(weight = "bold")),
locations = cells_body(columns = `80 mg QD (N=49)`)) %>%
tab_footnote("Achieved = newly achieved among those not in MMR at baseline. The 80 mg cohort is actively enrolling and less mature; rates may evolve.",
locations = cells_column_labels(columns = `80 mg QD (N=49)`)) %>%
tab_source_note(md("*Overall MMR = achieved + maintained. Source: Enliven EHA 2026.*")) %>%
gt_cml_theme()
```
### Response by Line of Therapy and After Asciminib (R)
Response is highest in earlier lines and β importantly β **does not degrade with prior asciminib exposure**, consistent with ELVN-001's complementary (active-site) mechanism.
```{r}
#| label: mmr-by-line
#| code-fold: true
#| code-summary: "MMR by prior lines (achieved + maintained), all vs post-asciminib"
#| fig-width: 10
#| fig-height: 5.5
by_line <- bind_rows(
tibble(pop = "All Phase 1b",
line = c("1β2", "3β4", "5+"), n = c(27, 26, 16),
Achieved = c(55, 32, 29), Overall = c(67, 50, 38)),
tibble(pop = "Post-asciminib",
line = c("1β2", "3β4", "5+"), n = c(6, 22, 15),
Achieved = c(60, 28, 29), Overall = c(67, 41, 33))
) %>%
mutate(Maintained = Overall - Achieved,
line = paste0(line, "\n(N=", n, ")")) %>%
pivot_longer(c(Achieved, Maintained), names_to = "component", values_to = "pct") %>%
mutate(component = factor(component, levels = c("Maintained", "Achieved")),
pop = factor(pop, levels = c("All Phase 1b", "Post-asciminib")))
overall_lab <- by_line %>% group_by(pop, line) %>% summarise(Overall = sum(pct), .groups = "drop")
ggplot(by_line, aes(x = line, y = pct, fill = component)) +
geom_col(width = 0.62, alpha = 0.95) +
geom_text(data = overall_lab, aes(x = line, y = Overall, label = paste0(Overall, "%")),
inherit.aes = FALSE, vjust = -0.4, fontface = "bold", size = 4) +
facet_wrap(~ pop) +
scale_fill_manual(values = c("Achieved" = elvn_new, "Maintained" = "#F5CBA7"),
labels = c("Maintained" = "Maintained MMR", "Achieved" = "Achieved MMR")) +
labs(title = "MMR by Week 24 Across Lines of Therapy",
subtitle = "\U0001F7E0 EHA 2026 \u2014 stacked: achieved + maintained = overall MMR",
x = "Prior unique TKIs", y = "Patients in MMR (%)", fill = NULL,
caption = "Prior asciminib does not meaningfully reduce response once line of therapy is accounted for. Maintained MMR = 100% in every group.") +
scale_y_continuous(limits = c(0, 75), expand = c(0.02, 0))
```
### Molecular-Response Shift Table (Python heatmap)
Every Phase 1b patient evaluable by week 24 (N=69) **improved or held** their molecular-response category β **no patient worsened**. Even in the highest-burden group (baseline BCR::ABL1 \>10%), **59% (10/17) improved** by β₯1 category.
```{python}
#| label: mr-shift-heatmap
#| code-fold: true
#| code-summary: "MR-category shift heatmap (slide 20 recreation)"
#| fig-width: 9
#| fig-height: 6
cats = ["β₯MR4.5", "MR4", "MR3", ">0.1β1", ">1β10", ">10"] # best -> worst
# counts[row=week24][col=baseline]
counts = np.array([
[4, 1, 4, 5, 2, 0], # week24 β₯MR4.5
[0, 0, 1, 1, 1, 0], # MR4
[0, 0, 6, 6, 4, 2], # MR3
[0, 0, 0, 9, 4, 5], # >0.1β1
[0, 0, 0, 0, 4, 3], # >1β10
[0, 0, 0, 0, 0, 7], # >10
], dtype=int)
n = len(cats)
# color by improvement(row<col)=green, no change(row==col)=light green, worsen(row>col)=amber
color = np.empty((n, n), dtype=object)
for i in range(n): # row = week24
for j in range(n): # col = baseline
if i < j: color[i, j] = "#1E8449" # improved (deeper response)
elif i == j: color[i, j] = "#A9DFBF" # no change
else: color[i, j] = "#F4D03F" # worsened
if counts[i, j] == 0:
color[i, j] = "#FBFCFC" # empty cells very light
fig, ax = plt.subplots(figsize=(9, 6))
for i in range(n):
for j in range(n):
ax.add_patch(plt.Rectangle((j, n - 1 - i), 1, 1, facecolor=color[i, j],
edgecolor="white", linewidth=2))
if counts[i, j] > 0:
txt_col = "white" if color[i, j] == "#1E8449" else "#1a1a2e"
ax.text(j + 0.5, n - 1 - i + 0.5, str(counts[i, j]),
ha="center", va="center", fontsize=13, fontweight="bold", color=txt_col)
ax.set_xlim(0, n); ax.set_ylim(0, n)
ax.set_xticks(np.arange(n) + 0.5); ax.set_xticklabels(cats, fontsize=9)
ax.set_yticks(np.arange(n) + 0.5); ax.set_yticklabels(cats[::-1], fontsize=9)
ax.set_xlabel("BCR::ABL1 category at BASELINE", fontweight="bold")
ax.set_ylabel("BCR::ABL1 category at WEEK 24", fontweight="bold")
ax.set_title("All Evaluable Phase 1b Patients Improved or Held MR Category (N=69)",
fontsize=14, color=PAL["ink"], pad=14)
for s in ax.spines.values():
s.set_visible(False)
ax.tick_params(length=0)
ax.set_aspect("equal")
legend = [Patch(facecolor="#1E8449", label="Improved β₯1 category"),
Patch(facecolor="#A9DFBF", label="No change"),
Patch(facecolor="#F4D03F", label="Worsened (none observed)")]
ax.legend(handles=legend, loc="upper center", bbox_to_anchor=(0.5, -0.12),
ncol=3, frameon=False, fontsize=9)
fig.text(0.01, -0.02, "Source: Enliven EHA 2026 (cutoff 10 Mar 2026).",
fontsize=8, style="italic", color="#888888")
plt.tight_layout()
plt.show()
```
## Safety and Tolerability
A favorable profile consistent with ABL1 selectivity: **6.2% AE-related discontinuation**, most TEAEs Grade 1β2, and at the 80 mg QD dose only **thrombocytopenia** exceeded 5% at Grade β₯3. Arterial occlusive events were uncommon (**4.4%** any grade, **1.9%** Grade 3 β all in patients with cardiovascular risk factors and/or prior nilotinib/ponatinib); hypertension **5.7%** any grade.
```{r}
#| label: safety-table
#| code-fold: true
#| code-summary: "Most common TEAEs (all vs 80 mg QD)"
saf <- tribble(
~TEAE, ~`All any`, ~`All β₯Gr3`, ~`80mg any`, ~`80mg β₯Gr3`,
"Any TEAE", "90%", "34%", "82%", "24%",
"Thrombocytopenia", "15%", "6.3%", "16%", "6.5%",
"Neutropenia", "7.0%", "6.3%", "1.6%", "0%",
"Lipase increased", "22%", "5.7%", "21%", "4.8%",
"Fatigue", "18%", "1.3%", "11%", "1.6%",
"Headache", "15%", "0.6%", "18%", "1.6%",
"Arthralgia", "14%", "1.3%", "16%", "1.6%",
"Diarrhea", "11%", "0%", "9.7%", "0%"
)
saf %>%
gt() %>%
tab_header(title = md("**ELVN-001 Most Common TEAEs**"),
subtitle = "π EHA 2026 Β· All N=158 safety set; 80 mg QD N=62") %>%
tab_spanner(label = md("**All patients**"), columns = c(`All any`, `All β₯Gr3`)) %>%
tab_spanner(label = md("π **80 mg QD**"), columns = c(`80mg any`, `80mg β₯Gr3`)) %>%
cols_label(`All any` = "Any", `All β₯Gr3` = "β₯Gr3", `80mg any` = "Any", `80mg β₯Gr3` = "β₯Gr3") %>%
tab_style(style = cell_text(weight = "bold"), locations = cells_body(columns = TEAE)) %>%
tab_style(style = cell_fill(color = new_fill),
locations = cells_body(columns = c(`80mg any`, `80mg β₯Gr3`))) %>%
gt_cml_theme()
```
### Differentiated Tolerability vs Asciminib (R dumbbell)
Using **laboratory abnormalities** (a more objective measure than investigator-reported AEs, and the metric used in prescribing information), ELVN-001 shows numerically lower hematologic and vascular toxicity than the asciminib label β a plausible consequence of ELVN-001's selectivity for ABL1 over ABL2 (\~32-fold), which allosteric inhibitors lack.
```{r}
#| label: dumbbell-vs-asciminib
#| code-fold: true
#| code-summary: "Dumbbell: ELVN-001 vs asciminib label"
#| fig-width: 10
#| fig-height: 4.8
cmp <- tribble(
~event, ~grade, ~elvn, ~asc,
"Thrombocytopenia", "Any", 25, 46,
"Thrombocytopenia", "Gr 3β4", 7, 24,
"Neutropenia", "Any", 18, 43,
"Neutropenia", "Gr 3β4", 8, 22,
"Arterial occlusive", "Any", 4.4, 12,
"Arterial occlusive", "Gr 3β4", 1.9, 2.5,
"Hypertension", "Any", 5.7, 14,
"Hypertension", "Gr 3β4", 1.9, 7
) %>%
mutate(lab = paste0(event, " β ", grade),
lab = fct_reorder(lab, asc))
ggplot(cmp) +
geom_segment(aes(x = elvn, xend = asc, y = lab, yend = lab),
color = neutral, linewidth = 1.1) +
geom_point(aes(x = asc, y = lab), color = asc_col, size = 4.2) +
geom_point(aes(x = elvn, y = lab), color = elvn_new, size = 4.2) +
geom_text(aes(x = elvn, y = lab, label = paste0(elvn, "%")),
color = elvn_new, fontface = "bold", size = 3.2, vjust = -1.1) +
geom_text(aes(x = asc, y = lab, label = paste0(asc, "%")),
color = asc_col, fontface = "bold", size = 3.2, vjust = -1.1) +
labs(title = "ELVN-001 vs Asciminib Label \u2014 Toxicity (lab abnormalities)",
subtitle = "Amber = ELVN-001 (N=158) | Green = asciminib (Scemblix USPI)",
x = "Rate (%)", y = NULL,
caption = "Cross-trial / cross-source comparison; not head-to-head. ELVN-001 hematologic values are laboratory abnormalities. Source: Enliven EHA 2026; Scemblix USPI.") +
scale_x_continuous(limits = c(0, 50), expand = c(0.02, 0)) +
theme(panel.grid.major.y = element_blank())
```
### Mechanistic Case Studies
Two illustrative responders support the design rationale in post-asciminib resistance (cutoff 27 May 2026):
- **Myristoyl-pocket mutation (A344D):** 57-yo, prior imatinib/bosutinib/asciminib (failed asciminib for A344D). On ELVN-001 80 mg QD β **rapid DMR** (0.22% β 0.026% β \<0.0016%), only low-grade AEs. A344D is an *allosteric*-resistance mutation, so activity here is exactly what an active-site agent should deliver.
- **T315I:** 72-yo, prior nilotinib/imatinib/asciminib (failed asciminib for T315I). On ELVN-001 80 mg BID β **achieved MMR** (47% β 0.083%), low-grade AEs.
------------------------------------------------------------------------
# Putting ELVN-001 in Context {#sec-context}
## Why Cross-Trial MMR Comparisons Mislead
Enrollment criteria drive the population, and population drives MMR. ENABLE deliberately enrolled the **hardest** population of the three programs below.
```{r}
#| label: enrollment-criteria
#| code-fold: true
#| code-summary: "Enrollment-criteria comparison"
enrol <- tribble(
~Criterion, ~Asciminib, ~`TERN-701 / MK-4208`, ~`ELVN-001 (ENABLE)`,
"Initial line of therapy", "3L+", "2L+", "No remaining standard option",
"1st/2nd/3rd-gen TKI resistant/intolerant", "β", "β", "β",
"Asciminib-intolerant eligible", "β", "β", "β",
"Asciminib-resistant eligible", "β", "β", "β",
"Atypical transcripts eligible", "β", "β", "β"
)
enrol %>%
gt() %>%
tab_header(title = md("**Enrollment Criteria Shape the Population**"),
subtitle = "ENABLE enrolled more 4L+, more prior asciminib/ponatinib, and asciminib-resistant patients") %>%
tab_style(style = cell_text(weight = "bold"), locations = cells_body(columns = Criterion)) %>%
tab_style(style = cell_fill(color = new_fill), locations = cells_body(columns = `ELVN-001 (ENABLE)`)) %>%
gt_cml_theme()
```
```{python}
#| label: mmr-decline-by-line
#| code-fold: true
#| code-summary: "Precedent: MMR declines steeply by line (Python)"
#| fig-width: 9
#| fig-height: 5
lines = ["1L", "2L", "3L", "4L", "5L+"]
asc_mmr = [68, 53, 29, 25, 16] # asciminib precedent (1L = wk48; others wk24)
fig, ax = plt.subplots(figsize=(9, 5))
bars = ax.bar(lines, asc_mmr, color=PAL["asc"], width=0.6, alpha=0.92, zorder=3)
for b, v in zip(bars, asc_mmr):
ax.text(b.get_x() + b.get_width()/2, v + 1.2, f"{v}%",
ha="center", fontweight="bold", fontsize=12)
ax.annotate(">3Γ difference\n2L vs 5L+", xy=(0.5, 60), fontsize=11, fontweight="bold",
color=PAL["ink"], ha="center",
bbox=dict(boxstyle="round,pad=0.4", fc="#FDF2E9", ec=PAL["elvn_new"]))
style_axes(ax)
ax.set_ylim(0, 80)
ax.set_ylabel("Achieved MMR (%)")
ax.set_title("Line of Therapy Matters: Achieved MMR Falls Sharply\n(asciminib precedent)",
fontsize=14, color=PAL["ink"])
fig.text(0.01, -0.03,
"Asciminib precedent; 1L = MMR at Wk48, others Wk24. >35% of ENABLE patients were 5L+. "
"Source: Scemblix USPI; ASCEMBL; ASC4FIRST.",
fontsize=8, style="italic", color="#888888")
plt.tight_layout()
plt.show()
```
## ELVN-001 vs the Last Two Approved Drugs (Phase 1 β Phase 3 read-through)
At the **same milestone** (achieved MMR by 24 weeks), ELVN-001's Phase 1b numbers compare favorably to asciminib and bosutinib β *despite* a more heavily pretreated population. CML Phase 1 MMR has historically tracked into Phase 3, which underpins Enliven's confidence.
```{python}
#| label: readthrough
#| code-fold: true
#| code-summary: "Phase 1 β Phase 3 achieved-MMR read-through (Python)"
#| fig-width: 9.5
#| fig-height: 5.5
rows = [
("ELVN-001 80 mg QD (Ph1b)", 48, 21, PAL["elvn_new"]),
("ELVN-001 all Ph1b", 40, 53, PAL["elvn"]),
("Asciminib (Ph3)", 27, 157, PAL["asc"]),
("Asciminib (Ph1)", 24, 80, "#7DCEA0"),
("Bosutinib (Ph1)", 15, 105, PAL["neutral"]),
("Bosutinib (Ph3)", 14, 76, "#BDC3C7"),
]
labels = [r[0] for r in rows]
vals = [r[1] for r in rows]
ns = [r[2] for r in rows]
cols = [r[3] for r in rows]
y = np.arange(len(rows))[::-1]
fig, ax = plt.subplots(figsize=(9.5, 5.5))
bars = ax.barh(y, vals, color=cols, height=0.62, zorder=3, alpha=0.95)
for yi, v, nn in zip(y, vals, ns):
ax.text(v + 0.8, yi, f"{v}%", va="center", fontweight="bold", fontsize=12)
ax.text(0.6, yi, f"N={nn}", va="center", ha="left", fontsize=8.5,
color="white", fontweight="bold")
ax.set_yticks(y); ax.set_yticklabels(labels, fontsize=10)
style_axes(ax)
ax.grid(axis="y", visible=False)
ax.set_xlim(0, 55)
ax.set_xlabel("Achieved MMR by 24 weeks (%)")
ax.set_title("MMR Achievement by 24 Weeks β ELVN-001 vs Last Two Approved CML Drugs",
fontsize=13.5, color=PAL["ink"])
fig.text(0.01, -0.03,
"Cross-trial; different eras, designs, and populations (ENABLE more heavily pretreated). "
"Source: Enliven EHA 2026; Hughes 2019; Khoury 2012; Scemblix USPI.",
fontsize=8, style="italic", color="#888888")
plt.tight_layout()
plt.show()
```
## The Dose-Maturity Artifact, Illustrated {#sec-dose-response}
```{r}
#| label: dose-maturity
#| code-fold: true
#| code-summary: "80 mg QD achieved-MMR maturation (R)"
#| fig-width: 9
#| fig-height: 5.2
mat <- tibble(
readout = factor(c("Jan 2026", "EHA 2026"), levels = c("Jan 2026", "EHA 2026")),
achieved = c(38, 48),
maturity = c("Fully mature", "Less mature\n(actively enrolling)")
)
ggplot(mat, aes(x = readout, y = achieved, group = 1)) +
annotate("rect", xmin = -Inf, xmax = Inf, ymin = 35, ymax = 45,
fill = elvn_new, alpha = 0.12) +
annotate("text", x = 1.5, y = 40, label = "Management-guided\nmature estimate ~40% \u00B1",
color = "#A04000", fontface = "italic", size = 3.4) +
geom_line(linewidth = 1.3, color = elvn_new) +
geom_point(size = 5, color = elvn_new) +
geom_text(aes(label = paste0(achieved, "%")), vjust = -1.2, fontface = "bold", size = 4.5) +
geom_text(aes(label = maturity), vjust = 2.0, size = 3, color = "#666666") +
labs(title = "ELVN-001 80 mg QD: Achieved MMR Reflects Data Maturity, Not Dose Effect",
subtitle = "Per management: 60/120 mg matured downward while 80 mg (enrolling) read upward \u2014 no dose-response",
x = NULL, y = "Achieved MMR @24 wks (%)",
caption = "The 60/120 mg cohort looked higher in Jan only because it was less mature then. No appreciable efficacy/safety difference across 60\u2013120 mg; 80 mg chosen on PK/PD (>99% target coverage).") +
scale_y_continuous(limits = c(25, 55), expand = c(0.02, 0)) +
scale_x_discrete()
```
------------------------------------------------------------------------
# ELVN-001 vs TERN-701 / MK-4208 {#sec-vs-tern}
TERN-701 (now also **MK-4208**, Merck; **HS-10382**, Hansoh in China) is a next-generation **allosteric** STAMP inhibitor β the same mechanistic class as asciminib. Enliven's framing on the call: it looks like "a very similar molecule to asciminib... an experiment about high-dose allosteric," and they argue TERN-701 shows **MMR degradation with more prior-asciminib exposure**, whereas ELVN-001 (active-site) holds response regardless of prior asciminib. That is a sponsor's view, not head-to-head fact, but it captures the core mechanistic thesis.
```{r}
#| label: vs-tern-table
#| code-fold: true
#| code-summary: "ELVN-001 (EHA 2026) vs TERN-701 (ASH 2025)"
vs <- tribble(
~Dimension, ~`ELVN-001 (EHA 2026)`, ~`TERN-701 / MK-4208 (ASH 2025)`,
"Mechanism", "ATP-competitive (active-site)", "Allosteric (STAMP / myristoyl pocket)",
"Cross-resistance w/ asciminib", "Complementary β active vs allosteric-resistance mutations", "Same pocket class as asciminib",
"Lead dose", "80 mg QD (OBD)", "β₯320 mg QD (RP2D)",
"Overall MMR @24 wks", "61% (80 mg QD)", "74β80% (β₯320 mg)",
"Achieved MMR @24 wks", "48% (80 mg); 40% all Ph1b", "64β75% (β₯320 mg)",
"DMR @24 wks", "30%", "29%",
"Population", "62% prior asciminib (mostly resistant); 70% β₯3 TKIs; asciminib-resistant eligible", "36% prior asciminib; asciminib-resistant excluded",
"Atypical transcripts", "Active (e13a3/e19a2 etc.)", "Unlikely (no myristoyl pocket)",
"Prior-asciminib effect", "No meaningful degradation", "Sponsor (ELVN) cites degradation w/ prior asciminib",
"Convenience", "QD, no food restriction, low DDI", "QD, no food restriction, P-gp inhibitor",
"Status", "Phase 3 (ENABLE-2) 2H 2026", "Phase 1/2 expansion (320 vs 500 mg)"
)
vs %>%
gt() %>%
tab_header(title = md("**ELVN-001 vs TERN-701 / MK-4208**"),
subtitle = "π ELVN-001 EHA 2026 Β· TERN-701 ASH 2025 β different populations; cross-trial only") %>%
cols_label(`ELVN-001 (EHA 2026)` = md("π **ELVN-001**"),
`TERN-701 / MK-4208 (ASH 2025)` = md("**TERN-701 / MK-4208**")) %>%
tab_style(style = list(cell_text(weight = "bold"), cell_fill(color = "#F8F9FA")),
locations = cells_body(columns = Dimension)) %>%
tab_style(style = cell_fill(color = "#EBF5FB"), locations = cells_body(columns = `ELVN-001 (EHA 2026)`)) %>%
tab_style(style = cell_fill(color = "#F4ECF7"), locations = cells_body(columns = `TERN-701 / MK-4208 (ASH 2025)`)) %>%
cols_width(Dimension ~ px(180), everything() ~ px(330)) %>%
tab_footnote("TERN-701's higher headline MMR partly reflects an easier population (2L+, asciminib-resistant excluded, fewer prior TKIs).",
locations = cells_body(columns = `TERN-701 / MK-4208 (ASH 2025)`, rows = Dimension == "Overall MMR @24 wks")) %>%
gt_cml_theme()
```
------------------------------------------------------------------------
# The Broader Pipeline & Landscape {#sec-pipeline}
```{r}
#| label: landscape-table
#| code-fold: true
#| code-summary: "Investigational landscape: mechanism, line, population, signal"
land <- tribble(
~Agent, ~Class, ~Sponsor, ~`Lead trial`, ~`Setting / population`, ~`Efficacy signal`, ~Status,
"ELVN-001", "ATP-competitive (active-site)", "Enliven", "ENABLE / ENABLE-2", "2L+, heavily pretreated, post-asciminib", "48% achieved / 61% overall MMR @24 wk (80 mg)", "Ph3 2H 2026",
"TERN-701/MK-4208","Allosteric (STAMP)", "Merck (ex-Terns)", "CARDINAL", "2L+, asciminib-resistant excluded", "74β80% overall MMR @24 wk (β₯320 mg)", "Ph1/2 expansion",
"TGRX-678", "Allosteric (STAMP), CNS-penetrant", "TargetRx (China)", "TGRX-678-1001", "R/I CP & AP CML incl T315I", "Promising in CP & AP incl T315I; MTD not reached", "Ph1a/1b (China)",
"Olverembatinib", "ATP-competitive (3rd-gen, pan-mutant)", "Ascentage (Takeda opt.)", "POLARIS-2", "2L CP-CML (China study: 1 prior line)", "CCyR 72β77%; MMR 44% (2L); deepens over time", "Ph3 (POLARIS-2)",
"Asciminib", "Allosteric (STAMP) β approved", "Novartis", "ASC4FIRST/ASCEMBL", "1L and 3L+ (approved)", "67.7% MMR 1L @48 wk; 25β34% 3L+", "Approved",
"Bosutinib", "ATP-competitive (2nd-gen) β approved", "Pfizer", "BFORE/label", "1Lβ3L+ (approved)", "13β15% MMR @24 wk (late line)", "Approved"
)
land %>%
gt() %>%
tab_header(title = md("**CML BCR::ABL1 Inhibitor Landscape**"),
subtitle = "Investigational + key approved references β cross-trial; populations differ markedly") %>%
tab_style(style = list(cell_text(weight = "bold")), locations = cells_body(columns = Agent)) %>%
tab_style(style = cell_fill(color = new_fill), locations = cells_body(rows = Agent == "ELVN-001")) %>%
tab_style(style = cell_fill(color = "#F4ECF7"), locations = cells_body(rows = Agent == "TERN-701/MK-4208")) %>%
cols_width(Agent ~ px(120), Class ~ px(150)) %>%
tab_source_note(md("*Sources: Enliven EHA 2026; Terns ASH 2025; TargetRx ASH 2024/2025 (Blood 2024;144:477; 2025;146:902); Ascentage ASH 2025; Scemblix USPI; ASC4FIRST.*")) %>%
gt_cml_theme()
```
```{python}
#| label: mechanism-map
#| code-fold: true
#| code-summary: "Mechanism Γ line-of-therapy positioning (Python)"
#| fig-width: 10
#| fig-height: 5.5
agents = {
"ELVN-001": dict(mech=1, line=3.0, col=PAL["elvn_new"], s=900),
"Olverembatinib": dict(mech=1, line=2.2, col=PAL["olver"], s=650),
"Bosutinib": dict(mech=1, line=1.5, col=PAL["neutral"], s=520),
"TERN-701/MK-4208":dict(mech=0, line=2.4, col=PAL["tern"], s=650),
"TGRX-678": dict(mech=0, line=3.2, col=PAL["tgrx"], s=520),
"Asciminib": dict(mech=0, line=1.6, col=PAL["asc"], s=620),
}
fig, ax = plt.subplots(figsize=(10, 5.5))
for name, d in agents.items():
ax.scatter(d["line"], d["mech"], s=d["s"], color=d["col"], alpha=0.85,
edgecolor="white", linewidth=2, zorder=3)
dy = 0.12 if name not in ("Bosutinib", "Asciminib") else -0.18
ax.annotate(name, (d["line"], d["mech"]), xytext=(d["line"], d["mech"] + dy),
ha="center", fontsize=9.5, fontweight="bold", color=PAL["ink"])
ax.set_yticks([0, 1]); ax.set_yticklabels(["Allosteric\n(STAMP)", "ATP-competitive\n(active-site)"], fontsize=11)
ax.set_xticks([1.5, 2.5, 3.3]); ax.set_xticklabels(["Earlier line\n(1Lβ2L)", "2L+", "Heavily pretreated\n(post-asciminib)"], fontsize=10)
ax.set_xlim(1.0, 3.8); ax.set_ylim(-0.6, 1.6)
style_axes(ax); ax.grid(axis="both", visible=True)
ax.set_title("Mechanism Γ Current Center-of-Gravity by Line of Therapy",
fontsize=14, color=PAL["ink"])
ax.text(3.3, 0.5, "Sequencing thesis:\nATP-competitive β allosteric",
ha="center", fontsize=9, style="italic", color="#777777")
fig.text(0.01, -0.02, "Bubble size β relative breadth of current clinical data. Illustrative positioning, not a ranking. Approved agents (asciminib, bosutinib) shown for reference.",
fontsize=8, style="italic", color="#888888")
plt.tight_layout()
plt.show()
```
------------------------------------------------------------------------
# Analysis & Outlook {#sec-analysis}
## 1 β EHA 2026 data vs the current paradigm
::: callout-note
**Efficacy.** At the Phase 3 dose, 48% achieved / 61% overall MMR by 24 weeks in a population where \~70% had β₯3 prior TKIs and 62% had prior (mostly resistant) asciminib is a strong later-line signal β and the read-through analysis shows it sits above asciminib's and bosutinib's own Phase 1 numbers at the same milestone. The honest caveat (management's own): the 80 mg cohort is immature and the durable achieved-MMR figure is likely **\~40% Β±**.
**Tolerability/toxicity.** This is arguably the more differentiated story: 6% AE discontinuation, mostly low-grade TEAEs, low AOE (4.4%) and hypertension (5.7%), and lab-based hematologic toxicity roughly half the asciminib label β consistent with ABL1-over-ABL2 selectivity. In a lifelong therapy, tolerability compounds into adherence and durability, which the KOL (Dr. Kim) emphasized as the agent's core advantage.
**Net.** ELVN-001 targets the two biggest gaps in the paradigm simultaneously β *suboptimal late-line efficacy* and *off-target toxicity/burden* β rather than trading one for the other.
:::
## 2 β Positioning, patient characteristics, and ELVN-001 vs TERN-701
The natural near-term position is **2L+ after asciminib (or another allosteric)**, especially asciminib-*resistant* patients and those carrying allosteric-resistance or T315I mutations, where an active-site mechanism is mechanistically the right switch. ELVN-001's tolerability also favors patients with comorbidities or polypharmacy (low DDI, no fasting). Versus TERN-701/MK-4208: TERN-701 posts higher headline MMR, but in an easier population (2L+, asciminib-resistant *excluded*, fewer prior TKIs) and within the same allosteric class as asciminib β so it is more exposed to allosteric cross-resistance. ELVN-001's differentiation is mechanistic complementarity and tolerability, not headline MMR. **Realistic landscape:** a credible best-in-class *ATP-competitive* 2L+ entrant first, with a genuine but unproven shot at frontline later; the binding constraint is randomized data, not mechanism.
## 3 β Future readouts, benchmarks, and likelihood
::: callout-tip
**Catalysts:** EoP2 FDA meeting (Q3 2026) β ENABLE-2 initiation (2H 2026; ELVN-001 vs physician's-choice ATP-competitive TKI, MMR\@24 wks, includes post-asciminib) and a 1L Phase 2 IST (2H 2026); potential 1L Phase 3 \~2028.
**Benchmarks to clear (and rough read):**
- *Beat second-gen comparator on MMR\@24wk in 2L+* β management targets **β₯15%** absolute advantage. **Likely**, given Phase 1 read-through and that the comparator excludes asciminib/ponatinib (so the bar is bosutinib-like).
- *Hold efficacy in asciminib-resistant patients* β **Likely**, mechanistically supported and seen in Phase 1.
- *Maintain the differentiated safety/tolerability at scale* β **Plausible but unproven**; lab-abnormality signal is encouraging, AOEs need longer follow-up.
- *Translate to frontline* β **Uncertain**; depends on a safety database at 80 mg, frontline tolerability, and how asciminib's frontline position evolves. Historical Phase 1β3 read-through in CML is favorable but not a guarantee.
:::
## 4 β Other pipeline prospects & relative opportunity
::: callout-note
- **TERN-701 / MK-4208 (Merck):** the most direct allosteric competitor; high MMR but same-class as asciminib and tested in an easier population. A small single-center 1L dataset (21 pts, HS-10382/China) looked similar to asciminib with directional safety signals β early. Merck ownership adds commercial muscle.
- **Olverembatinib (Ascentage; Takeda option; POLARIS-2):** a third-generation **ATP-competitive pan-mutant** (ponatinib-like), approved in China, T315I-active. ASH 2025 2L data (one prior line, China): CCyR \~72β77%, MMR \~44%, deepening over time β but a **much earlier-line, less-pretreated** population than ENABLE, and a ponatinib-class safety profile (Grβ₯3 thrombocytopenia 42.6%) to watch. Competes more with ponatinib than with ELVN-001 on tolerability.
- **TGRX-678 (TargetRx; China):** allosteric STAMP, **CNS-penetrant**, T315I-active in vitro; Phase 1a/1b with promising CP/AP activity and MTD not reached. Earliest-stage and geographically concentrated; its differentiators (CNS penetration, T315I) are niche but real.
**Relative opportunity.** The U.S. branded CML market is \~\$10B (\~110K patients, split \~\$5B 1L / \~\$5B 2L+). ELVN-001 and TERN-701 are the two assets with clear U.S. registrational paths and the cleanest differentiation arguments; olverembatinib's U.S. opportunity hinges on POLARIS-2 and a ponatinib-competitive niche; TGRX-678 is, for now, a China-centric early asset. ELVN-001's wedge is being the **selective ATP-competitive complement** in an allosteric-heavy future β a position none of the others occupy.
:::
------------------------------------------------------------------------
# Sources & Caveats {#sec-sources}
::: {.callout-note appearance="simple"}
- π Enliven Therapeutics β EHA 2026 company presentation & investor call, 11 June 2026 (ENABLE Phase 1, cutoff 10 Mar 2026); Kim D, et al. EHA 2026 oral presentation.
- Terns/Merck β TERN-701 (MK-4208) CARDINAL, ASH 2025 (Jabbour E, et al. Blood 2025;146(Suppl 1):901).
- TargetRx β TGRX-678 Phase 1 (NCT05434312), ASH 2024 (Blood 2024;144(Suppl 1):477) and ASH 2025 T315I update (Blood 2025;146(Suppl 1):902).
- Ascentage β olverembatinib 2L CP-CML, ASH 2025 (Abstract 3782); POLARIS-2 (Phase 3).
- Reference data: Hughes 2019 (asciminib Ph1), Scemblix USPI/ASCEMBL, ASC4FIRST, Khoury 2012 (bosutinib).
:::
::: callout-warning
All cross-trial and cross-source comparisons are confounded by differences in patient population, line of therapy, follow-up duration, era, and endpoint definitions; **no head-to-head trials exist**, and conclusions from cross-trial comparisons cannot be drawn. Investigational agents are not approved; safety/efficacy are not established. This document is a clinical/competitive analysis and is not investment advice.
:::
*Report generated `r format(Sys.Date(), "%B %d, %Y")`.*