feat(core): scale engine with YAML schema and deterministic scoring
CI / ruff · pytest (pull_request) Successful in 23s
CI / ruff · pytest (pull_request) Successful in 23s
Pydantic schema for config/scales/*.yaml, cached loader, score() with severity bands (sex-specific for AUDIT-C), rule-based C-SSRS triage, flags (PHQ-9 item 9, PCL-5 >= 33, PHQ-4 subscales) and delta(). Starting literature thresholds for phq9, gad7, pcl5, auditc, pcptsd5, cssrs_screen, phq4; final values are approved by the psychiatrist (#8). Refs #3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# AUDIT-C (Bush et al., 1998; Bradley et al., 2007). Положительный скрининг: ≥ 4 у мужчин, ≥ 3 у женщин.
|
||||
# Если пол неизвестен — используется более чувствительный порог (≥ 3), чтобы не пропустить риск.
|
||||
id: auditc
|
||||
title: "Тест на употребление алкоголя (AUDIT-C)"
|
||||
recall_period: "последний год"
|
||||
instruction: "Ответьте, пожалуйста, на вопросы об употреблении алкоголя. Одна стандартная порция — 10 г чистого спирта."
|
||||
license_note: "AUDIT/AUDIT-C (ВОЗ) — свободное использование."
|
||||
translation_note: >-
|
||||
Рабочий перевод команды на основе русской версии AUDIT (ВОЗ). Финальный перевод выбирает психиатр.
|
||||
items:
|
||||
- id: auditc_1
|
||||
text: "Как часто Вы употребляете алкогольные напитки?"
|
||||
options:
|
||||
- {value: 0, label: "Никогда"}
|
||||
- {value: 1, label: "Раз в месяц или реже"}
|
||||
- {value: 2, label: "2–4 раза в месяц"}
|
||||
- {value: 3, label: "2–3 раза в неделю"}
|
||||
- {value: 4, label: "4 раза в неделю или чаще"}
|
||||
- id: auditc_2
|
||||
text: "Сколько стандартных порций алкоголя Вы обычно выпиваете в день, когда пьёте?"
|
||||
options:
|
||||
- {value: 0, label: "1–2"}
|
||||
- {value: 1, label: "3–4"}
|
||||
- {value: 2, label: "5–6"}
|
||||
- {value: 3, label: "7–9"}
|
||||
- {value: 4, label: "10 и более"}
|
||||
- id: auditc_3
|
||||
text: "Как часто Вы выпиваете 6 и более стандартных порций за один раз?"
|
||||
options:
|
||||
- {value: 0, label: "Никогда"}
|
||||
- {value: 1, label: "Реже раза в месяц"}
|
||||
- {value: 2, label: "Ежемесячно"}
|
||||
- {value: 3, label: "Еженедельно"}
|
||||
- {value: 4, label: "Ежедневно или почти ежедневно"}
|
||||
range: {min: 0, max: 12}
|
||||
# Пол неизвестен — чувствительный порог (≥ 3).
|
||||
severity:
|
||||
- {min: 0, max: 2, code: negative, label: "Скрининг отрицательный"}
|
||||
- {min: 3, max: 12, code: positive, label: "Скрининг положительный"}
|
||||
by_sex:
|
||||
m:
|
||||
- {min: 0, max: 3, code: negative, label: "Скрининг отрицательный"}
|
||||
- {min: 4, max: 12, code: positive, label: "Скрининг положительный"}
|
||||
f:
|
||||
- {min: 0, max: 2, code: negative, label: "Скрининг отрицательный"}
|
||||
- {min: 3, max: 12, code: positive, label: "Скрининг положительный"}
|
||||
flags:
|
||||
- code: auditc_positive
|
||||
when: {severity_in: [positive]}
|
||||
@@ -0,0 +1,58 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# C-SSRS, скрининговая версия (Posner et al., 2011; Columbia Lighthouse Project), триаж:
|
||||
# q1–q2 (желание умереть, суицидальные мысли) → low
|
||||
# q3 (мысли о способе, без намерения) → moderate
|
||||
# q4 (намерение), q5 (план), q6 (поведение за 3 месяца) → high
|
||||
# Ответы «да/нет» хранятся как 1/0. Порядок правил важен: первое совпавшее — уровень риска.
|
||||
# В оригинале q6 задаётся «за всю жизнь» с уточнением «в последние 3 месяца»; для триажа нужен
|
||||
# только второй вариант, поэтому q6 сформулирован сразу про 3 месяца (утверждает психиатр).
|
||||
id: cssrs_screen
|
||||
title: "Колумбийская шкала оценки тяжести суицидального риска (C-SSRS), скрининг"
|
||||
recall_period: "последний месяц (вопрос 6 — последние 3 месяца)"
|
||||
instruction: "Ответьте, пожалуйста, на несколько вопросов о том, как Вы себя чувствовали за последний месяц."
|
||||
license_note: "C-SSRS — бесплатно для клинического и некоммерческого использования (Columbia Lighthouse Project)."
|
||||
translation_note: >-
|
||||
Рабочий перевод команды (демо-текст). Финальный текст — официальная русская скрининговая версия,
|
||||
выбирает психиатр.
|
||||
scoring: rules
|
||||
options:
|
||||
- {value: 0, label: "Нет"}
|
||||
- {value: 1, label: "Да"}
|
||||
items:
|
||||
- {id: cssrs_1, text: "Хотелось ли Вам умереть или заснуть и не проснуться?", buttons_only: true}
|
||||
- {id: cssrs_2, text: "Были ли у Вас мысли о том, чтобы покончить с собой?", buttons_only: true}
|
||||
- {id: cssrs_3, text: "Думали ли Вы о том, как могли бы это сделать?", buttons_only: true}
|
||||
- id: cssrs_4
|
||||
text: "Были ли у Вас такие мысли и хоть какое-то намерение действовать в соответствии с ними?"
|
||||
buttons_only: true
|
||||
- id: cssrs_5
|
||||
text: "Начинали ли Вы продумывать или уже продумали детали того, как покончить с собой? Собираетесь ли Вы осуществить этот план?"
|
||||
buttons_only: true
|
||||
- id: cssrs_6
|
||||
text: "За последние 3 месяца делали ли Вы что-нибудь, начинали делать или готовились сделать, чтобы покончить с собой?"
|
||||
buttons_only: true
|
||||
range: {min: 0, max: 6}
|
||||
severity_rules:
|
||||
- code: high
|
||||
label: "Высокий риск"
|
||||
when:
|
||||
any_of:
|
||||
- {item: cssrs_4, op: ">=", value: 1}
|
||||
- {item: cssrs_5, op: ">=", value: 1}
|
||||
- {item: cssrs_6, op: ">=", value: 1}
|
||||
- code: moderate
|
||||
label: "Умеренный риск"
|
||||
when: {item: cssrs_3, op: ">=", value: 1}
|
||||
- code: low
|
||||
label: "Низкий риск"
|
||||
when:
|
||||
any_of:
|
||||
- {item: cssrs_1, op: ">=", value: 1}
|
||||
- {item: cssrs_2, op: ">=", value: 1}
|
||||
default_severity: {code: none, label: "Риск не выявлен"}
|
||||
flags:
|
||||
# high → acute-алерт и кризисный протокол (ADR-006); moderate → врачу ≤ 24 ч (config/rules.yaml).
|
||||
- code: cssrs_high
|
||||
when: {severity_in: [high]}
|
||||
- code: cssrs_moderate
|
||||
when: {severity_in: [moderate]}
|
||||
@@ -0,0 +1,28 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# GAD-7 (Spitzer et al., 2006). Градации: 0–4, 5–9, 10–14, 15–21; ≥ 10 — вероятное ГТР.
|
||||
id: gad7
|
||||
title: "Шкала генерализованного тревожного расстройства (GAD-7)"
|
||||
recall_period: "последние 2 недели"
|
||||
instruction: "Как часто за последние 2 недели Вас беспокоили следующие проблемы?"
|
||||
license_note: "GAD-7 (Pfizer) — свободное использование, разрешения не требуется."
|
||||
translation_note: "Стандартная русская версия GAD-7 (MAPI). Финальную формулировку утверждает психиатр."
|
||||
options:
|
||||
- {value: 0, label: "Ни разу"}
|
||||
- {value: 1, label: "Несколько дней"}
|
||||
- {value: 2, label: "Более половины дней"}
|
||||
- {value: 3, label: "Почти каждый день"}
|
||||
items:
|
||||
- {id: gad7_1, text: "Вы нервничали, тревожились или были на грани срыва"}
|
||||
- {id: gad7_2, text: "Вы были не в состоянии остановить или контролировать своё беспокойство"}
|
||||
- {id: gad7_3, text: "Вы слишком сильно беспокоились по различным поводам"}
|
||||
- {id: gad7_4, text: "Вам было трудно расслабиться"}
|
||||
- {id: gad7_5, text: "Вы были настолько беспокойны, что Вам было тяжело усидеть на месте"}
|
||||
- {id: gad7_6, text: "Вы легко раздражались или злились"}
|
||||
- {id: gad7_7, text: "Вы испытывали страх, как будто может случиться что-то ужасное"}
|
||||
range: {min: 0, max: 21}
|
||||
severity:
|
||||
- {min: 0, max: 4, code: minimal, label: "Минимальная"}
|
||||
- {min: 5, max: 9, code: mild, label: "Лёгкая"}
|
||||
- {min: 10, max: 14, code: moderate, label: "Умеренная"}
|
||||
- {min: 15, max: 21, code: severe, label: "Тяжёлая"}
|
||||
flags: []
|
||||
@@ -0,0 +1,60 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# PCL-5 (Weathers et al., 2013). Порог вероятного ПТСР в литературе 31–33; берём 33 (VA National Center for PTSD).
|
||||
# Градация ≥ 50 «высокая» — рабочее решение команды под правило SPEC «PCL-5 ≥ 50 → high», не часть оригинальной шкалы.
|
||||
# Клинически значимое изменение — 10 баллов (правило «рост PCL-5 на ≥ 10 → врач» считает delta()).
|
||||
id: pcl5
|
||||
title: "Контрольный список симптомов ПТСР (PCL-5)"
|
||||
recall_period: "последний месяц"
|
||||
instruction: >-
|
||||
Ниже перечислены проблемы, которые иногда возникают у людей в ответ на очень стрессовое событие.
|
||||
Отметьте, насколько каждая из них беспокоила Вас за последний месяц.
|
||||
license_note: "PCL-5 — общественное достояние (VA National Center for PTSD); русская версия — лицензия на проверке."
|
||||
translation_note: >-
|
||||
Рабочий перевод команды (демо-текст). Финальный русский перевод выбирает психиатр (SPEC §9).
|
||||
Для еженедельного мониторинга используется та же шкала с периодом «последняя неделя».
|
||||
options:
|
||||
- {value: 0, label: "Совсем нет"}
|
||||
- {value: 1, label: "Немного"}
|
||||
- {value: 2, label: "Умеренно"}
|
||||
- {value: 3, label: "Сильно"}
|
||||
- {value: 4, label: "Крайне сильно"}
|
||||
items:
|
||||
- {id: pcl5_1, text: "Повторяющиеся, тревожащие и нежелательные воспоминания о стрессовом событии"}
|
||||
- {id: pcl5_2, text: "Повторяющиеся тревожащие сны о стрессовом событии"}
|
||||
- id: pcl5_3
|
||||
text: "Внезапное ощущение или поведение, как будто стрессовое событие происходит снова (как будто Вы снова в нём)"
|
||||
- {id: pcl5_4, text: "Сильное расстройство, когда что-то напоминало Вам о стрессовом событии"}
|
||||
- id: pcl5_5
|
||||
text: >-
|
||||
Сильные телесные реакции, когда что-то напоминало Вам о стрессовом событии
|
||||
(например, сердцебиение, затруднённое дыхание, потливость)
|
||||
- {id: pcl5_6, text: "Избегание воспоминаний, мыслей или чувств, связанных со стрессовым событием"}
|
||||
- id: pcl5_7
|
||||
text: >-
|
||||
Избегание внешних напоминаний о стрессовом событии (людей, мест, разговоров, занятий,
|
||||
предметов или ситуаций)
|
||||
- {id: pcl5_8, text: "Трудности с воспоминанием важных деталей стрессового события"}
|
||||
- id: pcl5_9
|
||||
text: >-
|
||||
Сильные негативные убеждения о себе, других людях или мире (например: «я плохой»,
|
||||
«со мной что-то серьёзно не так», «никому нельзя доверять», «мир совершенно опасен»)
|
||||
- {id: pcl5_10, text: "Обвинение себя или кого-то другого в стрессовом событии или в том, что произошло после него"}
|
||||
- {id: pcl5_11, text: "Сильные негативные чувства: страх, ужас, гнев, вина или стыд"}
|
||||
- {id: pcl5_12, text: "Потеря интереса к занятиям, которые раньше приносили Вам удовольствие"}
|
||||
- {id: pcl5_13, text: "Ощущение отстранённости или отчуждённости от других людей"}
|
||||
- id: pcl5_14
|
||||
text: "Трудности с переживанием положительных чувств (например, неспособность испытывать счастье или любовь к близким)"
|
||||
- {id: pcl5_15, text: "Раздражительность, вспышки гнева или агрессивное поведение"}
|
||||
- {id: pcl5_16, text: "Чрезмерный риск или действия, которые могут причинить Вам вред"}
|
||||
- {id: pcl5_17, text: "Состояние «сверхнастороженности»: постоянная бдительность, готовность к опасности"}
|
||||
- {id: pcl5_18, text: "Пугливость, Вы легко вздрагиваете"}
|
||||
- {id: pcl5_19, text: "Трудности с концентрацией внимания"}
|
||||
- {id: pcl5_20, text: "Трудности с засыпанием или прерывистый сон"}
|
||||
range: {min: 0, max: 80}
|
||||
severity:
|
||||
- {min: 0, max: 32, code: below_threshold, label: "Ниже порога ПТСР"}
|
||||
- {min: 33, max: 49, code: probable, label: "Вероятное ПТСР"}
|
||||
- {min: 50, max: 80, code: high, label: "Выраженная симптоматика ПТСР"}
|
||||
flags:
|
||||
- code: pcl5_probable_ptsd
|
||||
when: {total: true, op: ">=", value: 33}
|
||||
@@ -0,0 +1,30 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# PC-PTSD-5 (Prins et al., 2016). Положительный скрининг: ≥ 3 ответов «да».
|
||||
id: pcptsd5
|
||||
title: "Скрининг ПТСР для первичного звена (PC-PTSD-5)"
|
||||
recall_period: "последний месяц"
|
||||
instruction: >-
|
||||
Иногда с людьми случаются необычно или особенно пугающие, ужасные или травмирующие события.
|
||||
Если с Вами случалось такое событие, ответьте: было ли с Вами за последний месяц следующее?
|
||||
notes: >-
|
||||
Задаётся только если на вопрос о травматическом опыте пациент ответил «да».
|
||||
Если травматического опыта не было, шкала не проводится (результат = 0).
|
||||
license_note: "PC-PTSD-5 — общественное достояние (VA National Center for PTSD)."
|
||||
translation_note: "Рабочий перевод команды (демо-текст). Финальный перевод выбирает психиатр."
|
||||
options:
|
||||
- {value: 0, label: "Нет"}
|
||||
- {value: 1, label: "Да"}
|
||||
items:
|
||||
- {id: pcptsd5_1, text: "Вам снились кошмары о событии или Вы думали о нём, когда не хотели?"}
|
||||
- {id: pcptsd5_2, text: "Вы старались не думать о событии или избегали ситуаций, которые о нём напоминали?"}
|
||||
- {id: pcptsd5_3, text: "Вы были постоянно настороже, бдительны или легко вздрагивали?"}
|
||||
- {id: pcptsd5_4, text: "Вы чувствовали оцепенение или отстранённость от людей, занятий или окружающего?"}
|
||||
- id: pcptsd5_5
|
||||
text: "Вы чувствовали вину или не могли перестать обвинять себя или других в событии или в проблемах, которые оно вызвало?"
|
||||
range: {min: 0, max: 5}
|
||||
severity:
|
||||
- {min: 0, max: 2, code: negative, label: "Скрининг отрицательный"}
|
||||
- {min: 3, max: 5, code: positive, label: "Скрининг положительный"}
|
||||
flags:
|
||||
- code: pcptsd5_positive
|
||||
when: {severity_in: [positive]}
|
||||
@@ -0,0 +1,31 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# PHQ-4 (Kroenke et al., 2009) = GAD-2 (п.1–2) + PHQ-2 (п.3–4). Модуль family.
|
||||
# Общий балл: 0–2 норма, 3–5 лёгкая, 6–8 умеренная, 9–12 тяжёлая.
|
||||
# Подшкалы: GAD-2 ≥ 3 и PHQ-2 ≥ 3 — положительный скрининг → полный GAD-7 / PHQ-9.
|
||||
id: phq4
|
||||
title: "Опросник здоровья пациента (PHQ-4)"
|
||||
recall_period: "последние 2 недели"
|
||||
instruction: "Как часто за последние 2 недели Вас беспокоили следующие проблемы?"
|
||||
license_note: "PHQ-4 (Pfizer) — свободное использование, разрешения не требуется."
|
||||
translation_note: "Пункты из стандартных русских версий GAD-7 и PHQ-9. Финальную формулировку утверждает психиатр."
|
||||
options:
|
||||
- {value: 0, label: "Ни разу"}
|
||||
- {value: 1, label: "Несколько дней"}
|
||||
- {value: 2, label: "Более половины дней"}
|
||||
- {value: 3, label: "Почти каждый день"}
|
||||
items:
|
||||
- {id: phq4_1, text: "Вы нервничали, тревожились или были на грани срыва"}
|
||||
- {id: phq4_2, text: "Вы были не в состоянии остановить или контролировать своё беспокойство"}
|
||||
- {id: phq4_3, text: "Вам не хотелось ничего делать"}
|
||||
- {id: phq4_4, text: "У Вас было плохое настроение, Вы были подавлены или испытывали чувство безысходности"}
|
||||
range: {min: 0, max: 12}
|
||||
severity:
|
||||
- {min: 0, max: 2, code: normal, label: "Норма"}
|
||||
- {min: 3, max: 5, code: mild, label: "Лёгкая"}
|
||||
- {min: 6, max: 8, code: moderate, label: "Умеренная"}
|
||||
- {min: 9, max: 12, code: severe, label: "Тяжёлая"}
|
||||
flags:
|
||||
- code: phq4_anxiety_positive
|
||||
when: {sum_of: [phq4_1, phq4_2], op: ">=", value: 3}
|
||||
- code: phq4_depression_positive
|
||||
when: {sum_of: [phq4_3, phq4_4], op: ">=", value: 3}
|
||||
@@ -0,0 +1,49 @@
|
||||
# Стартовые пороги из литературы, финальные утверждает психиатр (issue #8).
|
||||
# PHQ-9 (Kroenke, Spitzer, Williams, 2001). Градации: 0–4, 5–9, 10–14, 15–19, 20–27.
|
||||
id: phq9
|
||||
title: "Опросник здоровья пациента (PHQ-9)"
|
||||
recall_period: "последние 2 недели"
|
||||
instruction: "Как часто за последние 2 недели Вас беспокоили следующие проблемы?"
|
||||
license_note: "PHQ-9 (Pfizer) — свободное использование, разрешения не требуется."
|
||||
translation_note: "Стандартная русская версия PHQ-9 (MAPI). Финальную формулировку утверждает психиатр."
|
||||
options:
|
||||
- {value: 0, label: "Ни разу"}
|
||||
- {value: 1, label: "Несколько дней"}
|
||||
- {value: 2, label: "Более половины дней"}
|
||||
- {value: 3, label: "Почти каждый день"}
|
||||
items:
|
||||
- id: phq9_1
|
||||
text: "Вам не хотелось ничего делать"
|
||||
- id: phq9_2
|
||||
text: "У Вас было плохое настроение, Вы были подавлены или испытывали чувство безысходности"
|
||||
- id: phq9_3
|
||||
text: "Вам было трудно заснуть, у Вас был прерывистый сон, или Вы слишком много спали"
|
||||
- id: phq9_4
|
||||
text: "Вы были утомлены, или у Вас было мало сил"
|
||||
- id: phq9_5
|
||||
text: "У Вас был плохой аппетит, или Вы переедали"
|
||||
- id: phq9_6
|
||||
text: >-
|
||||
Вы плохо о себе думали: считали себя неудачником (неудачницей), или были в себе разочарованы,
|
||||
или считали, что подвели свою семью
|
||||
- id: phq9_7
|
||||
text: "Вам было трудно сосредоточиться (например, на чтении газеты или просмотре телепередач)"
|
||||
- id: phq9_8
|
||||
text: >-
|
||||
Вы двигались или говорили настолько медленно, что окружающие это замечали? Или, наоборот,
|
||||
Вы были настолько суетливы или взбудоражены, что двигались гораздо больше обычного
|
||||
- id: phq9_9
|
||||
text: "Вас посещали мысли о том, что Вам лучше было бы умереть, или о том, чтобы причинить себе какой-нибудь вред"
|
||||
# Пункт о суицидальных мыслях — только кнопками, без интерпретации LLM (SPEC, ADR-002).
|
||||
buttons_only: true
|
||||
range: {min: 0, max: 27}
|
||||
severity:
|
||||
- {min: 0, max: 4, code: minimal, label: "Минимальная"}
|
||||
- {min: 5, max: 9, code: mild, label: "Лёгкая"}
|
||||
- {min: 10, max: 14, code: moderate, label: "Умеренная"}
|
||||
- {min: 15, max: 19, code: moderately_severe, label: "Умеренно-тяжёлая"}
|
||||
- {min: 20, max: 27, code: severe, label: "Тяжёлая"}
|
||||
flags:
|
||||
# П.9 ≥ 1 → C-SSRS + кризисная ветка (обрабатывают правила, config/rules.yaml).
|
||||
- code: phq9_item9_positive
|
||||
when: {item: phq9_9, op: ">=", value: 1}
|
||||
Reference in New Issue
Block a user