feat(questionnaire): integrate revised intake and follow-up monitoring
CI / ruff · pytest (pull_request) Successful in 55s

Add gated TSQ, Russian C-SSRS Recent, durable responses and notifications, diaries, schedules and audited clinical review. Preserve manual assessment when the Russian follow-up source is unavailable.

Refs #52
This commit is contained in:
Pavel Eliseev
2026-10-03 18:19:34 +03:00
parent 8b61eecf1b
commit c42ef621e5
34 changed files with 2556 additions and 85 deletions
+117
View File
@@ -0,0 +1,117 @@
# Реализация обновлённого опросника — PR #53
Спецификация: 19-страничный PDF, SHA-256
`b5e1cfd2b292526a8cec3bbb679294a90a446c4104a3615c0d8fcbf10e12fc0e`.
Состояние: техническая реализация для проверки; клиническое включение закрыто.
## Состав
- Первичный диалог: официальный русский C-SSRS Recent с условными переходами,
PHQ-2 → PHQ-9 при сумме ≥2, фильтр травмы → TSQ → PCL-5 при TSQ ≥6,
RUS-AUDIT-S 3/9/10 → полная форма по отдельно утверждаемому условию.
Вопросы о недавности травмы, ЧМТ и психотропных препаратах сохраняются отдельно.
- TSQ: дословная инструкция и десять пунктов приложения Г1, с.129–130 PDF
клинических рекомендаций 2023 года. Копия, источник и хеш —
`tsq-guideline-2023.pdf`, `tsq-source.json`. Актуальность редакции не подтверждена.
- Полная алкогольная форма сохраняет ответы 3/9/10 без повторного суммирования;
п.1=0 выводит только п.2=0. Конфликт с положительным п.3 передаётся на проверку.
Отказ указать пол не подменяется выбором мужских или женских границ.
- PHQ/PCL взяты из новой версии PDF; обратный перевод и таблица согласования
находятся в `revision-2026-10-03-v2/`. Тексты не считаются согласованными.
- Дневник: настроение, часы сна, восстановление после сна, приём лекарств и причина
пропуска, переносимость, вещества, необязательный комментарий; модули ПТСР,
депрессии, суицидальных мыслей. У группы с риском вопрос о мыслях задаётся первым.
Общая сумма дневника не вычисляется.
- Повторы: 7/14/28 дней от начала/смены терапии, затем 28; после кризиса PHQ-9 — 7,
PCL-5 — 14 с недельным периодом; специалист — 14/30; самопомощь — 28/28;
RUS-AUDIT-S — 30. При пересечении выбирается ближайшая дата. ЧМТ и алкогольные
направления сохраняются параллельно основному.
- Повторные PHQ/PCL сохраняют маршрут и изменение относительно последнего полного
результата той же версии и периода. Рост ≥5/≥10 помечается для повторного триажа.
Недельный PCL-5 не сравнивается с месячным. Переносимость уточняется при повторе
на фоне зафиксированной терапии.
## Остановка и работа врача
Положительный PHQ-9/9, высокий сигнал C-SSRS, мысли о смерти в дневнике и кнопка
помощи немедленно останавливают обычные вопросы. Сохраняются частичные ответы,
причина, дополнительные флаги и обращение. Кризисный ответ содержит 112 и кнопку
плана безопасности. Средний риск C-SSRS требует оценки специалиста; низкий при
утверждённой политике `graded` показывает план безопасности и обращение врачу.
Альтернатива `stop_any` прекращает опрос при первом «Да». Выбор остаётся за врачом.
**Русский Since Last Contact не получен.** При повторном мониторинге создаётся
отдельное задание для оценки специалистом; Recent не переименовывается и не
выдаётся за повторную форму. Перед дневником/плановым мониторингом предусмотрено
одно такое задание на местный календарный день. Обычный сценарий ждёт решения
врача. Это явно обозначенный временный порядок, который также требует согласования.
Дневниковое «Да» не ждёт окончания дневника или этой плановой процедуры.
Новые служебные маршруты:
- `GET /api/v1/patients/{token}/questionnaires?doctor_id=...` — ответы, версия,
периоды и результаты; чтение записывается в аудит.
- `POST /api/v1/patients/{token}/questionnaires/{record_id}/review` — поля
`doctor_id`, `assessment_performed: true`, `decision: resume | keep_hold`,
`reference` (идентификатор решения, без ФИО/свободного медицинского текста).
Проверяются принадлежность пациента врачу, согласие и статус записи.
Решение сохраняется с датой и аудитом. При открытом кризисе продолжение запрещено.
Простое подтверждение получения уведомления не снимает этот запрет проверки.
Как и остальной API этой ветки, эти маршруты предназначены для синтетического
прототипа: `doctor_id` передаёт вызывающая сторона. Перед реальными данными нужна
аутентификация врача; существующая карточка дашборда остаётся отдельной заглушкой.
## Надёжность и данные
Три новые таблицы: `questionnaire_records`, `questionnaire_notices`,
`questionnaire_tasks`. Они создаются существующим `init_db`; прежние результаты
шкал не переименовываются и не мигрируют. Ответ, переход и обращение фиксируются
в одной транзакции. Неполные суммы — `null`, C-SSRS не получает суммарного балла.
Выведенный п.2 RUS-AUDIT отмечается в `derived`, отсутствуя среди исходных ответов.
Период привязан к началу конкретного заполнения; у каждого ответа есть время.
Повторное нажатие и кнопка от другого вопроса не меняют следующий ответ.
Приостановленный опрос восстанавливается по сохранённой записи; смена версии
переводит его на проверку. После кризиса автоматического продолжения нет.
Отзыв согласия отменяет незавершённые записи, задания и неотправленные обращения.
Обращения врачу повторяются после ошибки с ограниченной задержкой; в ошибках
сохраняется только класс исключения. `accepted_by_adapter` означает приём адаптером,
`test_sink` — сохранение демонстрационным адаптером. Доставка человеку не утверждается.
Исходящие плановые сообщения сохраняются в задании до попытки отправки. Протокол
канала не поддерживает ключ идемпотентности: после падения между отправкой и
фиксацией возможна повторная доставка; потеря очереди внутри MemoryOutbox после
перезапуска также не является подтверждённой доставкой. Для реального запуска
нужен постоянный адаптер с подтверждением доставки.
Планировщик использует часы приложения и Europe/Moscow. PostgreSQL блокирует
параллельные запуски планировщика advisory lock, ответы пациента — блокировкой
строки. В SQLite демонстрации используется один процесс. Пропущенные тики не
создают пачку исторических анкет. Перезапуск не создаёт новое открытое задание
того же типа. Изменение схемы лекарств должно иметь новую дату начала в источнике
назначений; изменение дозировки без даты не угадывается.
## Предложенные определения для согласования
В `config/intake_runtime.yaml`: семь полных календарных дней ДО трёх дней ухудшения
образуют базовый уровень; пропуски не заменяются нулями. Для каждой из трёх ночей
проверяется «сон <4 часов ИЛИ кошмары ≥3». Только явное «не принимал» три дня подряд
считается пропуском; частичный приём и побочные эффекты — отдельные флаги.
Два дня без завершённого дневника в группе риска создают обращение для контакта;
сам звонок этим кодом не выполняется. При двух модулях подробные вопросы ПТСР и депрессии чередуются по календарным
дням; вопросы о риске остаются ежедневно. Обещание заполнить за одну минуту не используется. Якоря положительных показателей
и разбиение вопроса о сне — кандидатные формулировки для врача.
## Включение и остающиеся внешние действия
По умолчанию `enabled: false`; все подписи пусты. Для включения нужны решение по
C-SSRS, порог расширения алкоголя (сумма ИЛИ зона), подпись политики и три подписи
той же версии runtime: маршрутизация/дневники/расписания, содержание, контакты.
Тестовые подписи создаются только во временных каталогах тестов. После изменения
конфигурации требуется перезапуск приложения.
До работы с пациентами остаются: врачебное согласование, независимая проверка
перевода, проверка актуальной редакции КР и условий использования TSQ, получение
русского Since Last Contact, операционная проверка линий и готовности дежурного.
Публикация PR не выполняет ни один из этих пунктов.
+12 -9
View File
@@ -10,8 +10,10 @@
Получена дополненная версия от 3 октября. [Разбор изменений](revision-2026-10-03-v2/REVIEW.md)
и [рабочий обратный перевод](revision-2026-10-03-v2/backtranslation-draft.md) сохранены
отдельно. TSQ заменил симптомные вопросы PC-PTSD-5; добавлены дневник и расписания.
**Код пока следует предыдущей версии, новая спецификация ещё не реализована.**
Текст TSQ в новом PDF отсутствует: перечислены только темы.
**Новая спецификация подключена к диалогу за закрытым переключателем.**
[Состав реализации, ограничения и порядок проверки](IMPLEMENTATION.md).
Текст TSQ получен отдельно из приложения Г1 клинических рекомендаций 2023 года;
актуальность этой редакции ещё нужно подтвердить.
Независимая проверка перевода остаётся pending.
Описания реализованных правил и ссылки на страницы ниже относятся к исходному
14-страничному PDF, если явно не указана новая версия.
@@ -21,9 +23,9 @@
`app/core/questionnaire.py` содержит детерминированные правила первичного опроса:
короткий PHQ-2 из первых двух ответов PHQ-9, фильтр травмы PC-PTSD-5,
условное дополнение до полных шкал, RUS-AUDIT-S, структуру C-SSRS Recent,
приоритет основного маршрута и параллельные направления. Это новый модуль для
интеграции после проверки, а не уже подключённый сценарий бота. Существующие
контракты, `config/modules.yaml`, мониторинг и исторические результаты не менялись.
приоритет основного маршрута и параллельные направления. Правила подключены к версионированному диалогу, дневнику и планировщику.
Замороженные контракты, `config/modules.yaml` и исторические результаты не менялись.
Клиническое включение заблокировано до подписей.
`config/questionnaire.yaml` фиксирует **кандидатные** пороги из PDF. Политика без
записи врача не выдаёт обычный маршрут. Положительный PHQ-9/9, известный высокий
@@ -58,7 +60,7 @@ DOI 10.17116/profmed20222508121. Рисунок визуально провер
При дополнении до полной шкалы остаются пункты 1,2,4,5,6,7,8. Ответы на 3,9,10
переиспользуются по исходным ID и не суммируются дважды. Записывать версию и факт
получения ответа в краткой форме: её пояснение травмы отличается от полного текста.
Правило PDF `п.1 = 0` может вывести нули только для 2/3, **не для 9/10**;
Правило PDF `п.1 = 0` в новой версии выводит ноль только для 2; исходный 3 сохраняется, как и 9/10;
выведенные ответы возвращаются отдельно в `derived`, исходный словарь не меняется.
Полная форма и её зоны взяты из пользовательского PDF с.7–9, транскрипция является
@@ -152,9 +154,9 @@ q6 за всю жизнь всем; при положительном q6 уто
| ID | Решение, которое нужно зафиксировать | Статус |
|---|---|---|
| C01 | Любой «Да» останавливает обычный опрос или разрешено продолжение после низкого риска? Различить обычный опрос, уточнение риска и кризисную помощь. Новый PDF с.1 против с.12; в старом с.1 против с.11. Скриншот поддерживает остановку. | pending |
| C02 | С какой зоны RUS-AUDIT-S дополнять полную форму? Не переносить порог AUDIT-C ≥3/≥4. | pending |
| C02 | Использовать сумму ≥1 или согласованную границу зоны для расширения RUS-AUDIT-S? Не переносить порог AUDIT-C ≥3/≥4. | pending |
| C03 | Самозаполнение полного RUS-AUDIT, таблица стандартных порций, порядок дополнения и повторные замеры. | pending |
| C04 | Новая спецификация: TSQ ≥6 вместо PC-PTSD-5 ≥3; получить приложение Г1, согласовать применение и PCL-5 ≥31 для популяции. Код пока использует PC-PTSD-5. | pending |
| C04 | Новая спецификация: TSQ ≥6 вместо PC-PTSD-5 ≥3; получить приложение Г1, согласовать применение и PCL-5 ≥31 для популяции. TSQ из приложения Г1 редакции 2023 года уже добавлен; актуальность редакции и применение требуют подтверждения. | pending |
| C05 | Привязка PHQ-9/PCL-5 к специалистам, сроки срочной помощи, параллельные маршруты и состав флагов. | pending |
| C06 | Официальный русский C-SSRS: версия, возраст/популяция, применение Recent и Since Last Contact. | pending |
| C07 | Как отвечает живой дежурный, что делать при недоступности, когда подтверждать уведомление врачу. | pending |
@@ -170,7 +172,8 @@ q6 за всю жизнь всем; при положительном q6 уто
## Подключение к диалогу
Адаптер вызывает `evaluate_intake` после каждого ответа и на ручной кнопке помощи.
Адаптер проверяет непосредственные сигналы после каждого ответа и на кнопке помощи;
при завершении вызывает `evaluate_intake` для общего маршрута.
`crisis` открывает фиксированную кризисную ветку до LLM; `clinical_review_required`
не разрешает автоматическое продолжение; `incomplete` запрашивает обязательные
пропуски; `ready` содержит основной маршрут и отдельные параллельные направления.
+14 -5
View File
@@ -10,11 +10,20 @@
| Московская служба психологической помощи | 051 с городского; 8 (495) 051 с мобильного | Москва, региональный ресурс | [Страница службы](https://msph.ru/uslugi/neotlozhnaya-psikhologicheskaya-pomoshch): круглосуточно; городской звонок бесплатный, мобильный тарифицируется оператором. Не преобразовывать необычный короткий номер в выдуманный E.164. |
| Детский телефон доверия | 8-800-2000-122 | Дети, подростки и родители по вопросам ребёнка | [Официальная страница](https://telefon-doveria.ru/about/): аудитория, анонимность и бесплатность. Не универсальная взрослая кризисная линия. Часы работы конкретного регионального подразделения нужно уточнить. |
В существующем `config/texts/crisis.yaml` номер 8-800-2000-122 ошибочно подписан
просто «Телефон доверия» для всех пациентов. Взрослой ветке нужен ресурс для взрослых;
детский оставить с точной аудиторией. Замена номера и текстов в активном диалоге
должна быть согласована с владельцем кризисного сценария и врачом (#8).
Этот пакет проверок сам по себе активный кризисный экран не меняет.
В `config/texts/crisis.yaml` универсальная взрослая ветка исправлена на линию МЧС;
детский номер сохранён в возрастной ветке с указанием аудитории. Безусловное
обещание уведомления врача удалено. Формулировки и готовность линий требуют
согласования перед включением нового опросника.
## Дополнения из новой версии PDF
| Ресурс | Проверка источника | Ограничение |
|---|---|---|
| МГППУ, 8-800-600-31-14 | [Сообщение МГППУ](https://mgppu.ru/news/10402) публикует номер для детей и родителей | Не включён как универсальная линия для всех взрослых; часы и доступность проверить у службы. |
| Санкт-Петербург, 8 (812) 708-40-41 | [Справочник администрации](https://www.gov.spb.ru/gov/admgub/obrasheniya/faq/13551/) указывает телефон Института «Гармония» для детей и взрослых | Региональный ресурс; охват Ленинградской области отдельно не подтверждён. Повторное открытие страницы дало ошибку; перед включением перепроверить. |
| Фонд «Защитники Отечества», 117, доб.1 | [Страница государственного медучреждения](https://xn--7--9kcgbq1fn7g.xn--p1ai/информация-для-участников-специальн/) указывает номер фонда | Сайт самого фонда при проверке недоступен. Номер поддержки ветеранов и семей не объявляется круглосуточной экстренной психиатрической линией. В активный кризисный экран не добавлен. |
Звонки по этим трём позициям также не выполнены.
Номер 112 проверять тестовым вызовом нельзя. Его назначение — реальная экстренная
ситуация. Технический тест `tel:112` проводить без совершения вызова. Для прочих
+11 -10
View File
@@ -26,21 +26,18 @@
"note": "User supplied the file after the official-source download workflow was blocked. Local content and colors checked; publisher version is not inferred from PDF metadata."
},
"intake_release_ready": false,
"policy_version": "mvp-review-2026-10-03",
"policy_version": "mvp-v2-review-2026-10-03",
"latest_specification": {
"source_pdf": "revision-2026-10-03-v2/questionnaires-mvp-v2.pdf",
"sha256": "b5e1cfd2b292526a8cec3bbb679294a90a446c4104a3615c0d8fcbf10e12fc0e",
"pages": 19,
"review": "revision-2026-10-03-v2/REVIEW.md",
"implemented": false,
"pending_changes": [
"tsq_replaces_pcptsd5",
"alcohol_q1_zero_derives_q2_only",
"daily_diary",
"medication_followup_schedule"
],
"tsq_verbatim_source_verified": false,
"current_guideline_edition_verified": false
"implemented": true,
"pending_changes": [],
"tsq_verbatim_source_verified": true,
"current_guideline_edition_verified": false,
"implementation_scope": "gated_intake_diaries_schedules_manual_followup_risk_review",
"implementation": "IMPLEMENTATION.md"
},
"backtranslation": {
"units": 32,
@@ -48,5 +45,9 @@
"reconciliation": "revision-2026-10-03-v2/translation-reconciliation.tsv",
"clinician_approval": null,
"independent_review": "not_performed"
},
"cssrs_since_contact": {
"russian_source_received": false,
"fallback": "clinician_assessment_required_before_routine_monitoring"
}
}
+13 -12
View File
@@ -5,22 +5,25 @@
в `source-manifest.json`. Все страницы новой версии прочитаны и просмотрены.
Это разбор спецификации и языкового материала, не клиническое согласование.
Технический этап выполнен после разбора: [реализация и ограничения](../IMPLEMENTATION.md).
Ниже сохранены замечания к источнику с обновлённым статусом реализации.
## Что изменилось и как это влияет на реализацию
| Раздел новой версии | Изменение | Состояние реализации / дальнейшее действие |
|---|---|---|
| с.1, 3–4, 13 | TSQ вместо пяти симптомных вопросов PC-PTSD-5: 10 ответов, последняя неделя, реакция не реже двух раз, расширение при ≥6 | Текущий `evaluate_intake` ещё использует PC-PTSD-5 и порог 3. Нужны новая версия шкалы и миграция правил; переименования недостаточно. |
| с.1, 3–4, 13 | TSQ вместо пяти симптомных вопросов PC-PTSD-5: 10 ответов, последняя неделя, реакция не реже двух раз, расширение при ≥6 | Реализован TSQ из приложения Г1 редакции 2023 года: 10 пунктов, порог 6; прежние результаты не переименованы. |
| с.3 | Вступление и фильтр травмы PC-PTSD-5 сохранены; при «Нет» TSQ не задаётся | Записывать «не проводился по фильтру», не десять нулевых ответов. Вопрос о травме не является одиннадцатым пунктом TSQ. |
| с.4 | Темы TSQ прямо обозначены как ориентиры, а не готовые вопросы | Нельзя показывать таблицу как официальный опросник. Требуется дословная инструкция и пункты из приложения Г1 с проверенной редакцией. |
| с.4 | Темы TSQ прямо обозначены как ориентиры, а не готовые вопросы | Нельзя показывать таблицу как официальный опросник. Дословный текст получен из приложения Г1 редакции 2023 года; актуальность редакции ещё не подтверждена. |
| с.5–7 | Обосновано сохранение PCL-5 вместо IES-R; предложено сравнение на пилоте | 20 русских пунктов, инструкции и варианты PCL-5 не изменились; поменялось расположение на страницах. Пилот и валидация не выполнены. |
| с.8–10 | RUS-AUDIT-S исправлен на 3/9/10; повтор тоже краткой формой | Совпадает с уже реализованным составом. Временное расширение при любом ненулевом ответе не равно переходу с зоны II. Решение C02 остаётся открытым. |
| с.8 | При п.1=0 теперь явно пропускается только п.2 | Текущий модуль выводит нули для п.2 и п.3 по старому источнику. В новом потоке п.3 уже задан на первом этапе: сохранить исходный ответ, противоречие уточнить. Изменение кода ещё не внесено. |
| с.8 | При п.1=0 теперь явно пропускается только п.2 | Исправлено: выводится только п.2=0; п.3 сохраняется. Конфликт останавливает поток для проверки. |
| с.10 | В PDF по-прежнему не вписаны зоны краткой формы | В PR они уже есть по рис.3 Буновой: женщины 0–1 / 2–4 / 5 / ≥6; мужчины 0–3 / 4–6 / 7 / ≥8. Это не автоматическое утверждение порога расширения. |
| с.11–12 | Добавлена ссылка на русские бланки Columbia | Recent уже получен и сверён в PR. Для мониторинга требуется отдельный официальный Since Last Contact; текущий Recent его не заменяет. |
| с.13–14 | Контроль после начала/смены лекарств на 7-й, 14-й, 28-й день, затем каждые 4 недели; при пересечении расписаний — более частое | Нужны дата начала/смены, правила объединения расписаний и вопрос о переносимости. Сам вопрос о побочных эффектах пока не сформулирован. |
| с.14–16 | Ежедневный дневник: ядро, модули ПТСР, депрессии и суицидальных мыслей; тренды и внеплановые опросы | Это новые авторские вопросы и правила, не валидированная сокращённая шкала. В текущий код не добавлены. |
| с.13–14 | Контроль после начала/смены лекарств на 7-й, 14-й, 28-й день, затем каждые 4 недели; при пересечении расписаний — более частое | Расписания и объединение реализованы, вопрос о переносимости добавлен как кандидатный. Требуются согласование и корректные даты изменений назначений. |
| с.14–16 | Ежедневный дневник: ядро, модули ПТСР, депрессии и суицидальных мыслей; тренды и внеплановые опросы | Это новые авторские вопросы и правила, не валидированная сокращённая шкала. Добавлены за закрытым переключателем; определения и якоря ждут согласования. |
| с.16–17 | Добавлена таблица соответствия КР ПТСР ID 753 | Утверждения PDF об актуальной редакции, силе рекомендаций и применимости требуют проверки по первоисточнику; ссылка PDF ведёт на вторичный правовой сайт. |
| с.18–19 | Добавлены кризисные телефоны и аудитории | Это список кандидатов, а не результат проверки доступности. Предыдущая проверка официальных сайтов охватывала 112, МЧС, московскую и детскую линии; новые три позиции отдельно не подтверждены. |
| с.18–19 | Добавлены кризисные телефоны и аудитории | Это список кандидатов, а не результат проверки доступности. Проверка источников дополнена в ../crisis-contacts.md; проверка соединения не выполнена. |
## Противоречия и недостающие определения
@@ -88,12 +91,10 @@ PC-PTSD-5 и его отдельная инструкция о месяце.
## Что остаётся после этого разбора
Текущая реализация соответствует предыдущей спецификации и **не готова к запуску
по новой**. Следующий технический этап: получить точный русский TSQ, заменить
кандидатный PTSD-скрининг с отдельной версией, учесть изменение пропуска п.2
RUS-AUDIT и добавить тесты. Дневник и расписания требуют отдельных задач по
слоям приложения и формализации перечисленных условий. Врачебные решения,
независимая проверка перевода и операционная проверка линий не выполнены.
Техническая реализация новой версии подготовлена в PR #53. Полное описание —
[IMPLEMENTATION.md](../IMPLEMENTATION.md). Клиническое включение остаётся закрытым:
врачебные решения, независимая проверка перевода и операционная проверка линий
не выполнены; отдельная русская форма Since Last Contact не получена.
Попытка проверить актуальную карточку [КР 753_1](https://cr.minzdrav.gov.ru/preview-cr/753_1)
через веб-инструмент не дала доступного содержимого; актуальность редакции
Binary file not shown.
+13
View File
@@ -0,0 +1,13 @@
{
"source_url": "https://emdr.ru/sites/default/files/2024-11/%D0%9A%D0%A0753%20%282%29.pdf",
"publisher": "Российское общество психиатров",
"guideline": "753, 2023",
"pdf": "tsq-guideline-2023.pdf",
"sha256": "d1148603af1114aa588ef206dc1cb00613acd9f19f150983d24bbcc9d50b3a5a",
"pages": [
129,
130
],
"current_edition_verified": false,
"rop_download_6016": "Contains a draft with year 202_; not treated as approved current edition."
}