API этапа 1 на реальных данных вместо фикстур (пути/схемы app/api/schemas.py без изменений):
список пациентов врача: цвет по открытым алертам (ADR-006), PHQ-9/PCL-5, тренд, приверженность 7 дн., индекс риска прерывания терапии (правила, веса в app/api/doctor_views.py), день терапии, последнее событие; сортировка red→yellow→grey→green, затем риск;
карточка (ряды, дозы, алерты, план безопасности, саммари build_summary), 403 для чужого врача, аудит view_patient;
лента алертов (since_id/open_only), ack (+аудит), ack острого → doctor_ack в движок → пациент выходит из кризиса;
подключение пациента: identity + профиль + назначение + одноразовый код + deep link;
диалог: события → движок, outbox, история; демо: часы, reset (+scripts.seed_demo.reset() если есть), персоны по data/synthetic/*.jsonl.
Lane B (backend): app/api/routes.py, app/api/doctor_views.py, app/api/demo.py, tests/test_api_doctor.py, tests/test_api_dialog.py. Также заменён tests/test_contracts.py::test_api_fixture_routes (проверял фикстуры в роутерах).
Как проверить
make lint test; вручную: make up && make seed, GET /api/v1/doctors/doc-smirnova/patients.
Чек-лист
rebase на origin/dev
make lint + make test зелёные
лог в issue (### 2026-10-04)
нет ПДн в логах, нет реальных данных, нет секретов
## Что меняется
API этапа 1 на реальных данных вместо фикстур (пути/схемы `app/api/schemas.py` без изменений):
- список пациентов врача: цвет по открытым алертам (ADR-006), PHQ-9/PCL-5, тренд, приверженность 7 дн., индекс риска прерывания терапии (правила, веса в `app/api/doctor_views.py`), день терапии, последнее событие; сортировка red→yellow→grey→green, затем риск;
- карточка (ряды, дозы, алерты, план безопасности, саммари `build_summary`), 403 для чужого врача, аудит `view_patient`;
- лента алертов (since_id/open_only), ack (+аудит), ack острого → `doctor_ack` в движок → пациент выходит из кризиса;
- подключение пациента: identity + профиль + назначение + одноразовый код + deep link;
- диалог: события → движок, outbox, история; демо: часы, reset (+`scripts.seed_demo.reset()` если есть), персоны по `data/synthetic/*.jsonl`.
Closes #12
## Зона
Lane B (backend): `app/api/routes.py`, `app/api/doctor_views.py`, `app/api/demo.py`, `tests/test_api_doctor.py`, `tests/test_api_dialog.py`. Также заменён `tests/test_contracts.py::test_api_fixture_routes` (проверял фикстуры в роутерах).
## Как проверить
`make lint test`; вручную: `make up && make seed`, `GET /api/v1/doctors/doc-smirnova/patients`.
## Чек-лист
- [x] rebase на origin/dev
- [x] make lint + make test зелёные
- [x] лог в issue (### 2026-10-04)
- [x] нет ПДн в логах, нет реальных данных, нет секретов
- [x] общие файлы не трогались
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Doctor list/card/alerts/ack/connect, dialog events/outbox/history and demo
controls now read the identity and clinical DBs. Rule-based discontinuation
risk index, trend, adherence; every doctor read is audited.
Refs #12
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
API этапа 1 на реальных данных вместо фикстур (пути/схемы
app/api/schemas.pyбез изменений):app/api/doctor_views.py), день терапии, последнее событие; сортировка red→yellow→grey→green, затем риск;build_summary), 403 для чужого врача, аудитview_patient;doctor_ackв движок → пациент выходит из кризиса;scripts.seed_demo.reset()если есть), персоны поdata/synthetic/*.jsonl.Closes #12
Зона
Lane B (backend):
app/api/routes.py,app/api/doctor_views.py,app/api/demo.py,tests/test_api_doctor.py,tests/test_api_dialog.py. Также заменёнtests/test_contracts.py::test_api_fixture_routes(проверял фикстуры в роутерах).Как проверить
make lint test; вручную:make up && make seed,GET /api/v1/doctors/doc-smirnova/patients.Чек-лист
🤖 Generated with Claude Code