# Часы сердца: полная АВ-блокада и кардиостимулятор после лечения

Дата: 13.10.2026
Статус: принята автономно (владелец 12.10.2026: «Все автономно»). Issue: #235.
Связано: состояние «после лечения» для часов `2026-10-13-heart-clock-after-treatment.md` (#179, механика `atrialPacing`, `presetTreated`), пресет АВ-блокады I степени `2026-10-12-more-ecg-presets.md`, инструкция `docs/adding-a-disease-preset.md`. Источники: `/mnt/project-files/evidence/av-block-advanced-ecg.md` (дальше [E], номера строк таблицы), `/mnt/project-files/evidence/paced-rhythm.md`.

## Зачем

В часах сердца есть только АВ-блокада I степени. Её обычно не лечат, и на ЭКГ она отличается от нормы одним удлинённым PR. Тред интерактива нашёл, что «после лечения» на ЭКГ из оставшихся болезней подходит только АВ-блокаде: при блокаде высокой степени ставят постоянный кардиостимулятор, и его стимуляция желудочков видна на ЭКГ.

Этот этап добавляет два пресета:

- полная (III степени) АВ-блокада: зубцы P и комплексы QRS идут каждый в своём ритме;
- она же после лечения: двухкамерный стимулятор воспринимает собственный зубец P и после задержки стимулирует желудочки; на ЭКГ спайк перед широким QRS.

АВ-блокада II степени (Мобитц I и II, выпадение QRS) требует другой механики: удар с P и без QRS. Она идёт отдельной спекой, после этой.

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

Пресет «Полная АВ-блокада»:

- зубцы P идут ровно, 75 в минуту;
- комплексы QRS идут ровно и реже, 40 в минуту, и не связаны с P: интервал PR каждый раз разный, часть зубцов P попадает на QRS или T;
- QRS узкий: выскальзывающий ритм из АВ-соединения выше разветвления пучка Гиса;
- ползунок меняет частоту желудочков, от 35 до 50.

Пресет «Полная АВ-блокада после лечения: кардиостимулятор»:

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

Оба варианта есть на странице часов сердца и в конструкторе встраивания. Статья об АВ-блокаде показывала пресет I степени (решение ниже). Сменить ли её `preset:` на полную блокаду (тогда в статье «Норма», «Полная АВ-блокада» и «после лечения»), решает тред статей и интерактива: текст статьи — его зона. Пресет I степени остаётся на странице часов.

Решение (2026-10-13, тред интерактива): статья переходит на `av-block-third-degree`. Её текст описывает III степень с узким замещающим QRS при замещающем ритме выше бифуркации пучка Гиса и постоянный кардиостимулятор при III степени без обратимых причин даже без симптомов (Минздрав 2025, MSD — источники 1 и 2 статьи). I степень, по тексту статьи, «обычно не требует лечения», поэтому варианта «после лечения» у неё нет.

Дополнение (2026-10-13, тред интерактива): после #261 и #270 статья показывает и II степень: `morePresets: [av-block-second-degree-mobitz-1, av-block-second-degree-mobitz-2]`. Её текст описывает Мобитц I и II и постоянный кардиостимулятор при Мобитц II даже без симптомов, а при Мобитц I — при выраженных симптомах (источники 1 и 2). Вариантов «после лечения» у этих пресетов нет: Мобитц I часто не требует лечения, а кардиостимулятор при Мобитц II рисовался бы так же, как уже показанный пресет полной блокады после лечения (docs/plans/2026-10-13-heart-clock-second-degree-av-block.md).

Дополнение (2026-10-14, тред интерактива): статья показывает и I степень: `morePresets: [av-block-first-degree, av-block-second-degree-mobitz-1, av-block-second-degree-mobitz-2]`. Её текст описывает I степень: проходят все импульсы, но медленнее, и она обычно не требует лечения (источники 1 и 2), поэтому варианта «после лечения» нет.

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

| Что рисуем | Источник | Статус |
|---|---|---|
| При III степени ни один P не проводится, P и QRS не связаны (АВ-диссоциация), частота P выше частоты QRS | MSD «Atrioventricular Block»; StatPearls «Third-Degree AV Block» (NBK545199) [E 4a] | источник |
| Выскальзывающий ритм выше разветвления пучка Гиса: узкий QRS, 35–50 в минуту | MSD «Atrioventricular Block» [E 4c] (в другом месте MSD пишет 35–55); узкий QRS «junctional escape» — StatPearls NBK545199 [E 4e] | источник; ползунок 35–50 |
| Ниже разветвления: широкий QRS, 20–40 в минуту | MSD [E 4d] | источник; этот вариант модель не рисует |
| Частота обычно ниже 45–50 в минуту | StatPearls NBK545199 [E 4e] | источник |
| Частота желудочков по умолчанию 40 | внутри 35–50 | `assumption:` |
| Зубцы P идут ровно, 75 в минуту | регулярность P–P при III степени не найдена [E 4b]; частота — синусовый ритм модели | `assumption:` |
| Потеря согласованности предсердий и желудочков снижает сердечный выброс; пушечные волны a | StatPearls NBK545199; MSD [E 7a, 7b] | источник. Модель ставит вклад предсердий в наполнение 0: `assumption:` усреднение, модель не считает удар за ударом, где сокращение предсердий попало на закрытый клапан |
| При III степени (и Мобитц II, блокаде высокой степени), если причина не обратимая и не физиологическая, стимулятор показан независимо от симптомов | Минздрав 160_2 §3.3.2; ESC 2021 pacing §5.2.1.3 («независимо от симптомов» — только они); MSD: при отсутствии преходящей или обратимой причины [E 2d, 4f] | источник; класс рекомендации в тексте не называем: в ESC 2021 и Минздраве 2025 его не удалось прочитать [E 2e] |
| При синусовом ритме предпочтительна двухкамерная стимуляция | ESC 2021 §5.2.2.1 (избегает пейсмекерного синдрома) [E 5b]; Минздрав 2020 (ID 160) говорит то же, но заменён версией 2025 и не цитируется | источник |
| Двухкамерный стимулятор воспринимает собственный P, запускает АВ-задержку и в её конце стимулирует желудочек | StatPearls «Pacemaker Malfunction» (NBK553149); «Pacemaker Types and Selection» (NBK556011) [E 5a] | источник |
| Спайк стимула перед QRS при стимуляции желудочков; без захвата за спайком нет ответа камеры | StatPearls «Left Bundle Branch Block» (NBK482167): «Identification of pacemaker spikes preceding the QRS complexes» (paced-rhythm.md 1a′); StatPearls NBK553149 (потеря захвата), как в спеке СССУ | источник |
| Стимуляция желудочка даёт широкий QRS, похожий на блокаду левой ножки | StatPearls «Left Bundle Branch Block» (NBK482167) [E 5d] | источник |
| При блокаде левой ножки ST–T направлены против QRS | StatPearls NBK482167 [E 5e] | источник для БЛНПГ; для стимуляции — вывод из сходства, `assumption:` |
| Ширина QRS при стимуляции 160 мс | не найдено; при БЛНПГ ≥ 120 мс [E 5f] | `assumption:` |
| Форма стимулированного QRS во II отведении: широкий положительный без зубца Q | не найдено | `assumption:` |
| АВ-задержка — PR модели по умолчанию | только «не больше 230 мс» (ESC 2021, рис. 5) [E 6] | `assumption:` |
| QT при стимуляции — QTc модели по умолчанию при QRS 160 мс | не найдено | `assumption:` |
| Частота при стимуляции 60–100, по умолчанию 75: стимулятор следует за собственными зубцами P | нижняя и верхняя частоты слежения в источниках не найдены | `assumption:`; без своих пределов модель разрешила бы 40–132 |
| Высота спайка 0,5 мВ, как у предсердного | не найдено [E 5g] | `assumption:`, как в спеке СССУ |

Чего модель не рисует (в `summary`): выскальзывающий ритм с широким QRS из желудочков, АВ-блокаду II степени, пушечные волны, сокращения предсердий в 3D-модели при диссоциации, работу стимулятора при частоте выше верхней частоты слежения.

## Механика

### Зубцы P в своём ритме (`atrialRate`)

- Новый параметр `atrialRate`, уд/мин: 0 (по умолчанию) — зубец P часть удара, как сейчас; больше 0 — зубцы P идут по абсолютному времени часов с периодом `60000 / atrialRate`, независимо от ударов. При 0 ни одна кривая не меняется (снимок `curves-unchanged`).
- Форма и длительность зубца — как у P удара (`pAmplitude`, длительность 0,6 PR при этом периоде по той же формуле, что в `beatTiming`, включая `min(rr, 1500)`; формула выносится в общую функцию).
- Отрисовка: функция `dissociatedP(t, params)` в `ecg.ts`, рядом с `fWaves`. В `clock.ts` она входит в предсердную часть `atrial(b)`, поэтому при смене пресета посреди полоски старые зубцы P плавно уходят, как волны f и F. `beatWaves` не рисует свой P, когда `atrialRate > 0`: удар — это выскальзывающий комплекс.
- Удар не меняется: его начало — точка отсчёта, QRS через PR, как сейчас. Гемодинамика и звуки считаются от QRS. Предсердный вклад задаёт пресет (0). Фазы: окно от начала удара до R `phaseAt` сейчас называет «систолой предсердий»; при `atrialRate > 0` это окно — «наполнение», потому что предсердия не сокращаются вместе с ударом.
- 3D: `cycleState` подсвечивает синусовый узел в моменты зубцов P диссоциации (`atrialRate > 0`), а не в начале удара; АВ-узел в окне PR не подсвечивается, потому что импульс предсердий не проходит; пучок Гиса подсвечивается вместе с QRS: выскальзывающий ритм идёт из АВ-соединения (`assumption:` точное место модель не показывает).
- Ограничения: в `paramRanges` `atrialRate` — [0, 150]; в `resolveParams` — целое, 0 или не меньше 40 (`assumption:` диапазон; ползунка для него нет, это параметр пресета), как сделано для `pauseEvery`; при `atrialRate > 0` нужны `pAmplitude > 0` и нулевые `fWaveAmplitude`, `flutterConduction`, `rrIrregularity`, `pauseEvery`, `atrialPacing`, `ventricularPacing`. Условие `atrialRate > heartRate` (частота P выше частоты QRS по определению) проверяет `checkParams` в `clock.ts`: через неё идёт и `heartRateLimits`, поэтому ползунок сам не даст частоту желудочков выше частоты P.

### Стимуляция желудочков (`ventricularPacing`)

- Новый параметр `ventricularPacing` (0 или 1): каждый QRS начинается со спайка стимула желудочков в момент `qOnset`, через PR после начала P.
- `pacingSpikes(clock, from, to)` в `ecg-canvas.ts` отдаёт и предсердные (`start`), и желудочковые (`start + timing.qOnset`) спайки, в пределах полоски. `traceEcg` рисует их, как сейчас (0,5 мВ вверх от изолинии). Строка ЭКГ в диаграмме Виггерса (`wiggers-canvas.ts`) рисует сейчас только предсердный спайк в `xAt(0)`; она получает и желудочковый в `xAt(timing.qOnset)` при `ventricularPacing === 1`.
- Форма QRS задаётся пресетом (`qrsDuration`, `qAmplitude`, `rAmplitude`, `sAmplitude`, `tAmplitude`); новый код формы не нужен.
- 3D: при `ventricularPacing` ножки пучка Гиса и волокна Пуркинье в окне QRS не подсвечиваются (импульс идёт от электрода по миокарду, `assumption:` модель не показывает электрод), АВ-узел и пучок Гиса в окне PR — тоже (АВ-задержку отсчитывает стимулятор).
- Ограничения в `resolveParams`: целое 0 или 1; при 1 нельзя `fWaveAmplitude`, `flutterConduction`, `rrIrregularity`, `pauseEvery`, `deltaWave`, `atrialRate`.

### Пресеты

- `av-block-third-degree` в `presetIds` сразу после `av-block-first-degree`: `atrialRate: 75`, `heartRate: 40`, `atrialContribution: 0`. `presetRateFloors` 35, `presetRateCeilings` 50.
- `av-block-third-degree-paced` сразу после него: `ventricularPacing: 1`, `heartRate: 75`, `qrsDuration: 160`, `qAmplitude: 0`, `sAmplitude: 0` и отрицательный `tAmplitude` (`assumption:` величина). `presetRateFloors` 60, `presetRateCeilings` 100 (`assumption:`, см. таблицу); без них модель разрешила бы 40–132.
- `presetTreated['av-block-third-degree'] = 'av-block-third-degree-paced'`. Схема frontmatter исключает пресет «после лечения» сама (по `presetTreated`).
- `presetShape` в `packages/viewer/src/disease.ts`: оба `null`.
- Строки (en, ru, тестовая локаль): `heartClock.preset.<id>`, `.summary`, `.ecg` для обоих. «Полная АВ-блокада» / "Complete AV block"; «Полная АВ-блокада после лечения: кардиостимулятор» / "Complete AV block after treatment: pacemaker". В описании ЭКГ полной блокады `{rate}` — частота желудочков, и текст говорит, что зубцы P остаются 75 в минуту.
- Источники в `presetSources`: StatPearls NBK545199 и NBK482167; MSD AV block, Минздрав 160_2, ESC 2021, NBK553149 и NBK556011 там уже есть.

### Доступность

Как у других пресетов: смысл передаёт текстовое описание ЭКГ; в режиме «Стоп» и при reduced motion монитор стоит.

## Тесты

- Модель: `atrialRate: 0` и `ventricularPacing: 0` не меняют снимок; недопустимые сочетания отклоняются в `resolveParams`; зубцы P диссоциации идут с периодом `60000 / atrialRate` по абсолютному времени (максимумы `ecgAt`), удар без своего P; `cycleState` подсвечивает синусовый узел в момент P диссоциации и не подсвечивает ножки при стимуляции желудочков.
- Модель, дальше: `resolveParams` отклоняет `atrialRate` от 1 до 39 и дробный `ventricularPacing`; `checkParams` отклоняет `atrialRate` не выше `heartRate`; при `atrialRate > 0` `phaseAt` в окне до R даёт «наполнение»; зубцы P идут без сбоя через границы ударов и после долгого скачка времени; смена пресета посреди полоски (полная блокада → норма и обратно) не даёт ступеньки.
- Отрисовка: `pacingSpikes` отдаёт желудочковые спайки в `start + qOnset`; строка ЭКГ Виггерса рисует желудочковый спайк.
- Пресеты: общие проверки; `presetRateLimits` 35–50 и 60–100; встраивание с `?preset=av-block-third-degree&rate=120` прижимает частоту к 50; `presetTreated` ссылается на существующие пресеты.
- Снимок `curves-unchanged`: дифф — только новые ключи.
- e2e: на странице часов сердца выбор «Полная АВ-блокада» даёт ползунок 35–50 и описание ЭКГ; выбор пресета после лечения — описание про стимулятор.

## План PR

1. Эта спека.
2. Механика `atrialRate` и `ventricularPacing`, спайки желудочков, 3D-подсветка, тесты. Пресетов не меняет.
3. Пресеты, `presetTreated`, строки, источники, e2e, строки в `docs/adding-a-disease-preset.md`.
