[bot][A] Движок диалога: конвейер scrub → safety → FSM → мониторинг, согласие, возраст, кризис #10
Notifications
Due Date
No due date set.
Blocks
Depends on
#11 [bot][A] Telegram-адаптер (aiogram 3) поверх движка
MedITron/PTSRaiAgent
#20 [bot][A] Семьи: ветка «Я близкий» — PHQ-4, HITS, нагрузка, чек-лист признаков, «сообщить врачу», приглашение
MedITron/PTSRaiAgent
#2 [core] privacy: scrub() и pseudo_id() + тесты
MedITron/PTSRaiAgent
#5 [core] Движок правил алертов и действий (config/rules.yaml) + демо-часы
MedITron/PTSRaiAgent
#3 [core] Движок шкал: схема config/scales + скоринг PHQ-9, GAD-7, PCL-5, AUDIT-C, PC-PTSD-5, C-SSRS
MedITron/PTSRaiAgent
#4 [core] Safety: лексикон + LLM-сигнал, кризисный скрипт, recall 100% на наборе
MedITron/PTSRaiAgent
#7 [bot] LLM-шлюз: GigaChat + mock, extract / risk_classify / phrase / summarize
MedITron/PTSRaiAgent
#6 [backend] Модель данных: identity / clinical / audit, репозитории, create_all
MedITron/PTSRaiAgent
Reference: MedITron/PTSRaiAgent#10
Reference in New Issue
Block a user
Описание
Ядро диалога, общее для всех трёх направлений. Реализует
DialogEngineизapp/dialog/contracts.py(ADR-004). Поток SPEC §3:scrub()→safety.check()(+risk_classifyкак доп. сигнал) → FSM по состоянию → сохранение (app.db.repo) →MonitoringService.after_data_change()→ исполнение диалоговых действий.Желаемый результат
app/dialog/engine.py:Engine.handle(token, event); состояние вdialog_state(repo); сообщения вmessagesтолько scrubbed.app/dialog/flows/<module>.pyбез правки движка.new → consent → age_gate → (flow модуля) → idle,crisis(выход только после ack врача — флаг из repo),consent_revoked(бот замолкает, данные помечены к удалению).ACUTE→safety.crisis_reply()дословно, LLM не вызывается, повторно скрипт в том же кризисе не шлётся;POSSIBLE→cssrs_screen.Action(schedule_scale, med_info, reach_out, show_safety_plan, suggest_visit) → реплики.tests/test_dialog_engine.py: согласие, отказ, < 18, кризис без LLM, possible → C-SSRS, повторный кризис.Зона и владение файлами
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/engine.py: конвейер scrub → safety (сначала лексикон, при ACUTE LLM не вызывается) → FSM → сохранение →after_data_change→ диалоговые действия;register_engine(Engine).app/dialog/fsm.py(@state,@on_enter,@trigger), автозагрузкаapp/dialog/flows/*;flows/core.py: new → consent → age_gate →<module>.onboarding.start→ idle, crisis, consent_revoked, minor, refused.app/dialog/scale_session.py— переиспользуемая сессия шкалы;app/dialog/actions.py— исполнение действий мониторинга;app/dialog/crisis.py.config/texts/dialog.yaml— согласие (152-ФЗ), возраст, меню, кризис, план безопасности (черновик, утверждает психиатр #8).tests/test_dialog_engine.py.Результат
get_engine()возвращает настоящий движок;make lint testзелёные.Заметки/решения
NoopMonitoring, выйти изcrisisможно только поdoctor_ack.dialog_state.dataпишутся фактыsafety_events,crisis,contact_requests,delete_requested; формат описан в PR.[bot] Диалоговый движок (FSM, канал-независимый): согласие → скрининг/триаж → чек-ины → шкалы → кризисto [bot][A] Движок диалога: конвейер scrub → safety → FSM → мониторинг, согласие, возраст, кризис