# Часы сердца: экстрасистолы (предсердные и желудочковые)

Дата: 13.10.2026
Статус: принята автономно (владелец 12.10.2026: «Все автономно»). Issue: #263.
Связано: статья `content/*/disease/extrasystole.mdx` (#247), паузы `2026-10-12-more-ecg-presets.md`, АВ-блокада II степени `2026-10-13-heart-clock-second-degree-av-block.md`, инструкция `docs/adding-a-disease-preset.md`. Источники: `/mnt/project-files/evidence/extrasystole.md` (дальше [E], номера строк таблицы) и `extrasystole-article-evidence.md`.

## Зачем

У статьи об экстрасистолии нет пресета ЭКГ: часы не умеют рисовать удар, который приходит раньше очередного. Нужны два пресета, предсердная и желудочковая экстрасистола, чтобы блок «Интерактив» мог показать их в статье.

## Что видит читатель

«Желудочковая экстрасистола»:

- синусовый ритм, и каждый четвёртый удар приходит раньше срока;
- у раннего удара нет зубца P, QRS широкий, зубец T направлен в другую сторону;
- после него пауза, и следующий синусовый удар приходит тогда, когда пришёл бы без экстрасистолы (полная компенсаторная пауза).

«Предсердная экстрасистола»:

- каждый четвёртый удар раньше срока, с зубцом P и обычным узким QRS;
- после него пауза короче полной компенсаторной: синусовый узел «перезапускается».

Ползунок меняет частоту синусового ритма, от 40 до 86 в минуту (предел модели при сцеплении 0,7, см. «Механика»). Варианта «после лечения» нет: после лечения на ЭКГ обычный ритм, а такой пресет уже есть.

## Факты и источники

| Что рисуем | Источник | Статус |
|---|---|---|
| Экстрасистола — удар раньше очередного нормального; импульс не из синусового узла (в желудочке или предсердии) | MSD (consumer VPB, APB) [E 1, 2] | источник |
| ЖЭ: широкий QRS ≥ 120 мс, нет зубца P перед ним, T дискордантный | Минздрав 569_2; MSD VPB [E 14] | источник |
| После ЖЭ обычно полная компенсаторная пауза | MSD VPB [E 14] | источник; что это два RR ритма от синусового удара до синусового — определение, которого в собранных источниках нет: `assumption:` |
| ПЭ: ранний предсердный импульс, синусовый узел перезапускается, пауза короче полной компенсаторной | MSD ESA [E 15] | источник; что следующий удар приходит ровно через RR ритма от начала ПЭ — `assumption:` |
| ПЭ может проводиться нормально, с аберрацией или не проводиться | MSD ESA [E 15] | источник; модель рисует только нормально проведённую |
| ЖЭ идут беспорядочно или через равные промежутки (бигеминия, тригеминия) | MSD VPB [E 11] | источник для ЖЭ; модель ставит каждый 4-й удар и у ЖЭ, и у ПЭ, `assumption:` (бигеминию не выдаём за типичную, «квадригеминию» не называем) |
| Зубец P предсердной экстрасистолы той же формы, что синусовый | не найдено | `assumption:`, источники форму не описывают [E «Not verified»] |
| Ширина QRS ЖЭ 140 мс, один широкий зубец R без Q и S, T −0,3 мВ | не найдено | `assumption:` (≥ 120 мс из источника) |
| Интервал сцепления: экстрасистола через 0,7 RR от начала предыдущего удара | не найдено | `assumption:` |
| Синусовый зубец P во время ЖЭ не рисуется | не найдено | `assumption:`: он попадает на QRS или ST–T экстрасистолы |
| Саму ЖЭ не чувствуют, ощущается следующий усиленный удар | MSD VPB [E 10] | только для `summary` ЖЭ; модель силу удара не меняет |

Чего модель не рисует (в `summary`): одиночные беспорядочные и парные экстрасистолы, аберрантные и непроведённые предсердные, меньший выброс экстрасистолы и усиленный следующий удар (объёмы в модели одинаковые в каждом ударе), где именно в предсердии или желудочке очаг.

`presetSources` — общий список источников страницы часов: в него добавляются MSD «Ventricular Premature Beats», MSD «Ectopic Supraventricular Arrhythmias» и Минздрав 569_2. Минздрав 569_2 поддерживает только желудочковую экстрасистолу; комментарии в `presets.ts` у каждого пресета называют его собственные источники.

## Механика

### Параметры

- `prematureEvery` (0 или 2–20, целое): каждый N-й удар — экстрасистола. 0 выключает.
- `prematureOrigin` (0, 1 или 2): 1 — предсердная, 2 — желудочковая. 0 ровно когда `prematureEvery` 0.
- `prematureCoupling` (0,5–0,9): доля RR ритма от начала удара перед экстрасистолой до её начала. По умолчанию 0,7.
- `resolveParams` требует при `prematureEvery > 0` положительный `pAmplitude` и нулевые `rrIrregularity`, `fWaveAmplitude`, `flutterConduction`, `pauseEvery`, `atrialRate`, `atrialPacing`, `ventricularPacing`, `blockedP`, `deltaWave`.

### Какой удар экстрасистола

- Решение принимается при построении удара и хранится в нём: `Beat.premature` (0, 1 или 2) и `Beat.beforePremature` (удар укорочен, потому что следующий — экстрасистола). Удар k + 1 — экстрасистола тогда и только тогда, когда у удара k стоит `beforePremature`, с видом и сцеплением из параметров удара k. Поэтому `setParams` посреди группы не даст ни ЖЭ без укороченного удара перед ней, ни укороченного удара без ЖЭ. Какой удар укоротить, решает индекс: `index mod N = N − 2`.
- После длинного прыжка во времени (`extend` начинает новую серию) первый удар — обычный синусовый.

### Удары

- Удар перед экстрасистолой: его RR — `prematureCoupling · RR`, и фазы считаются от этого RR (`beatTiming(c · RR)`), потому что фазы обычного удара в него не помещаются (при 75 в минуту и c = 0,7 митральный клапан открылся бы на 603 мс, а экстрасистола приходит на 560 мс). PR сохраняется: `prExtra = prAt(RR) − prAt(c · RR)`. `assumption:` систола этого удара короче: при 75 в минуту QT 358 → 299 мс, QS2 388 → 321 мс; в реальном сердце длительности зависят от предыдущего RR, а не от следующего. Это сказано в `summary`.
- Предсердная экстрасистола: обычный удар с зубцом P, PR и узким QRS, её RR — RR ритма (синусовый узел перезапускается от неё, `assumption:` ровно через RR).
- Желудочковая экстрасистола: удар без зубца P, QRS начинается в начале удара (`prExtra = −PR`). Её параметры формы кладутся в `beat.params`: `qrsDuration` 140, `qAmplitude` и `sAmplitude` 0, `tAmplitude` −0,3, `pAmplitude` 0, `atrialContribution` 0, `stShift` и `stSlope` 0. Они считаются один раз на `setParams` и создании часов, не в каждом ударе. Её фазы — от RR ритма (`assumption:` систола ЖЭ по тем же регрессиям Weissler), после них пауза `(1 − c) · RR`, так что от начала удара перед ней до следующего синусового удара ровно два RR.
- Широкий QRS желудочкового происхождения: сейчас при `qAmplitude = sAmplitude = 0` комплекс — один гауссов зубец R с σ = 0,1 · QRS, и видимая часть (|ЭКГ| > 0,05 мВ) у QRS 140 мс — около 68 мс, уже синусового. Для ЖЭ и для `ventricularPacing` (там видно около 78 мс из 160) зубец R рисуется широким: σ растёт так, чтобы видимая ширина была не меньше 0,85 · `qrsDuration`. Это меняет кривую пресета «полная АВ-блокада после лечения»; снимок обновляется в этом PR, и в описании PR это сказано.
- `checkParams` проверяет короткий удар (`beatTiming(c · RR)` с `prExtra`) и ЖЭ с её параметрами, поэтому пределы ползунка учитывают оба. При c = 0,7 верхний предел — 86 в минуту: выше фазы укороченного удара с PR ритма не помещаются в c · RR (без сохранения PR было бы 126).

### Гемодинамика

- В начале ЖЭ `qOnset` = 0, и опорные точки `[0, start]` и `[qOnset, …]` в `basePressure`, `laPressure` и `volume` совпадают. Начало ЖЭ берёт давления и объём из конца предыдущего удара: при `qOnset` = 0 точка «до сокращения предсердий» пропускается, а `startLa` для ЖЭ не поднимает ЛП (нет сокращения предсердий). Тест: давления ЛЖ, ЛП, аорты и объём непрерывны на границах «удар перед экстрасистолой → экстрасистола → синусовый» для ЖЭ и ПЭ.
- Объёмы модели в каждом ударе нормированы, поэтому выброс экстрасистолы не меньше и следующий удар не сильнее; это сказано в `summary`.

### Монитор, 3D, звуки, Виггерс

- `phaseAt`: у ЖЭ начало удара — «наполнение», не «систола предсердий» (как при `atrialRate`).
- Фаза монитора выносится в чистую функцию `monitorPhase(sample)` в пакете часов: «синусовая пауза» только для паузы СССУ (`pauseDuration`), в паузе с `blockedP` и после ЖЭ — «наполнение». `HeartClockDemo` её использует; юнит-тест вместо e2e на короткое окно. Комментарии к `Beat.pause` и `ClockSample.pause` обновляются.
- 3D: на экстрасистоле синусовый узел не светится. ПЭ: АВ-узел, пучок Гиса и ножки светятся как обычно. ЖЭ: не светятся АВ-узел, пучок Гиса, ножки и волокна Пуркинье (импульс идёт по мышце, как при стимуляции желудочков).
- Звуки идут из фаз каждого удара: S2 удара перед экстрасистолой раньше S1 экстрасистолы (тест).
- Диаграмма Виггерса строит ось на RR ритма; в паузе после ЖЭ курсор стоит у правого края (240 мс при 75 в минуту, 450 мс при 40), как в паузах СССУ.
- Спайков стимуляции на ЖЭ нет.

### Пресеты

- `atrial-premature-beats` и `ventricular-premature-beats` в `presetIds` после `atrial-flutter`.
- Оба: `prematureEvery: 4`, `prematureCoupling: 0.7`; `prematureOrigin` 1 и 2. Частоту не задают (75 по умолчанию); пределы — что разрешает модель, 40–86.
- `presetShape` null. Строки en, ru и тестовая локаль: название, `.summary`, `.ecg`.

## Тесты

- Модель: при `prematureEvery: 0` снимок кривых не меняется (кроме широкого QRS стимуляции, см. выше); `resolveParams` отклоняет недопустимые сочетания; удар перед экстрасистолой длится c · RR и сохраняет PR; у ЖЭ нет зубца P, видимая ширина QRS ≥ 120 мс и больше синусовой, T отрицательный, от синусового удара до синусового через неё ровно два RR; у ПЭ следующий удар через RR от её начала; `checkParams` учитывает короткий удар и ЖЭ; `setParams` на ударе перед экстрасистолой и после прыжка во времени; гемодинамика непрерывна; `phaseAt` на ЖЭ; `monitorPhase`; порядок звуков; `cycleState` (синусовый узел на ПЭ и ЖЭ, АВ-узел на ПЭ, ножки и Пуркинье на ЖЭ); нет спайков на ЖЭ.
- Пресеты: общие проверки, пределы 40–86 в `narrowedLimits`.
- e2e: на странице часов оба пресета и описание ЭКГ.

## План PR

1. Эта спека.
2. Механика `prematureEvery`, `prematureOrigin`, `prematureCoupling`, широкий QRS желудочкового происхождения, `monitorPhase`, тесты.
3. Пресеты, строки, источники, e2e, строки в `docs/adding-a-disease-preset.md`.
