feat(ociwacht): geboortedatum plus postcode plus geslacht wijst één persoon aan #393

Merged
brenno merged 2 commits from feat/ociwacht-quasi-combo into main 2026-07-19 20:52:45 +00:00
Owner

bulk.quasi_combo uit §3-H — de klassieke "maar het is toch geanonimiseerd"-val.

Latanya Sweeney liet in 1997 zien dat postcode, geboortedatum en geslacht samen 87% van de Amerikaanse bevolking uniek aanwijzen. Geen van de drie is op zichzelf een identificator, en juist dáárom overleven ze het schrappen van namen en nummers — waarna het resultaat "geanonimiseerd" heet.

Dus geen nieuwe detectie, maar een combinatie van wat er al lag. Met één bouwsteen die ontbrak.

Geslacht krijgt bewust geen eigen regel

"Geslacht: M" wijst in zijn eentje niemand aan; als losse melding zou het alleen ruis zijn. Het telt hier mee als veld en niet als woord — een label met een waarde erachter, of een tabelkolom met die kop.

Een kale man of vrouw in lopende tekst telt niet. Dat verschil is het verschil tussen bruikbaar en onbruikbaar: anders gaat de regel af op elk verhaal waar iemand in voorkomt.

Twee bronnen per signaal, en waarom dat nodig bleek

Elk van de drie telt uit een bevinding óf een tabelkop. Dat tweede is niet voor de netheid: een geboortedatum in een tabelcel levert géén contact.birthdate op, want die regel eist een contextwoord binnen veertig tekens en een cel bevat alleen de datum. De kop bóven de kolom ís dat contextwoord, alleen staat hij een rij hoger.

Zonder die route zou de regel juist het geval missen waarvoor hij bestaat: de geëxporteerde tabel waar de namen uit zijn gehaald.

Twee van de drie meldt niets

Dat is de helft van de waarde. Een regel die al bij twee afgaat, meldt elke adreslijst — daar staat een test op met precies dat voorbeeld.

Wat er onderweg misging

Bij het schrijven van het geslachtspatroon sneuvelden de woordgrenzen. Zonder de grens ná de waarde matcht m op elk woord dat met een m begint, en werd "Geslacht: monteur" een geslachtsveld. Gerepareerd, met een test die het vasthoudt.

make check groen (3885 tests), main erin gemerged en opnieuw geverifieerd.

`bulk.quasi_combo` uit §3-H — de klassieke "maar het is toch geanonimiseerd"-val. Latanya Sweeney liet in 1997 zien dat postcode, geboortedatum en geslacht samen **87% van de Amerikaanse bevolking** uniek aanwijzen. Geen van de drie is op zichzelf een identificator, en juist dáárom overleven ze het schrappen van namen en nummers — waarna het resultaat "geanonimiseerd" heet. Dus geen nieuwe detectie, maar een combinatie van wat er al lag. Met één bouwsteen die ontbrak. ## Geslacht krijgt bewust geen eigen regel "Geslacht: M" wijst in zijn eentje niemand aan; als losse melding zou het alleen ruis zijn. Het telt hier mee als **veld** en niet als woord — een label met een waarde erachter, of een tabelkolom met die kop. Een kale `man` of `vrouw` in lopende tekst telt niet. Dat verschil is het verschil tussen bruikbaar en onbruikbaar: anders gaat de regel af op elk verhaal waar iemand in voorkomt. ## Twee bronnen per signaal, en waarom dat nodig bleek Elk van de drie telt uit een bevinding **óf** een tabelkop. Dat tweede is niet voor de netheid: een geboortedatum in een tabelcel levert géén `contact.birthdate` op, want die regel eist een contextwoord binnen veertig tekens en een cel bevat alleen de datum. De kop bóven de kolom ís dat contextwoord, alleen staat hij een rij hoger. Zonder die route zou de regel juist het geval missen waarvoor hij bestaat: de geëxporteerde tabel waar de namen uit zijn gehaald. ## Twee van de drie meldt niets Dat is de helft van de waarde. Een regel die al bij twee afgaat, meldt elke adreslijst — daar staat een test op met precies dat voorbeeld. ## Wat er onderweg misging Bij het schrijven van het geslachtspatroon sneuvelden de woordgrenzen. Zonder de grens ná de waarde matcht `m` op elk woord dat met een m begint, en werd "Geslacht: monteur" een geslachtsveld. Gerepareerd, met een test die het vasthoudt. `make check` groen (3885 tests), main erin gemerged en opnieuw geverifieerd.
`bulk.quasi_combo` uit §3-H. Geen nieuwe detectie maar een combinatie van wat
er al lag — Sweeney liet in 1997 zien dat postcode, geboortedatum en geslacht
samen 87% van de Amerikaanse bevolking uniek aanwijzen. Geen van de drie is
op zichzelf een identificator, en juist dáárom overleven ze het schrappen van
namen en nummers, waarna het resultaat "geanonimiseerd" heet.

Eén bouwsteen ontbrak: geslacht. Die krijgt bewust géén eigen regel.
"Geslacht: M" wijst in zijn eentje niemand aan, dus als losse melding zou het
alleen ruis zijn. Het telt hier mee als véld en niet als woord — een label
met een waarde erachter, of een tabelkolom met die kop. Een kale `man` of
`vrouw` in lopende tekst telt niet, want anders gaat de regel af op elk
verhaal waar iemand in voorkomt.

Elk van de drie signalen telt uit twee bronnen: een bevinding die de scanner
al deed, óf een tabelkop die het aankondigt. Dat tweede bleek nodig: een
geboortedatum in een tabelcel levert géén `contact.birthdate` op, want die
regel eist een contextwoord binnen veertig tekens en een cel bevat alleen de
datum. De kop bóven de kolom is dan het contextwoord, alleen staat hij een
rij hoger. Zonder die route zou de regel juist het geval missen waarvoor hij
bestaat — de geëxporteerde tabel waar de namen uit zijn gehaald.

Twee van de drie meldt niets, en dat is de helft van de waarde: een regel die
al bij twee afgaat, meldt elke adreslijst.

Bij het schrijven van het geslachtspatroon sneuvelden de woordgrenzen, en
zonder de grens ná de waarde matcht `m` op elk woord dat met een m begint —
"Geslacht: monteur" werd een geslachtsveld. Daar staat nu een test op.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into feat/ociwacht-quasi-combo
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
CI / Web hardening (pull_request) Has been cancelled
CI / Docs links (pull_request) Has been cancelled
CI / Supply-chain (Trivy · advisory) (pull_request) Has been cancelled
CI / Gate (Linux) · Format · Analyze · Coverage (push) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Web hardening (push) Has been cancelled
CI / Docs links (push) Has been cancelled
CI / Supply-chain (Trivy · advisory) (push) Has been cancelled
6564c36567
brenno merged commit 575ef4226e into main 2026-07-19 20:52:45 +00:00
Sign in to join this conversation.
No description provided.