Update roadmap and review documentation

This commit is contained in:
Janpeter Visser 2026-04-19 10:22:18 +02:00
parent 42d88ce8d6
commit 5641fffaff
2 changed files with 274 additions and 104 deletions

View file

@ -1,136 +1,305 @@
# Aanbevelingen voor Inspannings Monitor
# Actuele prioriteiten voor Inspannings Monitor
Dit bestand bevat aanbevelingen gebaseerd op analyse van de broncode, documentatie en backlog (peildatum: 2026-04-18). Bedoeld als leidraad voor toekomstige werksessies.
Peildatum: **19 april 2026** — bijgewerkt op basis van de huidige codebase en de
recente implementaties voor check-in, planning, energiemeter, Dusk-thema en
navigatiestructuur.
---
## Huidige status
## Samenvatting
De volgende onderdelen zijn volledig geïmplementeerd en van goede kwaliteit:
De app heeft inmiddels een **sterk fundament**:
| Onderdeel | Status |
|---|---|
| Authenticatie (login, signup, e-mailbevestiging, uitloggen) | ✅ Af |
| Beveiligde routes met server-side sessiecontrole | ✅ Af |
| Onboarding flow (3 stappen, profiel- en instellingenopslag) | ✅ Af |
| Instellingenbeheer (tijdzone, herinneringen, energiepunten) | ✅ Af |
| Databaseschema met RLS-beleid | ✅ Af |
| CI/CD (GitHub Actions + Vercel) | ✅ Af |
| Branchbeveiliging op `main` | ✅ Af |
- auth en protected routes werken
- onboarding en instellingen zijn aanwezig
- ochtendcheck-in en budgetlogica zijn aanwezig
- planning en energiemeter zijn aanwezig
- error/loading routes bestaan voor de belangrijkste dataroutes
- pending states en toastfeedback zijn aanwezig
- CI/CD, branch protection en Vercel-deploy staan
De grootste winst zit nu niet meer in fundering, maar in:
1. **de plan-do-evalueer-lus sluiten**
2. **kritieke technische gaten dichten vóór launch**
3. **test- en securitylaag versterken**
---
## Volgende prioriteiten (volgorde uit backlog)
## Wat al op orde is
### 1. ST-201 — Ochtendcheck-in UI (P0, EPIC-03)
Het hart van de applicatie. Zonder check-in heeft het dashboard geen inhoud. Bouwen als:
- Energieschuifregelaar (110)
- Slaapkwaliteitsinput (goed / matig / slecht)
- Opslaan in nieuwe tabel `morning_check_ins`
- Check-in status tonen op het dashboard (al ingevoerd of nog niet)
Deze punten stonden eerder als aanbeveling open, maar zijn inmiddels al
afgerond of grotendeels opgelost:
### 2. ST-203 — Budgetberekening (P0, EPIC-03)
Zodra de check-in werkt, berekent de app automatisch het dagbudget op basis van de energiescore. Vereist:
- Score-naar-budget mapping (formule vastleggen vóór implementatie)
- Edge cases: score = 1, score = 10, geen check-in
- Eenheidstests voor de berekeningslogica — dit is de enige plek in het project waar tests nu echt urgent zijn
- `error.tsx` voor de belangrijkste app-routes
- `loading.tsx` voor dashboard, check-in en planning
- pending states in onboarding, settings, check-in en planning
- centrale toastlaag voor redirect- en action-feedback
- expliciete `FormData`-validatie
- wizard-core en onboarding-refactor
- ochtendcheck-in en budget v1
- planning, energiemeter en niet-blokkerende budgetwaarschuwing
- Dusk-themafundering en toegankelijkheidspolish
- topnavigatie met publieke About-pagina
### 3. ST-301 t/m ST-305 — Dagplanning en energiemeter (P0, EPIC-04)
- Activiteiteninvoer met categorie, duur en energiepuntschatting
- Lopende energiemeter (resterend budget)
- Waarschuwing bij overschrijding (niet-blokkerend)
- Vereist nieuwe tabellen: `activities`, `activity_instances`, `activity_categories`
### 4. ST-401 t/m ST-405 — Evaluatie en dagoverzicht (P0, EPIC-05)
- Activiteiten afvinken als voltooid, overgeslagen of aangepast
- Dagelijkse samenvatting: gepland vs. werkelijk
- Sluit de plan-do-evaluate-lus
### 5. ST-105 — RLS hardening (P0, EPIC-08, parallel uitvoeren)
RLS-beleid is aangemaakt maar nog niet grondig getest. Voer dit parallel uit aan de feature-bouw:
- Testscripts schrijven die proberen om andermans rijen te lezen/schrijven
- Bevestigen dat `service_role`-key nergens in de frontend of Vercel-configuratie staat
Deze punten hoeven dus **niet** opnieuw als directe actielijst te worden gezien.
---
## Technische schuld
## Nu doen
De huidige code is van goede kwaliteit, maar bevat een aantal verbeterpunten die bij de volgende feature-bouwfase opgepakt kunnen worden — niet nu, maar vóór launch.
Dit zijn de hoogste actuele prioriteiten voor de eerstvolgende sprint.
### Matig urgent
### 1. ST-401 t/m ST-405 — Evaluatie en dagoverzicht
| Probleem | Bestand(en) | Oplossing |
|---|---|---|
| `getParamValue()` 4× gedupliceerd | `app/*/page.tsx` | Verplaats naar `lib/auth/params.ts` |
| `onboarding-flow.tsx` is 343 regels | `components/onboarding/onboarding-flow.tsx` | Splits in drie stapcomponenten |
| `settings-form.tsx` dupliceert toestandslogica van onboarding | `components/settings/settings-form.tsx` | Extraheer gedeelde hook |
De app ondersteunt nu:
### Laag urgent (vóór launch)
- check-in
- plannen
- energiebudget
| Probleem | Bestand(en) | Oplossing |
|---|---|---|
| Geen laadstatus tijdens server actions | `onboarding-flow.tsx`, `settings-form.tsx` | Gebruik `useTransition` + pending-state |
| Geen toast/melding na formulieropslaan | Alle clientcomponenten | shadcn/ui `toast` toevoegen |
| Booleaanse extractie uit FormData stil faalbaar | `app/**/actions.ts` | Expliciete validatie toevoegen |
Maar de daglus is nog niet af zolang de gebruiker activiteiten niet kan:
- afronden
- overslaan
- aanpassen
- samenvatten in een dagoverzicht
**Waarom nu:** dit is de grootste productmatige ontbrekende schakel. De app
voelt nu al nuttig, maar nog niet “rond”.
**Concreet:**
- activiteitstatus wijzigen naar `completed`, `skipped`, `adjusted`
- ongeplande activiteit kunnen toevoegen
- dagaggregaties berekenen
- dagoverzicht tonen met totalen en statusverdeling
---
## Risico's en aandachtspunten vóór launch
### 2. `npm test` toevoegen aan CI
### Security
- **Oud `service_role`-geheim in git-history**: Sleutel is als gecompromitteerd behandeld en niet meer in gebruik. Git-history opschonen is nog niet gedaan. Voer dit uit vóór publieke launch als extra voorzorgsmaatregel (`git filter-repo` of BFG Repo Cleaner).
- **RLS nog niet gehard (ST-105)**: Blokkeer launch totdat dit getest is.
- **Rate limiting ontbreekt (ST-701)**: Sign-up en sign-in eindpunten zijn momenteel niet beperkt op applicatieniveau (Supabase heeft eigen throttling, maar expliciete applicatielaag ontbreekt).
De app heeft nu unit tests voor:
### Privacy
- **DPIA nog niet gedaan (ST-803)**: Verplicht vóór launch omdat gezondheidsdata wordt verwerkt, ook al zijn het welzijnsgegevens.
- **Copyreview (ST-803)**: Alle teksten moeten door een copycheck — geen medische claims, geen diagnoses, geen therapeutisch advies. Dit is een harde launchpoort.
- **Gegevensretentie**: Nog geen beleid of implementatie voor het verwijderen van oude daggegevens.
- budgetlogica
- energiemeterlogica
### Kwaliteit
- **Geen testinfrastructuur**: Er zijn geen tests. Minimaal de budgetberekening (ST-203) en RLS-beleid vereisen geautomatiseerde tests vóór launch.
- **Geen toegankelijkheidsaudit (ST-802)**: WCAG 2.1 AA is de norm; nog niet gecontroleerd.
Maar in CI draaien nog alleen:
- `lint`
- `build`
**Waarom nu:** dit is een kleine wijziging met directe kwaliteitswinst.
**Concreet:**
- voeg `npm run test` toe aan `.github/workflows/ci.yml`
---
## Architectuuradvies voor de volgende bouwfase
### 3. Tijdzonehelper dedupliceren
### Databaseschema uitbreiden
Voeg tabellen toe in deze volgorde (met migraties in `/supabase/migrations/`):
1. `morning_check_ins` — energiescore, slaapkwaliteit, berekend budget, datum
2. `activity_categories` — referentiedata (naam, standaard energiepunten)
3. `activities` — geplande activiteiten per dag per gebruiker
4. `activity_instances` — werkelijk uitgevoerd, overgeslagen of aangepast
5. `skip_reasons` — optionele referentiedata
`getLocalDateForTimezone()` staat nu nog dubbel in:
Alle tabellen krijgen RLS-beleid op `user_id = auth.uid()`.
- `lib/check-in/service.ts`
- `lib/planning/service.ts`
### Servicelaag uitbreiden (`lib/`)
Volg het bestaande patroon in `lib/profile/service.ts`:
- Maak `lib/checkin/service.ts` voor ochtendcheck-in logica
- Maak `lib/planning/service.ts` voor activiteitenbeheer
- Houd serveracties (`app/**/actions.ts`) dun — valideren, delegeren naar service, redirecten
**Waarom nu:** klein, veilig en voorkomt toekomstige divergentie.
### Componentstrategie
- Gebruik het bestaande shadcn/ui-fundament (`components/ui/`)
- Voeg geen nieuwe UI-bibliotheek toe
- Bouw feature-componenten in eigen mappen (`components/checkin/`, `components/planning/`, `components/evaluation/`)
- Voeg `useTransition` toe zodra een form meer dan één server roundtrip kost
**Concreet:**
### Wanneer testen toevoegen
- Start met tests bij ST-203 (budgetberekening) — pure functie, makkelijk te testen
- Voeg RLS-integratietests toe bij ST-105
- Gebruik Vitest (past bij de huidige toolchain, geen extra configuratie nodig naast het toevoegen van het pakket)
- verplaats naar `lib/dates.ts`
- importeer vanuit beide services
---
## Samenvatting prioriteitsvolgorde
### 4. Onverwachte DB-fouten consistenter afvangen in server actions
Validatiefouten worden al goed afgehandeld. Wat nog niet overal strak genoeg is:
- onverwachte Supabase/DB-fouten
- partiële storingen in servicecalls
Nu eindigen sommige fouten nog als generieke exception, terwijl de gebruiker
beter een nette foutcode/toast kan krijgen.
**Waarom nu:** dit verhoogt herstelbaarheid zonder grote refactor.
**Concreet:**
- alle action-bestanden nalopen
- onverwachte servicefouten mappen naar gebruikersvriendelijke foutcodes
- bestaande `status/error`-toastpatronen hergebruiken
---
## Daarna doen
Deze punten zijn belangrijk, maar komen logisch ná de evaluatiefase.
### 5. ST-105 — RLS hardening en echte policy-tests
RLS staat aan en ziet er inhoudelijk goed uit, maar is nog niet systematisch
getest tegen misbruikscenarios.
**Concreet:**
- SQL-tests of handmatige scripts schrijven
- lezen/schrijven van andermans rijen expliciet proberen
- checken dat frontend/Vercel geen admin-secret gebruikt
**Waarom daarna:** belangrijk vóór launch, maar blokkeert de volgende productstap
niet direct.
---
### 6. Testdekking uitbreiden rond pure logica
Na de bestaande budget- en meter-tests zijn dit de beste vervolgstukken:
- `lib/forms/parse.ts`
- toekomstige dagaggregatie voor evaluatie
- tijdzone/datumhelpers zodra die gedeeld zijn
**Waarom daarna:** klein en waardevol, maar minder productkritisch dan ST-401.
---
### 7. Transactie of RPC voor onboarding-opslag
`completeOnboardingForCurrentUser()` doet nu twee losse updates:
- `profiles`
- `user_settings`
Dat werkt, maar kent een klein risico op partiële opslag als de tweede write
faalt.
**Concreet:**
- ofwel Supabase RPC
- ofwel server-side transactiepad waar haalbaar
**Waarom daarna:** belangrijk voor netheid en robuustheid, maar geen acute
blokkade.
---
## Vóór launch
Deze punten hoeven niet allemaal in de volgende sprint, maar moeten wel vóór een
serieuze publieke introductie op orde zijn.
### 8. Logging en monitoring
Nu ontbreekt nog een echte productieloglaag zoals:
- Sentry
- of vergelijkbare error monitoring
**Nodig voor:**
- incidenten terugvinden
- onverwachte action-/DB-fouten volgen
- regressies sneller herkennen
---
### 9. Rate limiting
Nu leunt auth vooral op Supabase-limieten. Voor de app zelf ontbreekt nog
bewuste begrenzing op mutaties zoals:
- check-in opslaan
- activiteit toevoegen
- latere evaluatie-updates
**Doel:** misbruik, spam en piekgedrag beperken.
---
### 10. Secret-history cleanup
Een oude Supabase `service_role` key heeft eerder in de git-history gestaan.
Ook al is die key niet meer actief in de app, vóór publieke launch is het nog
steeds verstandig om:
- die geschiedenis op te schonen
- en te bevestigen dat de sleutel niet meer bruikbaar is
---
### 11. Accessibility, copy en privacy-review
Voor launch nog nalopen:
- toetsenbord- en screenreaderflow op kritieke routes
- wellness/self-management copy zonder medische framing
- privacy/DPIA-check passend bij jullie positionering
---
## Later
Deze punten zijn nuttig, maar nu nog niet de beste besteding van tijd.
### 12. Paginering en schaaloptimalisaties
Bij de huidige MVP is de activiteitslijst nog klein. Zaken als:
- paginering
- geavanceerde caching
- query-optimisaties voor grote datasets
zijn voorlopig geen topprioriteit.
---
### 13. Supabase codegeneratie voor types
De huidige handmatige mapping is nog beheersbaar. Codegeneratie via Supabase CLI
kan later waardevol worden, maar nu voegt het waarschijnlijk meer toolinglast
toe dan directe winst.
---
### 14. Zwaardere compliance-laag
Formele zorgcompliance, audittrail en NEN-achtige eisen zijn pas logisch als de
productpositionering echt opschuift richting zorgmarkt. Voor de huidige
wellness-first MVP is dat nog niet de eerstvolgende stap.
---
## Aangescherpte prioriteitsvolgorde
```text
Nu: ST-401405 (evaluatie en dagoverzicht)
Nu: npm test toevoegen aan CI
Nu: getLocalDateForTimezone() dedupliceren naar lib/dates.ts
Nu: onverwachte DB-fouten in actions consistenter mappen
Daarna: ST-105 (RLS hardening en policy-tests)
Daarna: extra tests voor parse- en aggregatielogica
Daarna: onboarding-opslag transactioneler maken
Vóór launch: logging/monitoring
Vóór launch: rate limiting
Vóór launch: secret-history cleanup
Vóór launch: accessibility/copy/privacy review
Later: paginering, codegen, zwaardere compliance-laag
```
Nu: ST-201 (ochtendcheck-in UI)
Dan: ST-203 (budgetlogica + eerste tests)
Daarna: ST-301305 (dagplanning)
Daarna: ST-401405 (evaluatie)
Parallel: ST-105 (RLS), ST-701 (rate limiting)
Vóór launch: ST-802 (toegankelijkheid), ST-803 (copy + DPIA)
```
---
## Korte conclusie
De app is niet meer in de fase van “fundering ontbreekt”. Die fase is grotendeels
voorbij. De actuele focus moet nu verschuiven naar:
- de gebruikerslus afmaken
- reliability aanscherpen
- en launch-risicos gecontroleerd terugdringen
De beste volgende inhoudelijke stap is daarom nog steeds:
**`ST-401 t/m ST-405` — evaluatie en dagoverzicht.**