Skip to content

refactor(demo): één beschrijving van een demo-persona - #286

Open
ericwout-overheid wants to merge 6 commits into
mainfrom
chore/demo-persona-ontdubbelen
Open

refactor(demo): één beschrijving van een demo-persona#286
ericwout-overheid wants to merge 6 commits into
mainfrom
chore/demo-persona-ontdubbelen

Conversation

@ericwout-overheid

@ericwout-overheid ericwout-overheid commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Wat

De demo-identiteit stond twee keer beschreven: DemoPersona in demo-personas (zes velden, zeven require-eisen) en Persona in demo-console/generator/AanleverModel.kt (vijf velden, geen eisen). GeneratorProducer schreef de ene handmatig op de andere over, met labelnaam als enige verschil naast het weggelaten bron.

Die kopie kostte drie invarianten — een lege id, een leeg label en een ongeldig identificatienummer kwamen er ongehinderd doorheen. De generator had ze daarom in zijn eigen init-blok teruggezet: dezelfde controle op een tweede plek, en alleen voor wie via de generator binnenkomt.

DemoBerichtGenerator werkt nu rechtstreeks op DemoPersona; Persona en de handmatige mapping zijn geschrapt.

Doelpersona blijft staan: dat is geen kopie van de identiteit maar het paneel-contract, dat het identificatienummer bewust niet draagt.

Wat er in het init-blok van de generator overblijft

Behouden — kennis die alleen de generator heeft:

Eis Waarom niet elders
minstens één persona doelgroep() mag niet leeg zijn; de personadienst weigert een lege set al, maar deze constructor niet
id's uniek de configuratie sleutelt op id en kan er geen twee leveren, deze constructor wel
persona heeft magazijnen DemoPersona staat nul magazijnen expliciet toe (Grootbedrijf haalt op bij de stub-magazijnen)
magazijn-OIN in organisaties MagazijnKennisUitInrichting toetst tegen demo.magazijnen (aanlever-URL's), de generator tegen zijn sjablonen-map — twee verschillende verzamelingen
organisatie heeft sjablonen alleen de generator kent sjablonen

Vervallen, want ze staan in het init-blok van DemoPersona en zijn daar getoetst: id niet leeg, label niet leeg, Identificatiecheck.valideer(type, waarde). Met de lege id weg vervalt ook de forEachIndexed: de melding wijst de persona weer bij zijn id aan in plaats van bij zijn positie.

Acceptatiecriteria

  • De demo-identiteit wordt op één plek beschreven en vandaaruit gebruikt.
  • De controles die op het origineel zitten, gelden nu ook voor het gebruik in het bedieningspaneel.
  • Het opvoeren van berichten en de keuzelijsten werken ongewijzigd — PersonaConfiguratieTest (@QuarkusTest) bouwt de generator uit de échte configuratie en toetst de keuzelijst via /api/demo/omgeving.

Tests

De drie vervallen generator-tests (lege id, leeg label, elfproef) hebben hun tegenhanger in DemoPersonaTest; de controle verdwijnt niet, alleen de tweede plek. De twee overgebleven fail-fast-tests kregen er een assertie op de melding bij, zodat ze niet groen blijven als een ándere invariant aanslaat.

./mvnw clean test -pl demo/demo-console -am: 262 tests, 0 failures. ./mvnw detekt:check: 0 bevindingen.

Herkomst

Deze PR stond eerst gestapeld op #280, dat Persona.id en Doelpersona introduceerde. Nu #280 gemerged is, staat hij rechtstreeks op main.

Meegenomen: één regel in de header van demo-personas/…/microprofile-config.properties. Die zei dat Grootbedrijf en Concern een opt-in bij de twee echte magazijnen hebben, "dus" die twee leeg blijven. Dat volgt niet — juist een opt-in maakt aanlevering mogelijk; ze blijven leeg omdat het paneel er niets voor aanlevert.

Plan: docs/plans/2026-09-04-demo-persona-ontdubbelen.md

Closes MinBZK/MijnOverheidZakelijk#1071

🤖 Generated with Claude Code

https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

JaCoCo coverage

Overall Project 92.07% 🍏

There is no coverage information present for the Files changed

@ericwout-overheid
ericwout-overheid force-pushed the feature/demo-console-bericht-per-persona branch from 7c0b0ae to e7031a9 Compare September 4, 2026 11:19
@ericwout-overheid
ericwout-overheid force-pushed the chore/demo-persona-ontdubbelen branch from a92d651 to 62b9ba4 Compare September 4, 2026 11:25
@ericwout-overheid
ericwout-overheid marked this pull request as ready for review September 4, 2026 11:39
@ericwout-overheid
ericwout-overheid force-pushed the chore/demo-persona-ontdubbelen branch from c2f1fe5 to a16c7d9 Compare September 4, 2026 12:04
Base automatically changed from feature/demo-console-bericht-per-persona to main September 4, 2026 12:42
ericwout-overheid and others added 6 commits September 5, 2026 10:40
Het bedieningspaneel had een eigen `Persona` naast `DemoPersona` van de
personadienst: dezelfde velden, `label` hernoemd naar `naam`, `bron`
weggelaten, en geen enkele van de zeven `require`-eisen. De generator had
er daarom drie van teruggezet — dezelfde controle op een tweede plek, en
alleen voor wie via de generator binnenkomt.

`DemoBerichtGenerator` werkt nu rechtstreeks op `DemoPersona`; `Persona` en
de handgeschreven mapping in `GeneratorProducer` zijn geschrapt. Wat in het
init-blok van de generator overblijft is de kennis die alleen hij heeft:
minstens één persona, unieke id's, minstens één magazijn per persona, elk
magazijn-OIN bekend bij zijn organisaties, en sjablonen per organisatie.

`Doelpersona` blijft: dat is geen kopie van de identiteit maar het
paneel-contract, dat het identificatienummer bewust niet draagt.

De vervallen generator-tests (lege id, leeg label, elfproef) hebben hun
tegenhanger in `DemoPersonaTest`.

Closes MinBZK/MijnOverheidZakelijk#1071

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
Uit de review op deze wijziging:

- `GeneratorProducer` beweerde dat de keuzelijst en de gegenereerde
  berichten dezelfde set persona's gebruiken. Dat is niet zo: de generator
  krijgt `metMagazijnen()`, een deelverzameling. Met de handmatige mapping
  weg is die aanroep de enige plek waar het filter nog zichtbaar is.
- De assertie in `een persona met een onbekende organisatie-OIN` sloeg op
  het woord "onbekend" in de vaste meldingstekst en zou dus ook slagen als
  de melding de persona niet meer noemt.
- De magazijnen-lus werd alleen met één OIN uitgelokt; een regressie naar
  `magazijnen.first()` kwam er groen doorheen. Test erbij met een bekend
  OIN vóór het onbekende.
- De sjablonen-test maakte de eerste map-entry leeg, waar
  `organisaties.values.first()` doorheen komt; nu de tweede.
- `OmgevingResourceTest` gaf twee persona's hetzelfde identificatienummer,
  wat de personadienst fail-fast weigert — een fixture die niet kan bestaan.
- KDoc van `Doelpersona` zette zich nog af tegen `PersonaDto`, terwijl het
  type nu uit `DemoPersona` ontstaat, dat het nummer óók draagt.
- De toelichting op de magazijnen-eis noemde de verkeerde reden: hij bestaat
  omdat de constructor nul magazijnen aanneemt, niet omdat de personadienst
  ze toestaat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
Uit de tweede reviewronde:

- De twee lussen in het init-blok werden alleen met de foute waarde op de
  laatste positie uitgelokt. Daarmee sneuvelt een `first()`-implementatie
  wel, maar een `last()`-implementatie niet. Beide tests zijn nu
  geparameteriseerd over de positie.
- De KDoc van `Doelpersona` schreef de niet-lege velden toe aan
  `doelgroep()`, terwijl `DemoPersona` ze bewaakt, en beweerde dat het
  nummer buiten de generator-API blijft — dat doet het niet, alleen buiten
  de keuzelijst.
- De KDoc van `DemoBerichtGenerator` vatte het init-blok samen als
  "afzenders en sjablonen"; dat dekt drie van de vijf eisen niet.
- `GeneratorProducer` sprak van "de personadienst" waar het om de bean uit
  de jar gaat, in-process — niet om een aanroep over het net.
- De toelichting bij de generator-fixture in `TempoServiceTest` telde nog
  drie regels testdata.
- Het plan telde de invarianten die de kopie kostte te laag en had de
  rationale onder "minstens één persona" omgekeerd.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
De lus over de persona's zette de kapotte persona altijd als laatste, zodat
een implementatie die alleen `personas.first()` nagaat sneuvelde maar een
die alleen de laatste bekijkt erdoorheen kwam. Nu geparameteriseerd, gelijk
aan de twee lussen eronder.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
De basisbranch heeft `require(sjablonen.isNotEmpty())` naar `Organisatie`
verplaatst; de tabel noemde hem nog als behouden generator-invariant.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
…noemen

De header zei dat Grootbedrijf en Concern een opt-in bij de twee echte
magazijnen hebben, "dus" die twee leeg blijven. Dat volgt niet: juist een
opt-in maakt aanlevering mogelijk. Ze blijven leeg omdat het paneel er niets
voor aanlevert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SkFnFHif3ffbctaxoyEdwn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Demo: twee bijna gelijke beschrijvingen van dezelfde demo-persona naast elkaar

1 participant