38 KiB
Use Cases × Technische Componenten — Validatiematrix
Type: Architectuur Validatiedocument Versie: 1.0 Datum: 2026-02-14 Doel: Valideer of de enterprise architectuur alle use cases ondersteunt. Identificeer gaten. Relatie: Valideert
enterprise-epd-architectuur.mdenintent-system-architectuur-nl.md
1. Use Case Catalogus
Alle use cases uit de huidige codebase, uitgebreid met enterprise-scenario's die nog ontbreken.
1.1 Bestaande use cases (geïmplementeerd in prototype)
| ID | Use Case | Categorie | Intent | Status |
|---|---|---|---|---|
| UC-01 | Dagnotitie aanmaken via spraak/tekst | Rapportage | dagnotitie |
✅ Volledig |
| UC-02 | Rapportage tijdlijn bekijken (per shift) | Rapportage | — (UI) | ✅ Volledig |
| UC-03 | Notitie markeren voor overdracht | Rapportage | — (UI) | ✅ Volledig |
| UC-04 | Overdracht overzicht bekijken | Overdracht | overdracht |
✅ Volledig |
| UC-05 | AI-samenvatting genereren voor overdracht | Overdracht | overdracht |
✅ Volledig |
| UC-06 | Bronverwijzing volgen vanuit AI-samenvatting | Overdracht | — (UI) | ✅ Volledig |
| UC-07 | Patiënt zoeken op naam/BSN | Zoeken | zoeken |
✅ Volledig |
| UC-08 | Patiëntdossier openen | Navigatie | — (UI) | ✅ Volledig |
| UC-09 | Agenda bekijken (vandaag/week) | Agenda | agenda_query |
✅ Volledig |
| UC-10 | Afspraak aanmaken | Agenda | create_appointment |
✅ Volledig |
| UC-11 | Afspraak annuleren | Agenda | cancel_appointment |
✅ Volledig |
| UC-12 | Afspraak verzetten | Agenda | reschedule_appointment |
✅ Volledig |
| UC-13 | Intake status bekijken | Intake | intake_status |
⚠️ MVP |
| UC-14 | Risicotaxatie bekijken | Intake | risico_query |
⚠️ MVP |
| UC-15 | Diagnoses bekijken | Intake | diagnose_query |
⚠️ MVP |
| UC-16 | Navigeren naar intake-sectie | Intake | intake_navigeer |
⚠️ MVP |
| UC-17 | Spraak-naar-tekst voor invoer | Invoer | — (Deepgram) | ✅ Volledig |
| UC-18 | Samengestelde opdracht (multi-intent) | Classificatie | Meerdere | ✅ Volledig |
| UC-19 | Context-afhankelijke verwijzingen ("hem", "haar") | Classificatie | — (Orchestrator) | ✅ Volledig |
| UC-20 | Nudge na actie (vervolgactie suggestie) | Protocol | — (Nudge) | ⚠️ Code bestaat, niet aangeroepen |
1.2 Ontbrekende enterprise use cases
| ID | Use Case | Categorie | Waarom nodig |
|---|---|---|---|
| UC-21 | Behandelplan opstellen en bijwerken | Behandeling | Kernfunctie GGZ-EPD |
| UC-22 | Medicatieoverzicht bekijken/bijwerken | Medicatie | Wettelijk verplicht, hoog-risico |
| UC-23 | Incident/MIC-melding registreren | Veiligheid | Wkkgz verplichting |
| UC-24 | Wvggz-dwangmaatregel registreren | Juridisch | Wvggz verplichting |
| UC-25 | Toestemming registreren/intrekken | Juridisch | AVG + Wvggz |
| UC-26 | Audit log doorzoeken (compliance officer) | Audit | NEN 7513 verplichting |
| UC-27 | Patiëntdata exporteren (FHIR Bundle) | Interoperabiliteit | Dataportabiliteit (AVG) |
| UC-28 | Gebruikersbeheer (admin) | Beheer | Multi-tenancy |
| UC-29 | Protocolregel toevoegen/valideren | Knowledge | Protocol Engine beheer |
| UC-30 | Dashboard: team-overzicht per afdeling | Overzicht | Management informatie |
| UC-31 | Rapportage verwijderen (soft delete) + versioning | Rapportage | Wkkgz dossierplicht |
| UC-32 | Groepstherapie sessie rapporteren (meerdere patiënten) | Rapportage | GGZ-specifiek |
| UC-33 | Noodtoegang ("break the glass") | Beveiliging | NEN 7510, noodsituaties |
2. Technische Componenten Register
Alle componenten die de architectuur beschrijft, met hun verantwoordelijkheid en status.
2.1 Component overzicht
LAAG 1: INTERFACE
├── C01 Traditionele EPD UI (Next.js pages + forms)
├── C02 Intent Command Center (⌘K overlay)
├── C03 Spraak Input (Deepgram integratie)
└── C04 Block/Artifact systeem (canvas + forms)
LAAG 2: INTENT SYSTEEM
├── C05 Intent Registry (declaratieve definities)
├── C06 Reflex Classifier (lokale regex matching)
├── C07 Orchestrator (LLM classificatie)
├── C08 Entity Extractor + Date Parser
├── C09 Action System (intent → UI artifact mapping)
└── C10 Protocol Engine / Nudge
LAAG 3: KNOWLEDGE LAYER
├── C11 Protocol Rules Store (gevalideerde regels)
├── C12 RAG Pipeline (protocol indexering + vector search)
├── C13 Regelvalidatie UI (admin)
└── C14 Kennisbron Connectors (wet/protocol/kwaliteitsdoc importers)
LAAG 4: DOMEIN / BUSINESS LOGIC
├── C15 Rapportage Service (CRUD, versioning, soft delete)
├── C16 Overdracht Service (samenvatting generatie)
├── C17 Agenda Service (CRUD, conflictdetectie)
├── C18 Behandelplan Service
├── C19 Medicatie Service
├── C20 Intake Service
├── C21 Patiënt Service (CRUD, zoeken, toewijzing)
└── C22 Toestemming Service (Wvggz, AVG)
LAAG 5: ENTERPRISE FUNDAMENT
├── C23 Auth + SSO (Supabase Auth, SAML)
├── C24 Multi-tenancy (RLS, tenant context)
├── C25 RBAC + ABAC Engine (policy evaluatie)
├── C26 Audit Trail (NEN 7513 immutable log)
├── C27 Field Encryption (AES-256-GCM)
├── C28 FHIR Export Service
├── C29 CDS Hooks Service
├── C30 Observability (Pino, OpenTelemetry)
├── C31 Circuit Breaker / Resilience
├── C32 Health Check Service
└── C33 PII Filter (sanitisatie voor AI prompts)
LAAG 6: PLATFORM SERVICES (zie enterprise-componenten-uitbreiding.md)
├── C34 Notificatie Service (in-app + email + escalatie)
├── C35 Workflow Engine (state machine voor klinische workflows)
├── C36 Full-Text Search Service (klinische notities doorzoeken)
├── C37 Caching Layer (AI responses, API responses, sessiedata)
├── C38 Scheduled Jobs Service (BullMQ repeatable jobs)
└── C39 Webhook System (outbound event webhooks)
LAAG 7: EXTERNE INTEGRATIES (zie enterprise-componenten-uitbreiding.md)
├── C40 ZPM Facturatie Service (Zorgprestatiemodel)
├── C41 Vecozo Connector (voorbereiding)
└── C42 Zorgdomein Connector (voorbereiding)
LAAG 8: ANALYTICS (zie enterprise-componenten-uitbreiding.md)
└── C43 BI Module (materialized views, data-export)
2.2 Component status
| Component | Prototype status | Enterprise gereed? | Werk nodig |
|---|---|---|---|
| C01 EPD UI | Gedeeltelijk (rapportage, overdracht, agenda) | Nee | Uitbreiden: behandelplan, medicatie, admin |
| C02 Command Center | Volledig | Ja (refactor) | Store splitsen, Registry migratie |
| C03 Spraak Input | Volledig | Ja | Minimale wijzigingen |
| C04 Block/Artifact | Volledig | Ja | Uitbreiden met nieuwe block types |
| C05 Intent Registry | 40% (patronen verspreid over code) | Nee | Kernwijziging: centraliseren in config/DB |
| C06 Reflex Classifier | 85% werkend | Gedeeltelijk | Patronen naar Registry verplaatsen |
| C07 Orchestrator | 85% werkend | Gedeeltelijk | Prompt extractie, unified pipeline |
| C08 Entity Extractor | 60% werkend | Gedeeltelijk | Pattern tables externaliseren |
| C09 Action System | 70% werkend | Gedeeltelijk | Meer artifact types |
| C10 Protocol Engine | 30% (code niet aangeroepen) | Nee | Nieuw bouwen op basis van Knowledge Layer |
| C11 Protocol Rules Store | 0% | Nee | Volledig nieuw |
| C12 RAG Pipeline | 0% | Nee | Volledig nieuw |
| C13 Regelvalidatie UI | 0% | Nee | Volledig nieuw |
| C14 Kennisbron Connectors | 0% | Nee | Volledig nieuw |
| C15 Rapportage Service | 80% (CRUD werkt) | Nee | Versioning, multi-tenant |
| C16 Overdracht Service | 90% werkend | Gedeeltelijk | Multi-tenant, audit integratie |
| C17 Agenda Service | 80% werkend | Gedeeltelijk | Conflictdetectie, multi-tenant |
| C18 Behandelplan Service | 0% | Nee | Volledig nieuw |
| C19 Medicatie Service | 0% | Nee | Volledig nieuw |
| C20 Intake Service | 40% (MVP blocks) | Nee | Uitbreiden, multi-tenant |
| C21 Patiënt Service | 70% | Nee | Toewijzing, multi-tenant |
| C22 Toestemming Service | 0% | Nee | Volledig nieuw |
| C23 Auth + SSO | 60% (Supabase Auth) | Nee | SSO/SAML, MFA, session management |
| C24 Multi-tenancy | 0% | Nee | Volledig nieuw |
| C25 RBAC + ABAC | 10% (basis RLS) | Nee | Grotendeels nieuw |
| C26 Audit Trail | 0% | Nee | Volledig nieuw |
| C27 Field Encryption | 0% | Nee | Volledig nieuw |
| C28 FHIR Export | 10% (Patient endpoint) | Nee | Uitbreiden naar alle resources |
| C29 CDS Hooks | 0% | Nee | Volledig nieuw |
| C30 Observability | 10% (console.log) | Nee | Grotendeels nieuw |
| C31 Circuit Breaker | 20% (classifyWithTimeout) | Nee | Generaliseren |
| C32 Health Check | 0% | Nee | Volledig nieuw |
| C33 PII Filter | 40% (logger.ts sanitisatie) | Nee | Uitbreiden voor AI prompts |
3. Validatiematrix — Use Case × Component
Elke cel toont welke componenten een use case nodig heeft. Rode cellen zijn gaten.
3.1 Rapportage use cases
UC-01: Dagnotitie aanmaken via spraak/tekst
FLOW:
Zorgverlener spreekt/typt → "Notitie Jan medicatie onrustige nacht"
┌─────────────┐
│ C03 Spraak │ (optioneel) Audio → tekst
│ of C02 ⌘K │ Tekst invoer
└──────┬──────┘
▼
┌──────────────┐ ┌──────────────┐
│ C05 Registry │────►│ C06 Reflex │ Pattern match: "notitie" → dagnotitie
└──────────────┘ └──────┬───────┘
│ confidence 0.9
▼
┌──────────────┐
│ C08 Entity │ "Jan" → patient fuzzy match
│ Extractor │ "medicatie" → category
└──────┬───────┘
▼
┌──────────────┐
│ C09 Action │ Open dagnotitie-block met prefill
│ System │ { patient: Jan, category: medicatie }
└──────┬───────┘
▼
┌──────────────┐
│ C04 Block │ Formulier met vooringevulde data
│ (UI) │ Gebruiker bevestigt + voegt content toe
└──────┬───────┘
│ [gebruiker klikt "Opslaan"]
▼
┌──────────────┐ ┌──────────────┐
│ C25 RBAC │────►│ C15 Rapportage│ Insert report
│ check │ │ Service │ shift_date berekend
└──────────────┘ └──────┬───────┘
│
┌─────────────────────┤
▼ ▼
┌──────────────┐ ┌──────────────┐
│ C26 Audit │ │ C10 Protocol │ Evalueer nudges
│ Trail │ │ Engine │ → "Check vitale functies?"
└──────────────┘ └──────────────┘
COMPONENTEN NODIG: C02/C03, C05, C06, C08, C09, C04, C25, C15, C26, C10
GATEN:
🔴 C05 Intent Registry bestaat niet als centraal component
🔴 C25 RBAC check ontbreekt volledig
🔴 C26 Audit trail ontbreekt volledig
🔴 C10 Protocol Engine is niet aangesloten (code bestaat, niet aangeroepen)
🟡 C15 Rapportage Service mist versioning en multi-tenant
UC-05: AI-samenvatting genereren voor overdracht
FLOW:
Zorgverlener → "Overdracht" of klikt in UI
┌─────────────┐
│ C02 ⌘K │ of C01 UI → navigatie naar overdracht pagina
└──────┬──────┘
▼
┌──────────────┐ ┌──────────────┐
│ C06 Reflex │────►│ C09 Action │ Open overdracht-block
└──────────────┘ └──────┬───────┘
▼
┌──────────────┐
│ C16 Overdracht│ Haal patiëntenlijst op
│ Service │ Filter op afdeling/dienst
└──────┬───────┘
│ [voor elke actieve patiënt]
▼
┌──────────────┐
│ C33 PII │ Minimaliseer patiëntdata voor AI
│ Filter │
└──────┬───────┘
▼
┌──────────────┐
│ C07 Claude │ Genereer samenvatting
│ API │ Aandachtspunten + actiepunten
└──────┬───────┘
│
┌──────┴───────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ C26 Audit │ │ C04 Block │ Render samenvatting
│ Trail │ │ (UI) │ met bronverwijzingen
└──────────────┘ └──────────────┘
COMPONENTEN NODIG: C01/C02, C06, C09, C16, C33, C07 (Claude), C26, C04
GATEN:
🔴 C26 Audit trail ontbreekt — wie heeft welke samenvatting gegenereerd?
🔴 C33 PII filter is onvolledig — welke data gaat naar Claude?
🟡 C16 Overdracht Service mist tenant-filtering
🟡 Geen caching — elke keer opnieuw genereren is duur
UC-31: Rapportage verwijderen + versioning
FLOW:
Zorgverlener wil rapport wijzigen of verwijderen
┌─────────────┐
│ C01 UI │ Klik op "bewerken" of "verwijderen" in tijdlijn
└──────┬──────┘
▼
┌──────────────┐
│ C25 RBAC │ Mag deze gebruiker dit rapport wijzigen?
│ + ABAC │ Check: auteur OF hoofdbehandelaar OF admin
└──────┬───────┘
▼
┌──────────────┐
│ C15 Rapportage│ WIJZIGEN: nieuwe versie aanmaken
│ Service │ → version++, previous_version_id link
│ │ VERWIJDEREN: soft delete (deleted_at)
│ │ → NOOIT hard delete (Wkkgz)
└──────┬───────┘
▼
┌──────────────┐
│ C26 Audit │ Log: wie, wat, wanneer, waarom
│ Trail │ + data_before / data_after snapshot
└──────────────┘
COMPONENTEN NODIG: C01, C25, C15, C26
GATEN:
🔴 C15 Rapportage Service heeft GEEN versioning (alleen soft delete)
🔴 C25 Eigenaarschap-check ontbreekt
🔴 C26 Audit trail ontbreekt — geen bewijs van wijzigingen
3.2 Enterprise use cases (nieuw)
UC-23: Incident/MIC-melding registreren
FLOW:
Zorgverlener → "Incident melding: patiënt gevallen op kamer 3"
┌─────────────┐
│ C02 ⌘K │ "incident melding patiënt gevallen"
└──────┬──────┘
▼
┌──────────────┐
│ C06 Reflex │ Pattern: "incident" / "melding" / "MIC" / "gevallen"
│ │ → intent: NEW "incident_melding" (ONTBREEKT)
└──────┬───────┘
▼
┌──────────────┐
│ C08 Entity │ Extraheer: patiënt, locatie, type incident
│ Extractor │ "gevallen" → incident_type: "val"
└──────┬───────┘
▼
┌──────────────┐
│ C09 Action │ Open incident-formulier (ONTBREEKT)
│ │ Velden: patiënt, datum/tijd, locatie, beschrijving,
│ │ ernst, getuigen, maatregelen genomen
└──────┬───────┘
│ [gebruiker bevestigt]
▼
┌──────────────┐ ┌──────────────┐
│ C15 Rapportage│ │ C26 Audit │
│ report_type:│ │ Trail │
│ 'incident' │ └──────────────┘
└──────┬───────┘
▼
┌──────────────┐
│ C10 Protocol │ Nudges:
│ Engine │ → "Valpreventie protocol activeren?"
│ │ → "Informeer hoofdbehandelaar"
│ │ → "Plan follow-up observatie"
└──────────────┘
COMPONENTEN NODIG: C02, C06, C08, C09, C04, C15, C26, C10
NIEUWE COMPONENTEN NODIG:
🔴 Intent 'incident_melding' toevoegen aan Registry
🔴 Incident-formulier block (UI component)
🔴 Protocol rules voor incidentopvolging
🟡 Ernst-classificatie schema
🟡 Notificatie naar hoofdbehandelaar (C-NEW: Notificatie Service)
UC-24: Wvggz-dwangmaatregel registreren
FLOW:
Arts → Registreer dwangmaatregel (bijv. separatie, gedwongen medicatie)
┌─────────────┐
│ C01 UI │ Via traditionele formulier (te complex voor intent)
│ │ OF C02 ⌘K → "dwangmaatregel registreren [patient]"
└──────┬──────┘
▼
┌──────────────┐
│ C25 RBAC │ Check: alleen arts/psychiater mag dwangmaatregel registreren
│ + ABAC │ Check: patiënt heeft Wvggz legal_status
│ │ Check: toestemming/machtiging is actief (C22)
└──────┬───────┘
▼
┌──────────────┐
│ NEW: C34 │ Dwangmaatregel formulier
│ Wvggz Service │ Velden: type maatregel, start/eind, reden,
│ │ alternatieven overwogen, proportionaliteit
│ │ Juridische grondslag (zorgmachtiging nr.)
└──────┬───────┘
▼
┌──────────────┐ ┌──────────────┐
│ C22 Toestem- │ │ C26 Audit │ EXTRA LOGGING:
│ ming Service│ │ Trail │ Wvggz-maatregel = P1 audit event
│ Verify OK │ │ │ purpose: 'wvggz_dwangmaatregel'
└──────────────┘ └──────────────┘
▼
┌──────────────┐
│ C10 Protocol │ Nudges:
│ Engine │ → "Plan evaluatie dwangmaatregel (binnen 24u)"
│ │ → "Informeer geneesheer-directeur"
│ │ → "Registreer in Wvggz-register"
└──────────────┘
NIEUWE COMPONENTEN NODIG:
🔴 C34 Wvggz Service (registratie, evaluatie, rapportage)
🔴 C22 Toestemming Service (verificatie juridische grondslag)
🔴 Wvggz-specifieke ABAC policies
🔴 Protocol rules voor Wvggz-termijnen
🔴 Notificatie naar geneesheer-directeur
UC-26: Audit log doorzoeken
FLOW:
Compliance officer → "Wie heeft dossier patiënt X bekeken afgelopen maand?"
┌─────────────┐
│ C01 UI │ Admin → Audit log pagina
│ (admin) │ Zoekfilters: patiënt, gebruiker, periode, actie
└──────┬──────┘
▼
┌──────────────┐
│ C25 RBAC │ Check: rol = 'audit' of 'admin'
│ │ Audit officers hebben read-only toegang tot ALLE logs
└──────┬───────┘
▼
┌──────────────┐
│ C26 Audit │ Query: forensische zoekopdracht
│ Trail │ Filters: entity_type, entity_id, user_id, date range
│ │ Resultaat: gesorteerd op timestamp
└──────┬───────┘
▼
┌──────────────┐
│ C26 Audit │ META: het doorzoeken van de audit log
│ Trail │ wordt ZELF ook gelogd (wie zoekt wat op)
└──────────────┘
COMPONENTEN NODIG: C01, C25, C26
GATEN:
🔴 C26 Audit log UI (admin pagina) ontbreekt volledig
🔴 Export functie (CSV/PDF voor externe auditor)
🟡 Anomalie-detectie dashboard
UC-33: Noodtoegang ("break the glass")
FLOW:
Arts in noodsituatie → toegang nodig tot patiënt die niet is toegewezen
┌─────────────┐
│ C01 UI │ Patiëntdossier → "Geen toegang" melding
│ │ → Knop: "Noodtoegang aanvragen"
└──────┬──────┘
▼
┌──────────────┐
│ C25 RBAC │ Normale check FAALT (niet toegewezen)
│ + ABAC │ → Noodtoegang flow activeren
└──────┬───────┘
▼
┌──────────────────────────────────────┐
│ NEW: Break-the-Glass Dialog │
│ "U bent niet toegewezen aan deze │
│ patiënt. Noodtoegang vereist een │
│ reden." │
│ │
│ Reden: [dropdown] │
│ - Medisch noodgeval │
│ - Dienstdoend arts (geen toewijzing) │
│ - Vervanging collega │
│ Toelichting: [vrij tekstveld] │
│ │
│ [Annuleren] [Noodtoegang activeren] │
└──────┬───────────────────────────────┘
│ [gebruiker bevestigt]
▼
┌──────────────┐
│ C26 Audit │ P1 AUDIT EVENT:
│ Trail │ action: 'emergency_access'
│ │ purpose: reden uit formulier
│ │ → Automatische notificatie naar privacy officer
└──────┬───────┘
▼
┌──────────────┐
│ C21 Patiënt │ Tijdelijke toegang (bijv. 4 uur)
│ Service │ Auto-expire na timeout
└──────────────┘
NIEUWE COMPONENTEN NODIG:
🔴 Break-the-glass UI component
🔴 Tijdelijke toegang mechanisme in C25
🔴 Automatische notificatie service
🔴 Auto-expire logica
4. Gap Analyse — Samenvatting
4.1 Kritieke gaten (blokkeren enterprise deployment)
| # | Gap | Impact | Benodigde componenten | Inspanning |
|---|---|---|---|---|
| G1 | Geen audit trail | NEN 7513 niet-compliant, geen bewijs bij audit | C26 volledig bouwen | 2-3 weken |
| G2 | Geen multi-tenancy | Kan niet bij meerdere instellingen draaien | C24 volledig bouwen | 2-3 weken |
| G3 | Geen RBAC/ABAC | Iedereen ziet alles, geen rolgebaseerde toegang | C25 volledig bouwen | 2-3 weken |
| G4 | Intent Registry ontbreekt | Patronen verspreid over 3-4 bestanden | C05 centraliseren | 2-3 dagen |
| G5 | Protocol Engine niet actief | Nudges bestaan maar worden nooit getoond | C10 aansluiten + C11 rules store | 1-2 weken |
| G6 | Geen versioning op rapportages | Wijzigingsgeschiedenis niet traceerbaar | C15 uitbreiden | 3-5 dagen |
| G7 | Geen field encryptie | BSN en diagnoses onversleuteld in DB | C27 bouwen | 1 week |
4.2 Functionele gaten (ontbrekende GGZ-modules)
| # | Gap | Impact | Inspanning |
|---|---|---|---|
| G8 | Behandelplan module | Kernfunctie GGZ ontbreekt volledig | C18: 3-4 weken |
| G9 | Medicatie module | Wettelijk verplicht, hoog-risico domein | C19: 3-4 weken |
| G10 | Wvggz registratie | Kan geen verplichte zorg registreren | C34 + C22: 2-3 weken |
| G11 | Incident/MIC module | Wkkgz niet-compliant | Uitbreiding C15 + intent: 1-2 weken |
| G12 | Knowledge Layer | Geen protocol-gestuurde nudges | C11-C14: 4-6 weken |
4.3 Technische gaten
| # | Gap | Impact | Inspanning |
|---|---|---|---|
| G13 | Geen SSO/SAML | Enterprise instellingen vereisen SSO | C23 uitbreiden: 1 week |
| G14 | Geen structured logging | Console.log in productie = blind vliegen | C30: 1 week |
| G15 | Geen health checks | Geen alerting bij uitval | C32: 2-3 dagen |
| G16 | Circuit breaker incompleet | Alleen voor classify, niet generiek | C31 generaliseren: 3-5 dagen |
| G17 | PII filter incompleet | Patiëntdata lekt naar AI prompts | C33 uitbreiden: 3-5 dagen |
| G18 | Geen FHIR Bundle export | Alleen Patient endpoint, rest ontbreekt | C28 uitbreiden: 1-2 weken |
| G19 | Geen notificatie service | Geen alerts bij incidenten, Wvggz-termijnen | Nieuw component: 1-2 weken |
| G20 | Geen caching | AI samenvattingen elke keer opnieuw genereren | Cache layer toevoegen: 3-5 dagen |
5. Use Case × Component Kruistabel
Welk component is nodig voor welke use case? ● = nodig, ○ = optioneel, - = niet relevant.
UC UC UC UC UC UC UC UC UC UC UC UC UC
Component 01 05 07 10 11 21 23 24 26 27 31 32 33
dag ovdr zoek afsp ann beh inc wvgz aud fhir ver grp nood
─────────────────────────────────────────────────────────────────────────────
C01 EPD UI ○ ● ○ ○ ○ ● ● ● ● ● ● ● ●
C02 Command Center ● ● ● ● ● ○ ● ○ - - - ○ -
C03 Spraak ○ - - - - - ○ - - - - ○ -
C04 Block/Artifact ● ● ● ● ● - ● - - - - - -
C05 Intent Registry ● ● ● ● ● - ● - - - - - -
C06 Reflex ● ● ● ● ● - ● - - - - - -
C07 Orchestrator ○ ○ ○ ○ ○ - ○ - - - - - -
C08 Entity Extract ● - ● ● ● - ● - - - - - -
C09 Action System ● ● ● ● ● - ● - - - - - -
C10 Protocol Engine ● ● - - - ● ● ● - - - - -
C15 Rapportage Svc ● ● - - - - ● - - - ● ● -
C16 Overdracht Svc - ● - - - - - - - - - - -
C17 Agenda Svc - - - ● ● - - - - - - - -
C18 Behandelplan - - - - - ● - - - ○ - - -
C21 Patiënt Svc ● ● ● ● - ● ● ● - ● - - ●
C22 Toestemming - - - - - - - ● - - - - -
C24 Multi-tenancy ● ● ● ● ● ● ● ● ● ● ● ● ●
C25 RBAC/ABAC ● ● ● ● ● ● ● ● ● ● ● ● ●
C26 Audit Trail ● ● ● ● ● ● ● ● ● ● ● ● ●
C27 Field Encrypt - - ○ - - - - ● - ● - - -
C28 FHIR Export - - - - - - - - - ● - - -
C30 Observability ● ● ● ● ● ● ● ● ● ● ● ● ●
C31 Circuit Breaker ○ ● - - - - - - - - - - -
C33 PII Filter ○ ● - - - - - - - - - - -
C34 Wvggz Svc - - - - - - - ● - - - - -
Leeswijzer: C24 (Multi-tenancy), C25 (RBAC), C26 (Audit) en C30 (Observability) zijn nodig voor elke use case. Dit zijn de vier horizontale lagen die als eerste gebouwd moeten worden.
6. Bouwvolgorde — Prioritering op basis van gaps
Fase 0: Horizontale lagen (weken 1-4)
Bouw de vier componenten die elke use case nodig heeft:
Week 1-2: C24 Multi-tenancy (RLS, tenant context middleware)
C26 Audit Trail (immutable log, NEN 7513)
Week 3-4: C25 RBAC + ABAC Engine (rollen, policies, evaluatie)
C30 Observability (Pino structured logging)
Waarom eerst: Zonder deze vier werkt geen enkele enterprise use case. Retrofit is exponentieel duurder.
Fase 1: Intent systeem solide maken (weken 5-6)
Week 5: C05 Intent Registry (centraliseer patronen uit reflex-classifier)
C06 Reflex refactor (lees uit Registry)
C07 Orchestrator refactor (unified pipeline met Classify)
Week 6: C10 Protocol Engine activeren (nudge.ts aansluiten)
C15 Rapportage versioning + soft delete (G6)
C33 PII Filter uitbreiden
Na deze fase: UC-01 t/m UC-20 werken enterprise-grade.
Fase 2: Ontbrekende GGZ-modules (weken 7-12)
Week 7-8: C18 Behandelplan Service (UC-21)
C19 Medicatie Service (UC-22)
Week 9-10: C22 Toestemming Service (UC-25)
C34 Wvggz Service (UC-24)
UC-23 Incident/MIC formulier
Week 11-12: C27 Field Encryption (BSN, diagnoses)
C23 Auth uitbreiden (SSO/SAML, MFA)
UC-33 Break-the-glass noodtoegang
Fase 3: Knowledge Layer + interoperabiliteit (weken 13-18)
Week 13-14: C11 Protocol Rules Store (database)
C13 Regelvalidatie UI (admin)
Week 15-16: C12 RAG Pipeline (pgvector, protocol indexering)
C14 Kennisbron Connectors (eerste protocollen inladen)
Week 17-18: C28 FHIR Export (alle resources)
C29 CDS Hooks Service
C32 Health Check + C31 Circuit Breaker generaliseren
7. Technische Specificaties per Component
7.1 C24 Multi-tenancy — Specificatie
Verantwoordelijkheid: Isoleer data per instelling/tenant.
Database wijzigingen:
tenant_id UUID NOT NULLkolom op ELKE tabel met patiëntdata- RLS policy per tabel:
USING (tenant_id = get_current_tenant()) - Helper function:
get_current_tenant()leest uitapp.current_tenant_idsetting
Middleware:
// Elke request:
// 1. Haal user op uit Supabase Auth
// 2. Lees tenant_id uit user metadata
// 3. Zet als header voor Server Components
// 4. Zet als PostgreSQL setting voor RLS
Bestanden:
lib/auth/tenant-context.ts— Helper om tenant te zetten/lezenmiddleware.ts— Injecteer tenant in elke request- Migratie:
add_tenant_id_to_all_tables.sql - Migratie:
create_rls_policies.sql
Test: Maak twee tenants, voeg patiënt toe aan tenant A, verifieer dat tenant B de patiënt NIET kan zien.
7.2 C26 Audit Trail — Specificatie
Verantwoordelijkheid: Onwijzigbare log van alle toegang en wijzigingen aan patiëntdata.
Database:
- Tabel
audit_logs(zie enterprise-epd-architectuur.md §5.2) - Partitionering per maand
- Triggers die UPDATE/DELETE blokkeren
- Hash chain voor integriteitsverificatie
API:
// lib/audit/logger.ts
logAuditEvent({ entityType, entityId, action, purpose, cortexIntent?, metadata? })
// Automatisch:
// - user_id, user_role, user_name uit auth context
// - tenant_id uit tenant context
// - timestamp server-side
// - data_hash berekend
// - previous_hash opgehaald
Integratiepunten: Elke API route roept logAuditEvent() aan na succesvolle actie. Dit is een hard requirement — geen route zonder audit log.
Bestanden:
lib/audit/logger.ts— Core logging functielib/audit/hash.ts— Hash chain berekeningapp/api/audit/route.ts— Query endpoint (admin only)- Migratie:
create_audit_logs.sql
7.3 C25 RBAC + ABAC — Specificatie
Verantwoordelijkheid: Bepaal of een gebruiker een actie mag uitvoeren op een resource.
Twee lagen:
- RBAC (snel): Rol → vaste permissions set
- ABAC (verfijnd): Context-afhankelijke policies (toewijzing, toestemming, tijdvenster)
API:
// lib/access-control/evaluator.ts
const { allowed, reason } = await evaluateAccess({
userId, action, resource, resourceId, tenantId
});
if (!allowed) {
return Response.json({ error: 'Geen toegang', reason }, { status: 403 });
}
Bestanden:
lib/access-control/roles.ts— Rol definities en basis permissionslib/access-control/policies.ts— ABAC policy definitieslib/access-control/evaluator.ts— Policy evaluatie engine- Migratie:
create_access_policies.sql
7.4 C05 Intent Registry — Specificatie
Verantwoordelijkheid: Single source of truth voor alle intent definities.
Structuur per intent:
interface IntentDefinition {
id: CortexIntent; // 'dagnotitie', 'zoeken', etc.
label: { nl: string; en: string }; // Mensleesbare labels
description: string; // Voor LLM context
priority: 'P1' | 'P2' | 'P3';
// Reflex patterns
reflexPatterns: Array<{
pattern: RegExp;
weight: number;
extractHints?: string[]; // Welke entities te extracten
}>;
// Orchestrator hints
aiExamples: Array<{
input: string;
expectedIntent: CortexIntent;
expectedEntities: Record<string, string>;
}>;
// Entity configuratie
entities: {
required: string[]; // Welke entities verplicht
optional: string[];
};
// Action mapping
artifactType: string; // Welk block/formulier openen
requiresConfirmation: boolean; // Destructieve actie?
// Access control
allowedRoles?: string[]; // Welke rollen mogen dit intent gebruiken
featureFlag?: string; // Feature flag voor geleidelijke uitrol
enabled: boolean;
}
Opslag: TypeScript config file (fase 1), migreerbaar naar database (fase 3).
Bestanden:
lib/cortex/registry/intent-registry.ts— Registry classlib/cortex/registry/definitions/dagnotitie.ts— Per intent een definitielib/cortex/registry/definitions/zoeken.tslib/cortex/registry/definitions/index.ts— Barrel exportlib/cortex/registry/types.ts— IntentDefinition interface
7.5 C10 Protocol Engine — Specificatie
Verantwoordelijkheid: Evalueer klinische regels na afgeronde acties. Stel vervolgacties voor.
Pure function: (completedAction, patientContext, rules) → suggestions[]
Regel evaluatie:
// lib/cortex/protocol-engine/evaluator.ts
async function evaluateRules(
completedAction: CompletedAction,
patientContext: PatientContext,
rules: ProtocolRule[]
): Promise<NudgeSuggestion[]> {
const applicableRules = rules.filter(rule =>
rule.status === 'actief' &&
rule.trigger.afterIntent?.includes(completedAction.intent)
);
const suggestions: NudgeSuggestion[] = [];
for (const rule of applicableRules) {
const conditionMet = await evaluateCondition(rule.condition, patientContext);
if (conditionMet) {
suggestions.push({
ruleId: rule.id,
message: rule.suggestion.message,
priority: rule.suggestion.priority,
evidence: rule.suggestion.evidence,
suggestedIntent: rule.suggestion.suggestedIntent,
source: rule.source,
});
}
}
return suggestions.sort((a, b) =>
a.priority.localeCompare(b.priority) // P1 eerst
);
}
Bestanden:
lib/cortex/protocol-engine/evaluator.ts— Rule evaluatielib/cortex/protocol-engine/conditions.ts— Conditie evaluatie (static + query)lib/cortex/protocol-engine/rules/— Gevalideerde regels per domeinapp/api/cortex/nudge/route.ts— API endpoint
8. Validatie Conclusie
De architectuur ondersteunt alle use cases MITS:
- De vier horizontale lagen eerst gebouwd worden (G1-G3 + G14): multi-tenancy, audit, RBAC, logging
- Het intent systeem gecentraliseerd wordt (G4): Intent Registry als single source of truth
- De Protocol Engine aangesloten wordt (G5): nudge.ts → protocol-engine met rules store
- Ontbrekende GGZ-modules gebouwd worden (G8-G12): behandelplan, medicatie, Wvggz, incidenten
Wat de architectuur GOED doet:
- Dual interface (traditioneel + intent) ondersteunt alle use cases via twee paden
- De pipeline (Registry → Classify → Resolve → Action → Protocol) is generiek genoeg voor nieuwe intents
- Multi-tenancy via RLS is pragmatisch en past bij Supabase
- Audit trail als horizontale laag dekt alle use cases zonder per-module implementatie
Wat nog aandacht nodig heeft:
Notificatie service (niet in architectuur): incidenten, Wvggz-termijnen, break-the-glass alerts→ Opgelost: C34 (zieenterprise-componenten-uitbreiding.md)- Groepstherapie (UC-32): één rapportage voor meerdere patiënten — huidige datamodel is 1:1
Caching strategie: AI-samenvattingen zijn duur, caching ontbreekt in architectuur→ Opgelost: C37 (zieenterprise-componenten-uitbreiding.md)- Offline support: niet besproken, maar relevant voor mobiele zorgverleners
Uitbreiding: 10 nieuwe componenten (C34–C43)
Na de initiële gap analyse zijn 10 aanvullende enterprise componenten geïdentificeerd en gespecificeerd. Deze zijn gedocumenteerd in enterprise-componenten-uitbreiding.md en omvatten:
| Component | Laag | Status |
|---|---|---|
| C34 Notificatie Service | Platform Services | Interface gedefinieerd |
| C35 Workflow Engine (State Machine) | Platform Services | Interface + voorbeeldworkflows |
| C36 Full-Text Search | Platform Services | Interface + PostgreSQL tsvector schema |
| C37 Caching Layer | Platform Services | Interface + TTL strategie |
| C38 Scheduled Jobs | Platform Services | Interface + job definities |
| C39 Webhook System | Platform Services | Interface + security (HMAC) |
| C40 ZPM Facturatie | Externe Integraties | Interface + database schema |
| C41 Vecozo Connector | Externe Integraties | Interface + mock (voorbereiding) |
| C42 Zorgdomein Connector | Externe Integraties | Interface + mock (voorbereiding) |
| C43 BI Module | Analytics | Materialized views gedefinieerd |
De gap items G19 (notificatie) en G20 (caching) uit §4.3 zijn hiermee opgelost. Zie het uitbreidingsdocument voor volledige interface definities, database schemas en integratiepunten.