commit cf2cc8b5f4627b0847232c1d3c626822255982ee Author: Lacky1234union Date: Sat Oct 3 14:36:33 2026 +0300 docs: bootstrap repo — CLAUDE.md, spec, ADR, TenVex-style workflow Co-Authored-By: Claude Opus 5.5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f24cac0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.env +.env.* +!.env.example +.venv/ +__pycache__/ +*.pyc +.pytest_cache/ +.ruff_cache/ +.mypy_cache/ +.claude/worktrees/ +.claude/settings.local.json +*.log +.DS_Store +# исходники от организаторов лежат в docs/source; тяжёлые оригиналы в корне не коммитим +/*.pdf diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..fb0c138 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,80 @@ +# CLAUDE.md — Руководство для Claude Code + +## ⚡ ПЕРВОЕ ДЕЙСТВИЕ В КАЖДОЙ СЕССИИ + +```bash +set -a; . ./.env 2>/dev/null; set +a +``` +Переменные: `GITEA_USER` (кто я), `GITEA_TOKEN` (секрет — **в чат не печатать**), `GITEA_URL`, `GITEA_REPO`. + +--- + +## Что мы строим + +Хакатон MedITron, кейс SberMed AI «ИИ-помощник пациента». **Сопровождение восстановления между визитами к врачу** при ПТСР и депрессии (фокус — ветераны СВО и их семьи): мониторинг после обращения + управление приёмом лекарств. Общее ядро + модули `veteran` / `depression` / `family`, включаемые скринингом. +ИИ не ставит диагнозы и не лечит: LLM извлекает данные и формулирует реплики, **риск и алерты решают детерминированные правила**, клинические решения — врач. + +**Дедлайн: пн 05.10.2026, 13:00 МСК.** Критерии жюри: работоспособность, функциональность, дизайн, клинико-экономика, клиентский путь. + +Язык общения — русский. Код, идентификаторы, коммиты — английский. Тексты для пациента — в `config/texts/`, не в коде. + +--- + +## Карта документации + +> Задачи — в [Gitea Issues](https://gitea.24studbank.ru/MedITron/PTSRaiAgent/issues), не в файлах. + +| Файл | О чём | +|---|---| +| [`docs/info/SPEC.md`](docs/info/SPEC.md) | **Исходная спецификация:** право (152-ФЗ, 323-ФЗ), архитектура, модель данных, шкалы, LLM-контракт, FSM | +| [`docs/info/CLINICAL_MODULES.md`](docs/info/CLINICAL_MODULES.md) | Ядро + модули: шкалы, расписания, триггеры, обоснования | +| [`docs/DECISIONS.md`](docs/DECISIONS.md) | ADR — отступления от SPEC. **При конфликте важнее SPEC** | +| [`docs/product/`](docs/product/) | Идеи команды, демо-персона и сценарий, требования хакатона | +| [`docs/source/`](docs/source/) | Кейс SberMed AI, концепция и CJM (pdf + txt) | +| [`docs/dev/WORKFLOW.md`](docs/dev/WORKFLOW.md) | **Регламент:** зоны, жизненный цикл, worktree, ветки, PR | +| [`docs/dev/GITEA_API.md`](docs/dev/GITEA_API.md) | Gitea API: issue, PR, зависимости | +| [`docs/dev/ISSUE_TEMPLATE.md`](docs/dev/ISSUE_TEMPLATE.md) | Шаблон тела issue | + +--- + +## Guardrails + +Мнемоника: **обезличь, проверь безопасность, реши правилом, спроси часы, запиши в аудит.** + +| # | Правило | Где | +|---|---|---| +| 1 | В LLM — только текст после `scrub()`, только через `app/llm/gateway.py` | `app/core/privacy.py` | +| 2 | Safety-проверка до LLM на каждом входящем; `acute` → фиксированный скрипт, LLM не вызывается | `app/core/safety.py` | +| 3 | Скоринг и алерты детерминированы, «действия агента» — выход правил (ADR-007) | `app/core/rules.py`, `config/rules.yaml` | +| 4 | Время — только `app.core.clock` (демо-часы, ADR-005) | `app/core/clock.py` | +| 5 | identity и clinical — разные БД, связь через HMAC-токен; clinical-код не импортирует identity | `app/db/` | +| 6 | Каждое обращение врача к данным → `audit_log` | `app/db/audit.py` | +| 7 | Пороги, шкалы, тексты, лексикон — в `config/` (ADR-008) | `config/` | +| 8 | Только синтетика; логи без ПДн и без сырого текста; секреты только в `.env` | — | +| 9 | Никаких зарубежных API: LLM = GigaChat или `mock`; офлайн по умолчанию (ADR-004) | `app/llm/` | +| 10 | Одна задача = одна зона; `make lint && make test` перед PR | `docs/dev/WORKFLOW.md` | + +--- + +## TL;DR — командная работа + +1. **`.env` — первым делом.** +2. **Задача = Issue в Gitea.** Нет issue — нет кода. +3. **Зоны:** core / bot / backend / dashboard / devops / clinical / pitch / docs. В занятую чужую не лезь. +4. **Задача = свой worktree** (`.claude/worktrees/-`), ветка от `origin/dev` — до первого изменения. PR в `dev`; `main` — только человек. +5. **Завершил → сразу push + PR**, после зелёного CI можно мержить самому (хакатон). +6. **Лог** — в тело issue (`### YYYY-MM-DD`); архитектурные решения — в `docs/DECISIONS.md`. + +--- + +## Запуск + +```bash +cp .env.example .env +make up # docker compose: postgres + app (API, бот) + dashboard; LLM_PROVIDER=mock по умолчанию +make seed # синтетические пациенты и демо-сюжет +make lint test +``` +Дашборд и демо-консоль: http://localhost:8501 · API: http://localhost:8000/docs + +> Telegram используется только для прототипа на синтетических данных; прод-канал — MAX / Госуслуги. diff --git a/README.md b/README.md new file mode 100644 index 0000000..09cf25f --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# PTSRaiAgent — ИИ-помощник сопровождения при ПТСР и депрессии + +> Хакатон MedITron · кейс SberMed AI «ИИ-помощник пациента». Прототип на **синтетических данных**. +> Telegram используется только для прототипа на синтетических данных; прод-канал — MAX / Госуслуги. + +🚧 README заполняется к сдаче (issue «README по требованиям оформления»). Разделы по требованиям жюри: + +1. Цели и задачи решения +2. Что реализовано +3. Развёртывание, запуск, использование +4. Входные и выходные данные, API +5. Ограничения и особенности медицинской тематики + +Пока смотрите [`CLAUDE.md`](CLAUDE.md) и [`docs/`](docs/). diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md new file mode 100644 index 0000000..18940f3 --- /dev/null +++ b/docs/DECISIONS.md @@ -0,0 +1,48 @@ +# Архитектурные решения (ADR) + +> Живой журнал: **что** решили и **почему**. Новые записи — сверху. Одна запись = одно решение. +> При конфликте с [`docs/info/SPEC.md`](info/SPEC.md) действует ADR. + +## 2026-10-03 — ADR-009: Процесс — регламент TenVex в облегчённом режиме хакатона +**Контекст:** 3 дня, сдача в пн 05.10 в 13:00 МСК. Два разработчика и Claude Code-агенты работают параллельно. Опыт TenVex/vobot: без issue и изоляции агенты конфликтуют. +**Решение:** берём ядро регламента vobot: задача = issue, одна зона на issue, worktree + ветка от `origin/dev`, PR в `dev`, Conventional Commits, лог в теле issue, ADR сюда. Облегчения: PR в `dev` можно мержить самому после зелёного `make lint test`, без обязательного ревью; contract-first/orval нет; `main` = сдаваемая версия, промоушн `dev → main` делает человек. +**Последствия:** регламент — [`docs/dev/WORKFLOW.md`](dev/WORKFLOW.md). + +## 2026-10-03 — ADR-008: Конфиги в `config/`, данные в `data/` +**Контекст:** требования к оформлению: «конфигурационные файлы — в отдельной папке». В SPEC пороги лежали в `data/scales`. +**Решение:** `config/` — шкалы (пункты, диапазоны, градации), расписания модулей, правила алертов, лексикон риска, тексты для пациента (YAML, вычитывает психиатр). `data/` — синтетика, выдержки ГРЛС, eval-разметка. +**Причина:** соответствие чек-листу жюри; психиатр правит только `config/`, не трогая код. + +## 2026-10-03 — ADR-007: «Действия агента» — это выход движка правил, а не tool-calling LLM +**Контекст:** в демо-сценарии действия записаны как вызовы инструментов (`raise_alert`, `notify_doctor`, `crisis_protocol`, `book_visit`). Это выглядит так, будто их решает LLM, а это противоречит правилу «алерты детерминированы». +**Решение:** правила (`config/rules.yaml`) по структурированным данным возвращают список действий; оркестратор их исполняет. LLM только формулирует реплику вокруг уже принятого действия. +**Причина:** юридическая атрибуция ответственности: пороги задаёт врач, ИИ решений не принимает. Это ключевой аргумент для жюри и для специалистов. + +## 2026-10-03 — ADR-006: Цвета в UI ↔ уровни алертов +**Решение:** 🔴 = `acute` (кризис, п.9 ≥ 1, C-SSRS с намерением/планом, доступ к оружию при риске); 🟡 = `high` + `moderate` (врачу ≤ 24 ч / флаг к визиту); 🟢 = нет открытых алертов; `info` (молчание, нет ответа) — серый флаг. В БД хранится уровень, цвет вычисляется. + +## 2026-10-03 — ADR-005: Демо-часы (виртуальное время) +**Контекст:** демо — 13 дней терапии за 3 минуты. Шедулер на реальном времени это показать не даст. +**Решение:** всё время в системе берётся из `app.core.clock` (реальное или виртуальное, `DEMO_CLOCK=true`). В демо-консоли есть кнопка «следующий день». Шедулер срабатывает по сдвигу часов. Правила считают окна (3 дня подряд, 7 дней) от виртуального «сейчас». +**Последствия:** нигде не вызывать `datetime.now()` напрямую. Проверяется в ревью. + +## 2026-10-03 — ADR-004: Канал-независимый диалоговый движок + веб-демо-консоль + офлайн-режим +**Контекст:** решение должно запускаться на технике организатора без нестандартного ПО. Telegram и GigaChat на площадке могут быть недоступны. +**Решение:** диалог — чистая функция `engine.handle(token, event) -> list[Reply]` поверх FSM. Адаптеры: Telegram (aiogram) и веб-чат в демо-консоли (Streamlit). LLM за протоколом с двумя провайдерами: `gigachat` и `mock` (детерминированные ответы для демо-реплик). `LLM_PROVIDER=mock` по умолчанию в `docker compose up`. +**Причина:** главный критерий жюри — работоспособность. Демо не должно зависеть от сети. + +## 2026-10-03 — ADR-003: Один Postgres, две базы; без Redis и Alembic в MVP +**Контекст:** в SPEC два контейнера Postgres и Redis. +**Решение:** один сервис `postgres` с двумя базами (`identity`, `clinical`; `audit_log` лежит в `clinical`) и двумя ролями: роль клинического модуля не имеет прав на `identity`. Связь — HMAC-токен. Схема создаётся через `create_all` при старте. FSM-состояние хранится в таблице `dialog_state`. +**Причина:** изоляция сохраняется (разные БД и разные роли), а операционной сложности меньше. Alembic для трёхдневного прототипа — лишнее трение. В проде — отдельные кластеры и миграции. + +## 2026-10-03 — ADR-002: Ежедневный чек-ин = настроение + приём + модульный вопрос; шкалы — по расписанию +**Контекст:** в SPEC ежедневно собираются 2–3 пункта PHQ-9 в 14-дневном окне. В демо-персоне и в модулях — ежедневно настроение 0–10, приём, сон, алкоголь, а шкалы целиком по расписанию (PHQ-9 еженедельно/раз в 2 недели) и внепланово по триггеру. +**Решение:** берём модель из модулей. Ежедневно: настроение 0–10, приём препарата, один модульный вопрос (сон/кошмары у ветерана, алкоголь при флаге AUDIT-C) и свободный текст (`extract` → побочки, намерение бросить, алкоголь). Полные шкалы — по расписанию модуля и внепланово (например, настроение ≤ 3 три дня → внеплановый PHQ-9). П.9 PHQ-9 — только кнопками. +**Последствия:** новая таблица `daily_checkins` (mood, med_taken, sleep_bucket, alcohol_bucket, flags). + +## 2026-10-03 — ADR-001: Общее ядро + три модуля, включаемые скринингом +**Контекст:** три источника требований (SPEC, демо-персона, концепция/CJM) по-разному ставят фокус: ветераны, депрессия, семьи. +**Решение:** общее ядро (PHQ-9 → C-SSRS, ежедневный чек-ин, молчание как сигнал) и модули `veteran`, `depression`, `family` ([`CLINICAL_MODULES.md`](info/CLINICAL_MODULES.md)). Модули включает стартовый скрининг и/или врач при подключении пациента. Шкалы, расписания и триггеры модулей описаны декларативно в `config/modules.yaml`. +**Приоритет на хакатон:** ядро, `veteran` и `depression` — P0; `family` — P1 (вход «Я близкий», чек-лист, кнопка «сообщить врачу»). +**Кейс:** закрываем сценарии «мониторинг после обращения» и «управление приёмом лекарств». Скрининг/триаж — входная точка, а не отдельный третий сценарий. diff --git a/docs/dev/GITEA_API.md b/docs/dev/GITEA_API.md new file mode 100644 index 0000000..75223ec --- /dev/null +++ b/docs/dev/GITEA_API.md @@ -0,0 +1,58 @@ +# Gitea API — шпаргалка + +> **⛔ Кириллица в JSON:** `curl -d '{...}'` ломает кодировку. Тело собирать в файл (python/node `json.dumps(..., ensure_ascii=False)`) и слать через `--data-binary @file` с `Content-Type: application/json; charset=utf-8`. +> **⛔ Обратные кавычки:** markdown-тексты не передавать внутри `"..."` в shell — бэктики выполнятся как команды. Только через файл / heredoc `<<'EOF'`. + +```bash +set -a; . ./.env 2>/dev/null; set +a # GITEA_URL, GITEA_REPO, GITEA_USER, GITEA_TOKEN +API="$GITEA_URL/api/v1/repos/$GITEA_REPO" +H=(-H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json; charset=utf-8") +``` + +## Issues +```bash +# Мои открытые +curl -s "${H[@]}" "$API/issues?state=open&type=issues&assigned_by=$GITEA_USER" +# Открытые по зоне +curl -s "${H[@]}" "$API/issues?state=open&type=issues&labels=core" + +# Создать (тело из файла) +python3 - <<'EOF' > /tmp/issue.json +import json; print(json.dumps({"title":"...","body":open("body.md").read(),"labels":[1,2],"milestone":1}, ensure_ascii=False)) +EOF +curl -s -X POST "${H[@]}" "$API/issues" --data-binary @/tmp/issue.json + +# Дописать лог выполнения в тело +curl -s "${H[@]}" "$API/issues/NN" | python3 -c ' +import json,sys,datetime; b=json.load(sys.stdin)["body"] +b+=f"\n### {datetime.date.today()}\n- **Что сделано:** ...\n- **Результат:** ...\n" +print(json.dumps({"body":b},ensure_ascii=False))' > /tmp/patch.json +curl -s -X PATCH "${H[@]}" "$API/issues/NN" --data-binary @/tmp/patch.json >/dev/null + +# Комментарий +curl -s -X POST "${H[@]}" "$API/issues/NN/comments" --data-binary @/tmp/comment.json +``` + +## Зависимости (только через API) +```bash +# #NN зависит от #MM +curl -s -X POST "${H[@]}" "$API/issues/NN/dependencies" \ + -d "{\"owner\":\"${GITEA_REPO%%/*}\",\"repo\":\"${GITEA_REPO##*/}\",\"index\":MM}" +curl -s "${H[@]}" "$API/issues/NN/dependencies" +``` + +## Pull Requests +```bash +# base = dev, не main +curl -s -X POST "${H[@]}" "$API/pulls" --data-binary @/tmp/pr.json # {"head":"feat/NN-slug","base":"dev","title":"...","body":"Closes #NN ..."} +# Смержить (после зелёного CI) +curl -s -X POST "${H[@]}" "$API/pulls/PP/merge" -d '{"Do":"merge","delete_branch_after_merge":true}' +# Статусы CI коммита +curl -s "${H[@]}" "$API/commits//statuses" +``` + +## Ветки +```bash +git ls-remote --heads origin <ветка> # пусто = PR уже смержен, не пушить +B="feat/NN-slug"; curl -s -X DELETE "${H[@]}" "$API/branches/${B//\//%2F}" +``` diff --git a/docs/dev/ISSUE_TEMPLATE.md b/docs/dev/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..16a6a4d --- /dev/null +++ b/docs/dev/ISSUE_TEMPLATE.md @@ -0,0 +1,34 @@ +# Шаблон тела issue + +Задача самодостаточна: агент, открывший её без контекста, понимает, что делать. Не хватает информации — дополни issue до начала работы. + +```markdown +## Описание +Почему задача возникла, какую проблему решает, к какой части продукта относится. Ссылки на ADR / SPEC / CLINICAL_MODULES. + +## Желаемый результат +Конкретно и проверяемо. + +## Подзадачи +- [ ] шаг — файл/модуль + +## Анализ +### Затрагиваемые файлы +| Файл | Что меняется | +|---|---| + +### Ограничения и риски +152-ФЗ, safety, детерминизм, демо-часы, офлайн-режим. + +### Архитектурный выбор +Если есть развилка — варианты и выбор. + +## Как проверить +Команды / сценарий в демо-консоли / ожидаемый результат. + +--- + +## Лог выполнения +``` + +> Зависимости — только через API. Лог — секция `### YYYY-MM-DD` за каждую сессию. Issue закрывается мержем PR с `Closes #N`. diff --git a/docs/dev/WORKFLOW.md b/docs/dev/WORKFLOW.md new file mode 100644 index 0000000..f86138c --- /dev/null +++ b/docs/dev/WORKFLOW.md @@ -0,0 +1,116 @@ +# Регламент работы: зоны, задачи, git, коммиты + +> Основан на регламенте TenVex/vobot, облегчён под хакатон (ADR-009). Дедлайн: **пн 05.10.2026, 13:00 МСК**. + +## Зоны и файлы + +| Зона (`label`) | Пути | Отвечает за | Владелец | +|---|---|---|---| +| `core` | `app/core/` | privacy, шкалы и скоринг, safety, движок правил, демо-часы | dev | +| `bot` | `app/dialog/`, `app/channels/`, `app/llm/` | FSM диалога, Telegram-адаптер, LLM-шлюз (GigaChat/mock) | Егор | +| `backend` | `app/db/`, `app/api/`, `app/scheduler/`, `app/integrations/` | БД, API, шедулер, моки МИС/ЕСИА/ГРЛС, уведомления | dev | +| `dashboard` | `dashboard/` | дашборд врача, демо-консоль (Streamlit) | dev | +| `devops` | `docker-compose.yml`, `Dockerfile`, `Makefile`, `.gitea/`, `pyproject.toml` | окружение, CI, запуск на чистой машине | dev | +| `clinical` | `config/` (содержимое), `data/eval/` | шкалы, пороги, тексты, лексикон, кризисный скрипт | психиатр | +| `pitch` | `docs/pitch/` | презентация, клинико-экономика, CJM, правовые слайды | медик | +| `docs` | `docs/`, `README.md`, `CLAUDE.md` | регламенты, ADR, README | все | + +**Замок зоны:** пока на зону есть открытый issue с активной веткой, файлы зоны принадлежат ему до мержа. Перед правкой: `git fetch origin && git branch -r`. +**Схемы `config/*.yaml`** задаёт `core` (pydantic-модели), а **значения** в них — `clinical`. + +--- + +## Откуда задачи + +- Только из Gitea `$GITEA_REPO`. Нет issue — нет кода. Нет подходящего issue — заведи его на себя. +- Атрибуты: **метка зоны**, **тип** (`feature`/`fix`/`refactor`/`docs`/`chore`), **размер** (`size/0.5` ≈ 2 ч, `size/1` ≈ 4 ч, `size/2` ≈ день), **milestone** (M1/M2/M3), приоритет `P0`/`P1`/`P2`. +- **Одна задача = одна зона.** Нужно несколько зон → несколько issue, связанных зависимостью через API ([`GITEA_API.md`](GITEA_API.md)). +- Тело issue — по шаблону [`ISSUE_TEMPLATE.md`](ISSUE_TEMPLATE.md). + +### Milestones +| Milestone | Срок | Смысл | +|---|---|---| +| M1 Каркас | сб 03.10, 23:59 | ядро, БД, LLM-шлюз, конфиги; тесты зелёные | +| M2 Демо-сценарий | вс 04.10, 23:59 | весь сценарий проходит end-to-end в демо-консоли | +| M3 Сдача | пн 05.10, 13:00 | README, презентация PDF, репетиция, `dev → main` | + +--- + +## Жизненный цикл задачи + +``` +1. Взял issue (assignee = $GITEA_USER), зона свободна +2. git fetch origin +3. git worktree add .claude/worktrees/- -b /- origin/dev ← ДО первого изменения +4. cp .env в worktree; uv sync +5. Код по модулям; коммиты с Refs #N +6. git ls-remote --heads origin <ветка> ← пусто после первого пуша = PR смержен, стоп +7. git fetch && git rebase origin/dev +8. make lint && make test +9. Лог в тело issue: ### YYYY-MM-DD +10. PR в dev с Closes #N → после зелёного CI мержит автор (облегчение хакатона) +11. git worktree remove .claude/worktrees/- +``` + +**Задача завершена → сам: коммит → push → PR.** Не запушено — не сделано. + +## Git + +``` +main ← сдаваемая версия, мержит только человек (пн утром) +dev ← интеграция, сюда все PR +/- ← от dev +``` + +## Коммиты — Conventional Commits +``` +feat(core): add PHQ-9 scoring with item-9 escalation + +Refs #3 +``` +scope = зона. `Closes #N` — только в описании PR. + +## Шаблон PR +```markdown +## Что меняется +1–3 предложения. + +Closes # + +## Зона +core | bot | backend | dashboard | devops | clinical | pitch | docs + +## Как проверить +шаги/команды + +## Чек-лист +- [ ] rebase на origin/dev +- [ ] make lint + make test зелёные +- [ ] лог в issue (### YYYY-MM-DD) +- [ ] нет ПДн в логах, нет реальных данных, нет секретов +- [ ] общие файлы (CLAUDE.md, docker-compose, pyproject) — отдельный мелкий PR с пингом +``` + +--- + +## Guardrails (проверяются в каждом PR) + +1. **В LLM — только `scrub()`-текст.** Прямой вызов клиента GigaChat в обход `app/llm/gateway.py` запрещён. +2. **Safety до LLM.** При `acute` LLM не вызывается вообще. +3. **Алерты и скоринг детерминированы** — LLM не решает (ADR-007). +4. **Время — только из `app.core.clock`** (ADR-005). +5. **identity ↔ clinical — только через токен.** Модули clinical не импортируют `app.db.identity`. +6. **Доступ врача → `audit_log`.** +7. **Пороги, тексты и лексикон — в `config/`**, не в коде. +8. **Только синтетика.** Логи без ПДн и без сырого текста. +9. **Никаких зарубежных API в контуре.** + +## Факапы + +| Ситуация | Действие | +|---|---| +| Начал в основной копии | `git stash` → worktree → `git stash pop` | +| `git push` дал `[new branch]` после мержа | удалить ветку через API, новый issue + cherry-pick | +| Конфликт при rebase в чужой зоне | спросить владельца | +| Утёк секрет | отозвать ключ, вычистить историю | +| Битая кириллица в issue/PR | см. [`GITEA_API.md`](GITEA_API.md): только `--data-binary @файл` | diff --git a/docs/info/CLINICAL_MODULES.md b/docs/info/CLINICAL_MODULES.md new file mode 100644 index 0000000..7c08e3b --- /dev/null +++ b/docs/info/CLINICAL_MODULES.md @@ -0,0 +1,35 @@ +# Клинические модули: общее ядро + три модуля + +> Источник — предложение команды (2026-10-03). Пороги и шкалы — стартовые, **финальные утверждает психиатр**. +> В коде всё ниже живёт в `config/` (шкалы, расписания, правила), не хардкодится. Решение — ADR-001 в [`DECISIONS.md`](../DECISIONS.md). + +Строим не три продукта, а **общее ядро + три модуля**. У ветерана часто одновременно есть ПТСР, депрессия и суицидальность, поэтому модули включаются по результатам стартового скрининга (и/или врачом при подключении). + +## Общее ядро (во всех сценариях) +- PHQ-9. Если 9-й пункт ≥ 1 → C-SSRS → эскалация врачу. +- Ежедневно: настроение 0–10 и отметка приёма препарата. +- Пропуск чек-инов несколько дней подряд → связь с пациентом. **Молчание само по себе — сигнал риска.** + +## 1. Ветераны СВО +- **Старт:** PCL-5, PHQ-9, AUDIT-C. Опционально — шкала интенсивности боевого опыта (рус. версия Тарабриной). +- **Мониторинг:** PCL-5 (версия за неделю) и PHQ-9 раз в 2 недели; AUDIT-C раз в месяц; DAR-5 (гнев) раз в 2 недели; ежедневно один вопрос про сон и кошмары. +- **Триггеры:** рост PCL-5 на ≥ 10 → врач; AUDIT-C ≥ 4 (м) / ≥ 3 (ж) → флаг; доступ к оружию → блок безопасности. +- **Обоснование:** ПТСР у комбатантов часто коморбиден с депрессией и алкоголем; алкоголь — фактор риска суицида и взаимодействует с антидепрессантами и бензодиазепинами; гнев — отдельная мишень терапии; ограничение доступа к средствам — одна из самых доказательных мер профилактики. + +## 2. Депрессия и суицидальность +- **Старт:** PHQ-9, C-SSRS (полный скрининг), GAD-7. План безопасности Стэнли–Брауна: составляется с врачом на визите, хранится в приложении. +- **Мониторинг:** PHQ-9 еженедельно первые 4–6 недель, затем раз в 2 недели; C-SSRS «с последнего контакта» еженедельно; FIBSER раз в 2 недели. +- **Триггеры:** C-SSRS — мысли с намерением/планом или суицидальное поведение → срочная эскалация, на экран — план безопасности и кризисные контакты; пропуск препарата ≥ 3 дней → связь с пациентом. +- **Обоснование:** риск суицида максимален в первые месяцы после выписки (Chung et al., JAMA Psychiatry 2017); у пациентов < 25 лет в начале приёма антидепрессантов возможно усиление суицидальных мыслей (FDA) → частый мониторинг первых недель; план безопасности + звонки снизили суицидальное поведение ≈ на 45% (Stanley et al., JAMA Psychiatry 2018); «caring contacts» снижали смертность от суицида (Motto & Bostrom 2001) — ежедневный чек-ин как цифровой аналог. + +## 3. Семьи ветеранов +Член семьи в двух ролях: пациент и наблюдатель. +- **Старт:** PHQ-4 (PHQ-2 + GAD-2); нагрузка ухаживающего — Caregiver Strain Index (Zarit платная); безопасность дома — HITS (4 вопроса). +- **Мониторинг:** PHQ-4 раз в месяц; положительный → полный PHQ-9 и GAD-7. +- **Наблюдатель:** обучающий чек-лист тревожных признаков у ветерана (не валидированная шкала) + кнопка «сообщить врачу». +- **Триггеры:** признаки насилия → кризисные ресурсы; п.9 PHQ-9 у члена семьи → C-SSRS. +- **Ограничение (152-ФЗ):** передавать врачу данные о ветеране со слов семьи — только с согласия самого ветерана. +- **Обоснование:** вторичная травматизация у партнёров; ПТСР ассоциирован с риском агрессии в семье; близкие первыми замечают ухудшение. + +## Лицензии +Перед использованием проверить лицензии CSI, HITS, DAR-5 (и FIBSER, PCL-5 рус.). Пока не подтверждено — в прототипе помечаем «демо-текст, лицензия на проверке». diff --git a/docs/info/SPEC.md b/docs/info/SPEC.md new file mode 100644 index 0000000..e2e53df --- /dev/null +++ b/docs/info/SPEC.md @@ -0,0 +1,466 @@ +# SPEC — исходная спецификация продукта + +> Исходный CLAUDE.md команды (v0, 2026-10-03). Источник правды по правовым ограничениям, модели данных и клинической логике. +> **Отступления от него фиксируются в [`docs/DECISIONS.md`](../DECISIONS.md)** — при конфликте ADR важнее этого файла. +> Модули по сегментам — [`CLINICAL_MODULES.md`](CLINICAL_MODULES.md). Концепция и CJM — [`../source/concept_cjm.txt`](../source/concept_cjm.txt). + +--- + +## 1. Контекст проекта + +- **Событие:** хакатон MedITron, кейс SberMed AI «ИИ-помощник пациента». +- **Задача кейса:** ИИ-помощник, через который пациент в диалоговом формате взаимодействует с государственной системой здравоохранения. Нужно реализовать 1–2 сценария из списка. Мы закрываем два: **мониторинг после обращения** и **управление приёмом лекарств**. +- **Наш фокус:** психическое здоровье, депрессия и ПТСР, в первую очередь у ветеранов СВО. +- **Результат:** работающий прототип и презентация. +- **Критерии оценки:** работоспособность прототипа, функциональность, дизайн презентации и прототипа, оценка клинико-экономических эффектов, описание клиентского пути. + +### Команда +| Кто | Зона | +|---|---| +| Егор (dev) | Бот, FSM диалога, интеграция GigaChat, извлечение баллов, safety | +| Программист (dev) | Backend, БД, скоринг, алерты, шедулер, API, дашборд врача | +| Психиатр | Шкалы, пороги, лексикон риска, кризисный скрипт, разметка eval-набора | +| Медик с опытом в госсистеме | Клиентский путь, клинико-экономика, правовые слайды | + +### Позиционирование (важно для текстов в UI и коде) +- Продукт — **сопровождение восстановления между визитами к врачу**, а не «психиатрический контроль». +- Участие **добровольное**. Точка входа — существующая диспансеризация ветеранов СВО (консультация психолога), кабинеты медико-психологического консультирования, фонд «Защитники Отечества». Врач **предлагает** подключиться. +- **ИИ не ставит диагнозы и не проводит терапию.** LLM только извлекает данные и формулирует реплики. Решения о риске и алертах принимают **детерминированные правила** по валидированным шкалам. Клинические решения принимает врач. +- В текстах для пациента не используем слова «учёт», «контроль», «психиатрический надзор». + +--- + +## 2. Жёсткие ограничения + +### Правовые +- **152-ФЗ:** данные о здоровье относятся к специальной категории (ст. 10). Нужно явное согласие на обработку, отдельный шаг онбординга. +- **152-ФЗ, ч. 5 ст. 18 (с 01.07.2025):** запрещено записывать, хранить и извлекать ПДн граждан РФ в зарубежных базах данных. **Никаких зарубежных сервисов в контуре обработки ПДн.** +- **323-ФЗ ст. 13, Закон 3185-1 ст. 9:** врачебная тайна. Доступ к данным только у лечащего врача пациента. +- **323-ФЗ ст. 36.2:** дистанционное наблюдение допустимо после очного приёма. Диагноз дистанционно не ставится. +- Роли: оператор ПДн — медорганизация, СберМедИИ — обработчик по поручению. + +### Технические правила (обязательны в коде) +1. **В LLM уходит только обезличенный текст.** Каждое сообщение проходит через `scrub()` до любого вызова LLM. +2. **Identity и клинические данные хранятся в двух разных БД**, связь через HMAC-токен. +3. **Safety-проверка идёт до LLM на каждом входящем сообщении.** При кризисе отвечает фиксированный скрипт, LLM не генерирует ответ. +4. **Скоринг и алерты детерминированы.** LLM никогда не решает, отправлять ли алерт. +5. **Каждое обращение врача к данным пишется в аудит-лог.** +6. **Только синтетические данные.** Никаких реальных пациентов, даже «от знакомых». +7. Секреты — только из `.env`. `.env` в `.gitignore`. + +### Стек: можно и нельзя +| Слой | Используем | Не используем | +|---|---|---| +| LLM | **GigaChat** (пакет `gigachat`) | OpenAI, Anthropic, Gemini и любые зарубежные API | +| Канал пациента | Telegram (**только демо на синтетике**), целевой — MAX | WhatsApp | +| Хостинг (прод) | Cloud.ru, Yandex Cloud | AWS, GCP, Vercel, Supabase, Firebase | +| БД | PostgreSQL | MongoDB Atlas, Firebase | +| Пуши и аналитика | Свои / RuStore Push, без трекеров | FCM, Google Analytics | +| Авторизация (прод) | ЕСИА | Google / Apple Sign-In | + +В коде и README отмечаем: «Telegram используется только для прототипа на синтетических данных; прод-канал — MAX / Госуслуги». + +--- + +## 3. Архитектура + +``` +Каналы: [Бот пациента: aiogram] [Дашборд врача: Streamlit] + │ │ +Ядро: [Оркестратор FSM] → [Safety] → [Клин. движок] → [LLM-шлюз GigaChat] + │ │ +Данные: [identity_db] [clinical_db] [audit_log] + │ +Интеграции: [ЕСИА] [МИС/ЕГИСЗ] [ГРЛС] [Уведомления] ← в демо моки через адаптеры +``` + +### Поток обработки входящего сообщения +1. Бот получает сообщение → находит токен пациента. +2. `scrub(text)` удаляет ПДн. +3. `safety.check()`: лексикон + LLM-классификатор, берём максимум. + - `ACUTE` → `CRISIS_SCRIPT` + немедленный алерт дежурному + аудит. **Конец обработки.** + - `POSSIBLE` → алерт врачу в течение 24 ч + переход в состояние `cssrs_screen`. +4. Иначе FSM обрабатывает сообщение по текущему состоянию. +5. Для пункта шкалы: `extract()` → `ItemScore`. Если `None` или `confidence < 0.5`, бот задаёт уточняющий вопрос. +6. Сохранение в `clinical_db` → пересчёт трендов → проверка правил алертов. + +--- + +## 4. Структура репозитория + +``` +psy-assistant/ +├── CLAUDE.md +├── README.md +├── .env.example +├── docker-compose.yml # postgres-identity, postgres-clinical, redis, app, dashboard +├── pyproject.toml +├── app/ +│ ├── main.py # запуск бота + FastAPI + шедулер +│ ├── config.py # pydantic-settings +│ ├── bot/ +│ │ ├── handlers.py # aiogram routers +│ │ └── keyboards.py +│ ├── core/ +│ │ ├── fsm.py # состояния и переходы +│ │ ├── safety.py # кризис-детектор +│ │ ├── scoring.py # PHQ-9, GAD-7, PCL-5, тренды +│ │ ├── adherence.py # приверженность +│ │ ├── alerts.py # правила и отправка алертов +│ │ └── privacy.py # scrub(), pseudo_id() +│ ├── llm/ +│ │ ├── giga.py # клиент, ретраи, валидация JSON +│ │ ├── prompts.py +│ │ └── rag.py # инструкции ЛС из ГРЛС (опционально) +│ ├── integrations/ +│ │ ├── base.py # Protocol-интерфейсы +│ │ ├── esia_mock.py +│ │ ├── mis_mock.py # назначения из JSON +│ │ ├── grls.py +│ │ └── notify.py # Telegram-чат врача / email +│ ├── db/ +│ │ ├── identity.py +│ │ ├── clinical.py +│ │ ├── audit.py +│ │ └── migrations/ +│ ├── scheduler/ +│ │ └── jobs.py # APScheduler: лекарства, чек-ины +│ └── api/ +│ └── routes.py # для дашборда +├── dashboard/ +│ └── app.py # Streamlit +├── data/ +│ ├── scales/ # phq9.yaml, gad7.yaml, pcl5.yaml, cssrs.yaml +│ ├── lexicon/risk_ru.yaml # от психиатра +│ ├── meds/ # инструкции ЛС (ГРЛС), mis_prescriptions.json +│ ├── synthetic/ # сгенерированные пациенты +│ └── eval/ # разметка психиатра +├── scripts/ +│ ├── gen_synthetic.py +│ ├── seed_demo.py +│ └── eval_extraction.py +└── tests/ + ├── test_scoring.py + ├── test_safety.py + └── test_privacy.py +``` + +--- + +## 5. Модель данных + +### identity_db (доступ только у модулей регистрации и алертов) +```sql +CREATE TABLE patients ( + token CHAR(32) PRIMARY KEY, -- HMAC(SNILS) + full_name TEXT NOT NULL, + snils TEXT NOT NULL UNIQUE, + phone TEXT, + tg_chat_id BIGINT UNIQUE, + clinic_id TEXT NOT NULL, + doctor_id TEXT NOT NULL, + consent_at TIMESTAMPTZ, -- NULL = согласия нет, обработка запрещена + consent_ver TEXT, + revoked_at TIMESTAMPTZ, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE doctors ( + doctor_id TEXT PRIMARY KEY, + full_name TEXT NOT NULL, + clinic_id TEXT NOT NULL, + notify_chat BIGINT, + on_call BOOLEAN DEFAULT FALSE +); +``` + +### clinical_db (без прямых идентификаторов) +```sql +CREATE TABLE item_responses ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + ts TIMESTAMPTZ DEFAULT now(), + scale TEXT NOT NULL, -- phq9 | gad7 | pcl5 | cssrs + item_id TEXT NOT NULL, + score SMALLINT, + confidence REAL, + evidence TEXT, -- обезличенная фраза + source TEXT NOT NULL -- llm | button | clinician +); + +CREATE TABLE scale_results ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + scale TEXT NOT NULL, + period_start DATE, period_end DATE, + total SMALLINT NOT NULL, + severity TEXT NOT NULL, + complete BOOLEAN NOT NULL +); + +CREATE TABLE prescriptions ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + drug TEXT NOT NULL, -- МНН + dose TEXT NOT NULL, + schedule JSONB NOT NULL, -- {"times": ["08:00","20:00"]} + start_date DATE, end_date DATE +); + +CREATE TABLE doses ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + prescription_id BIGINT REFERENCES prescriptions(id), + planned_at TIMESTAMPTZ NOT NULL, + status TEXT NOT NULL, -- taken | missed | skipped | pending + side_effects TEXT +); + +CREATE TABLE alerts ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + ts TIMESTAMPTZ DEFAULT now(), + level TEXT NOT NULL, -- acute | high | moderate | info + reason TEXT NOT NULL, + acked_by TEXT, acked_at TIMESTAMPTZ +); + +CREATE TABLE messages ( + id BIGSERIAL PRIMARY KEY, + token CHAR(32) NOT NULL, + ts TIMESTAMPTZ DEFAULT now(), + direction TEXT NOT NULL, -- in | out + text_scrubbed TEXT NOT NULL, + fsm_state TEXT +); +``` + +### audit_log +```sql +CREATE TABLE audit_log ( + id BIGSERIAL PRIMARY KEY, + ts TIMESTAMPTZ DEFAULT now(), + actor TEXT NOT NULL, -- doctor_id | system + action TEXT NOT NULL, -- view_patient | ack_alert | crisis_acute | export + token CHAR(32), + details JSONB +); +``` + +--- + +## 6. Клиническая логика + +> Пороги — стартовые значения из литературы. **Финальные утверждает психиатр команды.** Храним их в `data/scales/*.yaml`, а не хардкодим. + +| Шкала | Пункты | Диапазон | Градации | +|---|---|---|---| +| PHQ-9 (депрессия) | 9 × 0..3 | 0–27 | 0–4 минимальная, 5–9 лёгкая, 10–14 умеренная, 15–19 умеренно-тяжёлая, 20–27 тяжёлая | +| GAD-7 (тревога) | 7 × 0..3 | 0–21 | 5 лёгкая, 10 умеренная, 15 тяжёлая | +| PCL-5 (ПТСР) | 20 × 0..4 | 0–80 | ≥31–33 вероятный ПТСР | +| C-SSRS (скрининг) | да/нет | — | Запускается только при сигнале риска | + +### Правила алертов (`core/alerts.py`) +| Условие | Уровень | Действие | +|---|---|---| +| Safety = ACUTE | `acute` | Скрипт + немедленно дежурному | +| PHQ-9 пункт 9 > 0 | `acute` | То же + C-SSRS | +| Safety = POSSIBLE | `high` | Врачу в течение 24 ч, C-SSRS | +| PHQ-9 ≥ 20 или PCL-5 ≥ 50 | `high` | Врачу в течение 24 ч | +| Рост PHQ-9 на ≥ 5 баллов между замерами | `high` | Врачу в течение 24 ч | +| ≥ 3 пропуска приёма за 7 дней | `moderate` | Чек-ин о причинах + флаг к визиту | +| Жалоба на побочный эффект | `moderate` | Флаг к визиту, при серьёзном — врачу | +| Нет ответа пациента > 3 дней | `info` | Флаг на дашборде | + +### Сбор шкалы в диалоге +- Каждый день 2–3 пункта, перефразированных разговорным языком. Тексты перефразировок утверждает психиатр. +- Окно шкалы — 14 дней. Если пункт уже собран в текущем окне, повторно его не спрашиваем. +- Свободный ответ → `extract()` → `ItemScore`. Кнопки с вариантами 0–3 остаются как запасной вариант. +- Пункт 9 PHQ-9 (мысли о смерти) задаётся **только кнопками**, без LLM-интерпретации. + +--- + +## 7. LLM-слой + +### Контракт извлечения +```python +class ItemScore(BaseModel): + item: str + score: int = Field(ge=0, le=3) # для PCL-5: le=4 + confidence: float = Field(ge=0, le=1) + evidence: str +``` +- `temperature=0.1`, ответ строго JSON, валидация pydantic, до 2 ретраев. При неудаче возвращать `None`, FSM задаёт уточнение. + +### Задачи LLM +1. **extract** — свободный ответ → балл пункта. +2. **risk_classify** — классификация риска: `none | possible | acute`. Используется только как **дополнительный** сигнал к лексикону, берём максимум. +3. **phrase** — эмпатичная формулировка следующего вопроса. Короткая, без советов, без диагнозов, без обещаний. +4. **summarize_for_doctor** — саммари динамики за период по структурированным данным (не по сырому тексту). +5. **med_qa** (опционально) — ответы на вопросы о препарате **только по RAG из инструкции ГРЛС**. Если ответа в инструкции нет: «уточните у вашего врача». + +### Запреты для системных промптов +- Не ставить диагнозы, не называть расстройства. +- Не менять и не отменять дозировки, не советовать препараты. +- Не проводить психотерапию. +- Не обещать конфиденциальность сверх реальной. +- При любом сомнении в безопасности — нейтральный ответ и передача врачу. + +--- + +## 8. FSM: состояния + +``` +new → consent → onboarding_baseline → idle +idle → daily_checkin → idle +idle → med_reminder → med_confirm → (side_effects?) → idle +any → cssrs_screen → idle | crisis +any → crisis (выход только после подтверждения врача) +consent_revoked → (данные помечаются к удалению, бот замолкает) +``` +- `consent`: текст согласия, кнопки «Согласен» / «Не согласен». Без согласия никакой обработки. +- `onboarding_baseline`: базовые PHQ-9 и PCL-5 (кнопками, быстро), подтягивание назначений из `mis_mock`. +- `daily_checkin`: шедулер раз в день, 2–3 пункта. +- `med_reminder`: по расписанию из `prescriptions`. Если нет ответа 2 часа, доза помечается `missed`. + +--- + +## 9. Интеграции (адаптеры) + +Все внешние системы закрыты `Protocol`-интерфейсами в `integrations/base.py`. В демо работают моки, в проде подменяется реализация. + +```python +class PrescriptionSource(Protocol): + async def get_prescriptions(self, token: str) -> list[Prescription]: ... + +class IdentityProvider(Protocol): # ЕСИА + async def verify(self, auth_code: str) -> VerifiedPerson: ... + +class Notifier(Protocol): + async def send(self, doctor_id: str, level: str, text: str) -> None: ... + +class DrugInfo(Protocol): # ГРЛС + async def instruction(self, inn: str) -> str: ... +``` + +| Адаптер | Демо | Прод | +|---|---|---| +| ЕСИА | `esia_mock`: регистрация по коду от врача | ЕСИА OAuth, нужна регистрация ИС | +| МИС / ЕГИСЗ | `mis_mock`: `data/meds/mis_prescriptions.json` | Региональная МИС, СЭМД в РЭМД | +| ГРЛС | Локальные инструкции 20–30 психотропных ЛС | Синхронизация с grls.rosminzdrav.ru | +| Уведомления | Telegram-чат врача | MAX / интерфейс МИС врача | + +--- + +## 10. Данные + +### Клинический контент +- PHQ-9, GAD-7: русские версии, свободное использование. +- PCL-5: русский перевод выбирает психиатр. +- C-SSRS: скрининговая версия на русском. +- Клинические рекомендации Минздрава (cr.minzdrav.gov.ru) — депрессия, ПТСР, для контекста RAG. +- Инструкции ЛС — ГРЛС. + +### NLP (оценка и вспомогательные сигналы) +- `sagteam/cedr_v1`, `seara/ru_go_emotions` — русские эмоции. +- `cointegrated/rubert-tiny2-cedr-emotion-detection` — лёгкий классификатор эмоций на CPU (опционально). +- Открытого русского датасета по суицидальному риску с клинической разметкой нет → лексикон психиатра + LLM + C-SSRS. + +### Синтетика (`scripts/gen_synthetic.py`) +Персоны (утверждает психиатр): +1. Ветеран с ПТСР: кошмары, гипербдительность, раздражительность; улучшение на терапии. +2. Депрессия с плохой приверженностью: пропуски → ухудшение PHQ-9. +3. Стабильный пациент: ровные баллы. +4. Эпизод с суицидальными мыслями на 9-й день (для демо кризиса). +5. Побочный эффект СИОЗС: тошнота, бессонница, желание бросить. +6. Алкоголь как самолечение. + +Для каждой персоны — 14 дней диалогов с заданной траекторией. Формат: `data/synthetic/.jsonl`, поля `day, role, text, expected_items`. + +### Eval (`scripts/eval_extraction.py`) +- 50–100 реплик, размеченных психиатром эталонными баллами → `data/eval/labels.jsonl`. +- Метрики: точное совпадение, совпадение ±1, MAE по пунктам, доля `confidence < 0.5`. +- Safety: recall по кризисным репликам должен быть 100% на eval-наборе. Precision вторичен. + +--- + +## 11. Дашборд врача (Streamlit) + +1. Список пациентов врача: последний PHQ-9 / PCL-5, тренд-стрелка, приверженность за 7 дней, неподтверждённые алерты (сортировка по уровню). +2. Карточка пациента: графики баллов во времени, календарь приёма доз, лента алертов, LLM-саммари периода. +3. Подтверждение алерта (`ack`) пишется в аудит. +4. Каждое открытие карточки — запись в `audit_log`. + +--- + +## 12. Демо-сценарий (обязателен к работе) + +1. Врач показывает QR → пациент запускает бота → согласие → базовые шкалы. +2. Подтягиваются назначения (мок МИС) → приходит напоминание → «принял». +3. Ежедневный чек-ин: свободный ответ «сплю плохо, кошмары почти каждую ночь» → извлечён балл → на дашборде обновился график. +4. **Кризис:** пациент пишет тревожную фразу → бот отвечает кризисным скриптом → **у врача на экране сразу алерт.** Этот момент проверить многократно. +5. Дашборд: динамика за 14 дней у синтетического пациента, саммари, флаги приверженности. + +--- + +## 13. План работ (приоритеты) + +### P0 — без этого демо нет +- [ ] `docker-compose` с двумя Postgres, миграции +- [ ] `privacy.py`: `scrub()`, `pseudo_id()` + тесты +- [ ] Бот: согласие, онбординг, базовые шкалы кнопками +- [ ] `safety.py` + кризисный скрипт + алерт врачу + тесты +- [ ] `scoring.py` (PHQ-9, PCL-5) + тесты +- [ ] `giga.py` + `extract()` с валидацией +- [ ] Ежедневный чек-ин с извлечением +- [ ] Напоминания о лекарствах + подтверждение +- [ ] Дашборд: список, карточка, алерты +- [ ] `seed_demo.py` с синтетикой + +### P1 +- [ ] Генерация синтетики + eval извлечения (цифра для слайда) +- [ ] LLM-саммари для врача +- [ ] Тренды и правила приверженности +- [ ] GAD-7 + +### P2 +- [ ] RAG по инструкциям ГРЛС +- [ ] Классификатор эмоций как дополнительный сигнал +- [ ] Голосовые сообщения (SaluteSpeech) +- [ ] Мок-экспорт заключения в формате СЭМД + +--- + +## 14. Соглашения по коду + +- Python 3.11+, асинхронный код (aiogram 3, FastAPI, asyncpg / SQLAlchemy 2 async). +- Типизация везде, pydantic для всех внешних данных и ответов LLM. +- `ruff` + `pytest`. Тесты обязательны для `privacy`, `safety`, `scoring`, `alerts`. +- Логи **без ПДн и без сырого текста сообщений**: только токен, состояние, коды событий. +- Тексты для пациента — в `app/bot/texts.py` или YAML, не в коде хендлеров (их будет вычитывать психиатр). +- Конфигурация порогов и лексикона — в `data/`, не в коде. +- Маленькие коммиты, осмысленные сообщения на английском. + +## 15. Переменные окружения (`.env.example`) + +``` +TG_BOT_TOKEN= +GIGACHAT_CREDENTIALS= +GIGACHAT_SCOPE=GIGACHAT_API_PERS +PSEUDO_KEY= # 32+ случайных байт, hex +IDENTITY_DB_URL=postgresql+asyncpg://... +CLINICAL_DB_URL=postgresql+asyncpg://... +REDIS_URL=redis://redis:6379/0 +DOCTOR_NOTIFY_CHAT_ID= +TZ=Europe/Moscow +``` + +--- + +## 16. Открытые вопросы (уточнить у команды) + +- Длительность хакатона → скорректировать P0/P1. +- Финальные пороги шкал и лексикон риска — психиатр. +- Русская версия PCL-5 — психиатр. +- Доступ к GigaChat API на хакатоне (ключи от организаторов?). +- Номер и детали приказа о диспансеризации ветеранов СВО — медик из госсистемы. diff --git a/docs/product/00_ideas.md b/docs/product/00_ideas.md new file mode 100644 index 0000000..ae03520 --- /dev/null +++ b/docs/product/00_ideas.md @@ -0,0 +1,7 @@ +# Идеи команды + +## 1. Фокус на психиатрии и ментальных расстройствах +Обычные трекеры требуют высокой мотивации, которой у пациентов с депрессией просто нет. Если сфокусироваться на психиатрическом профиле, можно создать систему, которая не просто «звенит», а использует поведенческие паттерны. Например, ИИ-ассистент, который по характеру ответов или активности в приложении понимает, что пациент близок к отказу от терапии (например, при подборе антидепрессантов в первые недели, когда побочки уже есть, а эффекта ещё нет), и сигнализирует об этом лечащему врачу. + +## 2. Предиктивная аналитика для врача (дашборд) +Главная проблема текущих систем — врач изолирован от данных пациента. Акцент на интерфейсе лечащего врача. Система агрегирует данные о комплаенсе и подсвечивает специалисту «красные зоны»: какие пациенты находятся в группе риска по прерыванию терапии. Алгоритм анализирует риски, но окончательное решение об изменении терапии принимает врач (что снимает часть этических и юридических проблем атрибуции ответственности ИИ). diff --git a/docs/product/01_demo_persona.md b/docs/product/01_demo_persona.md new file mode 100644 index 0000000..523b800 --- /dev/null +++ b/docs/product/01_demo_persona.md @@ -0,0 +1,69 @@ +# 01. Демо-персона и сценарии + +Источник для seed-данных и сценария демо. Все данные вымышленные. + +## Основная персона + +| Поле | Значение | +|---|---| +| Имя | Алексей, 28 лет, Москва | +| Работа | разработчик | +| Жалобы (2 мес.) | сниженное настроение, нет интереса к делам, плохой сон, трудно работать | +| Барьер | к врачу не шёл: «боюсь, что поставят на учёт» | +| Скрининг (день −3) | PHQ-9 = 14 (умеренная), п.9 = 0; травмы не было → PC-PTSD-5 пропущен; GAD-7 = 9 | +| Визит к психиатру (день 0) | депрессивный эпизод средней степени; сертралин 50 мг 1 р/сут утром после еды; следующий визит через 4 недели | +| Врач | д-р Смирнова Е. А., психиатр | + +## Сценарий А — скрининг (демо 30–40 сек) + +1. Пользователь открывает бота без регистрации → дисклеймер («это не диагноз») + согласие на обработку данных. +2. Вопрос о возрасте. Если < 18 → детский телефон доверия 8-800-2000-122, совет обратиться к взрослым / школьному психологу. +3. PHQ-9 → 14 баллов, п.9 = 0. +4. Вопрос о травматическом событии (вход в PC-PTSD-5) → «нет» → пропуск. +5. GAD-7 → 9 баллов. +6. Агент объясняет результат без слова «диагноз», рекомендует консультацию психиатра. +7. Пользователь: «А меня поставят на учёт?» → агент объясняет (добровольное обращение = консультативно-лечебная помощь). +8. Агент предлагает варианты (ПНД/поликлиника, платно, онлайн) → `book_visit` (мок) → с согласия `send_screening_summary` врачу. + +## Сценарий Б — сопровождение после визита (основное демо) + +Врач на дашборде нажимает «Подключить пациента», вводит препарат и дату следующего визита. + +| День | Приём | Настр. 0–10 | Сон | Алкоголь | Жалобы / свободный текст | Шкалы | Уровень | Действие агента | +|---|---|---|---|---|---|---|---|---| +| 1 | да | 4 | 6–8 | нет | — | — | 🟢 | приветствие, напоминание | +| 2 | да | 4 | 4–6 | нет | тошнота | — | 🟢 | объясняет: частая, обычно проходит за 1–2 нед.; принимать после еды | +| 3 | да | 4 | 4–6 | нет | тошнота | — | 🟢 | поддержка | +| 4 | да | 3 | 4–6 | нет | тошнота | — | 🟡 | побочка 3 дня подряд → `raise_alert(yellow)` | +| 5 | решил не принимать | 3 | 4–6 | нет | «от таблеток только хуже, брошу» | — | 🟡 | объясняет отсроченный эффект; не бросать без врача; `notify_doctor` | +| 6 | да | 4 | 6–8 | нет | — | — | 🟢 | врач позвонил, пациент продолжает | +| 7 | да | 4 | 6–8 | нет | — | PHQ-9 = 13, п.9 = 0 | 🟢 | плановый PHQ-9 | +| 8 | да | 4 | < 4 | 1–2 | — | — | 🟢 | — | +| 9 | да | 4 | < 4 | больше | — | — | 🟢 | — | +| 10 | да | 4 | < 4 | больше | «не могу уснуть без пива» | — | 🟡 | сон < 4 ч 3 ночи (F_Y6) + алкоголь 3 дня (F_Y5) → инфо о взаимодействии; `notify_doctor`; `book_visit` раньше | +| 11 | да | 3 | 4–6 | 1–2 | — | — | 🟡 | (алкоголь продолжается) | +| 12 | да | 3 | 4–6 | нет | — | — | 🟡 | — | +| 13 | да | 2 | < 4 | нет | «всё бессмысленно, устал от всего» | внеплановый PHQ-9 = 18, п.9 = 2 | 🔴 | настроение ≤ 3 три дня → внеплановый PHQ-9 → п.9 ≥ 1 → `crisis_protocol` + `raise_alert(red)` | + +## Дашборд врача: ещё 7 фейковых пациентов + +| Пациент | Возраст | Диагноз | Препарат | День терапии | Статус | Последнее событие | +|---|---|---|---|---|---|---| +| Ирина К. | 34 | депрессия | эсциталопрам 10 мг | 21 | 🟢 | PHQ-9 16 → 9 | +| Дмитрий В. | 41 | ПТСР | сертралин 100 мг | 45 | 🟡 | кошмары, сон < 4 ч 3 ночи | +| Ольга Н. | 29 | депрессия + тревога | сертралин 50 мг | 10 | 🟢 | тошнота прошла | +| Сергей П. | 37 | ПТСР | пароксетин 20 мг | 30 | 🟡 | пропуски 3 из 7 дней | +| Анна Л. | 23 | депрессия | флуоксетин 20 мг | 8 | 🟡 | возраст < 25: усиленный мониторинг; беспокойство | +| Павел Р. | 45 | депрессия | эсциталопрам 10 мг | 60 | 🟢 | ремиссия, PHQ-9 = 4 | +| Наталья Ф. | 52 | ПТСР | сертралин 50 мг | 14 | 🟡 | алкоголь 4 из 7 дней | +| Алексей | 28 | депрессия | сертралин 50 мг | 13 | 🔴 | п.9 PHQ-9 = 2 | + +История для графиков у остальных пациентов можно сгенерировать случайно в пределах указанного статуса. + +## Порядок демо (≈ 3 мин) + +1. Скрининг Алексея → запись к врачу — 40 с +2. Врач подключает пациента на дашборде — 10 с +3. День 5: «хочу бросить» → объяснение + алерт — 40 с +4. День 10: алкоголь + бессонница → запись раньше — 30 с +5. День 13: внеплановый PHQ-9 → 🔴 → кризисный протокол + карточка алерта на дашборде — 40 с diff --git a/docs/product/02_hackathon_requirements.md b/docs/product/02_hackathon_requirements.md new file mode 100644 index 0000000..7e7bd8d --- /dev/null +++ b/docs/product/02_hackathon_requirements.md @@ -0,0 +1,21 @@ +# 02. Кейс SberMed AI и требования к оформлению + +Конспект `Кейс_SBERMED AI.pdf` и `Требования к оформлению.pdf` (оригиналы в корне). + +## Кейс +- **Задача:** ИИ-помощник, через который пациент в диалоговом формате взаимодействует с государственной системой здравоохранения в цифровом канале. +- **Сценарии (выбрать 1–2):** запись к врачу, получение справок, предварительный сбор жалоб и анамнеза, **мониторинг после обращения**, **управление приёмом лекарств**. +- **ЦА:** граждане РФ старше 18 лет в периметре госсистемы здравоохранения. +- **Бизнес-эффекты:** снижение операционных издержек, удержание клиентов, удовлетворённость пациентов, рост доли MedTech в B2G. +- **Ограничения и риски:** 152-ФЗ и обработка медданных; комплаенс и ИБ. +- **Конкуренты:** ИИ-помощник Genotek, ChatGPT Health (OpenAI). +- **Критерии оценки:** 1) работоспособность прототипа; 2) функциональность; 3) дизайн презентации и прототипа; 4) оценка клинико-экономических эффектов; 5) описание клиентского пути. + +## Требования к оформлению (чек-лист сдачи) +- [ ] `README.md`: цели и задачи; что реализовано; развёртывание, запуск, использование (окружение, зависимости); входные/выходные данные, API; ограничения и особенности медтематики. +- [ ] Структура каталогов: код (`/app`), скрипты развёртывания (`Dockerfile`, `docker-compose.yml`), `/tests`, `/docs`, демо-набор данных без ПДн. +- [ ] Код с комментариями, особенно в алгоритмах обработки медданных; документация интерфейсов. +- [ ] **Конфигурационные файлы — в отдельной папке.** +- [ ] Docker для воспроизводимости; команды установки зависимостей. +- [ ] Презентация (PDF или слайды в репозитории): принцип работы, логика, архитектура. +- [ ] Решение должно запускаться **и на технике организатора, и на ноутбуках команды** без установки нелицензионного/непредусмотренного ПО. diff --git a/docs/source/case_sbermed_ai.pdf b/docs/source/case_sbermed_ai.pdf new file mode 100644 index 0000000..3fa8220 Binary files /dev/null and b/docs/source/case_sbermed_ai.pdf differ diff --git a/docs/source/concept_cjm.pdf b/docs/source/concept_cjm.pdf new file mode 100644 index 0000000..26d611c Binary files /dev/null and b/docs/source/concept_cjm.pdf differ diff --git a/docs/source/concept_cjm.txt b/docs/source/concept_cjm.txt new file mode 100644 index 0000000..2b9c710 --- /dev/null +++ b/docs/source/concept_cjm.txt @@ -0,0 +1,708 @@ +Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +Сервис поддержки при ПТСР и +депрессии — концепция и CJM + ​Oct 3, 2026 · ​@Arx + + +Суть сервиса +Сервис — цифровой первый шаг в государственную помощь при ПТСР и +депрессии. Он находит людей, которым нужна помощь, проводит +валидированный скрининг в диалоге, направляет на нужный уровень помощи и +сопровождает между визитами. Диагноз ставит и лечение назначает только +врач. + +Позиционирование: навигатор и монитор, а не «ИИ-психотерапевт». Сервис не +конкурирует с врачом, а убирает разрыв между «мне плохо» и «я дошёл до +специалиста». + + + Сторона Боль сейчас Что даёт сервис + + Человек с симптомами Стыдно, непонятно, куда Анонимный старт, + идти, страх «учёта» понятный маршрут, + поддержка между + визитами + + Семья Видит проблему, не Признаки, сценарий + знает, что делать, сама разговора, помощь для + истощена себя и детей + + Врач, медицинский Мало времени, анамнез Готовая карточка: + психолог собирается с нуля жалобы, баллы шкал, + динамика, красные флаги + + Региональный минздрав, Дефицит кадров, нет Сортировка нагрузки по + фонд «Защитники данных о реальной уровням, обезличенная + Отечества» потребности аналитика спроса + + Сбер Нужен B2G-продукт в Продукт на GigaChat и + MedTech СберЗдоровье для + госсектора + + + + + Page 1 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +Проблема и контекст в РФ +Помощь в России уже есть, но люди до неё не доходят. Инфраструктура +выросла за три года, а главные узкие места — стигма, отсутствие маршрута и +дефицит специалистов. + +Масштаб. Открытой статистики по ПТСР нет, оценки расходятся. Минздрав +называл от 3% до 11% военнослужащих, среди раненых до 30%. По словам А. +Цивилевой, помощь медицинских психологов и психиатров нужна 20% +вернувшихся (Коммерсантъ, RTVI). Каждому четвёртому, кто обратился за +психологической помощью через фонд, рекомендовали врача (отчёт +Минздрава за 2023 год). + +Что уже работает. С июля 2023 года открыто более 2 тысяч кабинетов +психологической помощи. В филиалах фонда «Защитники Отечества» работают +300 клинических психологов (фонд). Углублённую диспансеризацию в 2025 +году прошли более 105 тыс. ветеранов (фонд). Есть платформа СВОИРОДНЫЕ.РФ +и чат-бот фонда в Госуслугах. + +Где разрыв. + + Стигма: ветераны не идут к психологу, доверяют только сослуживцам и + хотят говорить с равным (ЕАН, ПНП). + Нет маршрутизатора: специалисты прямо говорят о нехватке единого + маршрута и мануала (RTVI). + Кадры: психиатров и психотерапевтов почти вдвое меньше норматива (RTVI). + Первыми приходят семьи, а не сами ветераны (Вечерняя Казань). + ПТСР часто проявляется через месяцы после возвращения, поэтому разового + скрининга мало. + +Депрессия в общей популяции часто остаётся нераспознанной: люди +списывают её на усталость, а терапевт на приёме не успевает её выявить. +Точные данные о распространённости депрессии в РФ в анализ не входили — +это открытый вопрос для презентации. + + +Сегменты целевой аудитории +Сервис работает с четырьмя группами пациентов и двумя группами на стороне +системы. Ветераны и люди с депрессией — ядро; семьи — главный канал входа +для ветеранов. + + + + + Page 2 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Сегмент Кто Ключевая боль Барьер к обращению Приоритет + + Ветераны Участники СВО, ПТСР, нарушения сна, «Я не псих», доверие 1 + боевых действий ветераны прошлых раздражительность, только своим, страх учёта + конфликтов, особенно алкоголь и потери прав на оружие и + раненые вождение + + Люди с Взрослые из общей Нет сил, ничего не радует, Не распознают симптомы, 1 + депрессией и популяции, включая бессонница считают это ленью или + тревогой хронически больных, выгоранием, боятся + переживших утрату, психиатрии + женщин после родов + + Семьи ветеранов Жёны, родители, Вторичная травма, горе, Думают о близком, а не о 1, как канал + и погибших взрослые дети страх за безопасность себе; не знают, норма ли входа + дома происходящее + + Пережившие Пострадавшие в ЧС и ПТСР вне армии Нет специализированной 2 + другие травмы терактах, жители точки входа + приграничных + регионов, переселенцы + + Специалисты Терапевты, Мало времени, нет данных Недоверие к ИИ, лишняя 1, + медицинские между визитами нагрузка пользователь + психологи, + психотерапевты, + психиатры + + Заказчик Региональный Дефицит кадров, нет Регуляторика, закупка Покупатель + минздрав, фонд данных о потребности + «Защитники Отечества» + + + +Персоны для CJM: + + Андрей, 34 года. Контрактник, вернулся после ранения 8 месяцев назад. + Живёт в райцентре, ближайший психиатр — в областном центре. Плохо спит, + стал чаще пить, срывается на домашних. + Ольга, 41 год. Бухгалтер. Полгода нет сил, плохо спит, ничего не радует. + Считает, что это выгорание. + Наталья, 38 лет. Жена Андрея, двое детей. Видит, что муж изменился, + боится за детей и устала сама. + Ирина, 45 лет. Медицинский психолог в кабинете при районной + поликлинике и консультант филиала фонда. + + +Точки входа +Ветераны сами почти не приходят, поэтому для них важнее проактивные +входы: при выписке, через фонд, через семью и сослуживцев. Людей с +депрессией сервис ловит там, где они уже бывают: в приложениях Сбера и на +диспансеризации. + + + + + Page 3 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Точка входа Сегменты Как человек попадает в Тип + сервис + + Выписка из госпиталя Ветераны QR-код в выписке, Проактивный + после ранения короткий модуль «что + нормально после + возвращения» + + Социальный Ветераны, Ссылка на первичной Проактивный + координатор фонда семьи беседе, первая анкета + «Защитники вместе с + Отечества» координатором + + Углублённая Ветераны, Короткий скрин перед Проактивный + диспансеризация и депрессия визитом к терапевту, + диспансеризация результат уходит в + карточку + + Приём у терапевта Депрессия, Врач даёт ссылку на Проактивный + поликлиники ветераны скрининг или на + мониторинг между + визитами + + Ветеранские Ветераны Ссылка «от своего», Проактивный + организации, peer- совместный первый + консультанты вход + + Приглашение от Ветераны Персональная ссылка Проактивный + близкого из семейной ветки + сервиса + + СберЗдоровье, Депрессия, Самотест «Как вы на Реактивный + СберБанк Онлайн семьи самом деле?» в разделе + здоровья + + Госуслуги, чат-бот Ветераны, Сценарий Реактивный + фонда семьи «Психологическая + поддержка» ведёт в + сервис + + Бот в мессенджере Все Анонимный вход без Реактивный + MAX или Telegram регистрации, в любое + время + + Горячие линии Все После звонка — Реактивный + предложение + мониторинга в сервисе + + + + + Page 4 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +Интеграции с Госуслугами, СберЗдоровьем и региональными системами +записи — гипотезы. Их нужно подтвердить с владельцами каналов до питча. + + +Модель ступенчатой помощи +Все входы ведут в один скрининг, а триаж распределяет людей по четырём +уровням помощи. Кризисный сигнал на любом шаге идёт мимо триажа сразу к +человеку. + + + + +ступенчатая помощь · 4 уровня и кризисная ветка + +Шкалы: PC-PTSD-5 и PCL-5 — ПТСР, PHQ-9 — депрессия, GAD-7 — тревога, AUDIT-C +— алкоголь, плюс отдельный скрин суицидального риска. Русскоязычные +валидированные версии и пороги между уровнями утверждает медицинский +эксперт. + + +CJM: ветеран боевых действий (Андрей) +Ключевой момент пути — первые 3–12 месяцев после возвращения, когда +симптомы нарастают, а за помощью Андрей не идёт. Сервис должен появиться +в его жизни раньше кризиса и говорить с ним на равных. + + + + + Page 5 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Этап Что делает и Барьер Что делает сервис Метрика + чувствует + + 1. Возвращение (0–3 Рад быть дома, занят Проблему не видит QR-код при выписке и в Доля + мес.) выплатами и фонде. Модуль «что подключившихся из + документами. «Всё нормально после контактов фонда и + нормально» возвращения» без слов госпиталя + «расстройство» и + «психолог» + + 2. Нарастание (3–12 Плохо спит, пьёт, Стигма: «я не псих» Check-in раз в 2–4 недели Доля ответивших на + мес.) срывается. про сон, повторный check-in + «Гражданские не раздражительность, + понимают» алкоголь. Сигнал от + семьи + + 3. Первый контакт Пишет ночью в Страх, что данные Анонимный режим. Конверсия «вход → + мессенджер. уйдут в часть, Прямо объясняет, кто начало скрининга» + «Посмотрю, что это» работодателю, видит данные и что + лишат прав на консультация — не учёт + оружие и вождение + + 4. Скрининг Отвечает на Длинные анкеты, Короткие блоки: PC-PTSD- Доля завершивших + вопросы в диалоге недоверие к 5, PCL-5, AUDIT-C, скрин скрининг + «тестам» суицидального риска. + Объясняет результат + простым языком + + 5. Маршрутизация и Выбирает, к кому Далеко, очереди, Предлагает уровень Конверсия «скрининг + запись идти неудобное время помощи. Вариант → запись → визит» + «сначала поговорить с + ветераном- + консультантом». Запись + к психологу фонда или в + кабинет, онлайн- + консультация. Карточка + уходит специалисту + только с согласия + + 6. Помощь Ходит на Бросает после 1–2 Напоминания, дневник Удержание в терапии + консультации, визитов, побочные сна, отметки о приёме через 3 месяца + возможно, эффекты лекарств, вопросы для + принимает врача + лекарства + + 7. Мониторинг и Работает, Рецидивы на Check-in раз в месяц. При Динамика баллов PCL- + возвращение к переобучается, годовщинах и при ухудшении — повторный 5, доля рецидивов + жизни живёт с семьёй стрессе триаж. Связка с мерами + фонда: переобучение, + трудоустройство + + + +Кризисная ветка работает на любом этапе. Суицидальные мысли или угроза +насилия запускают жёсткое правило, а не генерацию модели: немедленная +передача человеку — дежурному специалисту или на горячую линию, при +угрозе жизни — 112. + + + + + Page 6 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +CJM: человек с депрессией или тревогой (Ольга) +Ольга теряется на двух этапах: она не узнаёт в своём состоянии депрессию, а +начав лечение, бросает его до того, как оно подействует. Сервис нужен на +входе как «зеркало» и в лечении как опора. + + + Этап Что делает и чувствует Барьер Что делает сервис Метрика + + 1. Симптомы Нет сил, плохо спит, Не распознаёт Просветительский Охват контентом + ничего не радует. депрессию контент в + «Просто устала, надо СберЗдоровье: + взять себя в руки» признаки депрессии + простым языком + + 2. Триггер Видит баннер, Нет повода Самотест из 2 вопросов Охват скринингом + проходит остановиться (PHQ-2) в приложении + диспансеризацию, или перед визитом к + слышит от подруги терапевту + + 3. Скрининг Отвечает на PHQ-9 и Стыд, страх Объясняет разницу Доля завершивших + GAD-7 в диалоге «поставят на учёт» между консультацией и скрининг + диспансерным + наблюдением, кто + увидит результат + + 4. Узнаёт, что с ней, и что «В психдиспансер не Лёгкая степень — Конверсия «скрининг + Маршрутизация можно сделать пойду» самопомощь и онлайн- → запись → визит» + психолог. Умеренная — + кабинет медико- + психологической + помощи или + психотерапевт. + Тяжёлая — психиатр. + Запись и напоминание + + 5. Лечение Психотерапия, Эффект не сразу, Объясняет ожидаемые Приверженность + возможно, побочные эффекты, сроки, напоминает о лечению через 3 + антидепрессанты бросает приёме, фиксирует месяца + побочные эффекты для + врача + + 6. Поддержание Возвращается к Ранние признаки PHQ-9 раз в месяц. При Динамика PHQ-9, + ремиссии обычной жизни рецидива не росте баллов — сигнал доля рецидивов + замечает врачу и повторный + триаж + + + +Кризисная ветка та же, что у ветерана: ответ на суицидальные мысли — сразу +живой человек. + + +CJM: член семьи ветерана (Наталья) +Наталья — самый короткий путь к Андрею и одновременно отдельный пациент. +Сервис помогает ей самой, учит говорить с мужем и ставит её безопасность +выше задачи «привести его к врачу». + + + + + Page 7 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Этап Что делает и Барьер Что делает Метрика + чувствует сервис + + 1. Замечает Муж Не знает, норма ли Вход «Я близкий Доля входов + изменения срывается, это. Боится ветерана». Чек- через семейную + пьёт, не спит. спровоцировать лист признаков: ветку + «Пройдёт», конфликт что ожидаемо, + «боюсь за что требует + детей» помощи + + 2. Ищет Спрашивает Противоречивые Объясняет, как Доля + информацию подруг, фонд, советы проявляется дочитавших + интернет ПТСР, когда модуль + нужен врач, + когда звонить + 112 + + 3. Помощь себе Понимает, что «Сейчас не до Свой короткий Доля членов + истощена сама меня» скрининг: PHQ-9, семей, + GAD-7. Запись к получивших + психологу для помощь сами + неё, для детей + — к педагогам- + психологам + фонда + + 4. Разговор с Хочет Муж отказывается, Сценарии Конверсия + мужем предложить разговор разговора без приглашений + помощь кончается ссорой ярлыков. во вход + Персональная ветерана + ссылка- + приглашение + для мужа. + Вариант через + ветерана- + консультанта + + 5. Муж начал Срывы, усталость, Поддержка Удержание + Сопровождение ходить к откаты семьи, семьи в сервисе + специалисту информация о через 3 месяца + мерах фонда, + группы для + близких + + +Безопасность важнее мотивации. При признаках домашнего насилия сервис +не уговаривает «потерпеть» и не делает приоритетом лечение мужа. Он даёт +контакты кризисных служб и 112. + + + + + Page 8 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +CJM: врач и медицинский психолог (Ирина) +Для Ирины сервис ценен, если экономит время на приёме и не добавляет +работы. Поэтому он живёт внутри её привычной системы, а не в отдельном +кабинете, и шлёт сигналы только при ухудшении. + + + Этап Что делает Боль Что делает Метрика + сервис + + До приёма Готовится к Анамнез Карточка Доля приёмов + первичной собирается с пациента: с готовой + консультации нуля жалобы его карточкой + словами, баллы + шкал, + алкоголь, + красные флаги, + ожидания от + помощи + + На приёме Консультирует, Нет График баллов Время + назначает план динамики, и сна за период первичного + только мониторинга приёма + «сейчас» + + После Задаёт, как Нет Врач выбирает Доля + приёма наблюдать инструмента шкалы и пациентов с + пациента наблюдения частоту check- планом + in для мониторинга + пациента + + Между Работает с Поток Сигнал только Доля ложных + визитами другими данных, на при ухудшении сигналов + пациентами который нет или кризисе, по + времени порогам, + согласованным + с + медэкспертом + + Отчётность Вносит данные Двойной Выгрузка Время на + в медицинскую ввод карточки и документацию + систему динамики в + региональную + МИС + + + + + Page 9 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +Главные возражения специалистов: «ИИ ставит диагнозы», «кто отвечает за +пропущенный сигнал», «ещё один кабинет». Ответ: сервис только собирает +данные и маршрутизирует, пороги задаёт врач, интеграция — в существующую +систему. + + +Путь заказчика B2G +Покупают регион и фонд, а решение принимают главный внештатный психиатр +и региональный ИТ-оператор. Поэтому продажа идёт через пилот с измеримым +эффектом, а не через демо. + + 1. Выявление потребности. Региональный минздрав или филиал фонда + видит очереди и нехватку специалистов. Участники: министр или + замминистра, главный внештатный психиатр, руководитель филиала фонда. + 2. Пилот. Один-два района или один филиал фонда, 3–6 месяцев. Нужны: + согласованный маршрут, протокол кризисной эскалации, договор с + оператором данных. + 3. Оценка. Конверсия в визит, удержание, нагрузка на специалистов, + динамика шкал, отзывы врачей. + 4. Включение в программу. Региональная программа поддержки ветеранов + или программа психического здоровья, госзакупка. + 5. Масштабирование. Другие районы, затем другие регионы через фонд как + федеральный канал. + +До пилота нужны ответы на три вопроса: соответствие 152-ФЗ и аттестация +информационной системы; не попадает ли сервис под регистрацию как +программное медицинское изделие; кто оператор данных — Сбер, регион или +медицинская организация. + + +Архитектура, данные и 152-ФЗ +Языковая модель только ведёт разговор. Баллы считаются по формулам шкал, +кризис ловят правила, а данные делятся на анонимный и персональный контур. + + + + + Page 10 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + +архитектура · 4 слоя от каналов до получателей + +Данные о здоровье — специальная категория персональных данных по 152-ФЗ. +Из этого следует: + + Отдельное явное согласие на обработку данных о здоровье, которое можно + отозвать в один шаг. + Хранение и обработка в РФ, модель в российском контуре. + Анонимный режим по умолчанию: без ФИО до момента записи. + Минимизация: специалист видит карточку своего пациента, заказчик — + только обезличенную статистику. + Честное объяснение врачебной тайны: данные не передаются без согласия, + кроме случаев, прямо предусмотренных законом. Перечень таких случаев + проверяет юрист: от этого зависит доверие ветеранов. + + + +Метрики +Главная метрика — доля людей с положительным скринингом, дошедших до +специалиста. Остальные показывают, где воронка теряет людей и не страдает +ли безопасность. + + + + + Page 11 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Группа Метрика Зачем + + Охват Входы по каждой точке и Какие каналы работают + сегменту + + Воронка Вход → скрининг → Где теряем людей + завершение → запись → визит + + Удержание Доля в терапии и Сервис нужен дольше + мониторинге через 3 и 6 одного раза + месяцев + + Клинический Доля с клинически значимым Помощь работает, а не + эффект снижением баллов PCL-5 и просто записывает + PHQ-9 + + Безопасность Время от кризисного сигнала Сервис не создаёт ложного + до контакта с человеком, ощущения защиты + доля пропущенных кризисов + + Нагрузка на Доля случаев, закрытых на Специалисты заняты теми, + систему уровнях самопомощи и кому нужны + психолога + + Специалисты Доля приёмов с карточкой, Врачи пользуются, а не + доля ложных сигналов, терпят + оценка врачей + + Семьи Конверсия приглашений во Семейный канал работает + вход ветерана + + +Целевые значения нужно задать вместе с заказчиком и медицинским +экспертом до пилота. + + + +Риски и ограничения +Самый опасный риск — пропущенный кризис. Самый вероятный — сервис +нарастит спрос, а специалистов в регионе не хватит. + + + + + Page 12 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Риск Почему важно Как снижаем + + Пропуск кризиса Цена ошибки — жизнь Правила поверх модели, + дежурный человек, + тестирование на + сценариях вместе с + медэкспертом + + Модель «ставит диагноз» Юридическая и Жёсткие рамки ролей, + или даёт медицинские клиническая шаблонные ответы на + советы ответственность клинические вопросы, + проверка медэкспертом + + Страх учёта и утечки Ветераны не войдут или Анонимный контур, + данных не будут честны явное согласие, + прозрачно объяснено, + кто что видит + + Статус медицинского Может потребоваться Консультация юриста. В + изделия регистрация до запуска MVP — скрининг и + навигация без + клинических решений + + Нехватка мест у Человек дошёл, а Согласовать мощности с + специалистов записаться некуда регионом, развивать + самопомощь, группы и + онлайн-формат + + Недоверие к «госботу» Ветеран закроет чат Язык равного, peer- + после первого сообщения консультанты, вход + через ветеранские + организации + + Домашнее насилие Мотивация «помочь мужу» Протокол безопасности + может навредить семье в семейной ветке + + + + +Скоуп MVP +MVP начинается с ветеранов и их семей в одном канале, а депрессия в общей +популяции идёт второй волной. Так проще получить пилот через фонд и +показать эффект. + +Входит в MVP: + + Бот в одном мессенджере, анонимный вход и вход «Я близкий». + + + + + Page 13 of 14 + Сервис поддержки при ПТСР и депрессии — концепция и CJM + + + + + Диалоговый скрининг: PC-PTSD-5, PCL-5, PHQ-9, AUDIT-C, скрин суицидального + риска. + Триаж по уровням и кризисная ветка на правилах. + Запись к специалисту — в прототипе имитация, в пилоте интеграция с одной + системой. + Карточка пациента для специалиста, передаётся с согласия. + Check-in раз в 2 недели и сигнал специалисту при ухудшении. + Семейная ветка: признаки, сценарии разговора, приглашение. + +Не входит в MVP: интеграция с Госуслугами и СберЗдоровьем, сегмент +депрессии в общей популяции, выгрузка в региональную МИС, аналитика для +заказчика. + +Открытые вопросы к знакомым: + + Есть ли выход на фонд «Защитники Отечества» или региональный минздрав + для пилота? + Кто медицинский эксперт, который утвердит шкалы, пороги и протокол + кризиса? + Какие русскоязычные валидированные версии шкал будут использоваться? + Нужна ли регистрация как медицинского изделия — вопрос юристу. + + + + + Page 14 of 14 + \ No newline at end of file