# Часы сердца «после лечения»: кардиостимулятор при СССУ

Дата: 13.10.2026
Статус: принята автономно (владелец 12.10.2026: «Все автономно»). Issue: #179.
Связано: схемы «после лечения» `2026-10-12-after-treatment-mode.md` (#175), ритмы часов `2026-10-13-heart-clock-rhythms.md` (#192), инструкция `docs/adding-a-disease-preset.md`. Источники: `/mnt/project-files/evidence/paced-rhythm.md` и `/mnt/project-files/evidence/sick-sinus-syndrome.md`.

## Зачем

Схемы болезней уже умеют третье состояние «После лечения» (#175). #179 просит то же для часов сердца и 3D-модели.

Часы сердца. У остальных пресетов состояние после лечения либо близко к норме (после кардиоверсии или аблации — синусовый ритм, после аблации WPW — PR без дельта-волны), и тогда отдельная кнопка повторила бы «Норму», либо зависит от случая и не подкреплено нашими источниками (зубцы Q после инфаркта, фракция выброса при сердечной недостаточности, ФП при контроле частоты). Это скажет текст статьи. Состояние после лечения отличается от нормы там, где лечение — устройство, которое видно на ЭКГ. Первый такой случай — синдром слабости синусового узла (СССУ): основное лечение — постоянный кардиостимулятор, и его импульсы видны на ЭКГ как спайки.

3D-модель. Закрытый дефект, протез клапана или окклюдер требуют модели с совместимой лицензией. Таких среди проверенных кандидатов нет (`/mnt/project-files/models/heart-library/candidates-2026-10-12.md`). Эта часть остаётся в #179 и ждёт модели; этот этап её не делает.

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

В статье о СССУ блок часов сердца получает третий вариант рядом с «Норма» и «СССУ»: «СССУ после лечения: кардиостимулятор». Болезнь в подписи нужна, потому что на странице часов и в конструкторе встраивания этот вариант стоит в общем списке, сразу после СССУ. Он рисует ритм двухкамерного стимулятора, запрограммированного так, чтобы не стимулировать желудочек без нужды:

- в начале каждого зубца P — узкий вертикальный спайк стимула предсердий, затем P, PR модели по умолчанию, узкий QRS и T;
- ритм ровный, пауз нет: стимулятор посылает импульс, когда собственный ритм медленнее нижней частоты;
- частота — запрограммированная нижняя частота, по умолчанию 60, ползунок 50–70.

Вариант есть и на странице часов сердца, и в конструкторе встраивания, как другие пресеты.

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

| Что рисуем | Источник | Статус |
|---|---|---|
| При СССУ рекомендована двухкамерная стимуляция с минимизацией желудочковой | ESC 2021 (табл. «Рекомендации по ЭКС у пациентов ДСУ», I A), Минздрав 160_2 §3.3.1 (I A), MSD «Sick Sinus Syndrome» | источник |
| Стимулятор посылает импульс, только когда собственный ритм замедлен или прерывается | Минздрав 160_2, прил. В; StatPearls «Pacemaker Types and Selection» (NBK556011) | источник |
| Спайк стимула виден на ЭКГ, и при захвате за ним следует ответ камеры (P или QRS) | StatPearls «Pacemaker Malfunction» (NBK553149, 2023): потеря захвата — «a pacing spike … which is not followed by an evoked potential (P or a QRS)» | источник; учебник Open RN (табл. 7.4e, NBK594493) говорит прямо «pacer spike before the P wave», но он не в `trusted-sources.yaml` и без ISBN, поэтому только как пояснение в доказательствах |
| Спайк очень узкий: импульс короче 0,5 мс | AHA/ACCF/HRS, стандартизация ЭКГ, часть I (Kligfield 2007, DOI 10.1016/j.hrthm.2007.01.027) | источник |
| Биполярный спайк часто так мал, что на ЭКГ его не видно; увеличивать его на записи стандарт не рекомендует («should not be artificially increased in amplitude to aid recognition») | тот же документ | источник. Модель увеличивает спайк, чтобы его было видно на учебной схеме: это `assumption:`, и `summary` прямо говорит, что на настоящей ЭКГ спайк часто едва виден |
| После спайка предсердий при сохранной AV-проводимости QRS узкий | ApVs в StatPearls NBK556011; табл. 7.4e называет широким только QRS при стимуляции желудочков | вывод, `assumption:` |
| Форма P при стимуляции такая же, как синусовая | не найдено | `assumption:`; описание не утверждает, что P такой же |
| PR после стимула предсердий — PR модели по умолчанию | не найдено | `assumption:` |
| Нижняя частота 60, ползунок 50–70 | только пример 50 (StatPearls «Pacemaker Malfunction», NBK553149); ESC 2021 §5.2.2.2 пишет «e.g. 70» для постоянной ФП, где предсердия не стимулируют, — это лишь контекст | `assumption:` |

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

## Механика

### Спайк стимула

- Новый параметр `atrialPacing` (0 или 1, по умолчанию 0): каждый удар начинается со спайка стимула предсердий перед P. При 0 ни одна кривая не меняется: проверяет снимок `curves-unchanged`.
- Спайк короче одного пикселя (0,5 мс при 25 мм/с — сотые доли миллиметра), поэтому он не часть `ecgAt`: выборка по пикселям его бы пропустила. Нового метода часов не нужно: спайки — это удары из `clock.beatsBetween(from, to)` с `b.start >= from` и `b.params.atrialPacing === 1`. Параметры берутся у удара, а не у часов, поэтому при смене пресета посреди полоски спайки есть только у ударов нового пресета.
- `pacingSpikes(clock, from, to)` в `ecg-canvas.ts` отдаёт эти моменты. `traceEcg` (монитор статьи, страница часов, встраивание, ЭКГ-монитор) рисует их вертикальной линией толщиной в кривую, от изолинии вверх, только в пределах нарисованной кривой; ЭКГ-строка диаграммы Виггерса (`wiggers-canvas.ts`, которая берёт `clock.ecgBetween` напрямую) рисует спайк в начале показанного удара. Живая ЭКГ на главной (`home/ecg-live.ts`) и статичные полоски (`lib/ecg-strip.ts`) рисуют только параметры по умолчанию, их это не касается.
- Момент спайка: начало удара, где в модели начинается P. `assumption:` источники не дают задержки от стимула до P.
- Высота: 0,5 мВ вверх от изолинии, вдвое ниже зубца R модели. `assumption:` реальная высота зависит от электрода и часто очень мала; стандарт ЭКГ не рекомендует увеличивать спайк (см. таблицу), и описание это говорит.
- Ограничения в `resolveParams`, рядом с другими проверками сочетаний: `atrialPacing` — целое 0 или 1; при 1 нельзя фибрилляцию и трепетание (`fWaves`, `flutterConduction`), нерегулярный RR (`rrIrregularity`), паузы (`pauseEvery`) и `pAmplitude` не больше 0: стимулятор предсердий даёт ровный ритм с захваченным P, а без P или с перевёрнутым P (не модель этого режима) показывать нечего.
- Гемодинамика, звуки и фазы не меняются: `atrialPacing` не трогает тайминг. Ползунок вызывает `setParams({ heartRate })`, и `atrialPacing` сохраняется.
- 3D-модель: `cycleState` подсвечивает синусовый узел во время P (`cycle.ts`). При `atrialPacing` импульс идёт от электрода, поэтому узел не подсвечивается. `presetShape` в `packages/viewer/src/disease.ts` получает для нового пресета `null`: формы сердца у него нет.

### Пресет «после лечения»

- Новый пресет `sick-sinus-syndrome-paced` в `presets.ts`, в `presetIds` сразу после `sick-sinus-syndrome` (порядок там — порядок вариантов на странице): `atrialPacing: 1`, частота 60, без пауз. `presetRateFloors` 50 и `presetRateCeilings` 70. Переход СССУ (35) → стимулятор даёт 60, стимулятор → норма даёт 75, как у других пресетов, которые задают свою частоту; `?preset=sick-sinus-syndrome-paced&rate=90` во встраивании прижимается к 70.
- Пресет «после лечения» не может быть `preset:` статьи: схема frontmatter (`apps/web/src/lib/content.ts`) его исключает, статья получает его только через `presetTreated`.
- Связь «болезнь → после лечения»: `presetTreated: Partial<Record<PresetId, PresetId>>`, сейчас `{ 'sick-sinus-syndrome': 'sick-sinus-syndrome-paced' }`, экспорт из `index.ts`. У цели то же отведение (`presetLead`), что у болезни: `ArticleClock` передаёт одно отведение всем вариантам.
- `ArticleClock` передаёт в `HeartClockDemo` варианты `['normal', preset, presetTreated[preset]]`, когда третий есть. Других изменений в интерфейсе нет: варианты уже выбираются радиокнопками.
- Строки (en, ru, тестовая локаль): `heartClock.preset.sick-sinus-syndrome-paced` («СССУ после лечения: кардиостимулятор» / "Sick sinus syndrome after treatment: pacemaker"), `.summary` и `.ecg`. В описании ЭКГ — словами, что видно: спайк, затем P, затем узкий QRS. `summary` говорит, что спайк в модели увеличен, и чего модель не рисует.
- Источники пресета — в `presetSources` (`apps/web/src/components/heart-clock/sources.ts`): добавляются StatPearls NBK553149 и NBK556011 и Kligfield 2007; ESC 2021 и Минздрав 160_2 там уже есть.

### Доступность и движение

- Спайк — часть той же кривой: в режиме «Стоп» и при reduced motion монитор стоит, как и сейчас, а смысл передаёт текстовое описание ЭКГ.
- Цвет спайка — цвет кривой; ничего не передаётся только цветом.

## Тесты

- Модель: `atrialPacing: 0` не меняет снимок; недопустимые сочетания и нецелые значения отклоняются в `resolveParams`; `cycleState` не подсвечивает синусовый узел при стимуляции.
- Пресеты: `sick-sinus-syndrome-paced` проходит общие проверки пресетов; его пределы 50–70 (`narrowedLimits` в `presets.test.ts`), он в списке пресетов, задающих частоту; `presetTreated` ссылается только на существующие пресеты, цель не `normal`, отведение то же.
- Снимок `curves-unchanged` перебирает все пресеты: в PR 3 он обновляется, и дифф снимка — только новый ключ.
- Отрисовка: новый unit-тест `traceEcg` с поддельным контекстом: линия в момент спайка, нет линии левее края, при смене пресета посреди полоски — только у ударов со стимуляцией.
- e2e: в статье о СССУ три варианта (`ecg-presets.spec.ts` ждёт 3 вместо 2 для этой статьи); после выбора «после лечения» описание ЭКГ — про кардиостимулятор, ползунок 50–70.

## План PR

1. Эта спека.
2. Механика `atrialPacing` и спайки в `traceEcg`, тесты. Пресетов не меняет.
3. Пресет `sick-sinus-syndrome-paced`, `presetTreated`, третий вариант в `ArticleClock`, строки, источники, e2e, строка в `docs/adding-a-disease-preset.md` о том, как добавить вариант «после лечения».

Пункты 2 и 3 можно слить в один PR, если он остаётся небольшим. 3D-часть #179 остаётся открытой.
