# 🧩 Functioneel Ontwerp (FO) β€” Swift Medical Scribe Chatbot **Projectnaam:** Swift β€” Medical Scribe Chatbot Interface **Versie:** v3.0 **Datum:** 27-12-2024 **Auteur:** Colin Lit --- ## 1. Doel en relatie met het PRD 🎯 **Doel van dit document:** Dit Functioneel Ontwerp beschrijft het **redesign** van Swift naar een medical scribe chatbot interface. De gebruiker voert een natuurlijke conversatie met een AI-assistent die intents herkent, acties uitvoert, en relevante UI-componenten toont in een split-screen layout. πŸ“˜ **Relatie met andere documenten:** - **PRD:** `nextgen-epd-prd-ephemeral-ui-epd.md` β€” Ephemeral UI visie - **UX/UI:** `swift-ux-v2.1.md` β€” Visuele specificaties (wordt herzien) - **UX Research:** `nextgen-epd-onderzoeksverslag-ux-ui-patterns.md` β€” Marktanalyse - **Bouwplan:** `bouwplan-swift-v2.md` β€” Development roadmap **Kernprincipe:** > De gebruiker voert een natuurlijke conversatie met een medical scribe assistent. De assistent herkent intents, voert acties uit, en toont relevante UI-componenten (artifacts) rechts in beeld. De conversatie blijft zichtbaar en doorlopend β€” zoals ChatGPT Canvas of Claude Artifacts. **Belangrijkste wijzigingen t.o.v. v2.0:** | Aspect | v2.0 (Command Center) | v3.0 (Medical Scribe) | |--------|----------------------|----------------------| | Input model | Command-line stijl | Natuurlijke conversatie | | UI paradigma | Blocks die verschijnen/verdwijnen | Chat links, artifacts rechts | | Context | Per commando | Doorlopende conversatiegeschiedenis | | AI rol | Intent classifier | Converserende medical scribe | | Interactie | Transactioneel | Relationeel, follow-up mogelijk | --- ## 2. Overzicht van de belangrijkste onderdelen 🎯 **Doel:** Overzicht van alle modules en hun relaties. ### 2.1 Systeemcomponenten | # | Component | Beschrijving | Type | |---|-----------|--------------|------| | 1 | **Command Center** | Hoofdscherm met split-screen layout | Scherm | | 2 | **Context Bar** | Dienst, actieve patiΓ«nt, user info | UI Zone | | 3 | **Chat Panel** | Doorlopende conversatie (links, 40%) | UI Zone | | 4 | **Artifact Area** | Waar blocks verschijnen (rechts, 60%) | UI Zone | | 5 | **Chat Input** | Tekst + voice input (onderaan chat) | UI Zone | | 6 | **Chat API** | Medical scribe chatbot endpoint | Backend | | 7 | **Intent Engine** | Herkent intents in conversatie (hybrid) | Backend | | 8 | **Context Manager** | Beheert sessie context + chat history | Backend | ### 2.2 Artifacts (Bouwblokken) | Prio | Artifact | Functie | Trigger voorbeelden | |------|----------|---------|---------------------| | P1 | **DagnotatieBlock** | Snelle notitie invoer | "medicatie gegeven aan jan" | | P1 | **ZoekenBlock** | PatiΓ«nt zoeken | "wie is jan de vries" | | P1 | **PatientContextCard** | PatiΓ«nt overzicht | Na zoeken / selectie | | P1 | **OverdrachtBlock** | Dienst overdracht met AI-filtering | "maak overdracht" | | P2 | **RapportageBlock** | Behandelrapportage | "gesprek gehad met jan" | | P2 | **AgendaBlock** | Afspraken | "mijn afspraken vandaag" | | P2 | **MetingenBlock** | Vitale functies | "bloeddruk invoeren" | **Belangrijk:** Artifacts blijven functioneel hetzelfde als v2.0 blocks, maar verschijnen nu rechts in een persistent panel. ### 2.3 Rol-specifieke Views | Rol | Primaire workflow | Artifact focus | |-----|-------------------|----------------| | **Verpleegkundige** | Notities maken tijdens dienst | DagnotatieBlock, RapportageBlock | | **Psychiater** | Gefilterde overdracht lezen | OverdrachtBlock met AI-samenvatting | --- ## 3. User Stories 🎯 **Doel:** Beschrijven wat gebruikers moeten kunnen doen, vanuit hun perspectief. ### 3.1 Nieuwe Stories (v3.0) | ID | Rol | Doel / Actie | Verwachte waarde | Prio | |----|-----|--------------|------------------|------| | US-15 | Alle gebruikers | Natuurlijke conversatie voeren met assistent | Voelt als praten met collega | πŸ”΄ P1 | | US-16 | Alle gebruikers | Conversatiegeschiedenis zien | Context behouden tijdens werk | πŸ”΄ P1 | | US-17 | Alle gebruikers | Doorvragen zonder opnieuw te beginnen | Flexibele workflow | πŸ”΄ P1 | | US-18 | Alle gebruikers | Assistent stelt verduidelijkingsvragen | Minder fouten, betere data | 🟑 P2 | | US-19 | Alle gebruikers | Meerdere acties in één conversatie | EfficiΓ«nte workflow | 🟑 P2 | | US-20 | Verpleegkundige | Notities maken via spraak of typen | Hands-free documentatie | πŸ”΄ P1 | | US-21 | Verpleegkundige | Zien welke notities relevant zijn voor psychiater | Transparantie in filtering | 🟑 P2 | | US-22 | Psychiater | Alleen behandelrelevante info zien | Geen ruis, focus op behandeling | πŸ”΄ P1 | | US-23 | Psychiater | Doorklikken naar originele bron | Verificatie en context | πŸ”΄ P1 | ### 3.2 Bestaande Stories (herzien) | ID | Rol | Doel / Actie | Wijziging v3.0 | |----|-----|--------------|----------------| | US-01 | Verpleegkundige | Dagnotitie maken | Via conversatie: "Ik heb medicatie gegeven aan Jan" | | US-02 | Verpleegkundige | PatiΓ«nt zoeken | Via conversatie: "Wie is Jan de Vries?" | | US-04 | Verpleegkundige | Overdracht maken | Via conversatie: "Maak overdracht voor deze dienst" | --- ## 4. Functionele werking per onderdeel 🎯 **Doel:** Per component beschrijven wat de gebruiker kan doen en wat het systeem doet. ### 4.1 Command Center (Hoofdscherm) **Beschrijving:** Split-screen layout met chat links (40%) en artifacts rechts (60%). De gebruiker voert een natuurlijke conversatie met de medical scribe assistent. **Layout:** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ• Ochtend | 8 ptn Jan de Vries β–Ό πŸ‘€ SV β”‚ β”‚ CONTEXT BAR β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”‚ CHAT PANEL (40%) β”‚ ARTIFACT AREA (60%) β”‚ β”‚ β”‚ β”‚ β”‚ πŸ‘€ "Ik heb net medicatie β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ gegeven aan Jan" β”‚ β”‚ πŸ“ Dagnotitie β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ πŸ€– Ik maak een dagnotitie β”‚ β”‚ PatiΓ«nt: Jan de Vries βœ“ β”‚ β”‚ β”‚ voor Jan de Vries. β”‚ β”‚ Categorie: Medicatie βœ“ β”‚ β”‚ β”‚ Categorie: Medicatie. β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Notitie: β”‚ β”‚ β”‚ Wil je nog iets β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ β”‚ toevoegen? β”‚ β”‚ β”‚ medicatie gegeven β”‚β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ β”‚ πŸ‘€ "Nee, opslaan" β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ☐ Relevant voor psychiater β”‚ β”‚ β”‚ πŸ€– βœ“ Notitie opgeslagen β”‚ β”‚ β”‚ β”‚ β”‚ voor Jan de Vries. β”‚ β”‚ [Annuleren] [πŸ’Ύ Opslaan] β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ πŸ’¬ Typ of spreek... 🎀 β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Gedrag:** - Bij laden: Chat input heeft focus, artifact area toont placeholder - Keyboard shortcut `⌘K` focust chat input vanaf elke plek - Artifacts verschijnen rechts met slide-in animatie (200ms) - Chat blijft zichtbaar en scrollbaar tijdens werk met artifacts - Meerdere artifacts mogelijk via tabs (max 3 tegelijk) **States:** | State | Chat Panel | Artifact Area | |-------|------------|---------------| | Initial | Welcome message | Placeholder: "Artifacts verschijnen hier" | | Conversing | Chat history + streaming response | Ongewijzigd of artifact | | Action triggered | Chat continues | Artifact slide-in | | Working | Chat beschikbaar | Artifact actief | | Completed | Success message in chat | Artifact sluit of blijft | --- ### 4.2 Context Bar **Functie:** Toont essentiΓ«le context: dienst, actieve patiΓ«nt, gebruiker. **Elementen:** | Element | Beschrijving | Interactie | |---------|--------------|------------| | Dienst indicator | πŸ• Ochtend / Middag / Nacht + patiΓ«ntentelling | Geen | | Actieve patiΓ«nt | Dropdown met recent geselecteerde patiΓ«nten | Klik opent selector | | User info | Avatar + initialen | Klik opent menu | **Dienst kleuren:** | Dienst | Tijd | Kleur | |--------|------|-------| | Ochtend | 07:00-15:00 | Amber (#F59E0B) | | Middag | 15:00-23:00 | Blue (#3B82F6) | | Nacht | 23:00-07:00 | Indigo (#6366F1) | --- ### 4.3 Chat Panel **Functie:** Toont doorlopende conversatie met medical scribe assistent. **Elementen:** | Element | Beschrijving | |---------|--------------| | Chat Messages | Scrollbare lijst van user en assistant messages | | Message Bubbles | User: rechts, amber bg / Assistant: links, slate bg | | Streaming Indicator | Pulsating dots tijdens AI response | | Action Links | Klikbare links naar gerelateerde artifacts | | Timestamps | Optioneel, alleen bij pauzes >5 minuten | **Message Types:** | Type | Weergave | Voorbeeld | |------|----------|-----------| | User message | Rechts, amber | "medicatie gegeven aan jan" | | Assistant text | Links, slate | "Ik maak een dagnotitie..." | | Assistant action | Links, met icon | "πŸ“ Dagnotitie geopend" (klikbaar) | | System message | Centered, subtle | "βœ“ Notitie opgeslagen" | | Error message | Links, red border | "Er ging iets mis. Probeer opnieuw." | **Gedrag:** - Auto-scroll naar laatste message - Scroll-lock wanneer gebruiker omhoog scrollt - "Scroll to bottom" knop bij nieuwe messages - Max 100 messages in view (pagination voor oudere) --- ### 4.4 Chat Input **Functie:** Tekst + voice input voor conversatie met medical scribe. **States:** | State | Weergave | Trigger | |-------|----------|---------| | Default | "Typ of spreek..." + mic icon | β€” | | Typing | Cursor + getypte tekst | Keyboard input | | Listening | πŸ”΄ + waveform + live transcript | Mic click of spatie | | Processing | Disabled, "Denkt na..." | Na submit | | Streaming | Disabled, streaming in chat | Tijdens AI response | **Keyboard Shortcuts:** | Key | Actie | |-----|-------| | `Enter` | Submit message | | `⌘Enter` / `Ctrl+Enter` | Force submit (ook tijdens streaming) | | `Escape` | Clear input / cancel voice | | `↑` | Vorige message (edit history) | | `Space` (leeg) | Start voice recording | | `⌘K` | Focus input | **Voice Flow:** 1. User klikt mic of drukt spatie (bij lege input) 2. Deepgram start streaming transcription 3. Live transcript verschijnt in input field 4. Pauze detectie (1.5 sec stilte) β†’ auto-submit 5. Of user klikt "Stop" β†’ submit --- ### 4.5 Artifact Area **Functie:** Toont actieve artifacts (blocks) rechts van de chat. **Layout opties:** | Situatie | Weergave | |----------|----------| | Geen artifact | Placeholder met voorbeelden | | EΓ©n artifact | Full width, centered | | Meerdere artifacts | Tabs bovenaan (max 3) | **Artifact Lifecycle:** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 1. Intent detected in chat β”‚ β”‚ β†’ AI response: "Ik maak een dagnotitie..." β”‚ β”‚ β†’ Action object attached to response β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 2. Artifact appears β”‚ β”‚ β†’ Slide-in animation (200ms, from right) β”‚ β”‚ β†’ Pre-filled with extracted entities β”‚ β”‚ β†’ Focus moves to first editable field β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 3. User interacts β”‚ β”‚ β†’ Edits fields in artifact β”‚ β”‚ β†’ Can continue chatting (e.g., "voeg toe: sliep goed") β”‚ β”‚ β†’ Chat updates artifact in real-time β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 4. User saves or cancels β”‚ β”‚ β†’ Success: toast + chat confirmation + artifact closes β”‚ β”‚ β†’ Cancel: artifact closes, no confirmation β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Placeholder State:** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ πŸ’¬ Artifacts verschijnen hier β”‚ β”‚ β”‚ β”‚ Vraag me iets, bijvoorbeeld: β”‚ β”‚ β€’ "Notitie voor Jan: medicatie gegeven" β”‚ β”‚ β€’ "Zoek Marie van den Berg" β”‚ β”‚ β€’ "Maak overdracht voor deze dienst" β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ### 4.6 Medical Scribe Chat API **Functie:** Chatbot endpoint die conversatie voert en intents herkent. **Endpoint:** `POST /api/swift/chat` **Request:** ```typescript interface ChatRequest { message: string; // User message messages: ChatMessage[]; // Conversation history (max 20) context: { activePatient?: Patient; // Currently selected patient shift: 'ochtend' | 'middag' | 'nacht'; userId: string; recentActions: RecentAction[]; // Last 5 actions }; } ``` **Response (Server-Sent Events):** ```typescript // Text chunk (streaming) { type: 'text', content: string } // Action detected (end of response) { type: 'action', intent: Intent, entities: ExtractedEntities, confidence: number, artifact?: { type: ArtifactType, prefill: PrefillData } } // Done { type: 'done' } ``` **System Prompt (samenvatting):** ``` Je bent een medische assistent (medical scribe) voor Swift, een Nederlands GGZ EPD. Je rol: - Help zorgmedewerkers met documentatie en administratie - Voer natuurlijke gesprekken in het Nederlands - Herken intents en voer acties uit wanneer nodig - Stel verduidelijkingsvragen bij onduidelijkheid - Wees vriendelijk maar professioneel Intents die je herkent: - dagnotitie: notitie maken voor patiΓ«nt - zoeken: patiΓ«nt zoeken - rapportage: behandelrapportage schrijven - overdracht: dienst overdracht maken - metingen: vitale functies invoeren - agenda: afspraken bekijken Wanneer je een intent herkent, voeg een JSON action object toe aan je response. Huidige context: - Actieve patiΓ«nt: {activePatient} - Dienst: {shift} - Recente acties: {recentActions} ``` --- ### 4.7 Intent Engine (Hybrid) **Functie:** Herkent intents in conversatie met two-tier approach. **Tier 1: Local Pattern Matching (<50ms)** | Pattern | Intent | Entities | |---------|--------|----------| | "notitie [naam]" | dagnotitie | patient: naam | | "zoek [naam]" | zoeken | query: naam | | "overdracht" | overdracht | β€” | | "bloeddruk [naam]" | metingen | patient: naam, type: bloeddruk | **Tier 2: AI Classification (via Chat API)** Wanneer local patterns geen match geven of confidence <0.8, bepaalt de Chat API het intent op basis van conversatie-context. **Voorbeelden:** | Conversatie | Intent | Methode | |-------------|--------|---------| | "notitie jan medicatie" | dagnotitie | Local (direct match) | | "Ik heb net een gesprek gehad" | rapportage | AI (context needed) | | "Hij geeft aan zich beter te voelen" | (context) | AI (follow-up) | | "Wie was die mevrouw van kamer 12?" | zoeken | AI (indirect) | --- ### 4.8 AI-Filtering voor Psychiater (Overdracht) **Functie:** Filtert verpleegkundige rapportages naar behandelrelevante informatie. **Wat WEL naar psychiater gaat:** | Categorie | Voorbeelden | |-----------|-------------| | Medicatie-issues | Weigering, bijwerkingen, therapierespons | | Stemming/gedrag verandering | t.o.v. baseline, significante shifts | | Risico-signalen | SuΓ―cidale uitingen, zelfbeschadiging, agressie | | Signaleringsplan triggers | Oranje/rood fase signalen | | Psychotische symptomen | Hallucinaties, wanen | | Behandelplan stagnatie | Geen voortgang op doelen | **Wat NIET naar psychiater gaat:** | Categorie | Voorbeelden | |-----------|-------------| | Routine medicatie | "Medicatie volgens schema ingenomen" | | ADL activiteiten | "Heeft gedoucht", "Ontbijt genuttigd" | | Standaard observaties | "Rustige dag", "Goed geslapen" | | Sociale activiteiten | "Bezoek gehad", "Mee naar dagactiviteit" | **Linked Evidence:** Elke zin in de AI-samenvatting linkt naar de originele verpleegkundige notitie. De psychiater kan hover-to-preview of click-to-expand gebruiken. **UI in OverdrachtBlock:** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ”„ Overdracht Ochtend β†’ Middag [Γ—] β”‚ β”‚ 07:00 - 15:00 | 8 patiΓ«nten β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Behandelrelevant (3 patiΓ«nten) β”‚ β”‚ ─────────────────────────────────────────────────────── β”‚ β”‚ β”‚ β”‚ β–Ό Jan de Vries ⚠️ Alert β”‚ β”‚ Weigerde ochtendmedicatie. Geeft aan last te hebben β”‚ β”‚ van bijwerkingen (duizeligheid). Stemming somberder β”‚ β”‚ dan gisteren. β”‚ β”‚ πŸ“Ž 3 bronnotities [Bekijk bronnen] β”‚ β”‚ β”‚ β”‚ β–Ά Marie van den Berg β”‚ β”‚ β–Ά Piet Jansen β”‚ β”‚ β”‚ β”‚ ─────────────────────────────────────────────────────── β”‚ β”‚ Geen bijzonderheden (5 patiΓ«nten) β”‚ β”‚ [Toon allen β–Ό] β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ [πŸ“‹ Kopieer] [πŸ“€ Naar EPD] [βœ“ Gezien] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## 5. User Flows 🎯 **Doel:** Laten zien hoe de gebruiker stap-voor-stap door het systeem gaat. ### Flow 1: Dagnotitie via Conversatie ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 1. Verpleegkundige opent Swift β”‚ β”‚ β†’ Chat: welcome message β”‚ β”‚ β†’ Artifact: placeholder β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 2. Verpleegkundige typt: "Medicatie gegeven aan Jan" β”‚ β”‚ β†’ Message verschijnt in chat β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 3. AI Response (streaming): β”‚ β”‚ "Ik maak een dagnotitie voor Jan de Vries. β”‚ β”‚ Categorie: Medicatie. Wil je nog iets toevoegen?" β”‚ β”‚ β†’ Action: intent=dagnotitie, patient=Jan, cat=Medicatie β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 4. DagnotatieBlock verschijnt rechts: β”‚ β”‚ β†’ Patient: Jan de Vries βœ“ (pre-filled) β”‚ β”‚ β†’ Categorie: Medicatie βœ“ (pre-filled) β”‚ β”‚ β†’ Text: "Medicatie gegeven" (pre-filled) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 5. Verpleegkundige: "Nee, opslaan" β”‚ β”‚ β†’ Of: klikt direct op Opslaan knop β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 6. Resultaat: β”‚ β”‚ β†’ Toast: "βœ“ Notitie opgeslagen" β”‚ β”‚ β†’ Chat: "Notitie opgeslagen voor Jan de Vries." β”‚ β”‚ β†’ Artifact sluit (of blijft voor volgende) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ TIJD: ~15 seconden β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Flow 2: Overdracht met AI-Filtering (Psychiater) ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 1. Psychiater opent Swift β”‚ β”‚ β†’ Chat: "Goedemorgen! Wil je de overdracht bekijken?" β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 2. Psychiater: "Ja, laat zien" β”‚ β”‚ β†’ Of: "Overdracht ochtend" β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 3. AI Response: β”‚ β”‚ "Ik haal de overdracht op. 3 patiΓ«nten hebben β”‚ β”‚ behandelrelevante updates." β”‚ β”‚ β†’ OverdrachtBlock verschijnt rechts β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 4. OverdrachtBlock toont: β”‚ β”‚ β†’ Gefilterde samenvatting (alleen behandelrelevant) β”‚ β”‚ β†’ PatiΓ«nten gesorteerd op urgentie β”‚ β”‚ β†’ "Geen bijzonderheden" sectie ingeklapt β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 5. Psychiater klikt op "πŸ“Ž 3 bronnotities" bij Jan β”‚ β”‚ β†’ Slide-in panel met originele verpleegkundige notities β”‚ β”‚ β†’ Timestamps en auteurs zichtbaar β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 6. Psychiater in chat: "Wat was er gisteren met Jan?" β”‚ β”‚ β†’ AI antwoordt met context uit eerdere notities β”‚ β”‚ β†’ Geen nieuw artifact nodig β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 7. Psychiater klikt "βœ“ Gezien" β”‚ β”‚ β†’ Overdracht gemarkeerd als gelezen β”‚ β”‚ β†’ Chat: "Overdracht gemarkeerd als gezien." β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Flow 3: Rapportage met Verduidelijkingsvragen ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 1. Verpleegkundige: "Ik heb een gesprek gehad" β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 2. AI: "Met welke patiΓ«nt had je het gesprek?" β”‚ β”‚ β†’ Geen artifact (verduidelijking nodig) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 3. Verpleegkundige: "Jan" β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 4. AI: "Ik maak een rapportage voor Jan de Vries. β”‚ β”‚ Wat wil je vastleggen?" β”‚ β”‚ β†’ RapportageBlock verschijnt rechts (leeg) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 5. Verpleegkundige: "Hij voelt zich beter, minder angstig" β”‚ β”‚ β†’ Tekst verschijnt in RapportageBlock β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 6. AI: "Genoteerd. Wil je dit als voortgangsgesprek β”‚ β”‚ opslaan of is er meer?" β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 7. Verpleegkundige: "Opslaan als voortgang" β”‚ β”‚ β†’ Rapportage opgeslagen met tag "Voortgangsgesprek" β”‚ β”‚ β†’ Toast + chat confirmation β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## 6. Interacties met AI 🎯 **Doel:** Uitleggen waar AI in de flow voorkomt en wat de gebruiker ziet. | Locatie | AI-actie | Trigger | Output | |---------|----------|---------|--------| | Chat | Conversatie + intent detection | Elke user message | Streaming text + action object | | Chat | Verduidelijkingsvraag | Onduidelijke intent | Vraag in chat (geen artifact) | | Chat | Follow-up verwerking | User antwoord op vraag | Update artifact of nieuwe info | | OverdrachtBlock | Relevantie-filtering | "overdracht" intent | Gefilterde samenvatting | | OverdrachtBlock | Samenvatting generatie | Per patiΓ«nt | Behandelrelevante bullets | | RapportageBlock | Tekst structureren | "Structureer" knop | Gestructureerde tekst | | RapportageBlock | B1-niveau herschrijven | "Vereenvoudig" knop | Herschreven tekst | **Confidence Thresholds:** | Confidence | Actie | |------------|-------| | >0.9 | Direct artifact openen met prefill | | 0.7-0.9 | Artifact openen + bevestigingsvraag in chat | | 0.5-0.7 | Verduidelijkingsvraag in chat, geen artifact | | <0.5 | Fallback: "Ik begrijp je niet helemaal. Kun je het anders formuleren?" | --- ## 7. Gebruikersrollen en rechten 🎯 **Doel:** Beschrijven welke rollen toegang hebben tot welke onderdelen. | Rol | Toegang | Artifacts | AI-filtering | |-----|---------|-----------|--------------| | **Verpleegkundige** | Eigen dienst patiΓ«nten | Alle P1/P2 artifacts | Input: alle notities | | **Psychiater** | Alle patiΓ«nten in behandeling | OverdrachtBlock (read), PatientContextCard | Output: gefilterde samenvatting | | **Behandelaar** | Eigen caseload | Alle artifacts | Beide views beschikbaar | **Permissies per Artifact:** | Artifact | Verpleegkundige | Psychiater | Behandelaar | |----------|-----------------|------------|-------------| | DagnotatieBlock | βœ… Create | ❌ | βœ… Create | | RapportageBlock | βœ… Create | πŸ‘οΈ Read | βœ… Create | | OverdrachtBlock | βœ… Create | πŸ‘οΈ Read (filtered) | βœ… Both | | PatientContextCard | πŸ‘οΈ Read | πŸ‘οΈ Read | πŸ‘οΈ Read | --- ## 8. Technische Specificaties ### 8.1 API Routes | Route | Method | Functie | Status | |-------|--------|---------|--------| | `/api/swift/chat` | POST | Medical scribe chatbot | πŸ†• Nieuw | | `/api/swift/overdracht/generate` | POST | AI-gefilterde overdracht | πŸ”„ Herzien | | `/api/intent/classify` | POST | Intent classification | βœ… Bestaat | | `/api/patients/search` | GET | Patient search | βœ… Bestaat | | `/api/reports` | POST | Report opslaan | βœ… Bestaat | ### 8.2 Store Uitbreiding ```typescript interface SwiftStore { // Bestaande state activePatient: Patient | null; activeBlock: BlockType | null; shift: 'ochtend' | 'middag' | 'nacht'; // Chat state (nieuw) chatMessages: ChatMessage[]; isStreaming: boolean; pendingAction: Action | null; // Artifact state (nieuw) openArtifacts: Artifact[]; // Max 3 activeArtifactId: string | null; // Actions addChatMessage: (message: ChatMessage) => void; processAction: (action: Action) => void; openArtifact: (artifact: Artifact) => void; closeArtifact: (id: string) => void; } ``` ### 8.3 Component Structuur ``` components/swift/ β”œβ”€β”€ command-center/ β”‚ β”œβ”€β”€ command-center.tsx # Split-screen container β”‚ β”œβ”€β”€ context-bar.tsx # Header met dienst/patient β”‚ β”œβ”€β”€ chat-panel.tsx # πŸ†• Chat messages β”‚ β”œβ”€β”€ chat-input.tsx # Herzien: conversational β”‚ └── artifact-area.tsx # πŸ†• Artifact container β”œβ”€β”€ chat/ β”‚ β”œβ”€β”€ chat-message.tsx # πŸ†• Individual message β”‚ β”œβ”€β”€ chat-action-link.tsx # πŸ†• Clickable action β”‚ └── streaming-indicator.tsx # πŸ†• Typing dots β”œβ”€β”€ artifacts/ β”‚ β”œβ”€β”€ artifact-container.tsx # πŸ†• Wrapper met tabs β”‚ β”œβ”€β”€ dagnotitie-block.tsx # Bestaand β”‚ β”œβ”€β”€ zoeken-block.tsx # Bestaand β”‚ β”œβ”€β”€ overdracht-block.tsx # Herzien: met filtering UI β”‚ β”œβ”€β”€ rapportage-block.tsx # Bestaand β”‚ └── patient-context-card.tsx # Bestaand └── shared/ β”œβ”€β”€ linked-evidence.tsx # πŸ†• Bron-verwijzing component └── relevance-badge.tsx # πŸ†• "Behandelrelevant" indicator ``` --- ## 9. UI Specificaties ### 9.1 Layout Breakpoints | Viewport | Chat Panel | Artifact Area | |----------|------------|---------------| | Desktop (>1200px) | 40% | 60% | | Tablet (768-1200px) | 45% | 55% | | Mobile (<768px) | Full screen toggle | Full screen toggle | ### 9.2 Chat Message Styling | Element | User Message | Assistant Message | |---------|--------------|-------------------| | Alignment | Right | Left | | Background | Amber-50 (#FFFBEB) | Slate-100 (#F1F5F9) | | Border | Amber-200 | Slate-200 | | Max width | 80% | 80% | | Border radius | 16px (top-right: 4px) | 16px (top-left: 4px) | ### 9.3 Artifact Animation ```css /* Slide-in from right */ @keyframes artifact-enter { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .artifact-enter { animation: artifact-enter 200ms ease-out; } ``` --- ## 10. Bijlagen & Referenties 🎯 **Doel:** Linken naar overige documenten. ### Project Documentatie - PRD Ephemeral UI: `nextgen-epd-prd-ephemeral-ui-epd.md` - UX/UI Specs: `swift-ux-v2.1.md` - UX Research: `nextgen-epd-onderzoeksverslag-ux-ui-patterns.md` - Bouwplan: `bouwplan-swift-v2.md` - Project Status: `PROJECT-STATUS-2024-12-27.md` ### Externe Referenties - [ChatGPT Canvas UX Analysis](https://altar.io/next-gen-of-human-ai-collaboration/) - [Claude Artifacts Documentation](https://docs.anthropic.com) - [Abridge Linked Evidence](https://www.abridge.com/product) - [GGZ Zorgstandaarden](https://www.ggzstandaarden.nl) --- ## Wijzigingslog | Versie | Datum | Wijzigingen | |--------|-------|-------------| | v2.0 | 23-12-2024 | Command Center met ephemeral blocks | | v2.1 | 23-12-2024 | Prioriteitenlijst, intent mapping, P3 blocks | | v3.0 | 27-12-2024 | **Redesign:** Chat + Artifact interface, Medical Scribe conversatie, AI-filtering voor psychiater |