feat(core): add review-gated intake questionnaire rules

Correct RUS-AUDIT-S composition, preserve C-SSRS lifetime behavior, and prepare clinical review materials.

Refs #52
This commit is contained in:
Pavel Eliseev
2026-10-03 16:13:36 +03:00
parent f6e4828f01
commit 3cd7e2fd75
12 changed files with 1005 additions and 0 deletions
+155
View File
@@ -0,0 +1,155 @@
# Опросник: пакет проверки от 3 октября 2026
Статус: **подготовлено для проверки, не утверждено для пациентов**. Задача #52;
клиническое согласование остаётся в #8. Независимый обратный перевод, согласование
врачом и проверка линий звонками не выполнены. В `review-status.json` все эти
статусы оставлены незавершёнными.
## Что реализовано
`app/core/questionnaire.py` содержит детерминированные правила первичного опроса:
короткий PHQ-2 из первых двух ответов PHQ-9, фильтр травмы PC-PTSD-5,
условное дополнение до полных шкал, RUS-AUDIT-S, структуру C-SSRS Recent,
приоритет основного маршрута и параллельные направления. Это новый модуль для
интеграции после проверки, а не уже подключённый сценарий бота. Существующие
контракты, `config/modules.yaml`, мониторинг и исторические результаты не менялись.
`config/questionnaire.yaml` фиксирует **кандидатные** пороги из PDF. Политика без
записи врача не выдаёт обычный маршрут. Положительный PHQ-9/9, известный высокий
сигнал C-SSRS и ручной запрос помощи дают `crisis` независимо от этого ограничения.
`clinical_review_required` при других положительных C-SSRS означает остановку
обычного потока и необходимость человеческой проверки, а не присвоение высокого
риска. Для неполного C-SSRS возвращается нижняя граница риска, итоговый риск пуст.
Использовать в адаптере `score_alcohol`, а не низкоуровневый `scales.score` для
маршрутизации: первый не выдаёт итоговую сумму/зону неполной анкеты. Известный пол
нужен только для интерпретации алкогольной шкалы; неизвестный не заменяется мужским
или женским. Нет ответа, отказ и технически пропущенный вопрос не равны нулю.
## RUS-AUDIT-S: исправление спецификации
В PDF на с.7–9 первые три пункта ошибочно названы RUS-AUDIT-S. Валидированная
краткая форма состоит из **пунктов 3, 9, 10** полного RUS-AUDIT, в этом порядке.
Пункт 3 имеет значения 0/1/2/3/4, пункты 9 и 10 — только 0/2/4; сумма 0–12.
| Зона | Женщины | Мужчины |
|---|---|---|
| I | 0–1 | 0–3 |
| II | 2–4 | 4–6 |
| III | 5 | 7 |
| IV | 6–12 | 8–12 |
Источник состава: [Neufeld et al., Bulletin of WHO, 2021](https://pmc.ncbi.nlm.nih.gov/articles/PMC8243036/).
Зоны и текст для самозаполнения: [Бунова и соавт., 2022, рис.3](https://www.mediasphera.ru/issues/profilakticheskaya-meditsina/2022/8/1230549482022081021),
DOI 10.17116/profmed20222508121. Рисунок визуально проверен, включая пояснение
слова «травма» во втором вопросе. В интерфейсе это пояснение нельзя опускать.
При дополнении до полной шкалы остаются пункты 1,2,4,5,6,7,8. Ответы на 3,9,10
переиспользуются по исходным ID и не суммируются дважды. Записывать версию и факт
получения ответа в краткой форме: её пояснение травмы отличается от полного текста.
Правило PDF `п.1 = 0` может вывести нули только для 2/3, **не для 9/10**;
выведенные ответы возвращаются отдельно в `derived`, исходный словарь не меняется.
Полная форма и её зоны взяты из пользовательского PDF с.7–9, транскрипция является
материалом для согласования, не независимо подтверждённым русским бланком.
Для пункта 2 адаптеру нужна исходная таблица стандартных порций (с.8), а не
произвольное округление смешанных напитков. Применение полной интервью-формы
как самоопроса требует отдельного решения врача.
RUS-AUDIT: © ВОЗ, 2021; [отчёт ВОЗ](https://www.who.int/europe/publications/i/item/9789289055765),
CC BY-NC-SA 3.0 IGO. Использование в этом пакете — некоммерческий прототип.
Наличие шкалы здесь не означает одобрения продукта ВОЗ или авторами.
## C-SSRS: источник и незавершённая часть
Официальная [страница переводов Columbia](https://cssrs.columbia.edu/the-columbia-scale-c-ssrs/translations/)
ссылается на [Dropbox Screeners](https://www.dropbox.com/scl/fo/pkg1gwxxn1266rke8oite/AC2UFfOKCtefU-o9EEXP-yk?dl=0&rlkey=4grouuqbchfa8obxlcb3msnpz).
Ожидаемый файл: `C-SSRS Screener - Russian.pdf`. **Файл не получен, официальный
русский текст не добавлен**: проверка административной политики браузера не
доступна; обход блокировки не выполнялся.
`config/scales/cssrs_screen.yaml` остаётся историческим демо-переводом. Его q6
спрашивает только о последних трёх месяцах; автоматически конвертировать такой
ответ в пожизненный нельзя. Не выдавать этот файл за официальный перевод.
Новая структура данных использует q1…q5, q6_lifetime и q6_recent. Проверена по
[официальному Recent Screener для первичной помощи](https://cssrs.columbia.edu/wp-content/uploads/C-SSRS-Screener-with-Triage-Points-for-Primary-Care-2026.pdf)
и [описанию триажа Columbia](https://cssrs.columbia.edu/the-columbia-scale-c-ssrs/risk-identification/):
q1/q2 всем; при q2=0 перейти к q6; при q2=1 спросить q3–q5;
q6 за всю жизнь всем; при положительном q6 уточнить последние три месяца.
Поведение ранее трёх месяцев учитывается отдельно и не становится «риска нет».
Для завершения: получить русский PDF из официальной папки, сохранить хеш/дату/
версию, посимвольно сверить вопросы, пояснения, периоды и варианты, проверить
переходы на отрисованном бланке, затем добавить отдельную версию русской шкалы.
Версию «с последнего контакта» нельзя получить простой заменой заголовка Recent.
Статус лицензии и применимость к коммерческому продукту подтверждаются отдельно.
## Независимый обратный перевод
Передать переводчику **только** `backtranslation-blind.tsv` и следующие указания:
1. Нужен независимый переводчик со свободным английским, не автор исходного
русского текста. Перевести каждую из 38 единиц буквально по смыслу, включая
инструкции, фильтр, вопросы и варианты ответа. Не искать и не подглядывать
в английский оригинал. Сохранить ID и порядок строк.
2. Заполнить `english_backtranslation`, сомнения в `translator_comment`, имя и
дату. Не «улучшать» русские формулировки. Неясный смысл отмечать явно.
3. Вернуть файл координатору. Если оригинал уже знаком переводчику, это указать:
такую работу нельзя считать слепой независимой проверкой.
Координатор и врач используют `translation-reconciliation.tsv` после получения
обратного перевода. Сопоставить смысл, отрицания, интенсивность, временной период,
привязку к событию и примеры с [PC-PTSD-5 VA](https://www.ptsd.va.gov/professional/assessment/screens/pc-ptsd.asp)
и [PCL-5 VA](https://www.ptsd.va.gov/professional/assessment/adult-sr/ptsd-checklist.asp).
По каждой строке записать расхождение, тяжесть, согласованный русский текст,
врача и дату решения. Не заполнять английские поля машинным переводом под видом
независимой работы. Одна обратная проверка не доказывает психометрическую валидацию.
Транскрипция взята из приложенного `questionnaires-mvp-source.pdf`, с.3–7;
нормализованы только переносы и межсловные пробелы. SHA-256 оригинала записан в
`review-status.json`. В репозитории текущие PC-PTSD-5/PCL-5 отличаются от PDF;
после согласования переносить именно утверждённую версию и зафиксировать diff.
Английские оригиналы не включены в слепой файл.
## Решения врача — поля намеренно не заполнены
| ID | Решение, которое нужно зафиксировать | Статус |
|---|---|---|
| C01 | Любой «Да» останавливает обычный опрос или разрешено продолжение после низкого риска? Различить обычный опрос, уточнение риска и кризисную помощь. PDF с.1 против с.11, скриншот поддерживает остановку. | pending |
| C02 | С какой зоны RUS-AUDIT-S дополнять полную форму? Не переносить порог AUDIT-C ≥3/≥4. | pending |
| C03 | Самозаполнение полного RUS-AUDIT, таблица стандартных порций, порядок дополнения и повторные замеры. | pending |
| C04 | PC-PTSD-5 ≥3 и PCL-5 ≥31 для этой популяции; в текущем репозитории PCL-5 ≥33. | pending |
| C05 | Привязка PHQ-9/PCL-5 к специалистам, сроки срочной помощи, параллельные маршруты и состав флагов. | pending |
| C06 | Официальный русский C-SSRS: версия, возраст/популяция, применение Recent и Since Last Contact. | pending |
| C07 | Как отвечает живой дежурный, что делать при недоступности, когда подтверждать уведомление врачу. | pending |
| C08 | Повторы, ухудшение, разные периоды оценки и выход из кризисного режима. | pending |
Форма решения: ID; выбранный вариант; обоснование; ФИО/роль врача; дата с часовым
поясом; версия политики; ссылка на подписанный протокол; проверенные сценарии.
После решений C01/C02 и утверждения остальных применяемых порогов заполнить
`approval` в конфиге и изменить версию. Это запись о реальном согласовании, а не
переключатель для снятия блокировки. Синтетические записи в тестах не являются
подписью врача.
## Подключение к диалогу
Адаптер вызывает `evaluate_intake` после каждого ответа и на ручной кнопке помощи.
`crisis` открывает фиксированную кризисную ветку до LLM; `clinical_review_required`
не разрешает автоматическое продолжение; `incomplete` запрашивает обязательные
пропуски; `ready` содержит основной маршрут и отдельные параллельные направления.
Кнопка помощи доступна на каждом экране. Не утверждать, что врач уведомлён,
пока интеграция не подтвердила доставку. Обычный опрос после кризиса сам не возобновляется.
Хранить ответы, версию шкалы/политики, период, время из `app.core.clock`, исходные
и выведенные значения раздельно, флаги и состояние полноты. Новые ключи C-SSRS
не подменяют старый cssrs_6. Нельзя сравнивать динамику разных версий и периодов
как одну и ту же шкалу. Клинические данные не отправляются переводчикам.
## Проверка
`make lint && make test`. Новые тесты проверяют все 45 допустимых наборов
RUS-AUDIT-S для каждого пола, границы полной формы, отрицательную и положительную
ветви C-SSRS, давнее поведение, пропуски/противоречия, кризис на неполном опросе,
конфликт PHQ-9/9 и C-SSRS, пороги маршрутов, независимые направления и отсутствие
разрешения на автоматический переход без реального решения врача.