Alle noemenswaardige wijzigingen aan dit platform worden hier vastgelegd, geordend per release of werkperiode.
Format: gebaseerd op Keep a Changelog. Versies worden bij majeur-mijlpalen geknipt; tot dan groeit [Unreleased] mee met main. Conventional commits in git log blijven de feitelijke audit-trail.
Vijftien feature-PR's (#54–#81) tussen 12 mei en 27 mei. Eerste-ronde-reviewers (pilot-gemeente) ontvingen demo-toegang; tweede demo-ronde gepland 28 mei voor finale keuze-moment (doorbouwen / open-source-community / stoppen).
Bevindingen aanmaken via UI (PR #81)
/beheer/bevindingenhad alleen een lees-overzicht en filter; backend (POST /assessments/findings/) werkte al. Tijdens validatie voor de demo van 28 mei sluit deze PR de UI-gap.- "Nieuwe bevinding"-knop bovenaan + create-form met verplichte velden (assessment-dropdown, titel, ernst, status) en optionele beschrijving. Assessment-dropdown toont "type · domein · datum" zodat reviewers snel het juiste assessment kiezen.
- Knop is disabled + waarschuwingsbalk wanneer er nog geen assessments zijn (bevinding hangt altijd aan een assessment — audit-trail-conventie).
- api-client krijgt
api.findings.create()+api.findings.update(). - Tests: 4 nieuwe vitest in
bevindingen/page.test.tsx(empty-state, validatie, create-flow met API-spy, ernst-filter) + 2 e2e inbeheer-bevindingen-create.spec.ts(UI → API → DB-verificatie via psql).
Comprehensive UI → API → DB e2e-coverage (PR #62)
- Nieuw
frontend/e2e/helpers/-pakket: gecachede dev-token-helper (omzeiltRATE_LIMIT_AUTH=10/min) enqueryScalar/rowExistsals dunne wrapper ronddocker compose exec psql. - 9 nieuwe Playwright-specs (20 tests) die elke beheer-/admin-UI-route door de happy-path lopen en na elke actie de onderliggende DB-rij direct in
ims_*verifiëren — geen mocks: echte UI → API → DB. - Specs: admin-organisatie (boom-CRUD, cycle-prevention), admin-velden (form-builder, JSON-Schema enum), admin-agent-tokens (NHI two-step + JWT-claim), beheer-hitl-review, beheer-controls CRUD, beheer-assessments + bevindingen + bewijs, beheer-incidenten, beheer-risicos extensies, dashboard + admin-read.
Stabiliteits-fixes voor dev-stack onder e2e-druk (PR #62)
docker-compose.yml: frontendmem_limit512m → 2g. Turbopack OOM'de tijdens on-demand-compile van zware routes (/beheer/risicos7s); container herstartte telkens en tests kregenERR_EMPTY_RESPONSE.frontend/.dockerignoretoegevoegd zodatCOPY . .geen stale lokalenode_modules(next@16.2.4) overnpm ci-resultaten (next@16.2.6) heen kopieert. Dit verwijderde deMismatching @next/swc version-waarschuwing en dev-server-instabiliteit.- Twee opeenvolgende full-suite-runs: 40/40 e2e pass, 0 retries, 0 container-restarts, geheugen stabiel ~1.3GB / 2GB.
Node-base-image bump (PR #63)
frontend/Dockerfilenode 25-slim → 26-slim. Vervangt dependabot #61 die op een stale branch zat van vóór de mem_limit-fix.
M2 — RFC 0001 + 0002 door naar controls + assessments (PR #64)
- Backend:
organizational_unit_id(Optional) in Control/Assessment schemas (Create/Update/Response). POST/PATCH valideren cross-tenant (422). GET ondersteunt?organizational_unit_id=&include_descendants=met recursive-CTE-walk — identiek pattern als risico's.custom_attributeswas er al, nu volledig in Response geëxposeerd.ai_system_idook expliciet inAssessmentResponse. - Frontend:
/beheer/controls+/beheer/assessmentskrijgenOrgUnitSelect+CustomFieldsFormin create-form en filter-kaart op de lijst (zelfde pattern als/beheer/risicos). api-client.list({ organizationalUnitId, includeDescendants })op controls + assessments, plusassessments.update(). - Tests: +5 pytest in
test_organizational_units.py(control create-with-unit, cross-tenant-reject, descendants-filter; assessment create-with-unit + cross-tenant-reject). +6 e2e in twee nieuwe specs die UI-flow doorlopen en daarna direct inims_controls/ims_assessmentsverifiëren via psql.
Vitest-coverage uitgebreid (PR #65)
- 20 → 51 vitest-tests (+31), 4 → 11 spec-files.
- Nieuwe tests:
OrgUnitSelect(4),CustomFieldsForm(7), AI-systemen-page (5), HITL-checkpoints-page (5), agent-tokens-page (4), Controls-page (3), Assessments-page (3). - SWR-isolatie: elke test wrapt component in
<SWRConfig provider={() => new Map()}>zodat caches niet over tests heen lekken. - Coverage-ratchet:
vitest.config.tsthresholds 1/1/1/1 → 20/50/40/20 (V1 uit RFC 0003). Actuals: ~27/76/49/27.
M2 — GRC-engine uitbreidingen (RFC 0001 + 0002)
- Custom-attributes (JSONB) op risk/control/assessment/finding met tenant-specifieke veld-definities (
ims_custom_field_definitions), JSON-Schema-validatie, reserved-namespace-check tegen kernkolommen, additionalProperties=false op compound-schema. - CRUD
/api/v1/custom-fields/(admin-only) en/admin/veldenform-builder-UI met 4 veld-types (Tekst, Getal, Ja/nee, Keuzelijst). - Organizational units met parent-self-FK boom (
ims_organizational_units), max-depth-6, cycle-prevention via PATCH, recursive-CTE descendants-walk. - CRUD
/api/v1/organizational-units/+/tree+/{id}/descendantsen/admin/organisatieboom-editor-UI. - Risk-list filter
?organizational_unit_id&include_descendants+ dropdown op risico-form. Org-unit-koppeling op risk/control/assessment/grc_scores. - Herbruikbare frontend-components
OrgUnitSelect+CustomFieldsForm(renders inputs uit JSON-Schema-type).
M5 — Risicokwantificatie (kern + UI + historie)
- Schema-uitbreiding
ims_risksmetfinancial_impact_min_eur,financial_impact_max_eur,impact_distribution(Alembic 014). - Monte Carlo-service (
app/services/simulation/monte_carlo.py) met uniform en triangular distributies, NumPy-implementatie, reproduceerbaar via optioneleseed. - Endpoint
POST /api/v1/risks/{id}/simulatemet percentielen p5–p99, VaR-95/99, expected loss en optioneel?include_samples=truevoor histogram-rendering. - Simulatie-historie via
ims_risk_simulations(Alembic 015), auto-save per run met?label+?note,GET /risks/{id}/simulationspaginerend. - Frontend-componenten
SimulationHistogram(recharts, 30 bins, VaR-lijnen) enSimulationInterpretation(natuurlijke-taal-uitleg met conditionele waarschuwingen voor grote spreiding en materieel staartrisico). Lazy-loaded vianext/dynamic.
M4 — AI Governance volledig operationeel
- AI-systemenregister
ims_ai_systemsmet EU AI Act-classifier (deterministisch, keyword-based, advies-only), NIST AI RMF 1.0 als zesde normenkader met 4 kernfunctie-requirements, AI-conformity-assessment-type met verplichte AI-systeem-koppeling. - Append-only
ai_hitl_checkpointsvoor menselijk-toezicht-audittrail (EU AI Act art. 14) + NHI agent-tokens met scope-claim en TTL ≤ 24h, optioneel gekoppeld aan AI-systeem. - Drie frontend-routes:
/beheer/ai-systemen(CRUD met classifier-advies inline),/beheer/hitl-checkpoints(review-flow met verplichte motivatie + historie),/admin/agent-tokens(NHI-uitgifte met two-step confirm + one-time JWT-display). - Audit-logs-list endpoint
/ai-hitl-checkpoints/audit-logsmet review-telling per log + last_decision (voor UI-werklijst).
M0 — Productie-readiness
- HTTPS via Caddy reverse proxy (documentatie + voorbeeldconfig).
- Rate limiting via SlowAPI met instelbare limits per
.env(RATE_LIMIT_DEFAULT,RATE_LIMIT_AUTH). - PostgreSQL backup-pipeline (
scripts/backup-postgres.sh+ restore + end-to-end pipeline-test) met documentatie indocs/backup.md. /health/detailsendpoint met structured JSON-logging in productie + Langfuse-config-detectie + alerting-drempels (docs/monitoring.md).- 5-fasen deployment-handleiding voor IT-beheerders (
docs/deployment.md). - Security-hardening checklist (10 categorieën) met geautomatiseerde
scripts/security-check.sh.
Frontend test-stack (RFC 0003)
- Vitest 3 + React Testing Library 16 + MSW 2 + jsdom 25.
vitest.config.tsmet jsdom, coverage-v8, path-alias, drempels start op 1% met ratchet-plan tot 70%.- 20 unit-tests over 4 files:
lib/constants(RBAC),lib/format-error(Pydantic/FastAPI shapes),lib/api-client(MSW-gemockt incl.include_samples-query),simulation-interpretation-component (conditional warnings). - ESLint 10.3 → 9.36 downgrade om
eslint-plugin-react-incompat met ESLint 10 op te lossen. Lint nu actief in CI met 0 errors. - CI uitgebreid:
frontend.ymldoet lint + typecheck + test:coverage + coverage-upload + build;tests.ymldoetpytest --covmet coverage als artifact.
E2E coverage (Playwright)
- 5 spec-files: auth + navigation + inrichting-flow (origineel),
m5-simulatie(UI + API),m4-ai-systemen(UI + filter + classifier-determinisme),rfc-extensions(custom-fields + org-units API-flow).
Documentatie
docs/modules.md— modulaire 7-blok-frame met afhankelijkheidsdiagram en eerlijke backend/frontend-statussplitsing.docs/ai-governance-uitbreiding.md— NIST AI RMF + AI architectuur + NHI-pattern.docs/eu-ai-act-classification.md— classifier-regels en criteria.docs/risico-kwantificatie.md— Monte Carlo-API + distributies + interpretatie.docs/rfc/0001t/m0005— gestructureerde RFC's voor extensible attributes, org-units, frontend-test-strategie, M4-frontend-UI, M5-UI-uitbreiding. RFC 0003+0004+0005 zijn V1 geïmplementeerd; 0001+0002 V1 idem.
- ROADMAP geherformuleerd naar modulair frame met twee actieve sporen (M0 productie-readiness, M4 AI Governance) en geparkeerde M5+M6.
- README cijfers bijgewerkt naar 35 tabellen, 17 Alembic-migraties, 19 API-routers, 240+ backend tests, 20 frontend unit, 5 e2e-specs.
- Rate-limit-handler stuurt nu altijd Retry-After-header.
ims_risk_simulations.user_idnullable met existence-check in endpoint (NHI-tokens en dev-tokens hebben geen echte user-row).- ESLint 10.3 + eslint-plugin-react incompatibiliteit opgelost via downgrade naar 9.36.
- Diverse e2e-strict-mode-conflicten in M4 + M5-specs (exact-match op headings en percentielen).
| Categorie | Aantal |
|---|---|
| Databasetabellen | 41 |
| Alembic-migraties | 17 |
| API-routers | 22 |
| Backend Python-bestanden | 78 |
| Backend tests (pytest) | 247 |
| Frontend TypeScript-bestanden | 63 |
| Frontend unit tests (Vitest) | 55 (12 spec-files, coverage ratchet 20/50/40/20) |
| Frontend e2e-specs (Playwright) | 18 specs (48 tests) |
| Normenkaders | 6 (BIO 2.0, ISO 27001, ISO 27701, ISO 22301, AVG, NIST AI RMF) |
| RBAC-rollen | 6 |
| RLS-policies | 27 tabellen |
| Module | Backend | Frontend |
|---|---|---|
| M0 Platform | ✅ multi-tenant + RBAC + RLS + audit + rate-limit + monitoring + backup | n.v.t. (fundering) |
| M1 Normen & Mapping | ✅ 6 normenkaders + Rosetta Stone + RAG-store | n.v.t. (kennislaag) |
| M2 GRC-engine | ✅ + extensible attributes (RFC 0001, alle 4 entiteiten) + org-units (RFC 0002, risk + control + assessment + scoring) | ✅ /beheer/* (risk + control + assessment met org-unit + custom-fields + filter) + /admin/organisatie + /admin/velden |
| M3 IMS-inrichtingswizard | ✅ 22 stappen + 7 AI-agents + RAG | ✅ /inrichten/* |
| M4 AI Governance | ✅ alle 6 bouwstenen | ✅ 3 routes (AI-systemen + HITL + agent-tokens) |
| M5 Risicokwantificatie | ✅ kern + historie + range + Monte Carlo + VaR | |
| M6 Inter-org samenwerking | 🔮 Roadmap | 🔮 Roadmap |
Niet vastgelegd in een gepland release, wel direct openstaand werk:
- Edit-flows voor org-units (verplaatsen binnen boom) en custom-fields (definities aanpassen).
- Refactor
setState-in-effectinauth-providerensidebarnaaruseSyncExternalStore(suppressed metTODO(RFC 0003)-marker). - RFC 0005 V2: CDF-curve, scenario-vergelijking-UI, PDF-export via weasyprint, dedicated
/beheer/risicos/[id]/simulaties-route. - RFC 0004 V2: detail-pagina per AI-systeem, edit-flow,
classification_override_noteals DB-veld, HITLparent_checkpoint_idvoor genest review. - Vitest-coverage richting V2-ratchet (50/40/50/50) na vervolg-tests op
auth-provider, hooks, en de inrichtings-pagina's.
- Wat erin — wijzigingen worden hier gegroepeerd onder
Toegevoegd/Veranderd/Gefixt/Verwijderd/Beveiliging. - Wat eruit — pure refactors of intern-CI gaan niet in changelog (zie git log).
- Versie-knip — bij ROADMAP-milestone (bv. v1.0 productie-rijp) wordt
[Unreleased]versplitst en datum gestempeld. - Bron — elke PR die public-facing functionaliteit raakt zou een changelog-line moeten toevoegen. Voor nu retrofit: deze entry dekt PR #38 t/m #65.