# Phase: Patient Portal | Field | Value | | --- | --- | | Identifier | `healthcare-13-4` | | Status | Planned | | Owner | Platform | | Module(s) | `healthcare.patient_portal`, `healthcare.patient_documents` | | Service(s) | `healthcare` | | Depends On | `healthcare-13-0`, `healthcare-13-1` | | ADR(s) | TBD | | Manifest | [phase-manifest.yaml](../../ai-framework/phase-manifest.yaml) | | Framework | [ADR-013](../../architecture/adr/ADR-013.md) · [ADR-018](../../architecture/adr/ADR-019.md) · [ADR-019](../../architecture/adr/ADR-019.md) | ## Objective Expose patient-facing self-service APIs: profile read/update (healthcare fields only), appointment list/book/cancel via appointment engine, document download refs, and notification preferences — without Identity admin, full medical record write path, or frontend UI in this phase. ## Enterprise Phase Discovery > **Required before Implementation.** | Field | Value | | --- | --- | | Discovery date | TBD at implementation | | Inputs reviewed | Phase 13.1 appointment APIs · Identity profile refs · Communication preferences | ### Target Responsibility (this phase when Complete) - Patient-scoped API surface (authenticated patient context) - Profile extensions: emergency contact refs, preferred clinic, language - Appointment self-service: list upcoming/past, book (policy-aware), cancel/reschedule - PatientDocumentRef listing (Storage refs; upload via Storage contract) - NotificationPreference shells → Communication client - Permissions `healthcare.patient_portal.*` - Events `healthcare.patient_portal.*` ### Explicitly Excluded - Identity credential/password admin - Loyalty campaigns and point earn - Medical record clinical edits by patient (13.5 read-only subset may be exposed later) - Pharmacy checkout (13.6) - Delivery tracking UI (13.7) - Experience public site (Experience service) ## Business Analysis | Item | Detail | | --- | --- | | Actors | Patient (authenticated end user) | | Business capabilities | Self-service appointments; view shared documents; manage comms prefs | | Success metrics | Patient can only access own tenant-scoped data | | Non-goals | Guest booking without auth, family proxy accounts (future) | ## Scope ### In Scope - Aggregates: PatientPortalProfile (extends Patient), PatientDocumentRef, PatientNotificationPreference - APIs under `/api/v1/patient-portal/*` or patient-scoped deps on existing routes - Integration with appointment engine commands (no duplicate appointment logic) - Alembic `0005_phase_134_patient_portal`; version `0.13.4.0` ### APIs (planned) | Method | Path | Permission | Notes | | --- | --- | --- | --- | | GET | `/api/v1/patient-portal/me` | patient context | Profile | | PATCH | `/api/v1/patient-portal/me` | patient context | Limited fields | | GET | `/api/v1/patient-portal/appointments` | patient context | Own appointments | | POST | `/api/v1/patient-portal/appointments` | patient context | Book via engine | | POST | `/api/v1/patient-portal/appointments/{id}/cancel` | patient context | Cancel | | GET | `/api/v1/patient-portal/documents` | patient context | Storage refs | ## Out of Scope - Doctor panel (13.2) - Clinic admin (13.3) - Full EHR write (13.5) - Pharmacy (13.6) - Delivery (13.7) - Frontend patient app ## Completion Criteria - [ ] Patient isolation tests (cannot read other patients) - [ ] Appointment self-service flows green - [ ] Handover + registry at `0.13.4.0` ## Related Documents - [Phase 13.1](phase-13-1-appointment-engine.md) - [Healthcare Roadmap](../../healthcare-roadmap.md) - [Module Registry](../../module-registry.md#healthcare)