[core] Движок шкал: схема config/scales + скоринг PHQ-9, GAD-7, PCL-5, AUDIT-C, PC-PTSD-5, C-SSRS #3

Closed
opened 2026-10-03 14:38:52 +03:00 by Eleboba · 0 comments
Owner

Описание

Скоринг детерминирован, пороги в config/scales/*.yaml (ADR-008), значения утверждает психиатр (issue clinical-content). CLINICAL_MODULES.md, SPEC §6.

Желаемый результат

  • Pydantic-схема шкалы: id, items (id, text, button_options, buttons_only), range, severity bands, flags (например phq9.item9 >= 1 → cssrs).
  • app/core/scales.py: загрузка YAML, score(scale, answers) -> ScaleResult(total, severity, complete, flags). AUDIT-C — порог по полу. C-SSRS скрининг → уровень риска (none/low/moderate/high) по ответам.
  • Стартовые YAML с литературными порогами для: phq9, gad7, pcl5, auditc, pcptsd5, cssrs_screen, phq4 (для family).
  • Тесты tests/test_scoring.py: границы градаций, неполные анкеты, п.9.

Как проверить

make test; python -c "from app.core.scales import load_all; print(load_all().keys())".


Лог выполнения

2026-10-03

2026-10-03

  • Что сделано: app/core/scales.py — pydantic-схема шкалы (пункты, варианты, buttons_only, reverse, диапазон, градации, by_sex, правила scoring: rules, флаги с условиями item / sum_of / total / severity_in / any_of), кэшируемая загрузка load_all()/load_scale(), score(scale_id, answers, sex) → ScaleResult, delta(prev, cur). Семь YAML в config/scales/: phq9, gad7, pcl5, auditc, pcptsd5, cssrs_screen, phq4 с литературными порогами и пометкой «финальные утверждает психиатр (issue #8)».
  • Результат: 52 теста в tests/test_scoring.py (границы градаций, флаг п.9, AUDIT-C по полу, триаж C-SSRS, неполные анкеты, невалидные значения, валидация схемы); make lint test зелёный.
  • Заметки/решения:
    • Неполные анкеты не импутируются: total — нижняя граница по отвеченным пунктам, complete=False; флаги и правила срабатывают на отвеченном (положительный п.9 в незаконченном PHQ-9 обрабатывается).
    • AUDIT-C при неизвестном поле — чувствительный порог ≥ 3.
    • PCL-5: градация ≥ 50 «выраженная» — рабочее решение под правило SPEC, не часть оригинальной шкалы.
    • C-SSRS: q6 сформулирован сразу «за последние 3 месяца» (для триажа нужен только этот вариант); переводы PCL-5 / AUDIT-C / PC-PTSD-5 / C-SSRS — рабочие, финальные выбирает психиатр.
    • Схема строгая (extra=forbid), проверяет непрерывность градаций и соответствие диапазона пунктам — опечатка в YAML падает при загрузке.
    • delta() требует полные результаты одной шкалы.
## Описание Скоринг детерминирован, пороги в `config/scales/*.yaml` (ADR-008), значения утверждает психиатр (issue clinical-content). CLINICAL_MODULES.md, SPEC §6. ## Желаемый результат - Pydantic-схема шкалы: id, items (id, text, button_options, buttons_only), range, severity bands, flags (например `phq9.item9 >= 1 → cssrs`). - `app/core/scales.py`: загрузка YAML, `score(scale, answers) -> ScaleResult(total, severity, complete, flags)`. AUDIT-C — порог по полу. C-SSRS скрининг → уровень риска (`none/low/moderate/high`) по ответам. - Стартовые YAML с литературными порогами для: phq9, gad7, pcl5, auditc, pcptsd5, cssrs_screen, phq4 (для family). - Тесты `tests/test_scoring.py`: границы градаций, неполные анкеты, п.9. ## Как проверить `make test`; `python -c "from app.core.scales import load_all; print(load_all().keys())"`. --- ## Лог выполнения ### 2026-10-03 ### 2026-10-03 - **Что сделано:** `app/core/scales.py` — pydantic-схема шкалы (пункты, варианты, `buttons_only`, `reverse`, диапазон, градации, `by_sex`, правила `scoring: rules`, флаги с условиями `item / sum_of / total / severity_in / any_of`), кэшируемая загрузка `load_all()/load_scale()`, `score(scale_id, answers, sex)` → `ScaleResult`, `delta(prev, cur)`. Семь YAML в `config/scales/`: phq9, gad7, pcl5, auditc, pcptsd5, cssrs_screen, phq4 с литературными порогами и пометкой «финальные утверждает психиатр (issue #8)». - **Результат:** 52 теста в `tests/test_scoring.py` (границы градаций, флаг п.9, AUDIT-C по полу, триаж C-SSRS, неполные анкеты, невалидные значения, валидация схемы); `make lint test` зелёный. - **Заметки/решения:** - Неполные анкеты не импутируются: total — нижняя граница по отвеченным пунктам, `complete=False`; флаги и правила срабатывают на отвеченном (положительный п.9 в незаконченном PHQ-9 обрабатывается). - AUDIT-C при неизвестном поле — чувствительный порог ≥ 3. - PCL-5: градация ≥ 50 «выраженная» — рабочее решение под правило SPEC, не часть оригинальной шкалы. - C-SSRS: q6 сформулирован сразу «за последние 3 месяца» (для триажа нужен только этот вариант); переводы PCL-5 / AUDIT-C / PC-PTSD-5 / C-SSRS — рабочие, финальные выбирает психиатр. - Схема строгая (`extra=forbid`), проверяет непрерывность градаций и соответствие диапазона пунктам — опечатка в YAML падает при загрузке. - `delta()` требует полные результаты одной шкалы.
Eleboba added this to the M1 Каркас milestone 2026-10-03 14:38:52 +03:00
Eleboba added the size/1P0corefeature labels 2026-10-03 14:38:52 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#3