diff --git a/docs/intent/samenspel-tip-ecd.html b/docs/intent/samenspel-tip-ecd.html new file mode 100644 index 0000000..2a8130a --- /dev/null +++ b/docs/intent/samenspel-tip-ecd.html @@ -0,0 +1,663 @@ + + + + + +Samenspel TIP en GGZ-ECD + + + + +
+ +
+
Discussiestuk · Triqura
+

Het samenspel tussen
TIP en het GGZ‑ECD

+
+ Voor — werksessie Colin & Joshua + Datum — 14 juli 2026 + Status — ter bespreking, geen besluit +
+
+ +
+
1

Constatering

+

We bouwen aan twee systemen die samen één geheel moeten vormen: het GGZ‑ECD als eerste toepassing, TIP als het intent‑platform eronder. We hebben allebei dezelfde vraag op tafel — welke API’s hebben we nodig? — maar die is pas te beantwoorden als we samen de rolverdeling kiezen. Er leven nu twee verschillende beelden van hoe de systemen samenwerken, en die leiden tot verschillende API’s, verschillende datamodellen en een andere taakverdeling tussen de teams.

+
+

De kernvraag van dit stuk: hoe verdelen ECD en TIP het werk — TIP als beslisplatform dat het ECD voedt met gegevens, of TIP als intent‑laag die met het ECD meekijkt? Die keuze bepaalt óók het verhaal van het platform richting volgende domeinen. Een gezamenlijke productkeuze dus, geen techniekvraag van één van beide kanten.

+
+
+ +
+
2

Aanleiding

+

Er komen drie sporen samen:

+

Het ECD wordt opnieuw opgebouwd. Het huidige prototype leunt op Supabase en FHIR‑conventies die eruit gaan. Er komt een eigen PostgreSQL‑datamodel onder, met voorbereiding op pgvector (semantisch zoeken) en Neo4j (ZPM‑relaties). Het moment om de architectuur goed te snijden is nú.

+

Het intent‑systeem komt uit TIP. De oorspronkelijke Cortex‑architectuur ging uit van een intent-motor als TypeScript‑bibliotheek ín de ECD‑app (lib/cortex/). TIP bestaat inmiddels als zelfstandig platform (Python‑services, eigen runtime) en is domein‑agnostisch opgezet: het GGZ‑ECD is de eerste toepassing, andere domeinen moeten volgen. Het ECD bewijst het platform; het platform draagt het ECD.

+

De gedeelde vraag: “welke API’s hebben we eigenlijk nodig?” Die vraag speelt aan beide kanten en is niet te beantwoorden zonder eerst samen de rolverdeling te kiezen. Bij het naast elkaar leggen van beide codebases bleek dat de twee beelden van die rolverdeling (§3) nu nog uiteenlopen — dat is geen probleem, maar wel iets om expliciet te maken vóór we contracten vastleggen.

+
+ +
+
3

Twee mentale modellen

+

Legenda: ECD klinische applicatie & dossier  ·  TIP intent-platform.

+ +
+
+
Model A — het beeld
+
TIP als laag bovenop het ECD
+
TIPvertaalt taal → intent, geeft suggesties
+
+ tekst / spraak ↑ + ↓ intent + suggestie +
+
ECDdraait volledig zelfstandig +
UIlogicaregelsdatabase
+
+

TIP heeft geen eigen administratie. Trek je TIP eruit, dan werkt het ECD nog steeds — alleen zonder taalinterface. Dit is het model uit het oorspronkelijke Cortex‑architectuurdocument (vgl. “AI‑laag boven Chipsoft/Nexus”).

+
+ +
+
Model B — hoe TIP gebouwd is
+
Het ECD aangesloten op TIP
+
ECDregistratie & klinische feiten +
UIklinisch dossier
+
+
+ artifacts & events ↓ + ↑ intents & taken +
+
TIPeigen database, eigen dossier-state +
dossiersworkspacesIE’sintentregelsscenario’s
+
+

TIP werkt pas als het gevoed wordt: documenten, gebeurtenissen en gegevens moeten naar TIP gepusht worden. TIP houdt zelf bij waar elke casus staat. Trek je de datafeed eruit, dan is TIP blind.

+
+
+ +

Beide paden in TIP — het gestructureerde pad (intentregels over Information Elements) en het ongestructureerde pad (vrije tekst via /detect) — leveren dezelfde intent op. Maar alleen het ongestructureerde pad werkt zonder datafeed. De kracht van TIP — regels, scenario’s, zorgpaden — zit in het gestructureerde pad, en dat vereist Model B.

+ +
+

Deze opzet is een logische ontwerpkeuze. Elke beslislaag moet de data kunnen zien waarover hij beslist. De Information‑Element‑laag is precies wat TIP domein‑agnostisch maakt: het platform hoeft geen enkel bronsysteem te kennen, zolang bronsystemen hun gegevens als IE’s aanleveren. Er hoort alleen een consequentie bij die we samen moeten inplannen: een toepassing op TIP aansluiten betekent altijd een datafeed naar TIP bouwen — integratiewerk aan beide kanten, geen laag die je er los oplegt.

+
+
+ +
+
4

Voorbeeld: de verwijsbrief-flow

+

Hoe Model B er in de praktijk uitziet, stap voor stap. Let op waar de state terechtkomt.

+ +
+
+
1
+
+ ECD +

Een verwijsbrief komt binnen (ZorgDomein, e-mail, upload). Het ECD slaat de brief op in het klinisch dossier en stuurt hem als artifact door naar TIP.

+
+
+
+
2
+
+ TIP +

TIP maakt in zijn eigen database een workspace referral aan en extraheert Information Elements: verwijzer, verwijsreden, urgentie.

+ State in TIP: dossier X · workspace “referral” · 3 IE’s gevuld +
+
+
+
3
+
+ TIP +

Een intentregel vuurt: “urgentie hoog én geen intake gepland → intent: intake inplannen”. Het scenario zet een menselijke taak klaar — TIP voert nooit zelf uit.

+ State in TIP: intent gevuurd · taak open · wacht op behandelaar +
+
+
+
4
+
+ ECD +

Het ECD toont de taak. De behandelaar bevestigt (human‑in‑the‑loop) en de intake‑afspraak wordt in het ECD vastgelegd — het klinische feit leeft in het ECD.

+
+
+
+
5
+
+ ECD +

Het ECD meldt de voltooiing terug aan TIP als event, zodat TIP weet dat de taak is afgerond en de procesfase verschuift.

+ State in TIP: fase verwijzing afgerond · intake gepland +
+
+
+ +

Het gevolg: twee administraties over dezelfde patiënt

+
+ + + + + + + + + + + + + + + + +
ECD (klinische database)TIP (platform-database)
BevatKlinische feiten: rapportages, afspraken, diagnoses, de brief zelfProces-state: fase, workspaces, IE’s, gevuurde intents, open taken
Bron van waarheid voorHet medisch dossier“Waar staat het proces en wat moet er gebeuren”
+
+

Zolang die scheiding scherp is — ECD = klinische feiten, TIP = proces- en beslislogica — is dit gezond. Het risico ontstaat waar hetzelfde feit op twee plekken leeft. “Intake gepland op 14 juli” bestaat als afspraak in het ECD én als IE in TIP. Wordt de afspraak in het ECD verzet, dan moet er een event naar TIP — anders beslist TIP op verouderde informatie. Per gegeven moet dus vastliggen wie eigenaar is; de ander kent het alleen als afgeleide kopie.

+
+ +
+
5

Drie routes

+ +
+
+
Route 1

Alleen /detect — TIP als echte laag

+

Het oorspronkelijke beeld: tekst in, intent uit, verder niets.

+
+
Wat het betekent

Het ECD roept alleen de intent‑detectieservice aan. Alle state, regels, nudges en procesbewaking worden in het ECD zelf gebouwd (zoals in het oorspronkelijke Cortex‑ontwerp).

+
Voordeel

Dun, stateless contract. Geen synchronisatievraagstuk. ECD blijft volledig autonoom; TIP‑uitval betekent alleen “geen taalinterface”.

+
Consequentie

We gebruiken ~10% van het platform en bouwen intentregels, scenario’s en taken dubbel in het ECD. Twee regelmotoren in twee talen die uit elkaar groeien.

+
Wat het van beide kanten vraagt

TIP-kant vrijwel niets — /detect bestaat al. ECD-kant het meeste werk: alle beslislogica zelf bouwen. En de platformbelofte blijft onbeproefd.

+
+
+ +
+
Route 2

TIP als procesbrein — volledig Model B

+

Het ECD wordt registratie + UI; TIP doet alle beslislogica.

+
+
Wat het betekent

Elk relevant document en elke gebeurtenis gaat naar TIP. TIP bewaakt fases, evalueert regels, zet taken klaar. Het ECD toont en registreert.

+
Voordeel

TIP’s volle kracht: zorgpaden, intentregels, audit‑chain. Regels wijzigen zonder ECD‑deployment. Sterkste bewijs voor TIP’s platformbelofte.

+
Consequentie

ECD‑datamodel en TIP’s dossiermodel moeten sámen ontworpen worden — geen twee projecten meer, maar één systeem in twee repo’s. Eigenaarschap per gegeven en de eventfeed moeten vanaf dag één kloppen. Grote wederzijdse afhankelijkheid, nog vóór we het samenspel in het klein hebben beproefd.

+
Wat het van beide kanten vraagt

ECD-kant: een volledige datafeed (artifacts, events) en taak-UI. TIP-kant: stabiele push‑API, GGZ‑workspace‑typen en beschikbaarheidsafspraken — het ECD leunt in dit model op het platform.

+
+
+ + +
+ +

De snijlijn die in alle routes overeind blijft: TIP kent geen patiëntnamen en geen schermen; het ECD kent geen intentregels en geen scenario’s. Entity resolution (“jan” → patiënt #427) vereist toegang tot het patiëntenbestand en hoort daarmee aan de ECD‑kant — of het ECD stuurt kandidaten mee in de request.

+
+ +
+
6

Het samenspel per flow: wie levert wat

+

Afgeleid uit de bestaande gebruikersflows van het ECD, gemapt op de huidige TIP‑API. Dit is de feitelijke basis onder onze gedeelde API‑vraag — per regel: wat de flow nodig heeft en waar dat vandaag staat.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ECD-flowNodig van TIPStatus in TIP
Commando typen/inspreken → intent + prefillPOST /detect✓ bestaat
Verwijsbrief/document binnen → gegevens eruitArtifact-push + IE-extractie in workspace✓ bestaat (data layer)
Na actie → vervolgsuggestie (nudge)Event-push → intentregels → taak terug△ model bestaat; push-API vanuit het ECD moet in het contract
Bevestiging behandelaar (human-in-the-loop)/human-gates, taken ophalen & afmelden✓ bestaat
Beheer: intents, regels, scenario’s configureren/intents, /rules, /contexts, /scenarios✓ bestaat
Audit-inzage/audit/events, /audit/chain✓ bestaat
Chat (streaming, conversationeel)✗ nog nergens belegd — samen kiezen: ECD-kant of platform-roadmap (ai-engine)
Entity resolution (“jan” → patiënt #427)✗ hoort ECD-kant: vereist patiëntendata
Kennisbank / RAG (bronverwijzing bij suggestie)✗ nog niet zichtbaar in TIP
+
+
+ +
+
7

Beslisvragen voor het gesprek

+
+
+ Welke rolverdeling kiezen we — platform of laag? +

Sluiten toepassingen aan op TIP (Model B), of legt TIP zich als laag op toepassingen (Model A)? Deze keuze maken we samen: hij bepaalt het verhaal richting álle toekomstige domeinen, niet alleen dit ECD.

+
+
+ Welke route kiezen we voor het GGZ-ECD? +

Voorstel in dit stuk: route 3 — /detect plus de instroomflow als proef. Akkoord, of zien we het anders?

+
+
+ Wie is eigenaar van welk gegeven? +

Per gegeven vastleggen: leidend in het ECD of in TIP, en hoe de ander de kopie actueel houdt (events). Startpunt: de gegevens uit de instroomflow.

+
+
+ Hoe ziet de push-API eruit — artifacts en events? +

Het ontbrekende stuk contract voor route 3: hoe levert het ECD documenten en gebeurtenissen aan, en hoe haalt het taken op en meldt het ze af?

+
+
+ Waar beleggen we chat, entity resolution en RAG? +

Drie behoeftes die nu nergens belegd zijn. Bewust ECD-kant houden, of op de platform-roadmap (bijv. de ai-engine-service)? Per stuk samen besluiten.

+
+
+
+ + + +
+ + diff --git a/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.02.png b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.02.png new file mode 100644 index 0000000..09a07c3 Binary files /dev/null and b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.02.png differ diff --git a/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.20.png b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.20.png new file mode 100644 index 0000000..57a37da Binary files /dev/null and b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.20.png differ diff --git a/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.31.png b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.31.png new file mode 100644 index 0000000..7ce83c2 Binary files /dev/null and b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.31.png differ diff --git a/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.38.png b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.38.png new file mode 100644 index 0000000..f15497d Binary files /dev/null and b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.38.png differ diff --git a/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.47.png b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.47.png new file mode 100644 index 0000000..5fdf9c9 Binary files /dev/null and b/docs/releasenotes/Scherm­afbeelding 2026-03-09 om 12.06.47.png differ diff --git a/docs/sessions/2026-07-14-sessielog.md b/docs/sessions/2026-07-14-sessielog.md new file mode 100644 index 0000000..f33dada --- /dev/null +++ b/docs/sessions/2026-07-14-sessielog.md @@ -0,0 +1,63 @@ +# Sessielog — 14 juli 2026 + +**Deelnemers:** Colin (PO) + Claude Code +**Onderwerp:** TIP↔ECD-samenspel, module-reviews, opschoning codebase (fase 0 + 0b) +**Branch:** `swift-cortex` + +--- + +## 1. Besluiten + +| # | Besluit | Toelichting | +|---|---|---| +| 1 | **ECD wordt opnieuw opgebouwd op een eigen datamodel** | Prototype leunt op Supabase + FHIR-conventies met structurele gebreken. Geen quick fixes; eerst strippen, dan van scratch opbouwen met goede logica en module-interacties. | +| 2 | **Geen quick fixes op de gevonden bugs** | De reviewbevindingen (zie §3) zijn symptomen van het ontbrekende datamodel; structureel oplossen in de rebuild. | +| 3 | **Kapotte intake-tabs en behandelplan-module verwijderd** | Anamnese/Onderzoeken/ROM konden nooit opslaan; behandelplan-AI negeerde diagnose en ernst. Beide komen terug bij de rebuild. | +| 4 | **FHIR en Cortex blijven voorlopig staan** | `/api/fhir/Patient` is de facto de patiënten-API (dossier, agenda, Cortex). Vervangen is fase 3. Cortex-flows raken de TIP-koppeling — niet twee keer bouwen. | +| 5 | **Instroom als eerste rebuild-module (voorstel, nog te bevestigen)** | Verwijzing → screening → intake is ook de TIP-proefflow; bewijst datamodel én TIP-samenspel in één beweging. | + +## 2. TIP↔ECD-verkenning + +- TIP-repo (`../intent-platform/tip`) verkend: Dossier → Workspace → Artifact → Information Elements → Intentregels → Intent → Scenario. Twee paden naar een intent: gestructureerd (regels over IE's) en ongestructureerd (`POST /detect`). +- **Kerninzicht:** TIP is een platform waar je een systeem *op aansluit* (datafeed vereist), geen laag die je *op een systeem legt*. Dat wijkt af van het beeld waarmee het ECD is ontworpen — en van het Cortex-architectuurdocument v0.1, dat de intent-motor als in-app bibliotheek (`lib/cortex/`) beschrijft en TIP nog niet kent. +- Drie routes uitgewerkt: (1) alleen `/detect`, (2) TIP als volledig procesbrein, (3) **groeipad** — `/detect` + één gestructureerde flow (verwijsbrief → intake) als proef. Aanbeveling: route 3. +- Open behoeftes die TIP nu niet dekt: streaming chat, entity resolution (hoort ECD-kant: vereist patiëntendata), RAG/kennisbank. +- **Discussiestuk voor de werksessie Colin & Joshua:** `docs/intent/samenspel-tip-ecd.html` (ook als artifact gepubliceerd). Bevat de twee modellen, verwijsbrief-flow, drie routes, API-mapping en vijf beslisvragen. + +## 3. Module-reviews (drie parallelle agents) + +**Intake** — Anamnese, Onderzoeken en ROM functioneel volledig kapot: UI stuurt weergave-labels ("Psychiatrische anamnese") waar de database systeemcodes eist (`psychiatrisch`). Alle verwijderknoppen doen stil niets (DELETE RLS-policies ontbreken op alle intake-tabellen). Intake-header "Bewerken" is een lege placeholder. Kindcheck met default-antwoorden slaat leeg object op → voortgangsring blijft op "ontbreekt". + +**Diagnoses** — Verwijderen is een no-op (zelfde RLS-oorzaak, live geverifieerd). Behandelplan-AI kreeg "DSM-categorie: primary-diagnosis" in de prompt i.p.v. de diagnose; ernst viel altijd terug op "middel". DSM-5-veld werd verzameld maar nooit opgeslagen. UI kent 4 van de 6 statussen. ICD-10 hardcoded (55 F-codes). Twee parallelle diagnosemodules op dezelfde tabel. `conditions`-tabel staat in geen enkele migration (schema niet reproduceerbaar). + +**Agenda** — Drie schrijfpaden (EPD-modal, Cortex server actions, Cortex API-routes) met elk eigen conventies. Modal-afspraken verschuiven +2 uur per opslag (naïeve tijdstring → timestamptz). `practitioner_id` leeg → Cortex cancel/reschedule altijd 403. Cortex annuleer/verzet-flow doodlopend (parser levert string, UI verwacht object). Dagweergave filtert vanaf kloktijd i.p.v. middernacht. Patiëntzoeker case-sensitive op voornaam. + +## 4. Uitgevoerd: opschoning (7 commits, −24.097 regels) + +Van 394 naar 298 ts/tsx-bestanden. Build en lint groen na elke stap. + +| Commit | Inhoud | +|---|---| +| `10c994b` | Fase 0: marketing-site, blog, leads-API, `_archive`, sitemap; root → `/login`; robots op disallow-all | +| `5e910c3` | Dubbele diagnosemodule (patiëntniveau) weg | +| `a8b02c1` | Kapotte intake-tabs weg, incl. server actions, voortgangsring en Cortex-navigatiedoelen | +| `96848ec` | Behandelplan-module weg (ook uit patiëntdashboard, dashboard-API, Cortex-dashboardblock) | +| `38dd7c1` | Placeholder-pagina's dashboard/reports weg; login-tests → `/epd/agenda` | +| `caeba77` | `/epd/clients` redirect-laag weg; alles landt op `/epd/patients` | +| `b00bfa5` | `next-mdx-remote`, `gray-matter`, laatste marketing-restanten weg | + +Sidebar toont nu alleen werkende modules: Cortex, Cliënten, Verpleegrapportage, Agenda. + +**Nog open uit de verificatie:** e2e-suites en browser-smoke-check (vereisen draaiende dev-server). Commits zijn lokaal — nog niet gepusht. + +## 5. Vervolgstappen + +1. **Werksessie Colin & Joshua** over het TIP↔ECD-samenspel — discussiestuk als agenda (vijf beslisvragen, o.a. platform-of-laag en eigenaarschap per gegeven). +2. **Ontwerpdocument rebuild:** moduleset + flows + datamodel-voorstel (centrale waardelijsten, herkomst-velden mens/AI, stabiele ID's, pgvector-klaar, Neo4j ontworpen-niet-aangezet). Review met Colin vóór er een migration wordt geschreven. +3. Daarna: verse schema-baseline, `lib/dat/`, modules één voor één terugbouwen — **instroom eerst**. + +## Referenties + +- Discussiestuk: `docs/intent/samenspel-tip-ecd.html` +- Platform-architectuur: `../../docs/knowledge/technische-architectuur.md` (v0.1 — behoeft v0.2 met TIP-ADR) +- Opruimplan (goedgekeurd): zes stappen fase 0b, uitgevoerd zoals hierboven