Персональная вакцина от рака: зачем я пишу координационный слой с открытым исходным кодом для mRNA-терапии

от автора

Я помню момент, когда это перестало быть абстракцией.

Январь 2024 года. Команда Moderna и Merck публикует обновленные данные по KEYNOTE-942: в первичном анализе персонализированная mRNA-вакцина V940 в комбинации с пембролизумабом показала снижение риска рецидива меланомы на 44% (HR 0.561; 95% CI 0.309-1.017; двустороннее p=0.053), то есть результат на границе статистической значимости. Публикация в Lancet, 157 пациентов. Это не пресс-релиз с конференции и не слайд из инвесторской презентации, а рецензируемая статья в одном из самых строгих медицинских журналов. Потом картина стала только убедительнее: в 3-летнем наблюдении (ASCO 2024, абстракт LBA9512) сообщалось о 49% снижении риска рецидива или смерти (HR 0.510; 95% CI 0.288-0.906; двустороннее номинальное описательное p=0.019). В 5-летнем обновлении, опубликованном как корпоративное сообщение Moderna, эффект тоже описывался как сохраняющийся; в сообщении приводилось одностороннее номинальное p=0.0075.

А дальше все пошло быстро. К моменту публикации статьи в Lancet Moderna уже запустила третью фазу испытаний INTerpath-001. По записи ClinicalTrials.gov у исследования NCT05933577 дата первой публикации в реестре — 6 июля 2023 года; это фиксирует запуск уже в июле 2023-го. В протоколе — 1089 пациентов и, по данным запуска программы, 38 центров в 14 странах. Исследование по коду NCT05933577 находится сразу; статус — “active, not recruiting”. Параллельно Genentech вместе с BioNTech двигают вторую фазу autogene cevumeran по раку поджелудочной, NCT05968326, в комбинации с атезолизумабом и mFOLFIRINOX. Это заболевание, где пятилетняя выживаемость по срезу SEER для всей категории рака поджелудочной составляет 13.3% (интервал 2015-2021), а для PDAC профиль риска обычно еще хуже. В расширенном наблюдении первой фазы по раку поджелудочной (Sethna, Guasp et al., Nature, 2025; полный текст по платной подписке) у пациентов-респондеров на вакцину медиана выживаемости без рецидива не была достигнута при медиане наблюдения 3.2 года — против 13.4 месяца у нереспондеров (p = 0.007).

Два года назад я бы сказала “перспективное направление” и пошла дальше. Сегодня я смотрю на эти цифры и понимаю: это уже конвейер. Каждый пациент — отдельная серия производства. Секвенирование опухоли, предсказание неоантигенов, дизайн mRNA-конструкта, упаковка в липидные наночастицы, введение. В публичных коммуникациях Moderna фигурирует цель цикла порядка нескольких недель; в ряде выступлений речь шла примерно о 4 неделях. И на каждом шагу — документация, прослеживаемость, ворота качества.

Биоинформатические инструменты для этого есть: Nextflow + nf-core/sarek + pVACtools. Предсказание неоантигенов — NetMHCpan, MHCflurry, десяток альтернатив. Дизайн mRNA — LinearDesign, mRNAid. А вот открытого инструмента, который управлял бы всей цепочкой — от поступления образца до введения вакцины и мониторинга иммунного ответа, — я не нашла. Фарма пишет проприетарные системы за закрытыми дверями. Академия пишет пайплайны. Открытого специализированного слоя управления между одним и другим я не увидела.

Именно это меня и зацепило. Так я начала писать OpenRNA — координационный слой с открытым исходным кодом для персонализированных неоантигенных RNA-вакцин. TypeScript, Node.js, Express 5, Zod 4, 440 тестов в 22 наборах (по последнему верифицированному срезу репозитория), покрытие строк 95%, Apache-2.0. Это не пайплайн и не предсказатель, а оркестратор клинического рабочего процесса.

Десять шагов, из которых два покрыты

Представьте конкретного пациента. Меланома, стадия IIIB, резекция позади, нужна адъювантная терапия персонализированной вакциной. Дальше начинается длинная дорога:

  1. Согласие пациента на обработку генетических данных (управление согласием). Без него ничего не стартует.

  2. Регистрация биоматериала: опухолевая ДНК, нормальная ДНК, опухолевая РНК. У каждого образца — свой тип анализа (WES, WGS, RNA-seq) и происхождение.

  3. Запуск Nextflow-пайплайна: детекция соматических вариантов, фильтрация, HLA-типирование.

  4. Результаты HLA-типирования от нескольких инструментов нужно свести в консенсус. OptiType говорит одно, HLA-HD другое, arcasHLA третье. Если расхождение выходит за операторский порог, заданный политикой исследования, кейс уходит на ручной разбор.

  5. Контроль качества: качество секвенирования, глубина покрытия, процент дуплексов. Не прошел — стоп, возврат к шагу 2 с новым образцом.

  6. Ранжирование неоантигенов: pVACtools выдает список, его нужно сохранить и привязать к кейсу.

  7. Дизайн конструкта: выбор модальности (mRNA, saRNA, circRNA), стратегия линкеров между эпитопами, генерация пакета для производства.

  8. Экспертная панель: врачи рассматривают всю доказательную базу, утверждают или отправляют на доработку.

  9. Передача на производство: пакет документов с полной прослеживаемостью от образца до конструкта.

  10. Введение вакцины, мониторинг иммунного ответа, клиническое наблюдение.

Nextflow прекрасно справляется с шагом 3. pVACtools — с шагом 6. А для остальных восьми шагов открытого специализированного инструмента я не нашла.

И тут самое неприятное: каждый из этих восьми шагов находится под регуляторным надзором. FDA (21 CFR Part 11, CBER BLA), EMA (потенциально режим ATMP), ICH Q8-Q12. Это не та ситуация, где можно написать Jupyter-ноутбук и обойтись.

Фарма решает это по-своему: полгода разработки, NDA, команда из 20 человек на поддержке. Но для исследовательской группы из пяти человек, которая хочет запустить инициативное клиническое исследование, такой путь — тупик.

17 портов и ни одного new Service()

Когда я садилась проектировать OpenRNA, первый вопрос, который меня по-настоящему мучил, был не про хранение данных и не про фреймворк. Вопрос был другой: через три года, когда самоамплифицирующаяся РНК дозреет до второй фазы в онкологии, или когда кто-нибудь наконец придумает, как наладить cGMP-производство circular RNA — сколько из написанного мной кода придется выбросить?

Я хотела, чтобы ответ был: ноль.

Бизнес-логика не должна знать, какой именно HLA-тайпер стоит за интерфейсом. Не должна знать, Nextflow там или Snakemake. Не должна знать, pVACtools или MHCflurry. Она должна знать только одно: что эти вещи существуют и умеют делать определенные операции. А какие именно вещи и как именно — это уже детали адаптера.

Отсюда выросли 17 доменных портов. Интерфейсы, живущие в src/ports/:

// src/ports/IConstructDesigner.tsexport interface ConstructDesignRequest {  caseId: string;  rankedCandidates: RankingRationale[];  deliveryModality?: DeliveryModality;}export interface IConstructDesigner {  designConstruct(request: ConstructDesignRequest): Promise<ConstructDesignPackage>;}
// src/ports/IHlaConsensusProvider.tsexport interface IHlaConsensusProvider {  produceConsensus(    caseId: string,    inputs: HlaTypingInput[],    referenceVersion: string  ): Promise<HlaConsensusRecord>;  getConsensus(caseId: string): Promise<HlaConsensusRecord | null>;}

11 портов для научного и рабочего потока: IConstructDesigner, IHlaConsensusProvider, IModalityRegistry, INeoantigenRankingEngine, INextflowClient, IOutcomeRegistry, IQcGateEvaluator, IReferenceBundleRegistry, IWorkflowDispatchSink, IWorkflowOrchestrator, IWorkflowRunner.

5 портов для слоя управления: IAuditSignatureProvider, IConsentTracker, IFhirExporter, IRbacProvider, IStateMachineGuard.

И IEventStore для реплея доменных событий.

Все адаптеры инъектируются через единую фабрику AppDependencies. Ни одного new в бизнес-логике — это принцип, который я себе пообещала не нарушать:

export function createApp(dependencies: AppDependencies = {}) {  const {    modalityRegistry,    constructDesigner,    workflowRunner,    store,    hlaConsensusProvider,    neoantigenRankingEngine,    stateMachineGuard,    consentTracker,    rbacProvider,    // ...  } = resolveAppDependencies(dependencies);  // ...}

По умолчанию все поднимается на адаптерах в памяти — удобно для разработки и тестов. Нужен PostgreSQL? Подключаешь CASE_STORE_DATABASE_URL, и PostgresCaseStore тихо занимает место InMemoryStore. Бизнес-логика об этом не узнает.

20 адаптеров в сумме: 16 в памяти для локальной работы, 4 для PostgreSQL и интеграции с Nextflow.

15 состояний одного пациента

Когда рисуешь на салфетке жизненный цикл онкологического кейса, сначала кажется, что хватит пяти-шести состояний. Потом вспоминаешь про отказы, про QC-провалы, про ревизии. Потом про то, что консилиум может отправить кейс обратно на доработку. В итоге получилось 15:

INTAKING -> AWAITING_CONSENT -> READY_FOR_WORKFLOW -> WORKFLOW_REQUESTED-> WORKFLOW_RUNNING -> WORKFLOW_COMPLETED -> QC_PASSED -> AWAITING_REVIEW-> APPROVED_FOR_HANDOFF -> HANDOFF_PENDING

(Плюс WORKFLOW_CANCELLED, WORKFLOW_FAILED, QC_FAILED, REVISION_REQUESTED, REVIEW_REJECTED — на каждом этапе что-то может пойти не так, и это нужно моделировать явно.)

Каждый переход порождает доменное событие: case.created, sample.registered, workflow.started, qc.evaluated, board.packet.generated… Полная трассируемость от первого образца до клинического исхода.

Почему конечный автомат, а не простой статус-флаг? Честно говоря, я долго колебалась. Статус-флаг проще, быстрее пишется, быстрее отлаживается. Но FDA хочет видеть журнал аудита. Каждая мутация кейса должна быть иммутабельным событием с correlationId, временной меткой и контекстом. И если кто-то попытается перепрыгнуть из INTAKING сразу в APPROVED_FOR_HANDOFF, минуя согласие, рабочий процесс и экспертную оценку, порт IStateMachineGuard это запретит. Не из паранойи, а потому что в клиническом контексте пропущенный шаг — это реальный риск для реального пациента.

Три модальности с первого дня (и почему это не переусложнение)

Наверное, самый спорный выбор в архитектуре — поддержка трех модальностей RNA с самого начала. Меня справедливо спросят: зачем, если в третью фазу испытаний пока вышла только обычная mRNA?

У меня есть на это ответ, и он не про перфекционизм. Он про математику доз.

Обычная mRNA — 30-100 мкг на дозу. Для saRNA в доклинических и ранних разработках часто обсуждают очень низкие дозы, но клинически одобренная ARCT-154 (разработчик платформы — Arcturus; коммерциализация в Японии — через партнерскую связку CSL Seqirus и Meiji Seika Pharma) для COVID-19 использует дозу 5 мкг, и это уже рабочая платформа, а не теория. Circular RNA (circRNA) — замкнутое кольцо, устойчивое к экзонуклеазам, потенциально с более длительной экспрессией. Но cGMP-производство circRNA пока никто толком не наладил.

Gritstone Bio вела несколько онкологических программ: персонализированную GRANITE (в клинике — гибридный формат adenoviral prime + saRNA boost) и отдельную программу SLATE для общих неоантигенов. В 2024 году компания прошла через процедуру банкротства. При этом GRANITE в клинике была в первую очередь программой для MSS-колоректального рака, а не для PDAC. Судя по публичным отчетам, проблема была не только в платформе доставки, а в сочетании клинических результатов, выбранной стратегии и финансовой нагрузки. Модальность жива. Бизнес-модель конкретной компании — нет.

Так вот: базовая модальность в OpenRNA — обычная mRNA. Единственная, за которой стоят данные третьей фазы. saRNA и circRNA — записи в IModalityRegistry, включить и выключить которые может только администратор. А конструкт-дизайнер принимает deliveryModality?: DeliveryModality, и бизнес-логика одна и та же — меняется только адаптер.

const sampleTypes = [  "TUMOR_DNA", "NORMAL_DNA", "TUMOR_RNA", "FOLLOW_UP"] as const;

Типизация жесткая, Zod на каждом входе API. TUMOR_DNA — ДНК из опухолевой ткани, NORMAL_DNA — герминальная контрольная, TUMOR_RNA — для экспрессионного профилирования. FOLLOW_UP — постлечебные образцы для мониторинга иммунного ответа.

Когда три инструмента HLA-типирования не согласны друг с другом

Это один из моментов, который меня по-настоящему тревожит. HLA-типирование — фундамент предсказания неоантигенов. Ошибешься с HLA-генотипом пациента, и все предсказания связывания пептид-MHC окажутся мусором. А вакцина, собранная на основе этого мусора, просто не сработает.

Проблема в том, что разные инструменты дают разные результаты. OptiType (целочисленное линейное программирование по NGS-данным, в том числе WES и RNA-seq) покрывает только HLA класс I. HLA-HD, построенный на Bowtie2, работает с обоими классами, но иногда расходится с OptiType по HLA-A. arcasHLA (количественный анализ RNA-seq) добавляет третье мнение, которое может не совпадать ни с первым, ни со вторым.

Bauer et al. (Brief Bioinformatics, 2018; doi:10.1093/bib/bbw097) при систематической оценке вычислительных программ предсказания HLA-генотипов по геномным данным показали общую проблему расхождения между HLA-тайперами и ограничений по точности для клинического применения. Важно, что HLA-HD и arcasHLA в ту работу еще не входили: она иллюстрирует не прямое сравнение именно этих трех инструментов, а более общую проблему несогласованности HLA-типирования. Для платформы, где от типирования зависит выбор эпитопов, а от выбора эпитопов — подействует ли вакцина, это не абстрактная проблема. Это разница между иммунным ответом и его отсутствием.

Поэтому IHlaConsensusProvider принимает массив результатов от разных инструментов:

interface HlaTypingInput {  toolName: string;  alleles: string[];  confidence: number;  rawOutput?: string;}

И сводит их в консенсус с расчетом расхождений между инструментами. Если расхождения значимые — кейс не продвигается дальше автоматически и остается на ручном разборе. Это принципиальное решение. Не принудительное согласование, не голосование большинством, не “берем самый уверенный”. Честный флаг: данные противоречивы, человек должен посмотреть.

Мне было бы проще написать автоматический расчет консенсуса по мажоритарному голосованию. Но если этот инструмент когда-нибудь окажется в клиническом контексте, решение о HLA-генотипе должен принимать специалист, глядя на все данные сразу.

Журнал аудита и регуляторная реальность

21 CFR Part 11, параграф 11.10: меры для закрытых систем. Журнал аудита, ограничение доступа, проверка последовательности и полномочий. Звучит сухо. Но за этими словами стоит простая мысль: если софт участвует в процессе, который касается здоровья пациента, каждое действие в нем должно быть отслеживаемым и необратимым. Кто, когда, что сделал, почему.

Для персонализированных вакцин это особенно остро. Каждый кейс — потенциально (когда-нибудь, если повезет) регуляторный документ.

В OpenRNA каждая мутация кейса порождает иммутабельный CaseAuditEventRecord:

const caseAuditEventTypes = [  "case.created",  "sample.registered",  "artifact.registered",  "workflow.requested",  "workflow.started",  "workflow.completed",  "workflow.cancelled",  "workflow.failed",  "qc.evaluated",  "hla.consensus.produced",  "artifact.derived",  "candidate.rank-generated",  "payload.generated",  "outcome.recorded",  "board.packet.generated",  // ...] as const;

Correlation ID пробрасывается через весь запрос:

app.use((req, res, next) => {  const correlationId =    req.header("x-correlation-id") ?? `corr_${randomUUID()}`;  res.locals.correlationId = correlationId;  res.setHeader("x-correlation-id", correlationId);  next();});

Граф прослеживаемости строится из этих событий: от образца через артефакты и запуски пайплайнов до конструкта и клинического исхода. Порт IAuditSignatureProvider зарезервирован под электронные подписи, когда (если, не буду загадывать) дойдет очередь до валидированной системы.

А вот честная часть, которую я не хочу прятать. Электронных подписей в текущей реализации нет. 21 CFR Part 11 — карта соответствия в документации разделяет “реализовано” и “пробел” явно. Я не стану писать “соответствует Part 11” — это было бы ложью. Журнал аудита реализован, контроль доступа через RBAC с запретом по умолчанию, корреляционный идентификатор на каждом запросе. Но Part 11 — это не только про логирование. Это про подтверждение личности подписанта, уникальность учетных данных, привязку подписи к записи, двойную авторизацию выпуска. Этого пока нет, и я хочу, чтобы об этом знали все, кто будет смотреть на репозиторий.

Три зависимости в рабочей сборке

Вот мой package.json:

{  "dependencies": {    "express": "^5.2.1",    "pg": "^8.20.0",    "zod": "^4.3.6"  }}

Три пакета. Express 5 (наконец-то с нативной обработкой async-ошибок), pg (PostgreSQL-клиент для надежного хранения), Zod 4 (рантайм-валидация на каждом входе).

Node.js 24 в статусе Active LTS (по состоянию на апрель 2026 года). TypeScript 6.0.2, строгий режим типизации, module: "nodenext". Это переходный релиз, мост к TypeScript 7.0 и нативному Go-порту, а не обычный «еще один мажор». Тесты на встроенном node:test — без внешних тестовых фреймворков. На аудированном срезе от апреля 2026 года это 440 тестов в 22 наборах, и они проходят за секунды. Я засекала. И каждый раз немного радуюсь.

В devDependencies живут tsx, supertest, pg-mem (PostgreSQL в памяти для тестов). Но в рабочей сборке — три пакета, и точка.

npm audit --omit=dev --audit-level=high — чисто. CycloneDX SBOM генерируется скриптом. В CI стоят CodeQL SAST, проверка зависимостей на PR и прослеживаемость цепочки поставок через GitHub attestation + Sigstore.

Почему Express 5, а не Fastify, Koa или Hono? Потому что Express 5 наконец нормально ловит async-ошибки, а код читается любым, кто хоть раз работал с Node.js. Координационный слой не обслуживает 10K RPS, тут десятки кейсов в неделю. В этой ситуации простота чтения дороже бенчмарков.

Цифры

Показатель

Число

Тесты

440 в 22 наборах

Покрытие строк

95.00%

Покрытие ветвей

83.44%

Покрытие функций

94.94%

Доменные порты

17

Адаптеры

20 (16 в памяти + 4 интеграционных)

Состояния кейса

15

Уязвимости в рабочих зависимостях

0

95% покрытия строк — побочный эффект, а не цель. Я не гонялась за процентами. Каждый доменный порт протестирован через свои адаптеры, каждый переход конечного автомата проверен, каждый API-эндпоинт прогнан в supertest. Оставшиеся 5% — это аварийная остановка, граничные случаи PostgreSQL-адаптеров при потере соединения и миграционные скрипты. Правильные 5%.

Покрытие ветвей 83.44%, и я не пытаюсь его искусственно натянуть. Непокрытые ветки — в основном защитные проверки на невалидный ввод, который Zod срезает раньше. Тесты должны проверять поведение, а не добивать цифру ради красивого отчета.

Чего нет (и от чего я не буду отмахиваться)

На Хабре не верят разработчику, который рассказывает только о хорошем. И правильно делают.

  • Предсказание неоантигенов — не реализовано. Порт INeoantigenRankingEngine принимает результат от внешнего инструмента, а не запускает предсказание сам. OpenRNA — координационный слой, не биоинформатический конвейер. Я не пишу NetMHCpan, я оркестрирую работу с его выводом.

  • Электронные подписи (21 CFR Part 11) — зияющий пробел. Журнал аудита есть, электронных подписей нет. Это разница между “мы записываем, кто что сделал” и “мы можем доказать, что это действительно был тот человек”.

  • RBAC с привязкой к ресурсам — текущий RBAC дает запрет по умолчанию на уровне операций, но не на уровне конкретных кейсов или тенантов. Врач из клиники A не должен видеть пациентов клиники B — и этого пока не обеспечено.

  • Надежное хранилище событий — доменные события живут в памяти. PostgreSQL-журнал событий — в дорожной карте.

  • Двойная авторизация выпуска — для GMP-производства нужно. В текущей реализации нет.

  • Реальные пациентские данные — код тестировался только на синтетических данных.

Регуляторная карта

OpenRNA проектировался с оглядкой на регуляторику, а не задним числом. Но между “проектировался с оглядкой” и “прошел валидацию” — пропасть. Я хочу, чтобы разница была понятна.

Что архитектурно покрыто уже сейчас:

  • Журнал аудита на каждую мутацию кейса (§ 11.10)

  • Авторизация с запретом по умолчанию (§ 11.10)

  • Блокировка по согласию: запись в кейс невозможна без оформленного согласия

  • Корреляционный идентификатор на каждом запросе — прослеживаемость от начала до конца

  • Цепочка прослеживаемости от образца до конструкта (ICH Q8 Quality by Design)

  • Структурированный контракт ошибок с операторскими кодами

Чего не хватает для того, чтобы назвать это валидированной системой:

  • Электронные подписи (§§ 11.50, 11.70, 11.100, 11.200)

  • IQ/OQ/PQ квалификация

  • Описание предназначения (intended use)

  • Матрица прослеживаемости пользовательских требований

  • Валидированная база данных (по умолчанию — в памяти)

  • Процедура двойной авторизации выпуска

Это не мелочи, это не “доделаем потом”. Это разница между софтом, у которого правильная архитектура для будущей регуляторной валидации, и софтом, который эту валидацию прошел. Первое — да. Второе — нет.

Открытый код в фарме и кто конкурирует

Стандартный аргумент, который я слышу регулярно: фарма никогда не поставит решения с открытым исходным кодом в клинический процесс.

В исследовательском контексте и в клинических исследованиях — уже ставит.

Nextflow (Apache-2.0) работает в Seqera и десятках фармкомпаний. sarek из nf-core используется для детекции соматических вариантов в клинических исследованиях. pVACtools (BSD-3-Clause-Clear, лаборатория Griffith в WashU) — основной конвейер предсказания неоантигенов в академическом и клиническом применении. ViennaRNA (академическая лицензия Венского университета: бесплатна для исследований и образования; включение в коммерческий продукт — по согласованию с авторами) — золотой стандарт для предсказания вторичной структуры мРНК, больше 10 000 цитирований. MHCflurry (Apache-2.0) конкурирует с NetMHCpan с открытым кодом и открытыми данными для обучения.

OpenRNA не первый инструмент с открытым исходным кодом в этой цепочке. Он занимает пустое место между инструментами, которые уже стоят в чьих-то пайплайнах.

Apache-2.0 я выбрала осознанно. Коммерческое использование, модификация, распространение — без ограничений, patent grant включен. BSD-3-Clause-Clear (как у pVACtools) не дает patent grant, а AGPL требует раскрытия модификаций при сетевом использовании. Для фармкомпании, которая захочет взять OpenRNA и адаптировать под свои нужды, Apache-2.0 — минимальное юридическое трение при максимальной патентной защите.

Ландшафт:

Проект

Что делает

Чего не делает

Moderna/Merck

mRNA-вакцины, фаза III

Не с открытым исходным кодом

Genentech/BioNTech

autogene cevumeran, фаза II

Не с открытым исходным кодом

pVACtools

Предсказание и ранжирование неоантигенов

Не управляет рабочим процессом

Nextflow/nf-core

Оркестрация пайплайнов

Не управляет клиническим процессом

Benchling

Лабораторный процесс

SaaS, не специализирован, закрытый

OpenRNA

Слой управления для RNA-вакцинного процесса

Не пайплайн, не предсказатель

Слой управления между пайплайнами и клинической доставкой — ниша, которую пока никто не занял. Ни Nextflow, ни pVACtools не отвечают за согласие пациента, консилиум, передачу на производство или мониторинг исхода.

Три технических решения, которые я выбрала осознанно

Идемпотентная отправка на запуск

Запуск рабочего процесса — потенциально дорогая операция. Nextflow-пайплайн может считать часами на GPU. Двойной запуск — это не просто потеря денег, это провал аудита: два запуска на один кейс, два набора результатов, какой правильный?

Заголовок x-idempotency-key в OpenRNA опционален, но для безопасной дедупликации повторных отправок его лучше передавать всегда:

POST /api/cases/:caseId/workflowsx-idempotency-key: req_abc123

Повторный запрос с тем же ключом не запускает новый пайплайн, а возвращает результат предыдущего.

Опрос вместо вебхуков

Nextflow-пайплайн может работать часами. Вебхуки тут хрупки: сервер перезапустился — колбэк потерян, состояние непонятно. Я выбрала контур опроса: IWorkflowRunner периодически опрашивает Nextflow API, обновляет жизненный цикл запуска, маркирует провалы с категорией: executor_error, pipeline_error, timeout, infrastructure_error. Таймауты конфигурируемы. Не самое элегантное решение в мире, но надежное и предсказуемое.

Консилиум и ручной контроль

Консилиум получает пакет доказательств со всей информацией по кейсу: HLA-консенсус, ранжированные неоантигены, QC-результаты, артефакты. Экспертная панель выносит решение: approve, revision_requested или rejected. Каждое решение — аудитное событие. Пакет передачи на производство генерируется только после одобрения.

Никакой автоматической отправки на производство. Это не ограничение реализации — это осознанный выбор. Вакцину для конкретного пациента нельзя отдать в производство без одобрения живых врачей, видящих живые данные.


Код: github.com/KonkovaElena/OpenRNA.

Я описала технику, архитектуру и честно перечислила дыры. Но за всем этим остается один вопрос: доживет ли это до клиники?

И пять других вопросов, на которые у меня пока нет ответов:

  1. Скорость. 4-8 недель на одну вакцину — узкое место. Moderna заявляет цель в 4 недели. Где реальное узкое место: секвенирование, предсказание, дизайн конструкта, GMP-производство? Что можно параллелить, а что нельзя в принципе?

  2. Масштаб. INTerpath-001 — 1089 пациентов. Если V940 получит одобрение (по текущей записи ClinicalTrials.gov расчетная дата завершения первичной конечной точки — 26 октября 2029 года; расчетная дата полного завершения исследования — сентябрь 2030 года), масштаб вопроса перестанет быть академическим. Успел ли кто-нибудь подсчитать, сколько параллельных единичных серий производства нужно на один онкологический центр?

  3. Валидация. GxP-валидация софта для персонализированных биопрепаратов — это классический IQ/OQ/PQ или Computer Software Assurance? Руководство FDA 2023 года толкает к риск-ориентированному подходу, но конкретных прецедентов для ПО неоантигенных платформ я не нашла.

  4. Модальности. saRNA выживет в онкологии после банкротства Gritstone? Проблема с активацией врожденного иммунитета от dsRNA-интермедиатов — решаемая или фундаментальная?

  5. Открытый код в GxP. Кто реально работает с компонентами с открытым исходным кодом в GxP-среде и как это оформлено? GAMP 5 покрывает инфраструктурное ПО — но управление рабочими процессами для персонализированной терапии под это описание подпадает или нет?

Если вы работаете в этой области или рядом — мне правда интересно услышать ваш опыт.

Ссылки

ссылка на оригинал статьи https://habr.com/ru/articles/1024586/