[backend][B] API этапа 1: реальная реализация вместо фикстур #12

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

Описание

Контракт-PR создал app/api/schemas.py и ручки с фикстурами; здесь — реальная логика при тех же схемах (схемы не менять без contract-PR). Каждое чтение карточки → audit_log (view_patient).

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

/api/v1: список пациентов врача (цвет, PHQ-9/PCL-5, тренд, приверженность 7 дн., индекс риска прерывания терапии, день терапии, последнее событие), карточка (ряды шкал, настроение/сон/алкоголь, дозы, алерты, план безопасности, саммари из app/llm/summary.py), ack алерта (+аудит), поллинг новых алертов, подключение пациента (назначение → mis_mock, код/QR), сообщения/кнопки в диалог → get_engine(), история + outbox, демо-часы (advance/reset). Тесты tests/test_api_*.py.

Зона и владение файлами

Lane B (backend) — владеет: app/api/** (кроме schemas.py), app/services/**, app/scheduler/**, app/integrations/** (кроме base.py), app/db/**, scripts/**, data/**, tests/test_api*.py, tests/test_services*.py, tests/test_scheduler*.py, tests/test_seed*.py, tests/test_integrations*.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-04

2026-10-04

Что сделано

  • app/api/routes.py: все ручки /api/v1 читают identity/clinical БД вместо фикстур; пути и схемы (schemas.py) не менялись.
  • app/api/doctor_views.py: строка списка (цвет по открытым алертам ADR-006, PHQ-9/PCL-5, тренд, приверженность 7 дн., день терапии, последнее событие), карточка (ряды настроение/сон по серединам бакетов/алкоголь 0/1/2, шкалы с флагом unscheduled, дозы, алерты, план безопасности из safety_plans), детерминированный индекс риска прерывания терапии (веса задокументированы в коде).
  • app/api/demo.py: персоны по файлам data/synthetic/<slug>.jsonl, reset (часы + outbox + scripts.seed_demo.reset() если есть), deep link (t.me/<bot>?start= если бот запущен, иначе /console?code=), поиск MemoryOutbox за TelegramOutbox.
  • Ack острого алерта → Event(system="doctor_ack") в движок (если острых открытых больше нет), ответ уходит в outbox, статус пересчитывается.
  • Подключение пациента: identity-пациент (token = pseudo_id(СНИЛС)), профиль, назначение, одноразовый код, аудит connect_patient.
  • Аудит: view_patient_list, view_patient, view_patient_denied, view_alerts (только если отданы новые алерты), ack_alert, connect_patient.
  • Тесты: tests/test_api_doctor.py (8), tests/test_api_dialog.py (9); tests/test_contracts.py::test_api_fixture_routes заменён (роуты больше не отдают фикстуры).

Результат

  • make lint test зелёные (796 passed). Ветка feat/12-api.

Заметки/решения

  • Индекс риска: пропуски ≥3/7 дн. 30 (1–2 дн. 15), побочки ≥3 дн. подряд 20 (1–2 дн. 10), намерение бросить за 14 дн. 25, открытый алерт quit_intent +15, настроение ≤3 ≥3 дн. подряд 15, алкоголь ≥3/7 дн. 15 (1–2 дн. 5); cap 100; ≥60 high, ≥30 medium.
  • Тренд: последние две полные PHQ-9 или PCL-5 (у кого пара свежее); изменение < 3 (PHQ-9) / < 5 (PCL-5) = flat.
  • Чужой врач → 403 на карточку и ack. СНИЛС/телефон в ответы не попадают (проверено тестом).
  • app/config.py не трогал: username бота берётся у запущенного aiogram-бота (bot.me()).
  • Конфликт с веткой Arxip222 будет только в теле /demo/personas (там фикстура → берите реализацию из dev); строки include роутеров мержатся чисто.
## Описание Контракт-PR создал `app/api/schemas.py` и ручки с фикстурами; здесь — реальная логика при тех же схемах (схемы не менять без contract-PR). Каждое чтение карточки → `audit_log` (`view_patient`). ## Желаемый результат `/api/v1`: список пациентов врача (цвет, PHQ-9/PCL-5, тренд, приверженность 7 дн., индекс риска прерывания терапии, день терапии, последнее событие), карточка (ряды шкал, настроение/сон/алкоголь, дозы, алерты, план безопасности, саммари из `app/llm/summary.py`), ack алерта (+аудит), поллинг новых алертов, подключение пациента (назначение → mis_mock, код/QR), сообщения/кнопки в диалог → `get_engine()`, история + outbox, демо-часы (advance/reset). Тесты `tests/test_api_*.py`. ## Зона и владение файлами **Lane B (backend)** — владеет: `app/api/**` (кроме `schemas.py`), `app/services/**`, `app/scheduler/**`, `app/integrations/**` (кроме `base.py`), `app/db/**`, `scripts/**`, `data/**`, `tests/test_api*.py`, `tests/test_services*.py`, `tests/test_scheduler*.py`, `tests/test_seed*.py`, `tests/test_integrations*.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-04 ### 2026-10-04 **Что сделано** - `app/api/routes.py`: все ручки `/api/v1` читают identity/clinical БД вместо фикстур; пути и схемы (`schemas.py`) не менялись. - `app/api/doctor_views.py`: строка списка (цвет по открытым алертам ADR-006, PHQ-9/PCL-5, тренд, приверженность 7 дн., день терапии, последнее событие), карточка (ряды настроение/сон по серединам бакетов/алкоголь 0/1/2, шкалы с флагом unscheduled, дозы, алерты, план безопасности из `safety_plans`), детерминированный индекс риска прерывания терапии (веса задокументированы в коде). - `app/api/demo.py`: персоны по файлам `data/synthetic/<slug>.jsonl`, reset (часы + outbox + `scripts.seed_demo.reset()` если есть), deep link (`t.me/<bot>?start=` если бот запущен, иначе `/console?code=`), поиск MemoryOutbox за TelegramOutbox. - Ack острого алерта → `Event(system="doctor_ack")` в движок (если острых открытых больше нет), ответ уходит в outbox, статус пересчитывается. - Подключение пациента: identity-пациент (token = pseudo_id(СНИЛС)), профиль, назначение, одноразовый код, аудит `connect_patient`. - Аудит: `view_patient_list`, `view_patient`, `view_patient_denied`, `view_alerts` (только если отданы новые алерты), `ack_alert`, `connect_patient`. - Тесты: `tests/test_api_doctor.py` (8), `tests/test_api_dialog.py` (9); `tests/test_contracts.py::test_api_fixture_routes` заменён (роуты больше не отдают фикстуры). **Результат** - `make lint test` зелёные (796 passed). Ветка `feat/12-api`. **Заметки/решения** - Индекс риска: пропуски ≥3/7 дн. 30 (1–2 дн. 15), побочки ≥3 дн. подряд 20 (1–2 дн. 10), намерение бросить за 14 дн. 25, открытый алерт quit_intent +15, настроение ≤3 ≥3 дн. подряд 15, алкоголь ≥3/7 дн. 15 (1–2 дн. 5); cap 100; ≥60 high, ≥30 medium. - Тренд: последние две полные PHQ-9 или PCL-5 (у кого пара свежее); изменение < 3 (PHQ-9) / < 5 (PCL-5) = flat. - Чужой врач → 403 на карточку и ack. СНИЛС/телефон в ответы не попадают (проверено тестом). - `app/config.py` не трогал: username бота берётся у запущенного aiogram-бота (`bot.me()`). - Конфликт с веткой Arxip222 будет только в теле `/demo/personas` (там фикстура → берите реализацию из dev); строки include роутеров мержатся чисто.
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 14:38:55 +03:00
Eleboba added the P0size/1backendfeature labels 2026-10-03 14:38:55 +03:00
Eleboba changed title from [backend] API: пациенты, карточка, алерты/ack, подключение пациента, сообщения, демо-часы to [backend][B] API этапа 1: реальная реализация вместо фикстур 2026-10-03 15:16:35 +03:00
Eleboba added the lane/Bstage/veterans labels 2026-10-03 15:16:36 +03:00
Eleboba self-assigned this 2026-10-04 12:23:06 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#12