perf(export): één scan per bundel, en één bundel voor het dialoog (#613) #680

Merged
brenno merged 3 commits from perf/exportdialoog-scans-613 into main 2026-07-22 20:13:37 +00:00
Owner

Sluit #613.

Zes volledige privacyscans plus twee manifestbouwsels op de UI-draad, vóór de eerste frame van het exportdialoog. Beide wijzigingen komen uit jouw voorstel.

  • hasPrivacyFindings komt nu uit privacyExportSummaryProvider. Die regel bepaalt alleen of er íets te melden valt en kostte een complete extra bundel — drie scans plus een manifest met verse salts, waarvan alles op één bool na werd weggegooid.
  • Eén scan per bundel. forAudience en RedactionManifestService.build/redactedValues nemen er desgewenst één mee. Laten ze hem weg, dan scannen ze zelf zoals voorheen, zodat elke andere aanroeper ongemoeid blijft.

Zes werd één, plus één per profiel- of diepgangkeuze.

De test bewaakt de voorwaarde, niet de winst

Een scan tellen kan niet van buitenaf. Wat wél te toetsen is, is of de meegegeven scan werkelijk gebruikt wordt: een lege scan meegeven moet niets redigeren en een leeg manifest opleveren. Doet de code dat niet, dan scande ze alsnog zelf en is de herhaling er gewoon nog, hoe groen de rest ook staat. Plus de tegenhanger: dezelfde scan meegeven verandert de uitkomst niet.

Twee dingen die erbij hoorden

De bundelfabriek is verhuisd naar lib/services/export_bundle.dart. De wijziging duwde _MainLayoutState over zijn klasseplafond (1520/1510). Niet de basislijn verhoogd maar verplaatst: dit is exportlogica, geen schermlogica, en het hoort naast ExportBundle — in het bestand waarvan de kop de projectiegrens al beschrijft die deze functie bewaakt. De shell houdt de closure die de bron erin sluit; dát is het stuk dat wél shell-werk is. De klasse zakt naar 1457 regels, basislijn mee omlaag.

En daarmee kwam de dekkingsvloer. export_bundle.dart stond op 6,7%: de fabriek was tot nu toe alleen via een widgettest bereikbaar en werd daar nooit doorlopen. Nu hij een gewone functie is, is hij gewoon te toetsen — projectie, markdown, manifest, diepgangfilter en het geredigeerde profiel, elk met een dia die iets draagt wat er niet uit mag. Dat is de eigenlijke winst van die verhuizing.

Poort

make check groen (niet door tail gepijpt). Geen afhankelijkheid erbij, geen nieuwe zichtbare tekst.

Sluit #613. Zes volledige privacyscans plus twee manifestbouwsels op de UI-draad, vóór de eerste frame van het exportdialoog. Beide wijzigingen komen uit jouw voorstel. - **`hasPrivacyFindings` komt nu uit `privacyExportSummaryProvider`.** Die regel bepaalt alleen of er íets te melden valt en kostte een complete extra bundel — drie scans plus een manifest met verse salts, waarvan alles op één bool na werd weggegooid. - **Eén scan per bundel.** `forAudience` en `RedactionManifestService.build`/`redactedValues` nemen er desgewenst één mee. Laten ze hem weg, dan scannen ze zelf zoals voorheen, zodat elke andere aanroeper ongemoeid blijft. Zes werd één, plus één per profiel- of diepgangkeuze. ## De test bewaakt de voorwaarde, niet de winst Een scan tellen kan niet van buitenaf. Wat wél te toetsen is, is of de meegegeven scan werkelijk gebruikt wordt: een **lege** scan meegeven moet niets redigeren en een leeg manifest opleveren. Doet de code dat niet, dan scande ze alsnog zelf en is de herhaling er gewoon nog, hoe groen de rest ook staat. Plus de tegenhanger: dezelfde scan meegeven verandert de uitkomst niet. ## Twee dingen die erbij hoorden **De bundelfabriek is verhuisd naar `lib/services/export_bundle.dart`.** De wijziging duwde `_MainLayoutState` over zijn klasseplafond (1520/1510). Niet de basislijn verhoogd maar verplaatst: dit is exportlogica, geen schermlogica, en het hoort naast `ExportBundle` — in het bestand waarvan de kop de projectiegrens al beschrijft die deze functie bewaakt. De shell houdt de closure die de bron erin sluit; dát is het stuk dat wél shell-werk is. De klasse zakt naar 1457 regels, basislijn mee omlaag. **En daarmee kwam de dekkingsvloer.** `export_bundle.dart` stond op 6,7%: de fabriek was tot nu toe alleen via een widgettest bereikbaar en werd daar nooit doorlopen. Nu hij een gewone functie is, is hij gewoon te toetsen — projectie, markdown, manifest, diepgangfilter en het geredigeerde profiel, elk met een dia die iets draagt wat er niet uit mag. Dat is de eigenlijke winst van die verhuizing. ## Poort `make check` groen (niet door `tail` gepijpt). Geen afhankelijkheid erbij, geen nieuwe zichtbare tekst.
Zes volledige privacyscans plus twee manifestbouwsels op de UI-draad,
vóór de eerste frame van het exportdialoog. Bij 200 dia's is dat ruim
anderhalve seconde bevroren venster, zonder spinner, direct na de klik.
Het rasteren erná heeft voortgang, fasen en annuleren — de enige plek
waar de export voelde alsof hij hing, was de plek die nog niets deed.

Twee wijzigingen, allebei uit het voorstel in het issue:

- **`hasPrivacyFindings` komt nu uit `privacyExportSummaryProvider`.** Die
  regel bepaalt alleen of er íets te melden valt, en kostte een complete
  extra bundel: drie scans plus een manifest met verse salts, waarvan
  alles op één bool na werd weggegooid. De provider leest dezelfde
  ongefilterde scan en draait toch al voor de statusbalk.
- **Eén scan per bundel.** De projectie, het manifest en de samenvatting
  draaiden er elk hun eigen over hetzelfde deck. `forAudience` en
  `RedactionManifestService.build`/`redactedValues` nemen er nu
  desgewenst één mee; laten ze hem weg, dan scannen ze zelf zoals
  voorheen, zodat elke andere aanroeper ongemoeid blijft.

Blijft over: één scan bij het openen, en één per profiel- of
diepgangkeuze. Zes werd één.

De test bewaakt niet de winst maar de voorwaarde eronder: dat de
meegegeven scan werkelijk gebruikt wordt. Een lege scan meegeven moet
niets redigeren en een leeg manifest opleveren — doet de code dat niet,
dan scande ze alsnog zelf en is de herhaling er gewoon nog, hoe groen de
rest ook staat. Plus de tegenhanger: dezelfde scan meegeven verandert de
uitkomst niet.

Sluit #613.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De reparatie van #613 duwde `_MainLayoutState` over zijn klasseplafond.
Niet de basislijn verhoogd maar verplaatst: `buildExportBundle` en
`_expandForExport` zijn exportlogica, geen schermlogica, en horen naast
`ExportBundle` in `lib/services/export_bundle.dart` — waar de kop van het
bestand de projectiegrens al beschrijft die deze functie bewaakt.

De shell houdt de closure die de bron erin sluit; dat is precies het stuk
dat wél shell-werk is. De klasse zakt van 1520 naar 1457 regels en de
basislijn gaat mee omlaag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
test(export): dek de verplaatste bundelfabriek af
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Failing after 21s
CI / Web hardening (push) Failing after 27s
CI / Docs links (push) Failing after 23s
CI / Supply-chain (Trivy · advisory) (push) Failing after 23s
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Failing after 26s
CI / Web hardening (pull_request) Failing after 27s
CI / Docs links (pull_request) Failing after 26s
CI / Supply-chain (Trivy · advisory) (pull_request) Failing after 27s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
2d0ac48733
De verhuizing naar `lib/services/export_bundle.dart` liet dat bestand op
6,7% dekking achter — de fabriek was tot nu toe alleen via een widgettest
te bereiken en werd daar nooit doorlopen. Nu hij een gewone functie is,
kan hij dat wél: projectie, markdown, manifest, diepgangfilter en het
geredigeerde profiel, elk met een dia die iets draagt wat er niet uit mag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 7606ce6528 into main 2026-07-22 20:13:37 +00:00
Sign in to join this conversation.
No description provided.