fix(callouts): de dialoog rekende vanaf een verouderde kopie (#1848) #1865

Merged
brenno merged 1 commit from fix/1848-dialoog-verouderde-kopie into main 2026-08-29 22:24:14 +00:00
Owner

Uit de nieuwkomer-test van #1848 — en het is een gat in de reparatie van gisteren (#1858).

Wat er misging

CalloutEditorDialog krijgt de dia mee bij het openen en wordt daarna niet opnieuw opgebouwd. Elke bewerking rekende dus vanaf díe begintoestand. Wie twee verwijzingen achter elkaar maakte zonder de dialoog te sluiten, hield er één over:

na "Toevoegen" op regel 1:   ['Eerste punt (A)', 'Tweede punt']
na "Toevoegen" op regel 2:   ['Eerste punt',     'Tweede punt (B)']   <- (A) weg

De tweede bewerking schreef de regels terug zoals ze bij het openen wáren. Callout A bleef bestaan maar raakte los van zijn regel — en de lijst koppelt op precies die letter, dus die regel toonde weer "Toevoegen" in plaats van een badge met kruisje. De herstelpoging maakte het erger: nóg een verwijzing maken verving de vólgende letter. Verwijderen liet om dezelfde reden de letter in de zin staan, zodat de zin naar niets verwees.

De nieuwkomer eindigde zo met vijf markeringen op de afbeelding waarvan er één aan een regel hing, en de andere vier niet meer weg te krijgen waren.

De reparatie

De dialoog houdt de regels nu zelf bij (_bullets), net zoals hij dat al met _callouts deed; de dia buiten krijgt ze via _emit. Daarmee is de stand van de dialoog de waarheid zolang hij openstaat.

Bijvangst: de lijst laat een nieuwe verwijzing meteen als badge zien in plaats van pas na sluiten en heropenen.

Test plan

  • make check groen
  • make check-secrets groen · make sast groen (0 bevindingen)
  • Twee nieuwe toetsen die doen wat een mens doet: twee keer "Toevoegen" zonder de dialoog te sluiten, en verwijderen in een openstaande dialoog
  • Mutatieproef: terugzetten naar de verouderde kopie geeft exact de gemelde uitkomst — ['Eerste punt', 'Tweede punt (B)']

De bestaande toets uit #1858 bouwde de dialoog tussen twee bewerkingen opnieuw op en zag dit daarom niet. Die blijft staan (hij dekt de andere volgorde), met deze ernaast.

Bewaker

Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer, geen publieke belofte. Dit is een toestandsfout in één dialoog.

Raakvlak met ander werk

#1859, #1863 en #1864 gaan over hetzelfde scherm (indeling, cursor in het beschrijvingsveld, "Target verwijderen"). Geen van die drie raakt _bullets of _emit, dus dit zou er niet mee moeten botsen — maar wie daaraan begint, doet dat het best ná deze merge.

🤖 Generated with Claude Code

Uit de nieuwkomer-test van #1848 — en het is een gat in de reparatie van gisteren (#1858). ## Wat er misging `CalloutEditorDialog` krijgt de dia mee bij het openen en wordt daarna **niet opnieuw opgebouwd**. Elke bewerking rekende dus vanaf díe begintoestand. Wie twee verwijzingen achter elkaar maakte zonder de dialoog te sluiten, hield er één over: ``` na "Toevoegen" op regel 1: ['Eerste punt (A)', 'Tweede punt'] na "Toevoegen" op regel 2: ['Eerste punt', 'Tweede punt (B)'] <- (A) weg ``` De tweede bewerking schreef de regels terug zoals ze bij het openen wáren. Callout `A` bleef bestaan maar raakte los van zijn regel — en de lijst koppelt op precies die letter, dus die regel toonde weer "Toevoegen" in plaats van een badge met kruisje. De herstelpoging maakte het erger: nóg een verwijzing maken verving de vólgende letter. Verwijderen liet om dezelfde reden de letter in de zin staan, zodat de zin naar niets verwees. De nieuwkomer eindigde zo met vijf markeringen op de afbeelding waarvan er één aan een regel hing, en de andere vier niet meer weg te krijgen waren. ## De reparatie De dialoog houdt de regels nu zelf bij (`_bullets`), net zoals hij dat al met `_callouts` deed; de dia buiten krijgt ze via `_emit`. Daarmee is de stand van de dialoog de waarheid zolang hij openstaat. Bijvangst: de lijst laat een nieuwe verwijzing meteen als badge zien in plaats van pas na sluiten en heropenen. ## Test plan - [x] `make check` groen - [x] `make check-secrets` groen · `make sast` groen (0 bevindingen) - [x] Twee nieuwe toetsen die doen wat een mens doet: twee keer "Toevoegen" **zonder de dialoog te sluiten**, en verwijderen in een openstaande dialoog - [x] Mutatieproef: terugzetten naar de verouderde kopie geeft exact de gemelde uitkomst — `['Eerste punt', 'Tweede punt (B)']` De bestaande toets uit #1858 bouwde de dialoog tussen twee bewerkingen opnieuw op en zag dit daarom niet. Die blijft staan (hij dekt de andere volgorde), met deze ernaast. ### Bewaker Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer, geen publieke belofte. Dit is een toestandsfout in één dialoog. ### Raakvlak met ander werk #1859, #1863 en #1864 gaan over hetzelfde scherm (indeling, cursor in het beschrijvingsveld, "Target verwijderen"). Geen van die drie raakt `_bullets` of `_emit`, dus dit zou er niet mee moeten botsen — maar wie daaraan begint, doet dat het best ná deze merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(callouts): de dialoog rekende vanaf een verouderde kopie (#1848)
All checks were successful
scans / scans (pull_request) Successful in 2m16s
static-gate / static-gate (pull_request) Successful in 5m30s
e020754cb3
Uit de nieuwkomer-test, en het is een gat in de reparatie van vanmiddag.

`CalloutEditorDialog` krijgt de dia mee bij het openen en wordt daarna niet
opnieuw opgebouwd. Elke bewerking rekende dus vanaf díe begintoestand. Wie twee
verwijzingen achter elkaar maakte zonder de dialoog te sluiten, hield er één
over: de tweede schreef de bullets terug zoals ze bij het openen waren, dus de
`(A)` van de eerste verdween. Die callout raakte daarmee los van zijn regel en
was in de dialoog niet meer te bereiken — de lijst koppelt op precies die
letter, dus de regel toonde weer "Toevoegen" en een herstelpoging verving de
volgende letter. Verwijderen liet om dezelfde reden de letter in de zin staan.

De dialoog houdt de regels nu zelf bij, net als de callouts; de dia buiten
krijgt ze via `_emit`. De lijst laat een nieuwe verwijzing daardoor ook meteen
als badge zien in plaats van pas na heropenen.

De toets doet wat een mens doet: twee keer toevoegen zonder de dialoog te
sluiten. Terugzetten naar de verouderde kopie geeft exact de gemelde uitkomst
— `['Eerste punt', 'Tweede punt (B)']`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 04fbc6c3c3 into main 2026-08-29 22:24:14 +00:00
Sign in to join this conversation.
No description provided.