[core] Движок правил алертов и действий (config/rules.yaml) + демо-часы #5

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

Описание

Детерминированные правила по структурированным данным → алерты и «действия агента» (ADR-007). Время — только из app.core.clock (ADR-005). Цвета — ADR-006.

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

  • app/core/clock.py: now(); режим реальный / виртуальный (advance(days|hours), set(dt)); персистентность смещения (в БД через колбэк или файл).
  • app/core/rules.py: evaluate(snapshot) -> list[Action], где snapshot — последние N дней чек-инов, доз, результатов шкал, модули пациента, возраст. Action = {type: alert|crisis|schedule_scale|ask_followup|med_info|suggest_visit|reach_out, level, reason_code, params}.
  • config/rules.yaml — все правила из SPEC §6 + CLINICAL_MODULES + демо-персоны: п.9 ≥ 1 → crisis; PHQ-9 ≥ 20 / PCL-5 ≥ 50 → high; рост PHQ-9 ≥ 5 / PCL-5 ≥ 10 → high; побочка 3 дня подряд → moderate; намерение бросить → high + med_info; пропуск ≥ 3 из 7 → moderate + reach_out; сон < 4 ч 3 ночи → moderate; алкоголь 3 дня → moderate + med_info(alcohol) + suggest_visit; настроение ≤ 3 три дня → schedule_scale(phq9, unscheduled); молчание > 3 дней → info + reach_out; возраст < 25 и день терапии ≤ 28 → усиленный мониторинг; AUDIT-C ≥ 4/3 → флаг; оружие + риск → crisis-блок.
  • Дедупликация: одно правило не создаёт повторный открытый алерт.
  • Тесты tests/test_rules.py: прогон 13-дневной траектории из docs/product/01_demo_persona.md даёт ровно ожидаемые уровни по дням (🟢🟢🟢🟡🟡🟢🟢🟢🟢🟡🟡🟡🔴).

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

2026-10-03

2026-10-03

  • Что сделано: app/core/clock.py (демо-часы: now(), today(), advance(), set_now(), reset(), offset(), хук персистентности register_persistence(load, save)); config/rules.yaml + app/core/rules.py (17 правил: п.9 PHQ-9, C-SSRS high/moderate, оружие + риск, PHQ-9 ≥ 20, PCL-5 ≥ 50, рост PHQ-9/PCL-5, AUDIT-C по полу, намерение бросить, пропуски 3/7, побочка 3 дня, сон < 4 ч 3 ночи, алкоголь 3 дня, настроение ≤ 3 → внеплановый PHQ-9, молчание > 3 дней, возраст < 25 → усиленный мониторинг); color() / patient_status() по ADR-006.
  • Результат: make lint test зелёный; тесты на каждое правило, дедуп, часы и 13-дневную траекторию персоны — получается ровно 🟢🟢🟢🟡🟡🟢🟢🟢🟢🟡🟡🟡🔴.
  • Заметки/решения: YAML описывает правило (пороги, действия, уровни, reason_ru), Python реализует предикат под тем же id; если для id нет evaluator-а, загрузка падает. Дедуп: если открыт alert с кодом правила, правило молчит целиком (без повторных med_info/reach_out); crisis не подавляется. Серии «N дней подряд» заканчиваются сегодня, а если сегодняшнего чек-ина ещё нет — вчера; пропущенный день серию прерывает. П.9 → crisis только для PHQ-9 за последние 24 ч. Добавлено правило cssrs_moderate → HIGH (SPEC: Safety POSSIBLE). Конфликтов с таблицей персоны нет: дни 11–12 жёлтые, потому что алерты по алкоголю и сну открыты до подтверждения врачом.
## Описание Детерминированные правила по структурированным данным → алерты и «действия агента» (ADR-007). Время — только из `app.core.clock` (ADR-005). Цвета — ADR-006. ## Желаемый результат - `app/core/clock.py`: `now()`; режим реальный / виртуальный (`advance(days|hours)`, `set(dt)`); персистентность смещения (в БД через колбэк или файл). - `app/core/rules.py`: `evaluate(snapshot) -> list[Action]`, где snapshot — последние N дней чек-инов, доз, результатов шкал, модули пациента, возраст. Action = `{type: alert|crisis|schedule_scale|ask_followup|med_info|suggest_visit|reach_out, level, reason_code, params}`. - `config/rules.yaml` — все правила из SPEC §6 + CLINICAL_MODULES + демо-персоны: п.9 ≥ 1 → crisis; PHQ-9 ≥ 20 / PCL-5 ≥ 50 → high; рост PHQ-9 ≥ 5 / PCL-5 ≥ 10 → high; побочка 3 дня подряд → moderate; намерение бросить → high + med_info; пропуск ≥ 3 из 7 → moderate + reach_out; сон < 4 ч 3 ночи → moderate; алкоголь 3 дня → moderate + med_info(alcohol) + suggest_visit; настроение ≤ 3 три дня → schedule_scale(phq9, unscheduled); молчание > 3 дней → info + reach_out; возраст < 25 и день терапии ≤ 28 → усиленный мониторинг; AUDIT-C ≥ 4/3 → флаг; оружие + риск → crisis-блок. - Дедупликация: одно правило не создаёт повторный открытый алерт. - Тесты `tests/test_rules.py`: прогон 13-дневной траектории из `docs/product/01_demo_persona.md` даёт ровно ожидаемые уровни по дням (🟢🟢🟢🟡🟡🟢🟢🟢🟢🟡🟡🟡🔴). --- ## Лог выполнения ### 2026-10-03 ### 2026-10-03 - **Что сделано:** `app/core/clock.py` (демо-часы: `now()`, `today()`, `advance()`, `set_now()`, `reset()`, `offset()`, хук персистентности `register_persistence(load, save)`); `config/rules.yaml` + `app/core/rules.py` (17 правил: п.9 PHQ-9, C-SSRS high/moderate, оружие + риск, PHQ-9 ≥ 20, PCL-5 ≥ 50, рост PHQ-9/PCL-5, AUDIT-C по полу, намерение бросить, пропуски 3/7, побочка 3 дня, сон < 4 ч 3 ночи, алкоголь 3 дня, настроение ≤ 3 → внеплановый PHQ-9, молчание > 3 дней, возраст < 25 → усиленный мониторинг); `color()` / `patient_status()` по ADR-006. - **Результат:** `make lint test` зелёный; тесты на каждое правило, дедуп, часы и 13-дневную траекторию персоны — получается ровно 🟢🟢🟢🟡🟡🟢🟢🟢🟢🟡🟡🟡🔴. - **Заметки/решения:** YAML описывает правило (пороги, действия, уровни, `reason_ru`), Python реализует предикат под тем же id; если для id нет evaluator-а, загрузка падает. Дедуп: если открыт alert с кодом правила, правило молчит целиком (без повторных med_info/reach_out); crisis не подавляется. Серии «N дней подряд» заканчиваются сегодня, а если сегодняшнего чек-ина ещё нет — вчера; пропущенный день серию прерывает. П.9 → crisis только для PHQ-9 за последние 24 ч. Добавлено правило `cssrs_moderate` → HIGH (SPEC: Safety POSSIBLE). Конфликтов с таблицей персоны нет: дни 11–12 жёлтые, потому что алерты по алкоголю и сну открыты до подтверждения врачом.
Eleboba added this to the M1 Каркас milestone 2026-10-03 14:38:52 +03:00
Eleboba added the safetysize/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#5