[bot][A] Ветеран: ежедневный чек-ин, шкалы по расписанию, лекарства и побочные эффекты #37
Notifications
Due Date
No due date set.
Depends on
Reference: MedITron/PTSRaiAgent#37
Reference in New Issue
Block a user
Описание
ADR-002 + CLINICAL_MODULES §1–2. Это «мониторинг после обращения» и «управление приёмом лекарств» из кейса.
Желаемый результат
daily_checkinот шедулера): настроение 0–10 кнопками → сон и кошмары (вопрос модуля veteran) → свободный текст «как вы?» →extract_checkin(побочки, намерение бросить, алкоголь) → сохранение вdaily_checkins→after_data_change.scale_due(PCL-5 и PHQ-9 раз в 2 недели, AUDIT-C раз в месяц, DAR-5 раз в 2 недели, внеплановый PHQ-9 по правилу), п.9 — кнопками, при п.9 ≥ 1 → C-SSRS.med_reminder→ «принял / пропущу / есть побочки» → доза вdoses; побочки → уточнение.tests/test_dialog_veteran_days.py: 13 дней Андрея → ожидаемые реплики и алерты.Зона и владение файлами
Lane A (бот, Егор) — владеет:
app/dialog/**,app/channels/**,app/llm/**,config/texts/**,tests/test_dialog_*.py,tests/test_telegram*.py.Замороженные контракты (менять только отдельным мелким PR с пингом всех):
app/core/types.py,app/dialog/contracts.py,app/api/schemas.py,app/integrations/base.py,app/services/contracts.py,app/main.py,app/config.py,config/modules.yaml,config/rules.yaml,config/scales/*,pyproject.toml/uv.lock,docker-compose.yml,Makefile.Лог выполнения
2026-10-03
2026-10-03
Что сделано
app/dialog/flows/veteran_daily.py: ежедневный чек-инdaily.*(настроение 0–10 → приём, если сегодня не отмечен → сон + кошмары (veteran) → алкоголь (veteran или AUDIT-C+) → свободный текст «Как вы?» со «Пропустить» →extract_checkinпо обезличенному тексту → уточнение количества алкоголя, если упомянут без кнопки). Каждый ответ сразу пишется вdaily_checkins; кнопки важнее LLM. Триггерыsystem:daily_checkin,menu:checkin,menu:visit(просьба «записаться раньше» →data.visit_requests),text:idle. Вступления к плановым шкалам pcl5/phq9/dar5/auditc (exact enter-hookscale.<id>поверх общего).app/dialog/flows/meds.py: напоминаниеsystem:med_reminder→ «Принял» / «Пропущу» (причина: забыл / побочки / решил бросить →quit_intent/ другое) / «Есть побочные эффекты» (коды или свободный текст) →doses+daily_checkins; меню «Вопрос о лекарстве» →med_qaилиfallback_text(); обработчикmed_infoдля правил (выдержка инструкции по разделу + фиксированные тексты).app/dialog/actions.py: аддитивный хукregister_med_info_handler.config/texts/meds.yaml,config/texts/veteran_daily.yaml(черновик, утверждает психиатр #8).tests/test_dialog_veteran_days.py(13 дней Андрея на реальных правилах через дублёр мониторинга),tests/test_dialog_meds.py(23 юнит-теста).Результат
side_effect_3d; д.5 «решил бросить» → отсроченный эффект 2–4 нед. + «врач уведомлён»; д.10 сон+алкоголь → инфо о взаимодействии + «записаться раньше»; д.13 «всё бессмысленно» → C-SSRS → настроение ≤3 ×3 → внеплановый PHQ-9 → п.9=2 → кризисный скрипт + план безопасности +phq9_item9. Цвета по дням совпадают с персоной.make lint testзелёные (661 passed).Заметки/решения
daily_checkins(mood, med_taken, sleep_bucket, alcohol_bucket, side_effects, quit_intent, nightmares, free_text_scrubbed),doses(status taken/skipped/missed, answered_at, side_effects),dialog_state.data:visit_requests,med_pending,checkin_done.scale_dueстартует шкалы без intro (обошёл enter-hook'ом); C-SSRS после п.9 PHQ-9 повторяется в тот же день без кулдауна; кнопки с динамическими данными нельзя повесить на trigger (точное совпадение ключа) — поэтому dose_id хранится вdata.med_pending.intake.checkin.