# Модель согласия и доступа

> Кто что видит: изоляция проектов, парные идентификаторы, разрешения, владение записью, происхождение данных и информация о том, что видит пациент о каждом приложении с доступом.

Source: https://developers.anpheros.com/ru/guides/consent

**Правило:** с согласия пациента организация видит всю запись — включая то, что написали другие клиники — но может изменять или удалять только то, что написала сама. Каждая версия каждого ресурса записывает проект, который ее создал, и организацию, от имени которой она была создана.

## Кто что видит
- **Проект** (API-ключ) видит созданных им пациентов. В рамках **гранта** (OAuth-токен) приложение видит ровно одного пациента, независимо от всех писателей, с ограничением по предоставленным областям действия (scopes) и фильтрам категорий. Все остальное возвращает 404, никогда 403, поэтому идентификаторы нельзя угадать.
- **Парные идентификаторы:** каждый проект получает свой собственный идентификатор для одного и того же человека; внутренние идентификаторы никогда не покидают платформу. Ссылки на пациентов за пределами вашей области действия маскируются непрозрачным токеном для каждого проекта.
- **Справочник** (Organization, Practitioner, PractitionerRole): читается по идентификатору по всей плоскости, чтобы ссылки разрешались; поиск осуществляется только в пределах вашего проекта; используется как `X-Anpheros-Acting-As` / `X-Anpheros-On-Behalf-Of` только когда он ваш.
- **Песочница (Sandbox) и продакшн (production)** — это разные базы данных. Ключ песочницы физически не может получить доступ к реальным пациентам.

## Запись и владение
- `project_id` для каждой версии ресурса = автор записи. Обновление/удаление другим проектом → 403 с объяснением; вместо этого запишите свой собственный ресурс.
- `Provenance.agent.onBehalfOf` = клиника/организация на момент записи: `X-Anpheros-On-Behalf-Of`, иначе организация действующего PractitionerRole, иначе организация проекта.
- Каждая запись создает ресурс Provenance и строку аудита (кто, что, когда, под какой грант, какое приложение, с какого отпечатка источника).

## Что видит пациент
`/me/patients/{id}/grants` перечисляет каждое приложение с доступом, его области действия (scopes) и срок действия; `…/access-log` перечисляет, что каждое приложение прочитало или записало — в рамках согласия **и** с собственным ключом проекта. Отзыв доступа вступает в силу при следующем запросе; приложение не может обновить его обратно.
С помощью `format=fhir` журнал доступа возвращается в виде Bundle ресурсов FHIR R4 `AuditEvent`, сформированных по шаблонам IHE Basic Audit Log Patterns (тип `rest`, взаимодействие как подтип, приложение и лицо, действующее через него, как агенты, пациент и ресурс как сущности, без клинических данных), чтобы другая система могла объединить его в представление человека о том, кто обращался к его записям.

Что записывает каждый ресурс Provenance и как его настроить: [Объяснение происхождения медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-provenance).

## SMART Health Links (обмен через QR-код или ссылку)

Человек может поделиться своей записью без посредничества приложения: `POST /me/patients/{id}/shl` создает
[SMART Health Link](https://hl7.org/fhir/uv/smart-health-cards-and-links/) для подмножества **экстренных** данных (аллергии,
лекарства, проблемы, прививки — без результатов или истории) или **полного** Международного резюме пациента, с
необязательным паролем и сроком действия. Ответ содержит URI `shlink:/…` (для QR-кода) и адрес просмотрщика на `/shl/view`, который открывается в любом браузере. Любой, кто сканирует его, отправляет запрос на URL манифеста и получает резюме в виде JWE (`dir` + `A256GCM`), зашифрованного ключом, содержащимся в ссылке; работает любой читатель SMART Health Link.

- Содержимое генерируется при каждом открытии (флаг `L`, статус `can-change`), поэтому карта, хранящаяся в телефоне, остается актуальной.
- Пароль (флаг `P`) проверяется на сервере; после 10 неудачных попыток ссылка перестает работать.
- `GET /me/patients/{id}/shl` перечисляет ссылки с указанием частоты и времени каждого открытия; `…/shl/{link}/revoke` немедленно
  отключает одну из них. Каждое открытие регистрируется в журнале доступа.
- Внутренний идентификатор человека никогда не покидает платформу: документ называет его псевдонимом ссылки.

## Агенты ИИ предлагают, человек решает

С согласия человека запись, сделанная агентом ИИ (приложением, зарегистрированным как агент, например, помощник,
подключенный через MCP) или любая запись с `author_type` `ai`, не применяется немедленно. Платформа проверяет ее и
отвечает `202 Accepted` с идентификатором предложения (заголовок `Anpheros-Proposal`); в записи ничего не меняется. Человек
видит это в `GET /me/patients/{id}/proposals` — что это такое, какое приложение отправило — и принимает или отклоняет его
(`…/proposals/{proposal}/accept` или `…/reject`). Принятое предложение записывается точно так, как было отправлено, с пометкой
"написано ИИ" (HL7 AI Transparency). Проекты, которые могут видеть запись, получают тонкий
webhook `proposal.created`. Записи, сделанные с использованием собственного ключа проекта, в записях, созданных проектом, не удерживаются.
