# Gap Analyse: Intake Proces × Cortex

**Datum:** 03-02-2026
**Status:** Analyse
**Bron:** `docs/intent/intake-process-intents.md`

---

## 1. Executive Summary

| Laag | Status | Conclusie |
|------|--------|-----------|
| **EPD Backend** | ✅ 90% compleet | Server actions, database, API's zijn uitgebreid aanwezig |
| **EPD UI** | ✅ 95% compleet | Alle 9 intake tabs + screening hebben werkende componenten |
| **Cortex Intents** | ❌ 0% | Geen van de 26 intake intents bestaat |
| **Cortex Blocks** | ❌ 0% | Geen intake-specifieke blocks |
| **Cortex API** | ❌ 0% | Geen /api/cortex/intake/* routes |

**Conclusie:** De EPD-functionaliteit is robuust gebouwd. De koppeling met Cortex ontbreekt volledig.

---

## 2. Wat Bestaat (✅)

### 2.1 Cortex Core (7 intents)

```typescript
// lib/cortex/types.ts
type CortexIntent =
  | 'dagnotitie'        // ✅ Block + patterns
  | 'zoeken'            // ✅ Block + patterns
  | 'overdracht'        // ✅ Block + patterns
  | 'agenda_query'      // ✅ Patterns (geen dedicated block)
  | 'create_appointment'    // ✅ Patterns
  | 'cancel_appointment'    // ✅ Patterns
  | 'reschedule_appointment'// ✅ Patterns
  | 'unknown';
```

### 2.2 Cortex Blocks (6 stuks)

| Block | Pad | Functie |
|-------|-----|---------|
| `dagnotitie-block.tsx` | `components/cortex/blocks/` | Notitie invoer |
| `zoeken-block.tsx` | `components/cortex/blocks/` | Patiënt zoeken |
| `overdracht-block.tsx` | `components/cortex/blocks/` | Overdracht samenvatting |
| `patient-dashboard-block.tsx` | `components/cortex/blocks/` | Patiënt overzicht |
| `patient-context-card.tsx` | `components/cortex/blocks/` | Context weergave |
| `fallback-picker.tsx` | `components/cortex/blocks/` | Unknown intent handler |

### 2.3 Cortex API Routes

| Route | Methode | Functie |
|-------|---------|---------|
| `/api/cortex/classify` | POST | Intent classificatie |
| `/api/cortex/chat` | POST | Streaming chat |
| `/api/cortex/context` | GET | Context ophalen |
| `/api/cortex/agenda` | GET | Agenda query |
| `/api/cortex/agenda/create` | POST | Afspraak maken |
| `/api/cortex/agenda/cancel` | POST | Afspraak annuleren |
| `/api/cortex/agenda/reschedule` | POST | Afspraak verzetten |
| `/api/cortex/patients/search` | GET | Patiënt zoeken |

### 2.4 EPD Screening (Volledig)

**UI Componenten:**
| Component | Status | Functie |
|-----------|--------|---------|
| `HelpRequestCard` | ✅ | Hulpvraag invoer (textarea) |
| `DecisionCard` | ✅ | Besluit: geschikt/niet_geschikt |
| `DocumentCard` | ✅ | Document upload |
| `ActivityLog` | ✅ | Activiteiten timeline |

**Server Actions:**
| Action | Status | Functie |
|--------|--------|---------|
| `getScreeningSummary()` | ✅ | Screening data ophalen |
| `saveHelpRequest()` | ✅ | Hulpvraag opslaan |
| `saveScreeningDecision()` | ✅ | Besluit opslaan |
| `addScreeningActivity()` | ✅ | Activiteit toevoegen |

### 2.5 EPD Intake (Volledig)

**9 Tabs met UI + Actions:**

| Tab | UI Component | GET Action | CREATE Action |
|-----|--------------|------------|---------------|
| Algemeen | `IntakePage` | `getIntakeById()` | `createIntake()` |
| Contactmomenten | `ContactManager` | `getContactMoments()` | `createContactMoment()` |
| Kindcheck | `KindcheckForm` | `getKindcheck()` | `saveKindcheck()` |
| Risicotaxatie | `RiskManager` | `getRiskAssessments()` | `createRiskAssessment()` |
| Anamnese | `AnamneseManager` | `getAnamneses()` | `createAnamnese()` |
| Onderzoeken | `ExaminationManager` | `getExaminations()` | `createExamination()` |
| ROM | `ExaminationManager` | `getExaminations()` | `createExamination()` |
| Diagnose | `DiagnosisManager` | `getDiagnoses()` | `createDiagnosis()` |
| Behandeladvies | `TreatmentAdviceForm` | `getTreatmentAdvice()` | `saveTreatmentAdvice()` |

---

## 3. Wat Ontbreekt (❌)

### 3.1 Intents (26 ontbreken)

Geen van de intake-gerelateerde intents uit `intake-process-intents.md` bestaat:

#### Screening Intents (4)
| Intent | Type | Patterns nodig |
|--------|------|----------------|
| `screening_query` | Query | `^(toon\s+)?screening`, `wat is de hulpvraag` |
| `hulpvraag_invoer` | Actie | `hulpvraag:`, `noteer hulpvraag` |
| `screening_besluit` | Actie | `geschikt voor behandeling`, `niet geschikt` |
| `screening_activiteit` | Actie | `gebeld met`, `verwijsbrief ontvangen` |

#### Intake Start Intents (2)
| Intent | Type | Patterns nodig |
|--------|------|----------------|
| `intake_starten` | Actie | `start intake`, `nieuwe intake` |
| `intake_lijst` | Query | `toon intakes`, `welke intakes` |

#### Intake Navigatie (3)
| Intent | Type | Patterns nodig |
|--------|------|----------------|
| `intake_navigeer` | Navigatie | `ga naar risico`, `open kindcheck` |
| `intake_volgende` | Navigatie | `volgende stap`, `ga verder` |
| `intake_vorige` | Navigatie | `vorige`, `terug` |

#### Intake Tab Intents (14)
| Intent | Type | Tab |
|--------|------|-----|
| `contact_toevoegen` | Actie | Contactmomenten |
| `contacten_query` | Query | Contactmomenten |
| `kindcheck_invullen` | Actie | Kindcheck |
| `kindcheck_query` | Query | Kindcheck |
| `risico_toevoegen` | Actie | Risicotaxatie |
| `risico_query` | Query | Risicotaxatie |
| `anamnese_toevoegen` | Actie | Anamnese |
| `anamnese_query` | Query | Anamnese |
| `onderzoek_toevoegen` | Actie | Onderzoeken |
| `onderzoeken_query` | Query | Onderzoeken |
| `rom_toevoegen` | Actie | ROM |
| `rom_query` | Query | ROM |
| `diagnose_toevoegen` | Actie | Diagnose |
| `diagnose_query` | Query | Diagnose |
| `behandeladvies_invoer` | Actie | Behandeladvies |
| `behandeladvies_query` | Query | Behandeladvies |

#### Intake Afsluiten (3)
| Intent | Type | Patterns nodig |
|--------|------|----------------|
| `intake_afsluiten` | Actie | `sluit intake af`, `intake afronden` |
| `intake_samenvatting` | Query | `samenvatting intake` |
| `intake_checklist` | Query | `wat moet ik nog doen`, `is intake compleet` |

### 3.2 Cortex Blocks (9 ontbreken)

| Block | Doel | Data bron |
|-------|------|-----------|
| `ScreeningBlock` | Screening overzicht | `getScreeningSummary()` |
| `IntakeListBlock` | Lijst intakes van patiënt | `getIntakesByPatientId()` |
| `IntakeStatusBlock` | Voortgang/checklist | Nieuwe functie nodig |
| `KindcheckBlock` | Kindcheck samenvatting | `getKindcheck()` |
| `RisicoBlock` | Risico's met levels | `getRiskAssessments()` |
| `AnamneseBlock` | Anamnese samenvatting | `getAnamneses()` |
| `DiagnoseBlock` | Diagnoses lijst | `getDiagnoses()` |
| `BehandeladviesBlock` | Behandeladvies tonen | `getTreatmentAdvice()` |
| `IntakeSamenvattingBlock` | AI samenvatting | Nieuwe AI functie nodig |

### 3.3 Cortex API Routes (ontbreken)

| Route | Methode | Functie |
|-------|---------|---------|
| `/api/cortex/screening` | GET | Screening data voor Cortex |
| `/api/cortex/intake` | GET | Intake lijst |
| `/api/cortex/intake/[id]` | GET | Intake details |
| `/api/cortex/intake/[id]/status` | GET | Intake voortgang/checklist |
| `/api/cortex/intake/[id]/risks` | GET | Risico's van intake |
| `/api/cortex/intake/[id]/diagnoses` | GET | Diagnoses van intake |
| `/api/cortex/intake/[id]/summary` | GET | AI samenvatting |

### 3.4 Reflex Patterns (ontbreken)

In `lib/cortex/reflex-classifier.ts` moeten patterns worden toegevoegd voor alle 26 intents.

---

## 4. Architectuur Gap

```
┌─────────────────────────────────────────────────────────────────────────┐
│                         HUIDIGE SITUATIE                                 │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   CORTEX                           EPD                                  │
│   ┌─────────────────┐              ┌─────────────────┐                 │
│   │ 7 Intents       │              │ Screening UI    │                 │
│   │ 6 Blocks        │     ❌       │ Intake UI (9)   │                 │
│   │ 8 API routes    │ ─ ─ ─ ─ ─ ─ │ Server Actions  │                 │
│   └─────────────────┘  GEEN LINK   └─────────────────┘                 │
│                                                                         │
├─────────────────────────────────────────────────────────────────────────┤
│                         GEWENSTE SITUATIE                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   CORTEX                           EPD                                  │
│   ┌─────────────────┐              ┌─────────────────┐                 │
│   │ 7 + 26 Intents  │              │ Screening UI    │                 │
│   │ 6 + 9 Blocks    │     ✅       │ Intake UI (9)   │                 │
│   │ 8 + 7 API routes│ ◀──────────▶ │ Server Actions  │                 │
│   └─────────────────┘   GEKOPPELD  └─────────────────┘                 │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
```

---

## 5. Implementatie Roadmap

### Fase 1: Foundation (Query Intents)

**Doel:** Informatie opvragen via spraak

| # | Taak | Effort | Prioriteit |
|---|------|--------|------------|
| 1.1 | Intent types toevoegen aan `types.ts` | S | 🔴 |
| 1.2 | Patterns toevoegen aan `reflex-classifier.ts` | M | 🔴 |
| 1.3 | `IntakeStatusBlock` bouwen | M | 🔴 |
| 1.4 | `RisicoBlock` bouwen | S | 🔴 |
| 1.5 | `DiagnoseBlock` bouwen | S | 🟡 |
| 1.6 | `/api/cortex/intake/*` routes | M | 🔴 |

**Resultaat:** "Wat zijn de risico's?", "Is de intake compleet?" werken

### Fase 2: Navigation (Navigatie Intents)

**Doel:** Navigeren via spraak

| # | Taak | Effort | Prioriteit |
|---|------|--------|------------|
| 2.1 | `intake_navigeer` patterns | S | 🔴 |
| 2.2 | Navigation handler in orchestrator | M | 🔴 |
| 2.3 | Router integratie | M | 🟡 |

**Resultaat:** "Ga naar diagnose", "Open kindcheck" werken

### Fase 3: Actions (Actie Intents)

**Doel:** Data invoeren via spraak

| # | Taak | Effort | Prioriteit |
|---|------|--------|------------|
| 3.1 | `intake_starten` intent + handler | M | 🟡 |
| 3.2 | `risico_toevoegen` intent + handler | L | 🟡 |
| 3.3 | `diagnose_toevoegen` intent + handler | L | 🟡 |
| 3.4 | Confirmatie dialogen | M | 🟡 |

**Resultaat:** "Start intake", "Risico suïcidaliteit matig" werken

### Fase 4: Intelligence (AI Features)

**Doel:** Slimme AI functionaliteit

| # | Taak | Effort | Prioriteit |
|---|------|--------|------------|
| 4.1 | `IntakeSamenvattingBlock` met AI | L | 🔵 |
| 4.2 | Intake-gerelateerde nudges | M | 🔵 |
| 4.3 | Context-aware suggestions | L | 🔵 |

**Resultaat:** "Samenvatting intake", proactieve suggesties werken

---

## 6. Effort Schatting

| Fase | Items | Effort |
|------|-------|--------|
| Fase 1: Foundation | 6 taken | ~3-4 dagen |
| Fase 2: Navigation | 3 taken | ~1-2 dagen |
| Fase 3: Actions | 4 taken | ~3-4 dagen |
| Fase 4: Intelligence | 3 taken | ~2-3 dagen |
| **Totaal** | **16 taken** | **~10-13 dagen** |

---

## 7. Quick Wins

Snel te implementeren met hoge waarde:

### 7.1 `intake_status` Query (1 dag)

```typescript
// Input: "Wat moet ik nog doen?" / "Is de intake compleet?"
// Output: Checklist met voltooide/openstaande tabs

// Nieuwe functie nodig:
async function getIntakeCompletionStatus(intakeId: string) {
  const intake = await getIntakeById(intakeId);
  const kindcheck = await getKindcheck(intakeId);
  const risks = await getRiskAssessments(intakeId);
  const diagnoses = await getDiagnoses(intakeId);
  // etc...

  return {
    algemeen: !!intake,
    kindcheck: !!kindcheck.hasChildren !== undefined,
    risicotaxatie: risks.length > 0,
    diagnose: diagnoses.length > 0,
    // ...
  };
}
```

### 7.2 `risico_query` (0.5 dag)

```typescript
// Input: "Wat zijn de risico's?"
// Output: RisicoBlock met bestaande getRiskAssessments()

// Block template:
<RisicoBlock
  risks={[
    { type: 'suicidaliteit', level: 'matig', rationale: '...' },
    { type: 'agressie', level: 'laag', rationale: '...' }
  ]}
/>
```

### 7.3 `intake_navigeer` (0.5 dag)

```typescript
// Input: "Ga naar diagnose"
// Output: router.push() naar juiste tab

// Pattern matching:
{ pattern: /^ga\s+naar\s+(risico|diagnose|kindcheck|anamnese)/i, weight: 1.0 }
```

---

## 8. Dependencies

```
types.ts (intent definitions)
    ↓
reflex-classifier.ts (patterns)
    ↓
/api/cortex/intake/* (data routes)
    ↓
blocks/*.tsx (UI components)
    ↓
canvas-area.tsx (block rendering)
```

---

## 9. Risico's

| Risico | Impact | Mitigatie |
|--------|--------|-----------|
| Intake context niet beschikbaar | Hoog | ActiveIntake store toevoegen |
| Meerdere intakes per patiënt | Middel | Intent clarification bij ambiguïteit |
| Performance bij grote datasets | Laag | Pagination in queries |
| Pattern overlap met bestaande intents | Middel | Goede escalation logic |

---

## 10. Aanbeveling

**Start met Fase 1 (Query Intents)** omdat:
1. Hergebruikt bestaande server actions
2. Geen destructieve acties (veilig)
3. Direct waarde voor gebruiker
4. Legt foundation voor actie intents

**Eerste implementatie:**
1. `intake_status` - "Wat moet ik nog doen?"
2. `risico_query` - "Wat zijn de risico's?"
3. `intake_navigeer` - "Ga naar diagnose"

Deze 3 intents dekken de belangrijkste use case: snel navigeren en informatie opvragen tijdens een intake sessie.
