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
+28
View File
@@ -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: []