feat(core): scale engine with YAML schema and deterministic scoring
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:
2026-10-03 14:56:40 +03:00
co-authored by Claude Opus 5.5
parent de27ff1b72
commit 0c8cedc0c6
10 changed files with 1017 additions and 0 deletions
+31
View File
@@ -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}