feat(privacy): terzijdelegging — het filter en de knop (#651) #736

Merged
brenno merged 2 commits from feat/terzijdelegging-paneel-651 into main 2026-07-23 12:13:32 +00:00
Owner

De tweede ronde van #651, op de opslaglaag uit #732. Een bevinding is nu werkelijk terzijde te leggen.

Het filter zit op computePrivacyScan, precies waar al afgehandelde bevindingen wegvallen. privacyRawScanProvider blijft het volle aantal zien — dat is wat de nalevingstelling van MIAUW EIS 1.1 leest, en die mag niet meebewegen met een oordeel van de auteur. Verbergen is geen wegscannen; "beoordeeld en akkoord" is niet "opgelost".

De knop heet "Deze is beoordeeld en mag blijven" en staat bóven "Deze regel nooit meer melden". De volgorde is de boodschap: déze ene treffer is bijna altijd wat iemand bedoelt, de hele regel uitzetten is het zware middel. 31 vertalingen, met het onderscheid tussen "deze ene" en "de regel" in elke taal expliciet.

De gevonden waarde komt de widgetlaag niet in. De brug naar het paneel geeft die bewust nooit door — een privacycontrole die de gevonden BSNs in haar eigen meldingen zet, heeft het probleem verplaatst. Dus zoekt de widget alleen de bevinding op (op coördinaten) en gebeurt de rest in de privacylaag, waar de tekst wordt opgehaald en meteen tot commitment verwerkt.

Twee gevolgen die de goede kant op vallen: is de dia sinds de scan bewerkt, dan levert de resolver niets op en melden we liever dan te onderdrukken; en een sidecar met een ander zout verbergt niets.

Drie ratchets tripten, twee wezen op iets echts: de scannerfuncties staan nu in een eigen part, en het privacyblok is uit een 152-regelige if-ketting gelicht. Eén basislijn ging bewust vijf regels omhoog, ná er eerst 24 regels duplicatie uit te hebben gehaald; de reden staat bij de basislijn.

make check groen: 5970 tests.

Nog open in #651: de terzijdegelegd-lijst met ongedaan-maken, en het git-schrijfpad.

De tweede ronde van #651, op de opslaglaag uit #732. Een bevinding is nu werkelijk terzijde te leggen. **Het filter** zit op `computePrivacyScan`, precies waar al afgehandelde bevindingen wegvallen. `privacyRawScanProvider` blijft het volle aantal zien — dat is wat de nalevingstelling van MIAUW EIS 1.1 leest, en die mag niet meebewegen met een oordeel van de auteur. Verbergen is geen wegscannen; "beoordeeld en akkoord" is niet "opgelost". **De knop** heet "Deze is beoordeeld en mag blijven" en staat bóven "Deze regel nooit meer melden". De volgorde is de boodschap: déze ene treffer is bijna altijd wat iemand bedoelt, de hele regel uitzetten is het zware middel. 31 vertalingen, met het onderscheid tussen "deze ene" en "de regel" in elke taal expliciet. **De gevonden waarde komt de widgetlaag niet in.** De brug naar het paneel geeft die bewust nooit door — een privacycontrole die de gevonden BSNs in haar eigen meldingen zet, heeft het probleem verplaatst. Dus zoekt de widget alleen de bevinding op (op coördinaten) en gebeurt de rest in de privacylaag, waar de tekst wordt opgehaald en meteen tot commitment verwerkt. Twee gevolgen die de goede kant op vallen: is de dia sinds de scan bewerkt, dan levert de resolver niets op en melden we liever dan te onderdrukken; en een sidecar met een ander zout verbergt niets. **Drie ratchets tripten**, twee wezen op iets echts: de scannerfuncties staan nu in een eigen `part`, en het privacyblok is uit een 152-regelige if-ketting gelicht. Eén basislijn ging bewust vijf regels omhoog, ná er eerst 24 regels duplicatie uit te hebben gehaald; de reden staat bij de basislijn. `make check` groen: 5970 tests. **Nog open in #651:** de terzijdegelegd-lijst met ongedaan-maken, en het git-schrijfpad.
Het filter zit op `computePrivacyScan`, precies waar al afgehandelde
bevindingen wegvallen. `privacyRawScanProvider` blijft het volle aantal
zien — dat is wat de nalevingstelling van MIAUW EIS 1.1 leest, en die mag
niet meebewegen met een oordeel van de auteur. Verbergen is geen
wegscannen, en "beoordeeld en akkoord" is niet "opgelost".

**Waar de waarde vandaan komt, zonder de grens op te rekken.** Voor het
commitment is de gevonden tekst nodig, maar de brug naar het
kwaliteitspaneel geeft die bewust nooit door: een privacycontrole die de
gevonden BSN's in haar eigen meldingen zet, heeft het probleem verplaatst
in plaats van opgelost. `matchedTextOf` staat daarom in de
scannerbibliotheek en zoekt de tekst op vanaf de opgeslagen positie; hij
wordt meteen tot een commitment verwerkt en verlaat die laag niet.

Twee gevolgen die de goede kant op vallen: is de dia sinds de scan bewerkt
en klopt de positie niet meer, dan levert de resolver niets op en melden
we liever dan te onderdrukken. En een sidecar met een ander zout verbergt
niets, want die commitments slaan hier nergens op.

Zes tests; `!isSetAside` weghalen laat precies de juiste rood worden.

De resolver staat top-level en niet op `PrivacyScanner` — hij raakt geen
veld van die klasse aan, en de klasseratchet wees daar terecht op.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
"Deze is beoordeeld en mag blijven", boven de bestaande "Deze regel nooit
meer melden". De volgorde is de boodschap: déze treffer beoordeeld en goed
bevonden — "die naam hóórt hier" — is bijna altijd wat iemand bedoelt, en
de hele regel uitzetten is het zware middel.

De waarde komt de widgetlaag niet in. Het paneel kent alleen de
coördinaten, dus wordt de bevinding eerst in de ruwe scan opgezocht
(`findingForIssue`, op dia/veld/fragment/positie — de meldingssleutel
draagt een persoonsrol en is dus een ándere sleutel dan de regel-id), en
gaat de rest naar `withFindingSetAside` in de privacylaag. Daar wordt de
tekst opgehaald en meteen tot een commitment verwerkt.

De setter staat buiten undo/redo, net als de annotaties en de notities:
Ctrl+Z hoort een typefout terug te draaien, niet een privacy-oordeel.

**Drie ratchets tripten, en twee wezen op iets echts.**

`privacy_scanner.dart` liep over de bestandsgrens: de nieuwe functies
staan nu in `privacy_scanner_dismissals.dart`, om dezelfde reden waarom
`privacy_scanner_fragments.dart` bestaat.

`buildSlideQualityActions` werd 152 regels. Het privacyblok is een eigen
functie geworden met zijn eigen reden erboven — die if-ketting was al te
lang en dit was de aanleiding om er iets aan te doen.

**En één basislijn ging bewust omhoog**, wat ik normaal niet doe.
`DeckNotifier` kreeg er vijf regels bij voor `setDismissals`. Eerst ging er
24 uit: de vier identieke regels die annotaties, notities en
terzijdeleggingen deelden staan nu één keer in `_updateSidecarLayer` —
inclusief het vuil markeren, en juist dát is de stap die je bij een vierde
laag zou vergeten — en het opschonen en zetten van een notitie is
top-level. Wat overblijft raakt allemaal `state` en is niet uit de klasse
te tillen zonder een notitielaag te bouwen die groter is dan de functie die
erom vraagt. De reden staat bij de basislijn.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 84986cc96f into main 2026-07-23 12:13:32 +00:00
brenno deleted branch feat/terzijdelegging-paneel-651 2026-07-23 12:13:32 +00:00
Sign in to join this conversation.
No description provided.