Projectiefout gecorrigeerd via replay
Na terugmelding blijkt dat er een bug in 1 van de projecties zit: de gevolgen zijn goed vastgelegd; deze zijn echter niet goed zichtbaar in de projectie. Bij een overdracht wordt alleen de 1e eigenaar vastgelegd.
- WOZ Object wordt geregistreerd.
- Er vindt een overdracht plaats.
- Iemand (een afnemer?) merkt op dat er een specifieke projectie op een specifiek snapshot onjuist is en meldt dat terug (met bij voorkeur een UUID van de projectie). Er wordt een onderzoek gestart, en uit dat onderzoek blijkt dat er een bug in de projectie zit: verwerking is goed gegaan en gevolgen zijn correct.
- Het ontwikkel/beheerteam fixt de bug en doet een replay op de snapshots: voor de foutsituatie worden nieuwe snapshots geproduceerd.
- Onderzoek wordt afgerond.
Brondata
CorrectieMetReplayVoorbeeldTest-als-een-projectieview-verandert-naar-aanleiding-van-een-replay-wordt-de-oude-overschreven.jsonCommit9fbbe67Opgehaald18 september 2026Dit voorbeeld lijkt een beetje op het correctievoorbeeld dat we eerder gezien hebben — maar heeft een wezenlijk andere oorzaak. Daar lag de fout in de brondata zelf: Het gevolg klopte niet. Hier zijn de gevolgen correct opgeslagen, maar bevat de projectiecode een bug. Die oorzaak bepaalt de correctiestrategie: niet een correctie-gevolg, maar een replay.
De bug
De projectiecode bevat een fout in de verwerking van het gevolg BelangOvergegaanNavOverdracht. Bij een overdracht naar meerdere partijen legt de projectie alleen de eerste partij vast. De overige partijen worden overgeslagen. Gevolg: de toestand die de projectie na de overdracht toont, is onvolledig — de gerelateerdePartijen bevat maar één eigenaar (Piet Pietersen), terwijl de overdracht naar twee partijen plaatsvond.
Het is belangrijk om te begrijpen wat er niet mis is: de gevolgen zelf zijn correct. Het gevolg BelangOvergegaanNavOverdracht bevat de juiste lijst met partijen. De fout zit uitsluitend in de manier waarop de projectie het gevolg verwerkt tot toestand.
Ontdekking en onderzoek
Een afnemer bevraagt het systeem en constateert dat de projectie onjuiste belangen toont: er ontbreekt een eigenaar na een eigendomsoverdracht. De afnemer meldt dit terug, bij voorkeur met het UUID van de betreffende toestand. Er wordt een onderzoek gestart.
Tijdens het onderzoek worden de opgeslagen gevolgen nagelopen. Daaruit blijkt dat de verwerking correct is verlopen: het gevolg BelangOvergegaanNavOverdracht bevat beide partijen — Piet Pietersen en Hendrica Pietersen. Het probleem zit niet in de verwerking maar in de projectiecode — die legt bij een overdracht alleen de eerste eigenaar vast. Er is sprake van een bug in de projectielogica, niet van een fout in de registratie zelf. Het onderzoek wordt hierop bijgewerkt.
Gekeken naar de gevolgen voor deze entiteit zijn er dus geen verschillen tussen de gevolgentijdlijn en hoe deze had moeten zijn.
Correctie via replay
Het beheerteam fixt de bug in de projectiecode. Daarna voert het team een replay uit op de opgeslagen gevolgen: deze worden opnieuw verwerkt door de gecorrigeerde projectie.
De replay gaat gevolg voor gevolg door de historie. Het eerste gevolg — WozObjectGeregistreerd — levert hetzelfde resultaat op als voorheen; die toestand was al correct. Het tweede gevolg — BelangOvergegaanNavOverdracht — levert nu een nieuwe, correcte toestand op: gerelateerdePartijen bevat nu beide partijen (Piet Pietersen en Hendrica Pietersen).
Het resultaat: de projectie bevat precies één nieuwe toestand. Het gevolgenjournaal was al correct; de projectie is opgevolgd door een correcte versie.
De toestanden
De ProjectionViewer hieronder toont drie toestanden. De eerste stamt uit de registratie en is ongewijzigd gebleven. De tweede is de foutieve overdrachtstoestand — alleen Piet Pietersen, het resultaat van de bug. De derde is de correcte toestand die door de replay is opgebouwd — met de juiste partijen Piet Pietersen en Hendrica Pietersen.
De twee overdrachtstoestanden hebben hetzelfde gevolgId, hetzelfde geldigheidstijdstip en hetzelfde gevolgtijdstip: ze beschrijven dezelfde toestand op hetzelfde geldigheidsmoment, voortkomend uit hetzelfde gevolg. De laatste heeft een later projectietijdstip — hij is pas beschikbaar gekomen na de replay, in september 2020. Daardoor is de eerdere toestand opgevolgd en is de nieuwe Actueel.
Cruciaal: de foutieve toestand is niet verwijderd. Bevraag je het systeem met een projectietijdstip van vóór de replay, dan zie je nog steeds de foutieve toestand. Dit is geen ongewenst bijproduct — het is precies de bedoeling. Het bitemporeel model maakt de foutgeschiedenis auditeerbaar: je kunt altijd reconstrueren wat het systeem op enig moment dacht te weten, ook als dat fout was. Zie ook Actueel en opgevolgd voor meer toelichting.
Dit is de architectuurles: doordat een projectie uit opeenvolgende, nooit gewijzigde toestanden bestaat, blijft de volledige historie van het systeem — inclusief vergissingen en correcties — onveranderd opvraagbaar. De replay corrigeert de actuele toestand zonder de geschiedenis te wissen.
Het laatst op te merken punt is dat de replay enkel voor de Woz object projectie gedaan is: de bug zat enkel in deze projectie. Er is geen replay geweest in de belangenprojectie: deze bevatte de fout niet. In de Woz bestemming worden overdrachten überhaupt niet getoond en komt de fout dus ook niet voor.