# Часы сердца: блокады ножек пучка Гиса

Дата: 14.10.2026
Статус: принята автономно. Владелец работает в режиме «Все автономно». Пресет блокады ножек лежал в бэклоге потока приложения. 14.10.2026 координатор поднял его приоритет: статьи `bundle-branch-block` и `chagas-cardiomyopathy` вышли в PR #341 без пресета ЭКГ. Issue: #351.
Связано: спека трёх отведений `2026-10-13-heart-clock-three-leads.md`; инструкция `docs/adding-a-disease-preset.md`. Свидетельства: `/mnt/project-files/evidence/bundle-branch-block.md` и `/mnt/project-files/evidence/chagas-cardiomyopathy.md`. Ниже «строка #N» — номер в столбце `#` таблицы свидетельств, а не номер строки файла.

## Зачем

В статьях о блокаде ножек и о кардиомиопатии Шагаса нет часов сердца: ни один пресет не показывает широкий QRS при нормальном PR. Почти все признаки блокад из источников видны в отведениях от конечностей I, II и III, которые часы уже рисуют. Источник везде — MSD, Bundle Branch Block and Fascicular Block, 2024.

- **Блокада правой ножки (БПНПГ)** (строка #7):
  - QRS 0,12 с и больше;
  - в I и V6 зубец S длиннее зубца R или длится больше 0,04 с;
  - rsR' в V1–V2.
- **Блокада левой ножки (БЛНПГ)** (строка #8):
  - QRS 0,12 с и больше;
  - широкий зазубренный или сглаженный R без зубца Q в I, aVL, V5–V6;
  - ST и T направлены против QRS.
- **Блокада передней ветви левой ножки (передний гемиблок)** (строка #17):
  - QRS немного удлинён, но короче 0,12 с;
  - ось во фронтальной плоскости отрицательнее −45°.
- **Болезнь Шагаса:** поражение сердца обычно начинается с БПНПГ или блокады передней ветви (MSD, Chagas Disease; строка #16 свидетельств Шагаса).

## Ось — это прямая, а не направление

Коэффициент отведения `cos(θ − φ) / cos(θ − 60°)` не меняется при замене θ на θ + 180°: числитель и знаменатель меняют знак вместе. Поэтому ось в модели задаёт прямую, а направление волны задаёт знак её амплитуды в II.

Пример: зубец S с амплитудой −0,3 мВ в II на оси 0° — это вектор, направленный на 180°. В I он даёт −0,6 мВ, в III +0,3 мВ.

Нынешний диапазон осей −15…135 вместе с его копиями, повёрнутыми на 180°, покрывает все направления, кроме двух узких полос около −30° и 150°. В этих полосах волна почти пропадает в II. Расширять диапазон не нужно. Эту мысль надо записать в `docs/adding-a-disease-preset.md`.

## Что добавить в модель

### Ось S

- Новый параметр `sAxis`, диапазон −15…135, по умолчанию 60. `qrsAxis` по-прежнему направляет Q, R и дельта-волну. Имя не меняется, поэтому пресеты и статьи трогать не нужно.
- БПНПГ нужна ось S отдельно от R: поздний S в I широкий и глубокий, а начало комплекса как в норме. Гемиблоку отдельная ось S не нужна (см. ниже). Отдельной оси Q не нужно ни одному пресету, поэтому `qAxis` не добавляется.
- Пресеты, которые задают `qrsAxis` и у которых есть зубец S, задают и `sAxis` с тем же значением:
  - `atrial-septal-defect`: 100;
  - `ventricular-tachycardia`: 85, у неё S по умолчанию −0,25.
- `ventricularPrematureShape` (S = 0) и отведение V1 (не проецируется) не меняются.
- Тест сравнивает кривые I, II и III всех нынешних пресетов с кривыми, записанными до изменения. В них входят и необычные оси из `leads.test.ts`: тот тест меняется так, чтобы задавать `sAxis` вместе с `qrsAxis`.
- `LeadGains.qrs` делится на `qr` (Q, R, дельта) и `s`. Закон Эйнтховена выполняется для каждого коэффициента, потому что cos θ + cos(θ − 120°) = cos(θ − 60°). Тест проверяет его, как сейчас.
- `LeadGains` экспортируется из пакета, поэтому переименование поля меняет API. `apps/web` это поле не использует.

### Ширина S

- `sWidth` — σ зубца S как доля длительности QRS без дельта-волны. По умолчанию 0,07, как сейчас, диапазон 0,07…0,1. Центр S: `qOnset + delta + min(k·rest, rest − 2,5σ)`, где k = 0,8 (0,75 с дельта-волной), как сейчас. Так ±2,5σ остаются внутри QRS, а S идёт после пика R.
- «Длительность S» в тестах — время во второй половине QRS, пока кривая в отведении ниже −0,05 мВ. Сама σ гауссианы — не длительность зубца, потому что S перекрывается с хвостом R.

### Зазубренный R

- `rNotch` — глубина провала посередине R, 0…0,5, по умолчанию 0. Формула: `R(t)·(1 − rNotch·exp(−½((t − rPeak)/(σR/4))²))`. Получается один широкий R с двумя вершинами. Широкий R не плоский, поэтому вершины ниже `rAmplitude` (при `rNotch` 0,3 у БЛНПГ — около 0,85 от неё), и максимум R уже не совпадает с `rPeak`. Звук S1 привязан к `rPeak` (`sounds.ts`), это не мешает.
- У БЛНПГ нет Q и S (q = s = 0, без дельта-волны), поэтому R считается через `wideRSigma` и растянут примерно на 0,9 QRS. Провал накладывается на этот широкий R.
- `assumption:` гауссова форма и доли ширины подобраны так, чтобы признак был виден на полоске 25 мм. Источники описывают форму словами («broad», «notched»), без чисел.

## Пресеты

- Все числа ниже, кроме отмеченных «источник», — `assumption:` с комментарием в коде.
- Полоска вмещает кривую от −1 до 1,5 мВ: высота 25 мм, изолиния в 15 мм от верха. Тест «каждый пресет помещается во всех трёх отведениях» уже есть, и он ограничивает амплитуды. Коэффициенты в таблице посчитаны по формуле выше.

| Пресет | Параметры | Что видно | Источник |
| --- | --- | --- | --- |
| `right-bundle-branch-block` | QRS 140 мс (источник: ≥ 120); Q, R и `qrsAxis` по умолчанию; S −0,3 мВ, `sAxis` 0, `sWidth` 0,1 | Начало QRS как в норме. Поздний S в I −0,6 мВ и длиннее 40 мс, в II −0,3 мВ, в III поздний r +0,3 мВ (коэффициенты I 2, III −1). | строка #7: широкий S в I. Ось, амплитуды и r в III — допущения. |
| `left-bundle-branch-block` | QRS 150 мс (источник: ≥ 120); Q 0, S 0; R 0,6 мВ; `qrsAxis` 0; `rNotch` 0,3; T и ST на оси 0, отрицательные | Широкий зазубренный R в I 1,2 мВ без Q, в III −0,6 мВ (коэффициенты I 2, III −1). ST и T в I против QRS. | строка #8. Ось 0°, амплитуды и отсутствие S — допущения (источник говорит только про отсутствие Q). |
| `left-anterior-fascicular-block` | QRS 110 мс (шире 90 мс по умолчанию модели, но меньше 120: источник «< 0,12 s»); Q 0; R 0,2 мВ; S −0,4 мВ; `qrsAxis` = `sAxis` = 120 | r и S лежат на одной прямой: r направлен на +120°, S на −60°. В I qR (q −0,2, R +0,4), в II rS, в III rS с S −0,8 мВ, вдвое глубже, чем в II (коэффициенты I −1, III 2). | строка #17: QRS < 0,12 с, ось отрицательнее −45°. Формы qR и rS, глубина S в III и ось r +120° — допущения. |

- **Ось гемиблока.** Суммарная ось считается по площадям QRS в I и II. Она равна −60°, когда площадь S больше площади r: |S|·σS > R·σR, где σR = 0,1·QRS, σS = `sWidth`·QRS. Тест проверяет, что ось отрицательнее −45°: это единственный количественный критерий из источника.
- **Ритм и гемодинамика.** Все три пресета — синусовый ритм с нормальным PR. Гемодинамика не меняется, схема Виггерса рисуется как в норме. `assumption:` модель не показывает диссинхронию левого желудочка при БЛНПГ (строка #22), и `summary` говорит об этом.
- **Частота.** QRS 150 мс сужает допустимый диапазон частот (`presetRateLimits`). Тест проверяет, что частота пресета по умолчанию в него входит.
- **Отведения.** Все три пресета рисуются в отведениях от конечностей, `presetLead` = `II`. V1 не рисуется: rsR' при БПНПГ виден только в V1–V2. `summary` БПНПГ говорит, что модель показывает признак в I, а не в V1.
- **Чего нет в этом этапе:**
  - Пресет «БПНПГ + передний гемиблок» (двухпучковая блокада, Минздрав 160_2, строка #4). Источник по Шагасу называет БПНПГ **или** передний гемиблок, а не их сочетание. Сочетание добавляется отдельным PR, если статье понадобится, и только со ссылкой на источник.
  - Состояние «после лечения»: изолированная блокада обычно не лечится (строки #9, #18, #29).
- **Строки.** `summary` и названия пресетов пишутся во всех локалях, `en.json` — эталон. Названия: «Блокада правой ножки пучка Гиса», «Блокада левой ножки пучка Гиса», «Блокада передней ветви левой ножки».
- **Статьи.** Пресеты попадают в статьи через поток интерактива, задачу ему передаёт координатор:
  - `bundle-branch-block`: `preset: right-bundle-branch-block` и `morePresets` с двумя другими;
  - `chagas-cardiomyopathy`: БПНПГ и передний гемиблок. Подписи описывают блокаду, а не болезнь: не «ЭКГ при болезни Шагаса» (свидетельства Шагаса, раздел ECG preset).
  - Тексты статей этот этап не меняет.

## Тесты по пресетам

- QRS: у БПНПГ и БЛНПГ 120 мс и больше, у гемиблока меньше 120.
- БПНПГ: S в I длится больше 40 мс по определению выше.
- БЛНПГ: в I нет отрицательного зубца до R, у R две вершины, а посередине R опускается на `rNotch` от `rAmplitude`, ST и T в I против QRS.
- Гемиблок: суммарная ось отрицательнее −45°, S в III глубже, чем в II.
- Все три пресета помещаются в полоску во всех трёх отведениях.

## Порядок PR

1. Эта спека.
2. Механика:
   - `sAxis`, `sWidth`, `rNotch`;
   - `LeadGains` с полями `qr` и `s`;
   - `sAxis` в `atrial-septal-defect` и `ventricular-tachycardia`.
   Тесты:
   - снимок кривых не меняется;
   - I, II и III всех нынешних пресетов совпадают с записанными до изменения;
   - закон Эйнтховена при отдельной оси S;
   - зазубрина даёт две вершины;
   - широкий S остаётся внутри QRS и после пика R.
3. Три пресета, их строки и тесты из раздела выше.
4. Документация: `docs/adding-a-disease-preset.md` — ось как прямая, `sAxis`, `sWidth`, `rNotch`.
